現在従事しているプロジェクトでSlackへの投稿をPythonで実装することになったのですが、外部と通信するためにProxyサーバーを経由する必要があると後からわかりました。当初予定していたSlackwebではProxyへの対応方法がわからなかったため、他の投稿方法について調べSlackwebも含めてそれらをまとめました。
1.「Slackweb」を使用する方法
・Proxyの指定方法は不明。
・ポップアップ通知に slack.notify のtextで指定したメッセージの内容が表示されます。
・ Webhook URLを使用します。
・ blocksを使用できます。
コード例
import slackweb
slack = slackweb.Slack(url = "SlackのWebhook URL")
blocks = [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "メッセージ"
}
}
]
slack.notify(text = "メッセージ", blocks=blocks)
2-1.「requests.post」を使用する方法(Webhook URL)
・複数のProxyを指定できます。
・ポップアップ通知にメッセージの内容が表示されないという問題があります。
・Webhook URLを使用します。
・JSON形式を使うことによりblocksを使用できます。
コード例
import requests
import json
proxies = {'http':'http://xxx.xxx.xxx.xxx/:xxxx', 'https':'https://yyy.yyy.yyy.yyy:yyyy/'}
payload = {
"blocks": [{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "メッセージ"
}
}]
}
headers = {
"Content-Type" : "application/json; charset=UTF-8"
}
res = requests.post("SlackのWebhook URL", headers=headers, data=json.dumps(payload) , proxies=proxies)
2-2.「requests.post」を使用する方法(Bot User OAuth Token)
・複数のProxyを指定できます。
・ポップアップ通知にdataのtextで指定したメッセージの内容が表示されます。
・Bot User OAuth Tokenを使用します。 これはワークスペース単位となりdataでチャンネルを指定します。
・Blocksは使用できない模様。
コード例
import requests
proxies = {'http':'http://xxx.xxx.xxx.xxx/:xxxx', 'https':'https://yyy.yyy.yyy.yyy:yyyy/'}
data = {
'token': "SlackのBot User OAuth Token",
'channel': '#チャンネル',
'text': "メッセージ",
}
res = requests.post('https://slack.com/api/chat.postMessage', data=data , proxies=proxies)
3.「Slack SDK」を使用する方法
・1つのProxyを設定できます。
・ポップアップ通知にはchat_postMessage関数のtextで指定したメッセージ内容が表示されます。
・Bot User OAuth Tokenを使用します。これはワークスペース単位となりchat_postMessageでチャンネルを指定します。
・blocksを指定できます。
コード例
from slack_sdk import WebClient
client = WebClient(token="SlackのBot User OAuth Token", proxy='http://xxx.xxx.xxx.xxx:xxxx/')
blocks = [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "メッセージ"
}
}
]
response = client.chat_postMessage(channel="#チャンネル名", text="メッセージ", blocks=blocks)
所感
SlackやChatworkに投稿できるrequests.postの汎用性に驚かされます。Slackwebは情報量が少なく他の方法と比べてあまり使われていない感じがしますね。使い勝手は公式であるSlack SDKがいいと思います。
誤りや他にも方法がありましたら教えていただけると嬉しいです!