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

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

  • Post Author:

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

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

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。

コメントを残す