全てのブログ記事を一括修正するプログラムを書いた話。

目次。

 

この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。

ofuse.me

 

 

全てのブログ記事を一括修正したいシチュエーション。

にほんブログ村、SNS、YouTubeチャンネルなどのリンクを全てのブログ記事に張りたい。

にほんブログ村は、ブロブをやったことがある人なら知っていると思う。ブログをやったことがない人も以下のアイコンに見覚えはあると思う。

ブログランキング・にほんブログ村へ
にほんブログ村

 

にほんブログ村は、ブログのランキングサイト。上記のボタンを多くの人に押されると、ブログがランキング上位に入る。にほんブログ村のランキング上位に入ると目立つので、色々な人がブログにやってくる。

 

SNSと言えば、Twitter、Facebook、Instagramなど。

Twitterのボタンは、こんな感じ。

 

あと、最近だと個人でYouTubeチャンネルを持っている人が増えている。ブログで自分のYouTubeチャンネルを宣伝したいという人もいるだろう。

 

例えば、新たにYouTubeチャンネルを開設し、ブログの記事の最後に自分のチャンネルを宣伝する文章を加えたいとする。そして、あなたのブログには100本もの記事が掲載されている。

 

100本の記事で自分のチャンネルを宣伝したいのであれば、宣伝文を記事の最後に書き加える作業を100回、繰り返さないといけない。

…全てのブログ記事に宣伝文を自動で書き加えることができれば、どれだけ楽なことか。。。

 

 

無効になってしまったアフィリエイトリンクを張り変えたい。

アフィリエイトは、ブログで商品やサービスを紹介し、それが購入されたら、お金が入ってくるというシステム。

 

アフィリエイト案件を紹介しているサイトには、無料で登録することができる。A8.net、もしもアフィリエイトなんかが有名。

 

 

例えば、あなたが毎日、英語の豆知識を紹介するブログを運営していて、それぞれの記事におすすめの英会話教室と銘打って、アフィリエイトリンクを張っていたとする。

 

最初は、順調にアフィリエイト収益が伸びていったが、途中から何やら異変が...。収益が急に減少し始めたのである。慌てて、原因を探してみると、なんとブログで紹介していた英会話教室が倒産していたのである。しかし、幸いなことに英語関連の案件は他にもたくさんあるので、英会話教室の代わりに別の案件を紹介すれば、窮地を脱することができる。

 

英語の豆知識を紹介する記事をブログに書いて、1年の月日が流れた。ブログには、365本もの記事が…。この365本の記事で紹介している「倒産してしまった英会話教室」のアフィリエイトリンクを別の案件のアフィリエイトリンクに張り変えなければならない。

 

これを手動でやるのであれば、365回、同じ作業をひたすら繰り返さなければならない。

…全てのブログ記事内にある無効になったアフィリエイトリンクを別の案件のものに自動で張り変えることができれば、どれだけ楽なことか。。。

 

 

ブログ記事に書いてある宣伝文(イベントの告知とか)を一括で修正したい。

これは、先ほどのアフィリエイトリンクを修正したいという話と根本的には同じ。

 

例えば、

  • 趣味で楽器をやっているのであれば、ライブの告知を
  • アイドルなどの芸能活動をしているのであれば、イベントの告知を
  • ○○大学××部の活動を記録しているのであれば、試合の告知を
  • 何かモノを作って販売しているのであれば、販売先のリンクの宣伝を

…ブログ記事に書くと思う。

 

通常、過去の記事には過去のイベント情報が掲載されていて、最新の記事には最新のイベント情報が掲載されている。けれども、読者は最新の記事だけではなく、過去の記事も読む。

…過去の記事に書かれてあるイベント情報を常に新しいものへと更新し続ければ、より多くの人に最新のイベント情報を広げることができる。

 

しかし、新しいイベントが決まるごとに今までの記事の告知文を修正するというのは、ものすごく面倒くさい作業。

…全てのブログ記事に書かれてあるイベント情報を常に自動で最新のものへと更新できたら、どれだけ楽なことか。。。

 

 

 

 

僕が全てのブログ記事を一括修正するプログラムを書いた理由。

OFUSEのリンクを一括で張りたい。

OFUSEという投げ銭サービスがある。YouTubeで言うところのスーパーチャット(スパチャ)みたいなもの。

 

OFUSEのリンクは、こんな感じ。

ofuse.me

 

僕のブログ収入源は、今までGoogle AdSenseとアフィリエイトの2つしかなかった。そのため、もっと収入源が欲しいと思い、「ダイレクト課金」の分野に手を出した。

 

今年の夏ぐらいから、確か『VAIOの2 in 1(ノートパソコン・タブレット)を使い始めて1年半経った話。』から、記事の最後にOFUSEのリンクを張り始めた。それ以降、毎回、記事の最後にリンクを張っているが、未だに張れていない記事が大半である。また、記事の最後だけではなく、記事の最初の方(目次の下)にもリンクを張りたいと思うようになってきた。

 

