私のブログからの転載です。プログラミングやソフトウェア周りの記事を書いているのでご興味あればのぞいてみてください。
この記事のまとめ
- PythonでBlogger用Google APIを使うサンプルコードの紹介
背景
Bloggerをプログラムによって投稿できないものかと画策しており、いろいろ調べた結果、Blogger用のAPIが使えそうだったので、PythonでBlogger APIを使う方法を私自身の備忘録としても記載しておきます。
なおここでは、WindowsでPythonを使うことを前提とします。また、Pythonの導入方法については、ここでは行いません。
まずはとりあえずサンプルコードだけ載せておきます。
サンプルコード
下記はBloggerの記事をAPIから投稿するコードです。
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow
from oauth2client import tools,file
import argparse
import httplib2
import os
import sys
def main(argv):
# flowオブジェクトの生成
client_id = '{自身のClient ID}'
client_secret = '{自身のClient Secret}'
scope = 'https://www.googleapis.com/auth/blogger'
redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
flow = OAuth2WebServerFlow(client_id=client_id,
client_secret=client_secret,
scope=scope,
redirect_uri=redirect_uri)
# storageオブジェクトの生成、読み込み
storage = file.Storage(__file__ + '.dat') # 認証資格情報の保存ファイル名
credentials = storage.get() # 認証資格情報の読み込み
# 認証資格情報の取得(保存済みの資格情報がない場合)
if credentials is None or credentials.invalid:
credentials = tools.run_flow(flow, storage)
http = credentials.authorize(http = httplib2.Http())
service = build('blogger', 'v3', http=http)
posts = service.posts()
body = {
"kind": "blogger#post",
"id": "{自身のブログID}",
"title": "posted via python",
"content":"<div>hello world test</div>"
}
insert = posts.insert(blogId='{自身のブログID}', body=body)
posts_doc = insert.execute()
print posts_doc
if __name__ == '__main__':
main(sys.argv)
サンプルコードの概要
サンプルコードに沿って、その概要を説明していきます。
ソースコードのほとんどの部分は、OAuth 2.0という認証のために必要な情報の設定と認証処理を行っております。その認証情報を用いてGoogle APIを使うことができます。
まず、OAuth 2.0による認証方法について説明していきます。
OAuth 2.0
OAuth 2.0とは、Google APIで使われている認証プロトコルです。プロトコルの詳細は複雑なので(私も理解していません)、ライブラリの使い方のみ記載します。
基本的にはGoogleの公式ガイド(英語のみ)から重要そうなポイントだけを絞って説明していきます。
また、Google APIは基本的にWebアプリケーションを想定しているのかほとんどの説明がWebサーバーからの認証か、Webブラウザーからの認証がほとんどになっていますが、楽をしたかったのでコマンドラインツールを使ってブラウザーを用いて認証をしたいと思います。ブラウザーを用いた認証方法について一つ一つ手順を踏んで実装したい場合には、公式ガイド(英語のみ)にサンプルコードが載っていますのでそちらを参照してください。
oauth2clientライブラリ
oauth2clientライブラリはGoogle APIs Client Library for Pythonに含まれています。このライブラリのインストール方法は最後に説明します。このライブラリを使うことによって、APIの呼び出しに必要なOAuth 2.0プロトコルのすべてのステップを行ってくれます。
これ以降にライブラリの重要なモジュール、クラス、関数について説明します。
Flows
FlowクラスはあなたのアプリケーションがあなたのGoogleユーザーデータにアクセスするための認証する資格情報を取得するために用いられます。Flowオブジェクトは認証するステップを行う関数を持っています。ただし、後で説明しますが、コマンドラインツールを使って認証を行う場合には、Flowオブジェクトの関数を直接呼び出すことはありません。
Flowクラスにはflow_from_clientsecretsとOAuth2WebServerFlowとがあり、後者を使って認証を行います。なお、前者はclient_secrets.jsonを使って認証するFlowクラスであり、後者は認証に必要な情報を直接入力して認証するFlowクラスです。
OAuth2WebServerFlow
OAuth2WebServerFlowクラスはFlowオブジェクトを生成するために用い、client ID、client secret、scope、redirect_uriを渡すことでFlowオブジェクトを生成してくれます。
client ID、client secretは、認証に必要なIDと秘密鍵情報で、Google API Consoleから取得できます。なお、(http://hassiweb-programming.blogspot.jp/2017/01/blogger-api-part4.html)これらの情報を取得する方法は次の章で説明します。
scopeは、アクセスするサービスとアクセスレベルを指定するための情報です。ここに一覧があります。Bloggerに読み書き可能なアクセスレベルでアクセスするためにはhttps://www.googleapis.com/auth/bloggerを指定します。
redirect_uriは、Googleの認証サーバーが認証コードをリダイレクトする先を指定する情報です。指定方法は2つあり、http://localhost:[port]とurn:ietf:wg:oauth:2.0:oobの2つです。前者は、クライアント側に対して、指定したポートにリダイレクトします。そのため、クライアント側でGoogle APIを使うための認証コードのリダイレクトをリッスンできる状態にしておかなければなりません。後者は、クライアント側でリダイレクトをリッスンしない、もしくはできない場合に使用します。この場合、ブラウザーから認証コードを取得することになります。今回は、リダイレクト用のサーバーを立ち上げるのが手間なので、後者を指定します。
なお、このoauth2client.client.OAuth2WebServerFlowクラスですが、名前はWebServerとなっていますが、installed applicationおよびweb applicationにも使用できます。
Command-line tools
認証ステップを行ってくれるoauth2client.tools.run_flow関数を使います。なお、oauth2client.tools.run_flow関数は上記で説明したFlowオブジェクト内の関数を用いて実装されています。
oauth2client.tools.run_flow関数は認証資格情報(credentialsオブジェクト)を取得するための関数で、返り値としてそのcredentialsオブジェクトを返してくれますが、その中でブラウザーから下のようなアクセス許可の確認が行われます。
これを許可することでcredentialsオブジェクトを与えてくれます。
実行のために下記の2つの引数を必要とします。
1つ目が、上記で記載したFlowオブジェクトです。説明が前後していますが、上記で説明したものです。
2つ目が、credentialsオブジェクトを保管と取り出すためのstorageオブジェクトです。oauth2client.client.Storageとして定義されております。一度run_flow関数でcredentialsオブジェクトを取得してしまえば、その情報を保存し、次回以降それを読み込んでやれば何度も認証する必要なく、Google APIを呼び出すことができます。
credentials
credentialsオブジェクトはrefresh tokenとaccess tokenを保持し、それらは単一ユーザーのデータへのアクセスを認証します。credentialsオブジェクトのauthorize関数を使うことで、httplib2.HttpインスタンスによるすべてのAPI呼び出し要求に対して、必要な資格情報ヘッダーを付与してくれます。
apiclient.discovery.build
一度httplib2.Httpオブジェクトが認証されれば、apiclient.discovery.build関数に使いたいGoogle API情報とともに渡すことで呼び出したAPIに対するserviceオブジェクトを返してくれます。
なお、Google API名、バージョン名はこちらから確認できます。
Blogger API
serviceオブジェクトが生成できればあとはオブジェクトのインスタンスに基づいてAPIを制御するだけです。サンプルコードでは、タイトル"posted via python"、本文"hello world test"とだけ書いた記事を投稿するものになっています。
あとはこちらのAPIの説明に基づいてAPIを呼び出しましょう。
Google API用ライブラリーのインストール
続いて、サンプルコードを実行するためにPythonにGoogle APIを使うためのライブラリーのインストール方法を説明します。
Google API用ライブラリーのインストール手順
Google APIをPythonにインストールする手順を順を追って説明します。
pipのインストール
Linux環境ではpipは標準で入っていますが、Windows環境ではpythonをインストールしただけではpipが含まれていないことがありますのでGoogle APIをインストールするためのツールとしてpipをインストールします。
参考HP: https://pip.pypa.io/en/stable/installing/
pipをインストールするpythonファイルget-pip.pyをダウンロードします。
ダウンロードしたファイルがあるディレクトリにおいて、下記を実行します。
$ python get-pip.py
これでpipのインストールは完了します。
Google API用ライブラリーのインストール
pipを使ってBlogger用のAPI (2016.4.25においてはv3) を含むGoogle APIライブラリーのインストールを行います。
参考HP: https://developers.google.com/blogger/docs/3.0/api-lib/python
下記を実行します。
$ pip install --upgrade google-api-python-client
$ pip install gdata
これでBlogger用のAPIのインストールは完了します。
tlsliteのインストール
SSL/TLSを使って認証するため、tlsliteのパッケージもインストールしておきます。
下記を実行します。
$ pip install tlslite
OAuth 2.0認証に必要な情報の取得
Blogger APIを有効にするための方法と、サンプルコードの説明する中で出てきたOAuth2WebServerFlowクラスを用いてFlowオブジェクトを生成するために必要なclient IDとclient secretの取得方法について説明します。
Blogger APIの有効化
Google APIはサービスごとにAPIをGoogle APIs Consoleから有効にしなければ使えません。
まず、Google APIs Consoleを開きます。
下の画面キャプチャのように画面左のライブラリの項目を開き、Blogger API v3を探します。
下の画面キャプチャのように画面上方に有効にするボタンがありますので、これを押してAPIを有効化します。
client ID、client secretの取得
続いて、OAuth 2.0認証に必要なclient ID、client secretの取得方法について説明します。
下の画面キャプチャのように画面左の認証情報の項目を開きます。
認証情報タブから認証情報を作成ボタンを押すと、OAuthクライアントIDという項目がありますのでこれを選択します。
アプリケーション種別は今回はPythonのスクリプトとして実行しますので、その他を選択します。
名前はGoogle APIs Console上で管理するためにつけるだけなので任意の名前で構いません。
ここまで設定すると下の画面キャプチャのように、client IDとclient secretを取得できます。
これらの情報を使ってGoogle APIを呼び出せば、APIを使えるはずです。

以上です。これでBlogger用Google APIの使い方のすべての説明は終わりです。
あとはみなさまのやりたいようにPythonコードを作るだけです。
参考
Blogger APIだけでなくGoogle翻訳のAPIの使い方も記事にまとめていますのでご興味あればご覧ください。




