リモート開発メインのソフトウェア開発企業のエンジニアブログです

Pythonを使ったSlackの投稿方法およびProxyについて

現在従事しているプロジェクトで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がいいと思います。

誤りや他にも方法がありましたら教えていただけると嬉しいです!

← 前の投稿

Docker による AWS Lambda 関数コンテナイメージ化のすすめ

次の投稿 →

Scala のテストライブラリのバージョン互換の件で苦労した話

コメントを残す