Facebook Bot APIをさくらインターネットのレンタルサーバーで動かしてみた
最近BOTが熱いですね。
一斉に情報を送信できたり、対話形式でのやりとりから情報を入手できるというのはとてもよさそうです。
さて、今回はSPAJAMというハッカソンでFacebook BOT APIを使ってみて色々と可能性を感じたのと情報がまだ少ないかなと思ったので導入的なものを書いてみました。
さっそく解説をしていきたいと思います。
こちらで開発者登録をしてない方は登録してください。
登録が完了したら、画面右上のマイアプリから新しいアプリを追加してください。
WWWでウェブを選んで適当なApp名を入れたらSkipしちゃって構いません。
Appを作ったら、Facebookページを作成 | Facebookから架空の人物やら適当に作ってください。
作ったらAppの画面に戻って左下にあるMessangerからトークンを生成しましょう。
生成するといってもFacebookのページを選ぶだけです。
その下にあるWebhookでユーザーからメッセージが飛ばされたときにコールバックされるURLを指定できます。
最初はFacebook側から送信されるものをきちんと処理しているかチェックされているようなので、正しくコードを書いてください。
public function hook() {
$hub_verify_token = "FacebookBotTest"; // 適当なトークン
if ($_GET['hub_verify_token'] == $hub_verify_token) {
echo $_GET["hub_challenge"];
} else {
echo 'error';
}
}
hub_verify_tokenの部分は自分で作成します
中身はなんでも大丈夫ですが、Facebook側から送るトークンと一致するようにしてください。
上手く行けばこのような画面になると思います。
なお、SSLが必要で送信先のURLはhttpsであるのが条件です。
さくらインターネットのコントロールパネルのドメイン設定→共有SSLを利用するに設定してください。
これで、アクセストークンとWebhookの設定が完了です。
では、BOTを起動しましょう。
curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token= "
この<token>の部分に生成したページアクセストークンを設定してください。
問題なければ
"success":true
と帰ってくるはずです。
これで問題なくBOTが動作するはずです。
ただ、今の段階ではBOTから何も帰ってこないので先ほど設定したWebhookのURLの中身を書き換えましょう
public function hook() {
define('VERIFY_TOKEN', 'あなたが設定したトークン');
$method = $_SERVER['REQUEST_METHOD'];
$access_token = "あなたのアプリのアクセストークン";
if ($method == 'GET' && $_GET['hub_mode'] == 'subscribe' &&
$_GET['hub_verify_token'] == VERIFY_TOKEN) {
echo $_GET['hub_challenge'];
} else if ($method == 'POST') {
// メッセージ受信
$json_string = file_get_contents('php://input');
$json_object = json_decode($json_string);
$from_user_id = $json_object->entry{0}->messaging{0}->sender->id;
$message = $json_object->entry{0}->messaging{0}->message->text;
//メッセージ作成
$post = <<< EOM
{
"recipient":{
"id":"{$from_user_id}"
},
"message":{
"text":"{$message}"
},
"notification_type": "REGULAR"
}
EOM;
$url = "https://graph.facebook.com/v2.6/me/messages?access_token={$access_token}";
$headers = array(
"Content-Type: application/json"
);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$output = curl_exec($curl);
}
}
改行されてないな・・・見難くてすみません。
これで動くはずです。
動かない方はコードの中にerror_logを出力するようにして内部で何が起きてるのかを確認できるようにしてみてください。
私のはこのような感じです。
これはただ単にメッセンジャーから受け取った文章と同じ文章を返すだけですが、簡単に出来ますね。
トークン関係で悩むやつなんていないよね。