2022年01月22日 更新
どうも、クラゲです。
ラズパイから簡単にチャットサービスSlackへ画像投稿します。例えば、ラズパイで自動撮影したカメラ画像を送信するなどに応用できます!
以前はIncomming Webhooksを使って画像送信できましたが、新しいSlack APIでは出来なさそうなので別の方法で行います。
[TOC]
以下のページから、ワークスペースを新規作成します。 既に自分で自由に使えるSlackワークスペースを持っている場合は、そちらを使っても構いません。
https://slack.com/intl/ja-jp/get-started
Slackを使ってない人はアカウント作成が必要です。
ワークスペース作成時はいくつか質問がありますが適当に入力してください。「社名またはチーム名」は「ワークスペース名」、「取り組んでいること」は「追加チャンネル名」になります。その他、招待などスキップできるところはスキップして構いません。
ここまでは特別な設定はなく、普通にSlakが使えるようになればOKです。
以下のページにアクセスしてAppを作成します。
Create an App
> From scratch
と選択します。
App Name
にアプリ名を入力して、Pick a workspace to develop your app in:
でワークスペースを選択しCreate App
ボタンを押します。
こんな画面になります。
Slack APIではスコープを追加することで、様々なことができるようになります。逆に言うとスコープを追加しないと何もできません。今回は、テキストによるチャット送信機能と、画像をアップロードして送信できる機能を追加します。
左側メニューでOAuth & Permissions
を選択
下にスクロールし、Scopes
のBot Token Scopes
にてセレクトボックスから以下2つを追加してください。チャット送信に必要なスコープがchat:write
で、画像送信に必要なスコープがfiles:write
です。
なお、User Token Scopes
という箇所もあるかと思いますが、今回はユーザーではなくボットとして投稿しますのでBot Token Scopes
にて設定します。
このような表示になればOK。
左側メニューでApp Home
を選択し、Your App’s Presence in Slack
にてDisplay Name (Bot Name)
とDefault Name
に文字列が入っていることを確認します。確認できれば特に何もする必要はないです。
もし、空欄になっている場合はEdit
ボタンを押して追記してください。文字列が日本語だと、うまくいかない場合がありますので、半角英語にしてみてください。
左側メニューでInstall App
を選択しInstall to Workspace
ボタンを押します。
許可する
ボタンを押して権限のリクエストを許可します。
ちなみに、▼ボタンを押すと先ほど追加したスコープが見られます。
もし、...にはインストールするボットユーザーがありません
と表示されている場合は、先ほどのApp Home
を確認してください。
このような画面になりトークンを取得できるようになります。Copy
ボタンを押すことでトークンをコピーできます。
Slackアプリにて、新しく作ったSlackのワークスペースを表示します。Webアプリでもデスクトップアプリでもどちらでも構いません。
先ほど作ったAppが追加されていますので選択します。
App
にて右クリックしてリンクをコピー
を選択し、メモ帳などに貼り付けてみてください。URL最後の/
以降(上記画像の黄色部)がチャンネルIDです。
いよいよ、ここからRaspberry Pi側のプログラムです。
まずはチャット送信のみの場合の例です。
urlとしてchat.postMessage
を使います。
import requests
url = "https://slack.com/api/chat.postMessage"
data = {
"token": "",
"channel": "",
"text": "Hello world"
}
requests.post(url, data=data)
上記コードにはtoken
とchannel
の値を記載していませんが、ここに先ほど取得したトークンとチャンネルIDを貼り付けてください。text
の値は任意の文字列でOKです。
実行するとこのようにチャット送信されます!
urlとしてfiles.upload
を使います。
import requests
url = "https://slack.com/api/files.upload"
data = {
"token": "",
"channels": "",
"initial_comment": "This is a cat"
}
files = {'file': open("cat.png", 'rb')}
requests.post(url, data=data, files=files)
上記のコードはpythonプログラムと同じディレクトリにcat.png
という画像ファイルがある前提です。画像ファイルの準備とファイル名変更を行ってください。
initial_comment
の値は同時に送信するチャットテキストで、任意の文字列でOKです。
実行するとこのように画像送信されます!
ちなみに、プログラム1はchannel
という単数形で、プログラム2はchannels
という複数形にしないと正常に動きませんのでご注意してください。
また、全く同じ内容の投稿を繰り返すと正常に動かない場合がありますので、テキストやコメントなどを少し変更してから実行してみてください。
以上、ラズパイからSlackへ画像投稿でした!