はじめに
こんにちは!DMM WEBCAMPでメンターをしています@piyorです。
通学・出勤の時に電車が遅延しているかの確認をSlackで出来たら
チームメンバーなどで共有ができて便利ですよね
という訳で、運行状況をPythonでスクレイピングしてその結果をSlackに送信するものを作成しました。
対象者
- サーバレス(AWS Lambda)に興味がある方
- Webスクレイピングに興味がある方
- SlackAppに興味がある方
※今回Pythonのコードについては基本的には説明しません
※スクレイピングとはなに?って方はこちらの記事などを参考にしてください
※スクレイピングを禁止しているサイトも存在します。こちらの記事などを参考にしましょう
作るもの
👇この画像の部分を引っ張って来て、それをSlackに通知をするという流れになります
目次
目次 |
---|
構成 |
Lambda関数作成 |
API Gateway作成 |
SlackApp作成 |
Lambda関数の環境変数を設定する |
朝の9時にSlackAppがPOSTしてくれるように設定する |
終わりに |
参考 |
構成
構成は、朝の通知以外にもSlackからコマンドを叩いたら結果が帰ってくるようにしました
Lambda関数作成
Lambdaはサーバレスでコードを実行するためのサービスです
今回は、スクレイピング処理・Slackにスクレイピングの結果を送信するために使用します
Lambda関数を作成する
関数名:好きな関数名
ランタイム:Python3.8
他はデフォルト値で大丈夫です
外部ライブラリ・関数コードを用意する
使用ライブラリの説明
- os
- 標準ライブラリの1つでOS依存の機能使用するためのライブラリです
- 今回は環境変数を利用するために使用します
- requests
- HTTP通信のためのライブラリです
- Webページを取得するために使用します
- bs4 (beautifulsoup4)
- Webページから情報を取得するためのライブラリです
- スクレイピングを行うために使用します
- slackweb
- WebHookでSlackにPOSTするためのライブラリです
外部ライブラリ・関数コードの用意をする
Lambdaで外部ライブラリを使用する場合、別途用意する必要があります
詳細はAWS公式ドキュメントのPython の AWS Lambda デプロイパッケージなどを参考にしてください
今回は、使用する外部ライブラリ・関数コードを用意しているので次のコマンドを実行してください
※githubからクローンし、クローンしたファイル群をzip化するものです
$ git clone https://github.com/piyoraik/delay_bot.git
$ cd delay_bot
$ zip -r delay_bot.zip ./
※コードだけ見たい方※
import requests, bs4, slackweb, os
# URL・トークンの定義
url = "https://transit.yahoo.co.jp/traininfo/area/6/"
slack = slackweb.Slack(url=os.environ['SLACK_URL'])
def lambda_handler(event, context):
response = {
'statusCode': 200,
'isBase64Encoded': False,
'headers': {'Content-Type': 'application/json'},
'body': 'done'
}
fetch_result = data_fetch(url)
# 取得先のタイトルを取得
title = fetch_result.title.get_text()
# 遅延情報の取得
delay_info = fetch_result.find(id='mdStatusTroubleLine').find_all('a')
delay_info_text = ''
for info in delay_info:
delay_info_text += "\n" + info.get_text() + "\n" + info.get('href')
slack_send(slack, title, delay_info_text)
return response
# slackに情報の送信
def slack_send(slack, title , text):
attachments = []
attachment = {
"color":"#D00000",
"title": title,
"text": text,
"mrkdwn_in": ["text", "pretext"]
}
attachments.append(attachment)
slack.notify(attachments=attachments)
return
# requestsでデータをスクレイピング
def data_fetch(url):
get_url = requests.get(url)
bs4_obj = bs4.BeautifulSoup(get_url.text, 'html.parser')
return bs4_obj
Lambdaにアップロードする
.zipファイルを選択して、zipファイル化したdelay_bot.zip
を選択しアップロードします
※取得URLの変更を行う場合※
url = "https://transit.yahoo.co.jp/traininfo/area/6/"
現状ではlambda_function.py
4行目のこの記述により
https://transit.yahoo.co.jp/traininfo/area/6/
このURLの情報を取得しています
例えば、関東エリアの運行情報を取得したい場合は、4行目の記述を以下のように修正します
url = "https://transit.yahoo.co.jp/traininfo/area/4/"
修正後に最新としてデプロイをクリックし、変更を反映させましょう
API Gateway作成
API GatewayはAPIの作成を行うサービスです
今回は、API Gatewayで作成したURLを呼び出すと先程作成したLambda関数を実行させるために使用します
API Gatewayの作成をする
メソッドを作成し設定を行う
アクションからメソッドの作成をクリックし、POSTを選択します
※メソッドについてはこちらの記事などを参考にしましょう
選択後、セットアップを行います。
Lambdaプロキシ結合の使用とLambda関数を選択しましょう、選択後に保存をクリックします
APIのデプロイを行う
アクションからAPIのデプロイを選択しデプロイをしましょう
URLを確認する
デプロイをクリック後、URLが生成されます。
このURLは後で使用するのでいつでも確認できるようにしておきましょう
ここまでで作成したLambda関数を上のURLから呼び出す設定が完了しました
※今回POSTメソッドで作成しているのでブラウザでそのままURLを開いてもLambda関数は実行されません※
SlackApp作成
SlackAppを作成する
まず、SlackAppを作成するために下記URLにアクセスします
https://api.slack.com/apps
SlackAppを作成するウィンドウが出てくるので、アプリ名とインストールをするワークスペースを選択します
選択後、Create Appをクリックし作成を行いましょう
Slash Commandsを作成する
SlackからAPI Gateway経由でLambda関数を呼び出すためにこちらを使用します
SlashCommandsからCreate New Commandを選択します
Slash Commandsを作成ページに遷移するのでコマンドの作成を行っていきましょう
次のように記述します
- Command: 呼び出すコマンドを入力
- RequestURL: API Gatewayのアドレスを入力
- Short Description: コマンドの説明を入力
- Usage Hint: 使い方のヒントを入力
入力が終わったらsaveをクリックし保存をしましょう
Incoming Webhooksの設定を行う
Incoming Webhooksのページに遷移し有効にしましょう
有効にしたらAdd New Webhook to Workspaceという項目が現れるのでここをクリックします
クリック後、SlackAppが投稿をするチャンネルを選択する画面が出てくるので選択し許可をします
選択後Webhook URLが発行されているので控えておきましょう、後で使用します
ワークスペースにSlackAppにインストール
一通りの作業が終了したので、ワークスペースにSlackAppをインストールしていきます
黄色に表示されている部分をreinstall your appを選択し、インストールを行います
これでSlackAppの設定が完了です
Lambda関数の環境変数を設定する
環境変数の設定
Lambda関数からSlackに投稿するために環境変数の設定を行います
環境変数についてはこちらの記事などを参考にしてください
slack = slackweb.Slack(url=os.environ['SLACK_URL'])
PythonではLambda関数5行目のos.environ['SLACK_URL']
が環境変数の部分になります
Lambdaの環境変数設定で設定を行います
次のように記述します
キー:「SLACK_URL」と入力
値:Webhook URLをペースト
記述が出来たら保存を行います、これで環境変数の設定が完了です
動作確認
ここまで終わったらSLACKからLambda関数を呼び出すための設定が完了です!
実際にSlackから動作を確認してみましょう
Slackから/command
と入力すると次のように出てくるので選択して投稿してみましょう
POST後、このようにSlackAppから投稿されたら成功です!
朝の9時にSlackAppがPOSTしてくれるように設定する
SlackのSlash Commandから要求することは出来たので毎朝9時に投稿してくれるように設定をしていきます
Lambda関数を開きトリガーを追加をクリックします
クリックをすると、トリガー追加画面に遷移するので**EventBridge(CloudWatch Events)**を選択します
今回はこのEventBridgeという機能を用いて毎朝9時に実行させます
それでは設定していきます、次のように入力しましょう
ルール:「新規ルールの作成」を選択
ルール名:ルール名を入力
ルールタイプ「スケジュール式」を選択
スケジュール式:cron(00 00 * * ? *)
と入力
スケジュール式のcronの設定は、AWSのページにも記載されていますがUTC時間で設定をします
設定は**cron(分 時 日 月 曜日)**という記載方法になります
cronの設定については、AWS公式ドキュメントのルールのスケジュール式を参考にしてください
入力が出来たら追加をクリックしトリガーを有効化しましょう
これで毎朝9時にSlackAppが9時になると遅延情報をお知らせしてくれるようになります!
終わりに
お疲れ様でした!
今回のハンズオンで少しでもAWSやPythonに興味を持っていただいたら幸いです!
明日は@yoshimurayoshikiの番です!引き続き楽しんでいってください!
参考
Slackにincoming webhook経由でpythonからメッセージをPOSTする
Python Webスクレイピング 実践入門
API Gateway + LambdaでREST API開発を体験しよう [10分で完成編]