ジャンル不定の日記です。

Gmail APIできた

メール(Gmail)の自動処理スクリプトがGoogleの2段階認証で機能してなかったので、IMAP使わずにGmail APIを使うように修正した。

Gmail APIの使い方だが、
  1. Google Developer Consoleでプロジェクトを作成。
  2. APIと認証のAPIでGmail APIをオンにする。
  3. 認証情報で新しいクライアントIDを作成する。(ネイティブアプリケーションにした)
そうすると、
[クライアント ID],[クライアント シークレット],[リダイレクト URI]
の3つのパラメータが取得できる。

https://accounts.google.com/o/oauth2/auth?client_id=[クライアント ID]&redirect_uri=[リダイレクト URI]&scope=https://mail.google.com/&response_type=code&approval_prompt=force&access_type=offline
にブラウザで接続するとアクセストークン取得用のコードが表示される。
scopeはGoogleアカウントから取得する権限だが、
https://www.googleapis.com/auth/gmail.modify読み書き
https://www.googleapis.com/auth/gmail.readonly読みのみ
https://www.googleapis.com/auth/gmail.compose送信できる
https://mail.google.com/全権限
の4つがあり、modifyでも良かったのかもしれないが、削除ができないようなことが書かれてたので全権にした。

今度は上の手順で取得したコードを使ってアクセストークンを取得するが、GETではなくPOSTする必要がある。
curl -d client_id=[クライアント ID] -d client_secret=[クライアント シークレット] -d redirect_uri=[リダイレクト URI] -d grant_type=authorization_code -d code=[ブラウザで取得したコード] https://accounts.google.com/o/oauth2/token
こんな感じでコンソールからcurlコマンドでPOSTした。
JSON形式でアクセストークン等が返ってくるが、トークンには有効期限があるので、必要なのはaccess_tokenではなくrefresh_tokenの方。
レスポンスは全部JSONで返ってくるね。

ここまでで取得できた、
[クライアント ID],[クライアント シークレット],[リフレッシュトークン]
の3つをアプリ(スクリプト)で使う。

https://www.googleapis.com/oauth2/v3/token
にPOSTで、
client_id=[クライアント ID]
client_secret=[クライアント シークレット]
refresh_token=[リフレッシュトークン]
grant_type=refresh_token
の4個のパラメータをContent-Type: application/x-www-form-urlencodedでリクエストする。
そうするとアクセストークンが返ってくる。


以下のリクエストはOAuthなんで、リクエストヘッダに、
Authorization: OAuth [アクセストークン]
が必要。

メール一覧の取得は、
https://www.googleapis.com/gmail/v1/users/[Google ID]/messages
にGETで取得できる。メールのメッセージIDがJSONで返ってくる。
[Google ID]はGoogleにログインする時のメールアドレスね。
パラメータ(クエリ)にlabelIdsでラベルを指定したり、qで検索条件を指定したりして取得するメールを絞れる。

メール本体の取得は、
https://www.googleapis.com/gmail/v1/users/[Google ID]/messages/[メッセージID]
にGETで取得でき、bodyはBase64された本文なんだが、ここでちょっとハマった。
Base64のデコードにMIME::Base64を使ったんだが、ここで取得できるBase64はURLセーフになってる。
$body=~s/-/+/g;
$body=~s/_/\//g;
こんな感じでURLセーフのBase64を通常のBase64に変換しないとMIME::Base64でデコードできない。
bodyの文字コードはUTF-8になってるんで文字コード変換は不要。

メールの削除は、取得と同じURLにGETではなくDELETEメソッドで接続すればできるようなんだが、
ゴミ箱への移動は、
https://www.googleapis.com/gmail/v1/users/[Google ID]/messages/[メッセージID]/trash
にGET。
削除方法はゴミ箱にした。


こんな感じ。
ちょっとハマったけど、シグネチャとか要らないからTwitterのOAuthよりは簡単かな。