2022年01月22日 更新

Raspberry PiからSlackへ画像投稿

どうも、クラゲです。
ラズパイから簡単にチャットサービスSlackへ画像投稿します。例えば、ラズパイで自動撮影したカメラ画像を送信するなどに応用できます!
以前はIncomming Webhooksを使って画像送信できましたが、新しいSlack APIでは出来なさそうなので別の方法で行います。

目次

[TOC]

Slackのワークスペース準備

以下のページから、ワークスペースを新規作成します。 既に自分で自由に使えるSlackワークスペースを持っている場合は、そちらを使っても構いません。

https://slack.com/intl/ja-jp/get-started

Slackを使ってない人はアカウント作成が必要です。
ワークスペース作成時はいくつか質問がありますが適当に入力してください。「社名またはチーム名」は「ワークスペース名」、「取り組んでいること」は「追加チャンネル名」になります。その他、招待などスキップできるところはスキップして構いません。

ここまでは特別な設定はなく、普通にSlakが使えるようになればOKです。

Slack APでApp作成

以下のページにアクセスしてAppを作成します。

https://api.slack.com/apps

Create an App > From scratch と選択します。


App Nameにアプリ名を入力して、Pick a workspace to develop your app in:でワークスペースを選択しCreate Appボタンを押します。


こんな画面になります。

スコープの追加

Slack APIではスコープを追加することで、様々なことができるようになります。逆に言うとスコープを追加しないと何もできません。今回は、テキストによるチャット送信機能と、画像をアップロードして送信できる機能を追加します。

左側メニューでOAuth & Permissionsを選択


下にスクロールし、ScopesBot Token Scopesにてセレクトボックスから以下2つを追加してください。チャット送信に必要なスコープがchat:writeで、画像送信に必要なスコープがfiles:writeです。

  • chat:write
  • files:write

なお、User Token Scopesという箇所もあるかと思いますが、今回はユーザーではなくボットとして投稿しますのでBot Token Scopesにて設定します。


このような表示になればOK。

SlackにApp登録してトークン取得

左側メニューでApp Homeを選択し、Your App’s Presence in SlackにてDisplay Name (Bot Name)Default Nameに文字列が入っていることを確認します。確認できれば特に何もする必要はないです。
もし、空欄になっている場合はEditボタンを押して追記してください。文字列が日本語だと、うまくいかない場合がありますので、半角英語にしてみてください。


左側メニューでInstall Appを選択しInstall to Workspaceボタンを押します。


許可するボタンを押して権限のリクエストを許可します。
ちなみに、▼ボタンを押すと先ほど追加したスコープが見られます。

もし、...にはインストールするボットユーザーがありませんと表示されている場合は、先ほどのApp Homeを確認してください。


このような画面になりトークンを取得できるようになります。Copyボタンを押すことでトークンをコピーできます。

チャンネルID取得

Slackアプリにて、新しく作ったSlackのワークスペースを表示します。Webアプリでもデスクトップアプリでもどちらでも構いません。
先ほど作ったAppが追加されていますので選択します。

Appにて右クリックしてリンクをコピーを選択し、メモ帳などに貼り付けてみてください。URL最後の/以降(上記画像の黄色部)がチャンネルIDです。

いよいよ、ここからRaspberry Pi側のプログラムです。

Pythonプログラム1:チャット送信

まずはチャット送信のみの場合の例です。
urlとしてchat.postMessageを使います。

import requests

url = "https://slack.com/api/chat.postMessage"
data = {
   "token": "",
   "channel": "",
   "text": "Hello world"
}
requests.post(url, data=data)

上記コードにはtokenchannelの値を記載していませんが、ここに先ほど取得したトークンとチャンネルIDを貼り付けてください。textの値は任意の文字列でOKです。


実行するとこのようにチャット送信されます!

Pythonプログラム2:画像送信

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