やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PythonでOAuth2.0とFusionTablesAPIを実行する手順まとめ

表題の件について再現可能なように情報をまとめておく。

目標

ラズパイのCPU温度を定期的にロギングしてアップロードしたい

小目標

PythonからFusionTablesAPIを使ってinsertする。

前回

PythonでOAuth2.0とFusionTablesAPIによるinsertができた。ついに小目標を達成した。

しかし、目標を達成することはできない。OAuth2.0では手入力が必要になってしまうためである。

対象環境

Googleのドキュメント

OAuth 2.0

Using OAuth 2.0 to Access Google APIsにてOAuth2.0の概要を参照する。

Fusion Tables API

Fusion Tables API v2にてWebAPIの仕様を参照する。

Google API Client Libraries

Google API Client LibrariesにてPythonからGoogleAPIを使用するライブラリの使い方を参照する。

環境の準備

ローカルツール

ライブラリ

Google API Client Libraryをインストールしたときの手順を参照。

Webサービス

ソースコード

  1. SimpleSample.pyファイルとして以下を保存する
  2. 控えたClientId, ClientSecret, API Key, docid(tableid)をそれぞれコードの変数値に埋め込む
#!python2
# https://developers.google.com/fusiontables/docs/samples/python

import urllib2, urllib, simplejson, sys, httplib

client_id = "*.apps.googleusercontent.com"
client_secret = "01234567890123456789"
redirect_uri = "http://localhost:8000"
api_key = '0123456789012345678901234567890123456789'
tableid = '0123456789012345678901234567890123456789'

class RunAPITest:
  def __init__(self):
    self.access_token = ""
    self.params = ""

  def main(self):
    print "copy and paste the url below into browser address bar and hit enter"
    print "https://accounts.google.com/o/oauth2/auth?%s%s%s%s" % \
      ("client_id=%s&" % (client_id),
      "redirect_uri=%s&" % (redirect_uri),
      "scope=https://www.googleapis.com/auth/fusiontables&",
      "response_type=code")

    code = raw_input("Enter code (parameter of URL): ")
    data = urllib.urlencode({
      "code": code,
      "client_id": client_id,
      "client_secret": client_secret,
      "redirect_uri": redirect_uri,
      "grant_type": "authorization_code"
    })

    serv_req = urllib2.Request(url="https://accounts.google.com/o/oauth2/token",
       data=data)

    serv_resp = urllib2.urlopen(serv_req)
    response = serv_resp.read()
    tokens = simplejson.loads(response)
    access_token = tokens["access_token"]
    self.access_token = access_token
    self.params = "?key=%s&access_token=%s" % \
      (api_key, self.access_token)

  def testInsertV2(self):
    print "v2 Query.sql insert"
    sql = "INSERT INTO %s (Timestamp, CpuTemperature) values('%s',%s)" % (tableid, '2011-11-11 11:11:11',11111)
    data = '''{
      "sql": "%s"
    }''' % (sql)
    response = self.runRequest(
      "POST",
      "/fusiontables/v2/query%s&sql=%s" % \
       (self.params, urllib.quote(sql)),
      data=data,
      headers={'Content-Type':'application/json'})
    json_response = simplejson.loads(response)
    print(json_response)
    return json_response

  def runRequest(self, method, url, data=None, headers=None):
    request = httplib.HTTPSConnection("www.googleapis.com")

    if data and headers: request.request(method, url, data, headers)
    else: request.request(method, url)
    response = request.getresponse()
    print response.status, response.reason
    response = response.read()
    print response
    return response

if __name__ == "__main__":
  api_test = RunAPITest()
  api_test.main()
  api_test.testInsertV2()

実行する

ローカルサーバを起動する

  1. コンソールを起動する
  2. 以下のコマンドを叩く Python2の場合
python -m SimpleHTTPServer [ポート番号(デフォルトは8000)]

Python3の場合

python3 -m http.server [ポート番号(デフォルトは8000)]

f:id:ytyaru:20161130131322p:plain

このままにしておく。

OAuth2.0認証する

  1. コンソールを起動する
  2. python SimpleSample.pyでコードを実行する
    f:id:ytyaru:20161130112451p:plain
  3. コンソールに表示されたhttps://accounts.google.com/...のURLをコピーする

  4. ブラウザを起動する

  5. ブラウザのロケールバーにURLをペーストする
    f:id:ytyaru:20161130112615p:plain
  6. Enterキーを押下してURLにアクセスする
  7. 以下のように許可を求める表示が出る
    f:id:ytyaru:20161129183947p:plain
  8. 内容を確認して、許可をクリックする
  9. 以下のようなページが表示される
    f:id:ytyaru:20161130114320p:plain
  10. URLがlocalhost:8000/?code=...になる
  11. codeパラメータの値をコピーする(画面に表示されているものやURL内にある)

  12. コンソールに戻る

  13. Enter code (parameter of URL):で待機しているので、コピーしたURLをペーストする
    f:id:ytyaru:20161130114957p:plain
  14. Enterキーを押下する

AccessTokenの取得→Fusion Tables APIの実行

  1. あとはプログラムが実行され、コードにあるとおりinsert文が発行される
    f:id:ytyaru:20161130115037p:plain
  2. 上記のログからHTTP 200 OKが返却されることを確認する
  3. 対象のFusionTablesファイルを参照し、コードでinsertした内容が挿入されていることを確認する
    f:id:ytyaru:20161129212849p:plain

おわり

以上。たぶんこれで再現可能なはず。こまかいところはリンク先を参照。抜けや漏れがないことを祈る。

所感

ゼロからはじめたら一体どれだけ時間がかかることやら…。

準備や手順が長すぎる。たかがWebAPIひとつ叩くために、これだけのサーバ、通信、ソフトウェア、操作が必要なのか。毎回これをやるの?ないわ。