はじめに
お昼にお弁当の注文をWebでいつもしているのですが、よく忘れます。
そこでslackに毎朝通知が来るようにすれば忘れ防止になると思い、試していたらハマった箇所があったのでメモです。
まずは単純にSlackへのpostを成功させる
slack chat.postMessage API がスタンダードなメッセージをPOST するAPIがあると思いますが、帯をつけたメッセージにしたいなと思う時、attachementが使えます。
python のrequests モジュールを使ってattachmentを定義する際、少しハマりました。
import json
import requests
SLACK_TOKEN = YourToken
SLACK_CHANNEL = YourChannelId
res = requests.post(url='https://slack.com/api/chat.postMessage', data={
'token': SLACK_TOKEN,
'channel': SLACK_CHANNEL,
'as_user':'true',
"attachments": json.dumps([
{
"title": "おべんとねっと",
"title_link": "https://www.obentonet.jp/login.html",
"text": "今日の注文はお済みですか?まだの方はお忘れなく",
"image_url": "https://pbs.twimg.com/profile_images/918467156697694209/7Za_rDKG.jpg",
"color": "#36a64f",
"footer": "XXXX"
}
])
}).json()
print(res)
attachments はJson.dumps かけないとだめのようです。
ちゃんとドキュメントにもかいてありますね。
そのほかのパラメータについては公式ドキュメント を参照してください。
今回はおべんと注文サイトのおべんとねっとさんへタイトルを押したら遷移できるようにしています。
次に定刻でPythonコードが実行されるようにAWS Lambda を設定する
続いて毎朝10時になったらpostをするというのをAWS Lambdaを使って実装します。
Lambda では5,6行目の TOKEN、ACCESS_CHANNELのようなキー情報は、lambdaのソースコードには直接書かずに環境変数に書き出すことができます。
※ただし、今回はモジュールのインストールが必要になることからやめました。
lambda_handler の中身はほぼそのままで、
以下のようなソースになります。
これをそのままAWS コンソールで使おうと思っても使えません。
requestsモジュールはlambdaでは標準インストールされておらず、
こういった場合は、pip installをlambda上でしなくなるところですができません。
ローカルでファイルを作成して、それをzip圧縮してアップロードをしなければなりません。
def lambda_handler(event, context):
# TODO implement
import json
import requests
SLACK_TOKEN=YourToken
SLACK_CHANNEL=YourChannelId
res = requests.post(url='https://slack.com/api/chat.postMessage', data={
'token': SLACK_TOKEN,
'channel': SLACK_CHANNEL,
'as_user':'true',
"attachments": json.dumps([
{
"title": "おべんとねっと",
"title_link": "https://www.obentonet.jp/login.html",
"text": "今日の注文はお済みですか?まだの方はお忘れなくー",
"image_url": "https://pbs.twimg.com/profile_images/918467156697694209/7Za_rDKG.jpg",
"color": "#36a64f",
"footer": "XXXX"
}
])
}).json()
return res
関数の名前はlumbda_handlerでないとだめなので注意してください。
上記ファイルをローカルに作った任意のフォルダに格納して、
そのフォルダまで移動した状態で、
$ pip install requests -t .
を行います。カレントディレクトリにライブラリをインストールすることができます。
lambdaのアップロードにはzipファイルにする必要があるため、
$ zip -r upload.zip *
ディレクトリの中身丸ごと圧縮してくれます。
その後、コードエントリタイプからzipファイルをアップロードを選択して、
uploadでlambda関数を作る場合、環境変数の外だし定義は使えないようで、
ローカルで作るファイルに直に必要があります。
まずはこの状態で問題なくlambda が動作するのか確認しておいたほうがよいです。
右上のテストボタンを押して、エラーなく正常終了して、slack に通知が飛べばOK
最後にLambdaの起動トリガーをCloudWacth Events のスケジュールにする
あとは、CloudWatchEvents を使って、定刻に呼び出すようにしていきます。
ルールを新規作成して、
スケジュールで実行を選んで、Cron式を任意の時間に設定します。
Cron式:0 1 ? * MON-FRI *
毎週月曜から金曜の10時の場合だと上記のように設定になります。
最後に
これでEC2など立ち上げることなく、定刻になったら指定したslackチャネルに
通知が来るようになります。
お弁当の注文しわすれがなくなりますね!