前回のブログで完成させることができなかったので,ちゃんと丁寧に調べた結果をここに記します.自分のメモ用というところでもありますかね.
今回はサーバーを使ってSlackで動くbotを作っていきます.そのためさくらサーバーとかXサーバーとか,phpを動かせる環境があるのが前提です.
Contents
1.SlackでBotを作る
まず,Slack APIのサイトにアクセスし,「Create an App」というボタンをクリックします.
App Name -> 好きなアプリ名
Development Slack Workspace → アプリをいれるワークスペースを選択
で「Create App」
そうすると下のような画面になるはず.
そしたらこの赤い「Permissions」をクリック.
Bot Token Scopesの「Add an OAuth Scope」をクリック.
選択するスコープは「chat:write」
日本語翻訳されていますが,メッセージを投稿するにはこの権限が必要です.
その他のスコープはスラック公式サイトで確認してください.
App Home
続いて左のらんの「App Home」をクリック.
Editを押して,ボットの表示名(Display name)とボットユーザー名(Default name)を設定して,「Add」をクリック.
続いて,その下にある「Always Show My Bot as Online」をOnにする.
2.サーバーとの連携
さて,ここからはサーバーを使用していきます.
一旦slackAPIサイトは置いておいて,,,
PHPファイルを作成します!
phpファイルの作成
作るものはこちら.(コピペでオッケー!)
<?php
$data = json_decode(file_get_contents("php://input"),true);
if($data["type"] == "url_verification"){
header('Content-Type: text/plain');
echo $data["challenge"];
exit;
}
?>
Code language: HTML, XML (xml)
これを適当な名前で保存して,自分のレンタルサーバーにアップロードしてください.そのURL(http(s)://~)を控えておいてください.
Event Subscriptions
さて,先ほどまで使っていたSlack APIのページに戻ります.
左の「Event Subscriptions」をクリック.
Enable EventsをOnに.さすれば下のようなURLを入れる欄が出てくると思います.
さて,このURLにはさっきのやつ!を入れます.
続いてその下にある「Subscribe to bot event」から「Add Bot User Event」をクリックして,
- 「app_mention」
- 「message.im
を追加する.
OAuth & Permissions
ここまできたらあと少し.
左の「OAuth & Permissions」をクリック.
ページに現れる「Install App to Workspace」をクリック.
これでワークスペースにインストールできました.
PHPファイルの編集
先ほど作ったPHPファイルにコードを追加していきます.コードを追加するために2つの文字列をメモします.
Basic Information
左の「Basic Information」をクリックして,少しスクロールすると,下のようなものが現れます.
①Signing Secret
これが1つ目です.signing Secretの値(写真の下のやつ)をコピーします.
OAuth & Permissions
左の「OAuth & Permissions」をクリックして,少しスクロールすると,下のようなものが現れます.
②Bot User OAuth Access Token
「Bot User OAuth Access Token」の値が2つ目です.これをコピーします.
これらの値を使って,少し前にアップロードしたphpファイルを編集します.
今回作るボットはこんな感じ.
phpのコードはこんな感じ.
<?php
//参考:https://www.seeds-std.co.jp/blog/creators/2019-09-24-100127/
//参考:https://tech.pepabo.com/2019/10/10/make-slack-app-by-rental-server/
//秘密情報
define("SLACK_SIGNING_SECRET" ,"[①をコピペ]");
define("SLACK_BOT_ACCESS_TOKEN","[②をコピペ]");
//イベント発生時にHTTPPOSTリクエストを受信する
$data = json_decode(file_get_contents("php://input"),true);
//URLの確認であればexit
if($data["type"] == "url_verification"){
header('Content-Type: text/plain');
echo $data["challenge"];
exit;
}
//event_callbackの場合に自動応答する
if($data["type"] == "event_callback"){
if(isset($data["event"]["subtype"]) && $data["event"]["subtype"] == "bot_message"){
exit; // 自分自身(bot)のメッセージは処理しない
}
// 自動応答メッセージの送信
$message=$data["event"]["text"];
// 送信メッセージは関数にしている.
send_slack_message($message,$data["event"]["channel"],$data["event"]["user"]);
}
function send_slack_message($message,$channel,$user)
{
//返答する文章の作成(attachmentsの中身)
$attachments[] =
[
'fallback' => 'daily',
"callback_id" => "daily",
"color" => "#F0E68C",
"attachment_type" => "default",
"text" => $message,//メッセージをそのまま返す
];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_URL => 'https://slack.com/api/chat.postMessage',
CURLOPT_HTTPHEADER => [
'Content-Type: application/json; charset=utf-8',
'Authorization: Bearer ' . '[②をコピペ]'
],
CURLOPT_POSTFIELDS => json_encode([
'channel' => $channel,//文字でチャンネルを指定することもできる.
'text' => "<@".$user.">\nおはよう!",//ユーザーをメンションする.アタッチメントに含まれないテキスト
"username" => "bot",//ユーザー名
'attachments' => $attachments
])
]);
$response = curl_exec($curl);
$response = json_decode($response, true) ?? null;
if ( !$response ) {
return false;
}
return $response;
}
?>
Code language: HTML, XML (xml)
お疲れ様でした.
コメント