けれども、僕のブログには記事が80本以上ある。それぞれの記事の最初と最後にOFUSEのリンクを張ろうとすると、同じ動作を100回以上、繰り返さないといけない。

…全てのブログ記事の最初と最後にOFUSEのリンクを自動で挿入出来たら、どれだけ楽なことか。。。

 

ということで、全てのブログ記事の最初と最後にOFUSEのリンクを自動で挿入するプログラムを書くことにした。

 

 

無効になってしまったアフィリエイトリンクを張り変えたい。

今まで、Amazonアソシエイトや楽天アフィリエイトばかりやっていたが、最近、A8.netの案件にも手を出し始めた。僕のブログと相性がいい案件(金融系・プログラミング系)は、単価がものすごく高い(1成約:2千円~3万円くらい?)。最近になって、この事実にやっと気づくことができた。

 

今は、A8.netのアフィリエイトリンクを張り始めて間もないので、リンク切れを起こしているアフィリエイトリンクはまだない。しかし、時間が経つにつれて、リンク切れが発生する可能性は高まる。

 

そのため、リンク切れしたアフィリエイトリンクを迅速に別の案件のリンクに置換するプログラムが予め書いておいて、そういった事態に備えることにした。

 

 

 

 

プログラムコード(ソースコード)。

自己責任でお願いします。ブログ記事が消えてしまっても責任は取りません。プログラムを動かす前にブログ記事のバックアップをおすすめします。

 

「OFUSEのリンクをブログ記事の最初と最後に挿入するプログラム」と「リンク切れしたアフィリエイトリンクを新しい案件のものに張り変えるプログラム」を紹介する。

 

このプログラムには、Atom Publishing ProtocolというWeb APIを使っている。Atom Publishing Protocolの詳しい操作方法などは、以下のwebサイトを参照のこと。

developer.hatena.ne.jp

 

このプログラムは、はてなブログ向けに書いてはいるが、使っているAtom Publishing Protocolははてな独自のAPIではなく、色々なwebサービスで広く使われてるWeb APIなので、あなたが使っているブログサービスがAtom Publishing Protocolを提供していれば、このプログラムをそのまま適用できると思う。

 

 

 

 

プログラミングの勉強方法。

そもそもプログラミング技術がなくて、とりあえず何か勉強してみたいっていう人は、僕のプログラミング勉強遍歴をまとめた以下の文章がおすすめ。

blog.sun-ek2.com

blog.sun-ek2.com

 

また最近は、オンラインプログラミングスクールがどんどん誕生している。オンライン相談会や体験レッスンなどが用意されているので、色々なところを見て回って、自分に合うプログラミングスクールを見つけて、そこで勉強するのもおすすめ。

 

 

ブログ上の全ての記事IDを取得する。

記事IDは、(多分)その記事が投稿された日時のepoch時間(UNIX時間)。

 

Atom Publishing Protocolを使うと、記事情報が以下のようなxml形式で得られる。

<generator uri="https://blog.hatena.ne.jp/" version="xxxxx">Hatena::Blog</generator>
<id>hatenablog://blog/xxxxx</id>
<entry>
<id>tag:blog.hatena.ne.jp,2013:blog-sun_ek2-xxxxx-xxxxx</id>
<link href="https://blog.hatena.ne.jp/sun_ek2/sun-ek2.hatenablog.com/atom/entry/投稿した時のepoch時間(UNIX時間)" rel="edit"/>
<link href="ブログ記事のURL" rel="alternate" type="text/html"/>
<author><name>sun_ek2</name></author>
<title>ブログ記事のタイトル。</title>
<updated>更新日時。</updated>
<published>投稿日時。</published>
<app:edited>更新日時との違いが分からん。。。</app:edited>
<summary type="text">ブログ記事の要約。</summary>
<content type="text/html">
ブログの内容(見たままモード、はてな記法モード、Markdownモードのどれか)。
</content>
<hatena:formatted-content type="text/html" xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#">
ブログの内容(html形式)。
</hatena:formatted-content>
<app:control>
<app:draft>no</app:draft>
</app:control>
</entry>
<entry></entry></feed>

 

記事IDは、<link href="https://blog.hatena.ne.jp/sun_ek2/sun-ek2.hatenablog.com/atom/entry/投稿した時のepoch時間(UNIX時間)" rel="edit"/>に含まれている。

 

ソースコードは、以下の文章内の「はてなブログの記事情報を取ってくる方法。」とほぼ同じ。

blog.sun-ek2.com

 

「はてなブログの記事情報を取ってくる方法。」では、全てのブログ記事の「タイトル」と「URL」を取ってくるプログラムを紹介している。

 

具体的には、

temp_article_titles = soup.findAll('title')[1:]

で「タイトル」を

