Bloggerの記事をバックアップする方法いろいろ

2019/11/22

Blogger

t f B! P L
みなさんちゃんとバックアップ取ってますか?
バックアップは大切です。

Bloggerは個人でサーバーを運用しているわけではないので、サーバーのバックアップは不要ですが、記事のバックアップは念のためとっておきたいです。

Googleの透明性レポートによると、政府機関からの削除リクエストのうち、約10%はBloggerに対してのリクエストになっています(BloggerはGoogleのサービス)。
引用元: https://transparencyreport.google.com/government-removals/overview?hl=ja

つまり、せっせと書いたブログが突然削除されてしまう可能性が!
これはサービスを貸していただいている以上、仕方のないことです。
そのため、個人で対策が求められます。

一番簡単な方法は、Bloggerの標準機能を使うことです。
Blogger管理画面から
「設定」>「その他」>「インポートとバックアップ」
へと飛び、「コンテンツをバックアップ」を押すことです。
すると「blog-MM-DD-YYYY.xml」というファイルがダウンロードされます。
このバックアップファイルがあれば、再びBloggerをはじめることや別のサービスにお引っ越しすることもできます。

でも、毎回手動でバックアップボタンを押すのは面倒くさいですね。
そこで今回は自動化できる方法をいくつか紹介します。

標準機能でDLするURL

上記のDLはBloggerのAPIでも可能です。
現行の最新APIがv3で、こちらはv2なのでひとつ古いバージョンになるようです。
また、調べた限りではv3にExportFormatのAPIはなかったので、こちらを使うことになるようです。


難点としてはめんどくさいOAuth2による認証が必要な点です。

ですが、これには裏技があって、Bloggerと同じGoogleアカウントにブラウザでもログインしている場合は、以下のURLにブラウザで直接アクセスすることで、DL可能です。

https://www.blogger.com/feeds/blogID/archive

これをブックマークに登録すればクリックするだけでDLできます。
これで幾分かは楽になるはずです.

また,コマンドラインからchromeが使える場合は、以下のコマンドでも可能です。
コマンドから実行できるとcronなども使えますね。

google-chrome https://www.blogger.com/feeds/blogID/archive

ちなみにblogIDはBloggerの管理画面のURLを見れば分かります(blogID=となっている部分)。
これはログインIDではないですが、フロントからはたぶん見えない仕様になっているのでむやみに公開しないほうがよいと思われます。

メリット

  • 環境構築なし
  • 標準機能なので安心

デメリット

  • クリックの手間はかかる
  • ログインしているChromeでないとダメなので、自分のマシン以外ではセキュリティ上自動化したくない

RSSを監視して外部サービスに保存する

このブログでも、自動化サービスIFTTTでRSSを監視して更新があればTweetしたり、ブログランキングにpingを送ったりしています。

同じようにRSSに更新があった場合にEvernoteなどの外部サービスに保存するようにすることもできます。
これはIFTTTの画面上でぽちぽちやるだけなので楽です。

ただし、保存先の外部サービスのデータがいざというとき簡単にまとめて出力できるかはよく確認しておいたほうがいいと思います。

メリット

  • 環境構築が楽
  • 完全自動化

デメリット

  • 最新ファイルしか保存されない(過去分は別途保存しておく必要がある)
  • 保存する外部サービスのフォーマットによってはお引越しするときに不都合が生じる可能性がある

APIv3を使う

こちらのAPIv3でも記事の取得は可能です。


ただし、こちらはXML形式のバックアップではなく、公開済み記事のみを10件ずつJSON形式で取得します。
なので下書き記事は取れません。

公開記事のみであるため、OAuthではなく、APIキーのみで可能です。
APIキーの発行はこちらから。

発行したらそのまま使えますが、念の為Google Developer ConsoleでAPIキーの制限をしておきます。
「APIキーの制限」>「キーを制限」で「Blogger API v3」を選びましょう。
他にもリクエスト元など制限できる場合は制限しておきます。

コードは以下のようになります。
blogIDとAPIキーは環境変数にしましょう。


import os
import json
import time
import requests


blogger_id = os.environ['BLOGGER_ID']
blogger_api_key = os.environ['BLOGGER_APIKEY']

url_base = 'https://www.googleapis.com/blogger/v3/blogs'

nextPageToken = not None
items = []
url = url_base + '/{}/posts?key={}'.format(blogger_id, blogger_api_key)

while nextPageToken:
    time.sleep(1)
    
    res = requests.get(url=url)
    print(res)
    body = json.loads(res.content)

    if 'nextPageToken' in body.keys():
        nextPageToken = body['nextPageToken']
    else:
        nextPageToken = None
    
    if nextPageToken:
        url = url_base + '/{}/posts?key={}&pageToken={}'.format(blogger_id, blogger_api_key, nextPageToken)
    
    if 'items' in body.keys():
        items.extend(body['items'])
    
    print(nextPageToken)
    
# save
if items:
    with open('blogger.json', 'w') as fw:
        json.dump({'items': items}, fw, indent=2)

NextPageTokenがあるかどうかでページ送りを制御しています。
デフォルトでは10記事ずつ取得できるので、あたかも記事一覧ページを見て、ページ送りしていくイメージです。

ちなみにクエリパラメータにmaxResultsというパラメータを設定すると、同時取得数をコントロールできますが、私は10 (default)のまま、ページネーションで順番に取得する実装にしています。
パラメータ一覧はこちら。

実際には、このコードはVMやCloud functionで実行して、JSONファイルはVMのストレージにそのまま置いとくなり、githubにpushするなり、Slackにそのまま送るなりします。

テキストデータのみで、ファイルサイズは全然大きくないため、そのままメール送信しても良いのですが、メールサーバーの準備は環境によっては面倒くさいし、クラウドのメールサービスをこのためだけに登録するのもめんどうだったので、APIで簡単にデータを送信できるサービス(GitやSlackなど)を使うのがいいと思います。

メリット

  • 完全自動化
  • 安心と信頼のJSONフォーマット

デメリット

  • 若干コーディングが必要
  • 保存先は要検討

今日のベストプラクティス

好きなの選んで。

ラベル

QooQ