webhookを使ってSlackに通知を送る

みなさん、こんにちは。
この時期になると飲み会が増える渋谷です。
今回は、前回の記事pythonでWebスクレイピングで取得した内容で何かしたいと思ったので、取得内容を整形してSlackのアプリ incoming webhook を使ってSlackに送信する機能を作りました。
incoming webhook
最初に、Slackのアプリ incoming webhook の設定をします。
Slackの左サイドバーにあるAppをクリックし、Appディレクトリで incoming webhook を検索し、設定を追加します。
次にメッセージを送るチャンネルを聞かれるので、チャンネルを指定します(最初は自分にプライベートで送るようにしましょう)。
すると Webhook URL が生成されるのでそれをコピーしておきましょう(後で使います!)。
その他細かい設定がありますが、各々が好きなように設定し、設定を保存すれば、incoming webhookの作業は完了です。
例)
Pythonでコーディングする
前回のソースコードを改修して、送信するデータを整形します。
以下、ソースコードです。
# scraping.py
from datetime import datetime, date, timedelta
from bs4 import BeautifulSoup
import sys, re, requests, json
# 昨日の日付を取得する
# 例)2018/08/01
today = datetime.today()
yesterday_calc = today - timedelta(days=1)
yesterday = datetime.strftime(yesterday_calc, '%Y/%m/%d')
# 引数からタグを取得
if len(sys.argv) != 2:
print("タグを指定してください")
sys.exit()
else:
tag_name = sys.argv[1]
# MediumのURLを作成
url = "https://medium.com/tag/" + tag_name + "/archive/" + yesterday
html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
# 記事取得
article_element = soup.find_all("div", class_="streamItem streamItem--postPreview js-streamItem")
# 10件だけ取得
count = 0
is_article = False
for i in article_element:
# 記事のタイトル取得
article_title_tag = i.find("h3", class_="graf--title")
if article_title_tag:
article_title = article_title_tag.getText()
else:
article_title = '';
# 記事へのリンクを取得
article_url_tag = i.find(class_="link link--darken")
article_url = article_url_tag.get("href")
# clap数
clap_count_tag = i.find("button", class_="button button--chromeless u-baseColor--buttonNormal js-multirecommendCountButton u-disablePointerEvents")
if clap_count_tag:
clap_count = clap_count_tag.getText()
else:
clap_count = "0";
if re.findall('K' , clap_count) or int(clap_count) >= 600:
is_article = True
requests.post("ここに先ほど取得したWebhook URLを指定する", data = json.dumps({
"text": article_url,
"unfurl_links": True,
"username": "Medium",
"attachments":[
{
"color":"#006400",
"fields":[
{
"value": ":clap:" + clap_count,
"short": False,
}
]
}
],
}))
count = count + 1
if count == 10:
if is_article:
sys.exit()
else:
print("記事がありません")
前回のソースコードに追加して、新たに json ライブラリをインポートしています。
jsonライブラリは、JSON形式の文字列やファイルをPythonで扱うためのライブラリで、dumpを使う事でJSONファイルへデータを書き込む事ができます。
実行
下記コマンドで実行してみましょう。
$ python3 scraping.py blockchain
自分のSlackチャンネル宛に記事のURLが下画像のように送られてきているはずです。
まとめ
上記のコードだと、通知対象の記事が10件あれば通知が10件来てしまうのでうるさいです。しかし、10件を1件にまとめて通知するとURLのリンクが展開されず見た目的に気に入らないので、今のままにしています。(Slackの仕様で4つ以上のURLがまとまって通知されるとリンクが展開されないようです)
incoming webhookを利用して、Pythonからデータを送信してみましたが、思いの外簡単に実装できるのでみなさんも興味が湧いたら是非やってみてください!!