APIを使ってメール一覧や本文を取得するサンプルIT系おじさんのチラシの裏2018年10月~プロフィールAUTHOR:とっちら書きたくなったときに書きたいことを書く雑記ブログ。IT系のネタが多いかも知れません。11:57とっちら1年前の記事に助けられました。14:28とっちらこの記事のお陰で60分録画できるようになりました。16:01とっちらライセンスを明示して貰えると使いやすいのですが。14:37ご回答いただきどうもありがとうございます。21:56とっちら超初心者です。)前回の記事、「GmailでIMAPが使えなくなるので自作プログラム用に認証キーを取得する」の続きです。Platformでプロジェクトを作成し、認証情報の入ったJSONファイルをダウンロードしましたので、今回はそれを使ってGmailへOAuth2.0で接続し、メールの一覧を取得するサンプルプログラムを作ってみます。以前は「PHPでIMAPを使いメールの本文を取得する例」で書いたとおり、PHPでIMAP接続を使い、Gmailからメールを取得していました。メンテナンス用の定期タスクで動かすことが多いプログラムですので、今後はChromeブラウザを自動操縦するPuppeteerも組み合わせて使っていきたいな、という目論見もあります。実際、今でも「puppeteerでAmazonのレポートページに自動ログインしてSSを撮る」の例にあるとおり、Amazonアソシエイトのレポートを自動でDLするようなタスクを組んで運用していたりします。Gmailの取得も、Chromeの自動操縦も全部Node.jsで一本化できたらスマートかな、とそんなふうに思ったわけです。Developersの公式ドキュメントを参考にするのが一番良いです。APIリファレンスを読みながら自分でコーディングしてみた次第です。Explorerという機能が付いていて、画面右側にパラメーターを入力するとすぐその場でAPIの実行を試せるのはすごく便利なのですが、そのせいかサンプルコードが少なく感じます。本題に入る前に環境構築に関する余談を少し。Node.jsはWindowsで使う場合でも下記ページから「推奨版」をダウンロードしてセットアッププログラムを実行し、[次へ][次へ]と進めるだけで何も難しいことを聞かれることもなく設定が完了します。https://nodejs.org/ja/しかし、毎回開発環境を移動したり、毎月のようにOSを初期化するような病気癖のあるぼくのような人の場合、環境はなるべくポータブルにしたい。セットアッププログラムを走らせずとも、単にフォルダコピーだけで環境構築が出来るようにしたい、そんな需要もあると思うのです。幸いなことにNode.jsについてもそういった配慮から(かどうかは知りませんが)、セットアップ不要なモジュールも配布されています。(.zip)」ですね。このZIPファイルを好きなフォルダに解凍すればすぐにnodejsが使用可能。パスが通っていないとコマンドが使いづらいですし、NODE_PATHという環境変数が設定されていないとnpmコマンドでモジュールをインストールするときに困ります。よって、あくまで一例ですが、下記のようなバッチファイルを用意して、これを実行してからnodejsを使うようにすると便利かも知れません。NODE_PATH=%cd%\node_modules\cmd実際、ぼくはネットワークドライブ上にnodejsを置いて、上記のバッチファイルを使うことで複数のマシンで同じ環境を共有できています。nodejsはモジュールが増えてくると細かい小さなファイルをたくさん読み込むせいか、ネットワークドライブだと動作が重いのが難点ですかね。以上、node.jsをポータブル環境で使う話でした。APIを使う準備Linuxのことはよく知らないので、Windows環境での話です。googleapis」でパッケージをインストールするだけです。vulnerabilitiesあとはここにJavaScript用のテキストファイルを作り、実際にコーディングしていきましょう。APIでトークンを取得する例Googleのサンプルではトークンの取得~ラベル一覧の取得まで1つのスクリプトで実行していましたが、そこは別にひとつにする必要はなく、一度取ったトークンはしばらく使いまわすと思うので、まずはトークン取得部分のみ作りました。['https://www.googleapis.com/auth/gmail.modify'];この部分ですが、前回の記事のOAuth同意画面で設定したスコープです。この例ではgmail.modifyですが、本当に読み取りしかしないならgmail.readonlyでも良いです。Platformの画面であらかじめ権限を設定しておく必要があります。ここが間違っていると認証画面で「お前にその権限はねーよ」的なことを言われて怒られます。PlatformでダウンロードしたJSONファイルをcredentials.jsonとリネームしておいてください。ちなみに、このjsonファイルの中身は、↓こんなふうになっています。2つをスクリプト中にハードコーディングしても構いません。して2つのスクリプトを作る予定なので、両方に固定値書くのもアレだしなぁーということで、JSONファイルを読むことにしました。PlatformでわざわざJSONファイルをDLする機能があるし、公式ドキュメントでもそういう使い方をしているので、従っておきましょ。//^&は&のエスケープ処理この部分はGoogleのサンプルから大きく変えました。Googleサンプルでは単にURLを表示して「ブラウザで開いてね」とメッセージを出しているだけですが、URLコピーしてブラウザ開いてアドレス欄に貼り付ける、なんて操作、クソ面倒くさくありませんか?URLわかってるんなら勝手にブラウザで開いてくれよ...と思ったのでそのようにしました。[URL]」というコマンドを実行してるだけです。普通、WindowsでstartコマンドにURLを渡せばデフォルトのブラウザが勝手に開くので、その動作に任せているだけですね。いう記号に変換しています。いわゆるエスケープ処理。正常にブラウザが起動すると下記のようなログイン画面が出てくるはずです。ログインに成功すると、お次は「テスト中のアプリだけど大丈夫か?招待元の開発者は信用できるんか?」と聞かれます。青字のボタンを押したくなりますが、そこはグッと堪えて[続行]ボタンを押します。■更に警告画面このアプリにアクセス権限、具体的にはGmailアカウントのメール閲覧、作成、送信の権限を与えようとしてるけど大丈夫?という警告が出ます。スコープ設定でgmail.modifyを選んでいるからですね。これがgmail.readonlyだと「メール閲覧」だけ表示されるのだと思います。自分で作ったアプリで自分のアドレスにアクセスするだけなので、気にせず[続行]ボタンを押します。■認証コード、ゲットだぜ!ここまできて、ようやく認証コードがもらえました。上の画面の黒塗りした部分が認証コードですが、右にあるアイコンでクリップボードにコピーできるので、そのままNode.jsの画面に戻って貼り付ければOK。いうテキストファイルにここで取得したトークン情報を保存します。最初のcredentials.jsonを読んで、OAuth2オブジェクトを初期化する部分はget_token.jsと同じなので省略します。連想配列に戻してsetCredentialsに渡していますが、基本これだけで認証が通るハズです。'me'});この部分でメールの一覧を取得していますが、パラメーターを渡すことで文言で絞り込んだり、ラベル指定したりも可能です。'me',q:'is:unread'});ラベルを指定して検索したい場合はラベルのIDを指定する必要があります。'me',q:'is:unread',labelIds:'IMPORTANT'});デフォルトで存在するラベルはIDが決まっているようで、うちのアカウントで調べた限りは下記のとおりでした。番号が付くIDになっているので、そういったラベルで検索したい場合はあらかじめラベルIDを調べておくか、ラベル名からIDを取得する関数でも作るしかなさそうです。いう関数を作って、ラベル一覧からラベル名を検索してIDを取得するようにしています。msg.data.payload.headers[j].value);break;}}思わずコメント欄でも不安を書いてしまいましたが、メールの件名取得でもひっじょ~~~に無駄なことをしている気がしてなりません。IMAPならメールの一覧取得時に件名も入ってくるので一覧表示は容易でした。APIのusers.messages.listの中には件名はなく、メッセージIDのみなんですよ。そのメッセージIDを使ってusers.messages.getでデータを取得するのですが、この中には素のヘッダーが配列で格納されています。効率的な取得方法があるのではないか、と疑問に思いつつも愚直にヘッダー配列を全件見ながらsubjectを探しています。大文字小文字が混在するので小文字に変換してから探しています。........................ホントにこんな面倒なことやらなきゃいけないの?解説:メールの本文を取得メール本文の部分は必ずbase64エンコードされているので、これを変換する必要があります。いえ、関数がやってくれるのでここは1行で済みます。//Base64変換まとめ無駄に長くなってしまった気がしますが、とりあえず、このコードでうちの環境ではうまく動作しています。PHP+IMAPでGmailを読んでいたときに比べると体感できるほど遅くなったので、とても無駄な動きをしている気がしてなりませんが、速度が重要な部分ではないので、まぁ...いい...の...かなぁ...?セキュリティの部分が面倒くさくなるのは仕方ないと思うんですよ。APIは...なんだろう...なんでこんな仕様なんだろうか。IMAPよりだいぶ使いづらくないですかね...?う~~~ん、なんか使い方が間違っている気もします。いえ、今のところはこの程度の知識しかないので、備忘録として残しておきます。レベルアップできたらもう少しまともなサンプルを掲載しますね。関連記事JavaScriptでファイル名順に複数ファイルを読み込む方法INPUTタグで複数ファイルを読み込む際、ブラウザ内で処理するときはFileReaderオブジェクトを使うことが多いと思います。これは非同期処理なので、はてファイル名順に処理する場合はど02024-06-13JavaScriptのcanvasで縦書きを行う際の備忘録canvas上に縦書きの文章を出力して画像化しようと考えてちょっとハマったので忘れないうちにメモしておきます。結論から先に書くと、基本的にcanvasにはwriting-modeの設定が効くの02024-06-11JavaScriptのWebAudioAPIで楽曲の口パクをしてみる以前、ソフトウェアの解説動画を作った際、おっさんの声だけ流れてるのもアレだし、最近流行りのアバターにしゃべらせるやつやってみよう、と思ったことがあります。vtuberとかおじさんよくわからない02023-11-20jQuery不要なLightbox代替スクリプトLuminousが本当に軽量jQueryって...重いですよね。各種ブラウザへの対応が面倒くさかった時代には本当にありがたかったのですが、モダンブラウザ全盛の今、jQueryの必要性を感じないことが多くなってきました。前回の記事「JavaScriptで画像を連続表示してコマ撮りムービー風の表示をしてみる」では連続して画像を表示することで、コマ撮りムービーのようなものをブラウザ上に表示することに成功しました。82023-01-24JavaScriptでTABLEにソート機能を実装する(jQuery不要)jQueryもそのプラグインも、外部ライブラリも使わず、自前で書いたJavaScriptでTABLEタグをソートするプログラミング例の紹介と解説です。コメント投稿直後ならコメントの編集/削除が可能です。※24時間経過するか、新しく投稿した場合は古い投稿の編集や削除は出来ません。※ブラウザでCookieが受け入れられない場合はこの機能は使えません。非公開にチェックを入れたコメントは管理人のみ閲覧できます。コメント投稿のガイドライン誰もが閲覧できるコメント欄ですので個人が特定できる情報等は書き込まないようにしましょう。他人のHPやブログの文章を掲載する場合は著作権法第32条「引用」の条件を満たすかご確認ください。誹謗中傷にあたる表現などは場合によっては法的な責任を問われる可能性があるためご注意ください。とっちらか~るTOP。