Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GCP Pub/Sub と Gmail API をいじる #12

Open
laughk opened this issue Aug 10, 2019 · 13 comments
Open

GCP Pub/Sub と Gmail API をいじる #12

laughk opened this issue Aug 10, 2019 · 13 comments

Comments

@laughk
Copy link
Owner

laughk commented Aug 10, 2019

#10 のつづき

Gmail API -> Pub/Sub -> CloudFunction 的なあれをやりたいのでそのへんいじる

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

image

「APIとサービス」→「APIとサービスの有効化」から連携サービスを探すことができて、
Gmail もある。こいつを有効にするとよさそう。

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

認証まわりがどう設定するのがいいかまだ良くわかってないので一旦スキップ

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

Pub/Sub の準備

image

適当な名前でトピックを作成し、 情報パネルのメンバー追加から gmail-api-push@system.gserviceaccount.com を Pub/Sub パブリッシャーとして追加する。

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

Cloudfunctions を用意

Gmail -> Pub/Sub がよくわかってないので一旦 Pub/Sub -> Cloud Functions へ
まずは雑にポチポチそれっぽく作る。

image

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

Gmail -> Pub/Sub

この辺がヒントになりそうかな
Push Notifications  |  Gmail API  |  Google Developers

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

どうも Gmail API と Pub/Sub の関係を勘違いしていた模様。
少し整理してみると以下のような感じらしい。

  • Gmail -> Pub/Sub へのキューイングは黙ってても行われなさそう
  • Gmail API に対し watch request を投げてはじめて Pub/Sub へのキューイングがされる
  • キューイングされる内容は Gmail 上のイベントの historyId のみ
  • キューイング先の Pub/Sub は Gmail API を有効にしたトピックを持つ必用がある

この辺は以下の記事が参考になる

Gmail APIとPub/Subでリアルタイムメール受信 on ruby - Qiita

テストした私が噛み砕くと、watchメソッドは、「gmail上のどんな些細な変更も順番に記録されているhistoryIDの中から、有る特定のイベント(正確な条件は私は調べても分からなかった)が起きた際に、指定されたPub/Sub上のトピックに、historyIDとその他些細なデータを含めたメッセージをPublishすることを試みることを一定期間において継続的に実行する」ことを起動するメソッドである。

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

つまり Pub/Sub を使うにせよ、結局どこかから何らかの方法で watch request し続ける必用がありそうで、 単純に Pub/Sub をトリガーとした Cloud Functions 一つでは上手くできなさそう。
Cloud Function だけでやるなら以下のように2つ用意する必用があるかも?

  • Cloud Shceduler と連携して1週間 watch し続ける Cloud Functions を週1で起動する
    • 起動の際にできれば既存の起動中の watch Function は落とす
  • Pub/Sub をトリガーとした historyId から Gmail のメッセージを引っ張ってきて通知を行う

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

💭 Pub/Sub にはいい感じにキューイングされそうだと思ってたので面倒臭くなってきた...

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

勢で #13 をやってしまったけど、これ多分いらなそう

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

こうすれば認証情報 (credentials.json)が取得できた

image

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

💭 Qiita の記事とかみてると Heroku や GAE に雑に Web アプリを立てているが、
それは Pub/Sub のサブスクリプションで設定するエンドポイントの話。今回は Pub/Sub のイベントをトリガーにするのでそこは考える必用は無い。(冷静にみればそりゃそーだ)

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

とりあえず watch request はできたっぽい

$ python watch.py
{'historyId': '11907096', 'expiration': '1566031177696'}

コードはこんな感じ

import typing as t

from googleapiclient.discovery import build

from fetch import get_creds


def watch(request: t.Dict):

    creds = get_creds()
    service = build('gmail', 'v1', credentials=creds)
    return service.users().watch(userId='me', body=request).execute()


if __name__ == '__main__':
    print(
        watch({
            'labelIds': ["INBOX", "SENT"],
            'topicName': 'projects/private-tool-kit/topics/gmail-tool',
        })
    )

https://github.com/laughk/TIL/blob/master/gmail_tool/modules/fetch.py#L60-L84

@laughk
Copy link
Owner Author

laughk commented Aug 10, 2019

watch を一回実行したら Pub/Sub にキューイングされ始めたっぽい

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant