私のブログからの転載です。プログラミングやソフトウェア周りの記事を書いているのでご興味あればのぞいてみてください。
この記事のまとめ
- 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の使い方も記事にまとめていますのでご興味あればご覧ください。