temp_article_links = soup.findAll('link', rel='alternate', type='text/html')

で「URL」を取得している。

 

そして、後者のコードを

temp_article_links = soup.findAll('link', rel='edit')

に変えると、ブログ記事の「URL」ではなく、自動編集に必要な「ID」を取得することができる。

 

「はてなブログの記事情報を取ってくる方法。」では、関数名をgetBlogArticleList()にしていた。ここでは、修正したgetBlogArticleList()getBlogArticleList2()と名付ける。

 

 

 

 

OFUSEのリンクをブログ記事の最初と最後に挿入するプログラム。

以下のような形式をとっているブログ記事を

(目次)

(空行)

(空行)

(最初の見出し)

(記事本文)

(空行)

ブログランキング・にほんブログ村へ
にほんブログ村

(Google AdSense)

 

このように修正する。

(目次)

(空行)

この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。

ofuse.me

(空行)

(空行)

(最初の見出し)

(記事本文)

(空行)

(空行)

この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。

ofuse.me

(空行)

ブログランキング・にほんブログ村へ
にほんブログ村

(Google AdSense)

 

import requests
from bs4 import BeautifulSoup


_, article_links = getBlogArticleList2()
def add_OFUSE(article_links):
    ofuse_text = '<p>この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。</p>\n'
    ofuse_content = '(OFUSE関連のhtml)'
    first_insert = '\n<p>\xa0</p>\n' + ofuse_text + ofuse_content + '\n<p>\xa0</p>\n<p>\xa0</p>\n'
    second_insert = '\n<p>\xa0</p>\n<p>\xa0</p>\n'+ ofuse_text + ofuse_content +'\n<p>\xa0</p>\n'
    for i in range(len(article_links)):
        print(i)
        target_url = article_links[i]
        r = requests.get(url=target_url, auth=('sun_ek2', 'xxxxx'))
        soup = BeautifulSoup(r.text, 'html.parser')
        content = soup.find('hatena:formatted-content').getText()
        removed_content = ''

        if content.find('class="table-of-contents"') != -1:
            toc_index = content.find('class="table-of-contents"')
            removed_content = content[:content.find('<h3 id=', toc_index)]

            while True:
                blank = '<p>\xa0</p>\n'
                remove_index2 = removed_content.rfind(blank)

                if remove_index2 < removed_content.rfind('<p>\xa0</p>\r\n'):
                    blank = '<p>\xa0</p>\r\n'
                    remove_index2 = removed_content.rfind(blank)

                if remove_index2 == len(removed_content) - len(blank):
                    removed_content = removed_content[:remove_index2]
                    continue
                break

            content = removed_content + first_insert + content[content.find('<h3 id=', toc_index):]

        remove_index = content.find('<p><a href="//www.blogmura.com/ranking.html">')
        removed_content = content[:remove_index]

        if remove_index != -1:
            while True:
                blank = '<p>\xa0</p>\n'
                remove_index2 = removed_content.rfind(blank)

                if remove_index2 < removed_content.rfind('<p>\xa0</p>\r\n'):
                    blank = '<p>\xa0</p>\r\n'
                    remove_index2 = removed_content.rfind(blank)

                if remove_index2 == len(removed_content) - len(blank):
                    removed_content = removed_content[:remove_index2]
                    continue
                break

            content = removed_content + second_insert + content[remove_index:]

            soup.find('id').extract()
            soup.find('link').extract()
            soup.find('link').extract()
            soup.find('summary').extract()
            soup.find('hatena:formatted-content').extract()

            new_tag = soup.new_tag('content')
            new_tag.string = content
            soup.find('content').replace_with(new_tag)
            r = requests.put(url=target_url, auth=('sun_ek2', 'xxxxx'), data=str(soup).encode("utf-8"))

 

 

 

 

リンク切れしたアフィリエイトリンクを新しい案件のものに張り変えるプログラム。

import requests
from bs4 import BeautifulSoup


_, article_links = getBlogArticleList2()
def replace_URLs(article_links):
    for i in range(len(article_links)):
        print(i)
        target_url = article_links[i]
        r = requests.get(url=target_url, auth=('sun_ek2', 'xxxxx'))
        soup = BeautifulSoup(r.text, 'html.parser')
        content = soup.find('hatena:formatted-content').getText()
        content = content.replace('無効になったアフィリエイトリンク', '新しい案件のアフィリエイトリンク')

        soup.find('id').extract()
        soup.find('link').extract()
        soup.find('link').extract()
        soup.find('summary').extract()
        soup.find('hatena:formatted-content').extract()

        new_tag = soup.new_tag('content')
        new_tag.string = content
        soup.find('content').replace_with(new_tag)
        r = requests.put(url=target_url, auth=('sun_ek2', 'xxxxx'), data=str(soup).encode("utf-8"))

 

 

この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。

ofuse.me

 

ブログランキング・にほんブログ村へ
にほんブログ村