PythonでGoogle Blogger APIを使うサンプルコードの紹介

![PythonでGoogle Blogger APIを使う（その１：Pythonのサンプルコードの紹介）](https://4.bp.blogspot.com/-b48YgsNThfw/WUb-weqVlFI/AAAAAAABVFc/MSLnbSNoJUcYnyVUzZT-g-MInf1ogpwbwCEwYBhgL/s1600/GoogleDevelopers.jpg "PythonでGoogle Blogger APIを使う（その１：Pythonのサンプルコードの紹介）")

[**私のブログからの転載です。プログラミングやソフトウェア周りの記事を書いているのでご興味あればのぞいてみてください。**](https://hassiweb-programming.blogspot.com/)

# この記事のまとめ
- PythonでBlogger用Google APIを使うサンプルコードの紹介

# 背景
Bloggerをプログラムによって投稿できないものかと画策しており、いろいろ調べた結果、Blogger用のAPIが使えそうだったので、PythonでBlogger APIを使う方法を私自身の備忘録としても記載しておきます。

なおここでは、WindowsでPythonを使うことを前提とします。また、Pythonの導入方法については、ここでは行いません。

まずはとりあえずサンプルコードだけ載せておきます。


# サンプルコード
下記はBloggerの記事をAPIから投稿するコードです。

```py
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の公式ガイド（英語のみ）](https://developers.google.com/api-client-library/python/guide/aaa_oauth)から重要そうなポイントだけを絞って説明していきます。

また、Google APIは基本的にWebアプリケーションを想定しているのかほとんどの説明がWebサーバーからの認証か、Webブラウザーからの認証がほとんどになっていますが、楽をしたかったのでコマンドラインツールを使ってブラウザーを用いて認証をしたいと思います。ブラウザーを用いた認証方法について一つ一つ手順を踏んで実装したい場合には、[公式ガイド（英語のみ）](https://developers.google.com/api-client-library/python/auth/installed-app)にサンプルコードが載っていますのでそちらを参照してください。

### oauth2clientライブラリ
`oauth2client`ライブラリは[Google APIs Client Library for Python](https://developers.google.com/api-client-library/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](https://console.developers.google.com/?hl=JA&pli=1)から取得できます。なお、(http://hassiweb-programming.blogspot.jp/2017/01/blogger-api-part4.html)これらの情報を取得する方法は次の章で説明します。

`scope`は、アクセスするサービスとアクセスレベルを指定するための情報です。[ここ](https://developers.google.com/identity/protocols/googlescopes)に一覧があります。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`オブジェクトを返してくれますが、その中でブラウザーから下のようなアクセス許可の確認が行われます。

![認証許可](https://dl.dropboxusercontent.com/s/6pe7xrp622gl94w/OAuthConfirmation.PNG)

これを許可することで`credentials`オブジェクトを与えてくれます。

実行のために下記の2つの引数を必要とします。

1つ目が、上記で記載した`Flow`オブジェクトです。説明が前後していますが、上記で説明したものです。

2つ目が、`credentials`オブジェクトを保管と取り出すための`storage`オブジェクトです。`oauth2client.client.Storage`として定義されております。一度`run_flow`関数で`credentials`オブジェクトを取得してしまえば、その情報を保存し、次回以降それを読み込んでやれば何度も認証する必要なく、Google APIを呼び出すことができます。

<!--
3つ目が、認証における制御情報である`flags`オブジェクトです。`flag`オブジェクトについて詳しく説明されている文献がなく、詳細が知りたい方は`run_flow`関数のソースコードを[こちら](http://oauth2client.readthedocs.io/en/latest/_modules/oauth2client/tools.html)から見ながら作るとよいかもしれません。必要な情報は、`auth_host_name`、`auth_host_port`、`noauth_local_server`の3つと、必要に応じて`logging_level`を用います。
-->


#### 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名、バージョン名は[こちら](https://developers.google.com/api-client-library/python/apis/)から確認できます。

#### Blogger API
`service`オブジェクトが生成できればあとはオブジェクトのインスタンスに基づいてAPIを制御するだけです。サンプルコードでは、タイトル"posted via python"、本文"hello world test"とだけ書いた記事を投稿するものになっています。
あとは[こちら](https://developers.google.com/resources/api-libraries/documentation/blogger/v3/python/latest/)の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](https://console.developers.google.com)を開きます。

下の画面キャプチャのように画面左の`ライブラリ`の項目を開き、`Blogger API v3`を探します。

![Google API Console Library](https://dl.dropboxusercontent.com/s/kp3xwczwgb665pm/API%20%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%20%20%20API%20Project.png)

下の画面キャプチャのように画面上方に`有効にする`ボタンがありますので、これを押してAPIを有効化します。

![Enabling Google API on the Console](https://dl.dropboxusercontent.com/s/1cig12w3wp932ku/Blogger%20API%20v3%20%20%20API%20Project.png)

## client ID、client secretの取得
続いて、OAuth 2.0認証に必要な`client ID`、`client secret`の取得方法について説明します。

下の画面キャプチャのように画面左の`認証情報`の項目を開きます。

`認証情報`タブから`認証情報を作成`ボタンを押すと、`OAuthクライアントID`という項目がありますのでこれを選択します。

![Aquiring crient ID and secret 1](https://dl.dropboxusercontent.com/s/csq7kv1t1op5t30/OAuth2.0%20page1.png)


アプリケーション種別は今回はPythonのスクリプトとして実行しますので、`その他`を選択します。
`名前`はGoogle APIs Console上で管理するためにつけるだけなので任意の名前で構いません。

![Aquiring crient ID and secret 2](https://dl.dropboxusercontent.com/s/vxd0nb1c7woms96/OAuth2.0%20page2.png)

ここまで設定すると下の画面キャプチャのように、`client ID`と`client secret`を取得できます。
これらの情報を使ってGoogle APIを呼び出せば、APIを使えるはずです。
![Aquiring crient ID and secret 3](https://dl.dropboxusercontent.com/s/n0a4egmsrp11g8k/OAuth2.0%20page3.png)

以上です。これでBlogger用Google APIの使い方のすべての説明は終わりです。
あとはみなさまのやりたいようにPythonコードを作るだけです。

# 参考
Blogger APIだけでなくGoogle翻訳のAPIの使い方も記事にまとめていますのでご興味あればご覧ください。

- [Google翻訳APIをPythonから使う方法](http://hassiweb-programming.blogspot.com/2017/01/blogger-api-part4.html)