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へ画像投稿でした!