【サーバー・PHPを使って】SlackのBotを作る(2020年対応)

前回のブログで完成させることができなかったので,ちゃんと丁寧に調べた結果をここに記します.自分のメモ用というところでもありますかね.

今回はサーバーを使ってSlackで動くbotを作っていきます.そのためさくらサーバーとかXサーバーとか,phpを動かせる環境があるのが前提です.

1.SlackでBotを作る


まず,Slack APIのサイトにアクセスし,「Create an App」というボタンをクリックします.

App Name -> 好きなアプリ名

Development Slack Workspace → アプリをいれるワークスペースを選択

で「Create App」

そうすると下のような画面になるはず.

そしたらこの赤い「Permissions」をクリック.

Scopeの設定

Bot Token Scopesの「Add an OAuth Scope」をクリック.

選択するスコープは「chat:write」

slack公式サイトの説明

日本語翻訳されていますが,メッセージを投稿するにはこの権限が必要です.

その他のスコープはスラック公式サイトで確認してください.

App Home

続いて左のらんの「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)

お疲れ様でした.

3.参考記事

レンタルサーバーを使って自動応答するSlack bot(Slack app)を作ってみた - Pepabo Tech Portal
はじめまして、そうせいじと申します。普段は内部監査室のセキュリティ監査チームに所属しており、コードを書く最前線は15年前に引退してるの身ですが、2019年度も9月に実施されたお産合宿に参加してちょっとだけコードを書いてきました。 そ...

コメント

タイトルとURLをコピーしました