今度はFacebook Bot試してみる
https://developers.facebook.com/docs/messenger-platform/quickstart
ここに作り方書いてあるので、書いてある手順で設定する。
- Verify Tokenは自分が決めて設定、herokuのenvに反映
- Access Tokenはfacebook pageごとに違うので、コピーしてheorkuのenvに反映
Goコードは以下ようにすれば、オウムbotはできる。
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
"time"
)
var accessToken = os.Getenv("ACCESS_TOKEN")
var verifyToken = os.Getenv("VERIFY_TOKEN")
// const ...
const (
EndPoint = "https://graph.facebook.com/v2.6/me/messages"
)
// ReceivedMessage ...
type ReceivedMessage struct {
Object string `json:"object"`
Entry []Entry `json:"entry"`
}
// Entry ...
type Entry struct {
ID int64 `json:"id"`
Time int64 `json:"time"`
Messaging []Messaging `json:"messaging"`
}
// Messaging ...
type Messaging struct {
Sender Sender `json:"sender"`
Recipient Recipient `json:"recipient"`
Timestamp int64 `json:"timestamp"`
Message Message `json:"message"`
}
// Sender ...
type Sender struct {
ID int64 `json:"id"`
}
// Recipient ...
type Recipient struct {
ID int64 `json:"id"`
}
// Message ...
type Message struct {
MID string `json:"mid"`
Seq int64 `json:"seq"`
Text string `json:"text"`
}
// SendMessage ...
type SendMessage struct {
Recipient Recipient `json:"recipient"`
Message struct {
Text string `json:"text"`
} `json:"message"`
}
func main() {
http.HandleFunc("/", helloHandler)
http.HandleFunc("/webhook", webhookHandler)
port := os.Getenv("PORT")
addr := fmt.Sprintf(":%s", port)
http.ListenAndServe(addr, nil)
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Facebook Bot")
}
func webhookHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
if r.URL.Query().Get("hub.verify_token") == verifyToken {
fmt.Fprintf(w, r.URL.Query().Get("hub.challenge"))
} else {
fmt.Fprintf(w, "Error, wrong validation token")
}
}
if r.Method == "POST" {
var receivedMessage ReceivedMessage
b, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Print(err)
}
if err = json.Unmarshal(b, &receivedMessage); err != nil {
log.Print(err)
}
messagingEvents := receivedMessage.Entry[0].Messaging
for _, event := range messagingEvents {
senderID := event.Sender.ID
if &event.Message != nil && event.Message.Text != "" {
sentTextMessage(senderID, event.Message.Text)
}
}
fmt.Fprintf(w, "Success")
}
}
func sentTextMessage(senderID int64, text string) {
recipient := new(Recipient)
recipient.ID = senderID
m := new(SendMessage)
m.Recipient = *recipient
m.Message.Text = text
b, err := json.Marshal(m)
if err != nil {
log.Print(err)
}
req, err := http.NewRequest("POST", EndPoint, bytes.NewBuffer(b))
if err != nil {
log.Print(err)
}
values := url.Values{}
values.Add("access_token", accessToken)
req.URL.RawQuery = values.Encode()
req.Header.Add("Content-Type", "application/json; charset=UTF-8")
client := &http.Client{Timeout: time.Duration(30 * time.Second)}
res, err := client.Do(req)
if err != nil {
log.Print(err)
}
defer res.Body.Close()
var result map[string]interface{}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Print(err)
}
if err := json.Unmarshal(body, &result); err != nil {
log.Print(err)
}
log.Print(result)
}
基本的な流れは以下のようになります。
- Facebook APP作成
- verify tokenと決めてWebhooksになるものを用意する。herokuデプロイ
- Facebook上でwebhook(callback url)を設定
- Facebook上で対象facebook pageを選択してaccess tokenを取得
- Subscribe the App to the Page
curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=<token>"
- access tokenをコードに反映(herokuのenv)してもう一回デプロイ
- 対象facebook page行って「Message」してみる
作ったbotをfacebookに申請して承認されて一般公開されないと開発者との会話しかwebhookに反応しない。友達に見せたいのであれば、facebookアカウントをTestersに追加しても反応する。
facebook pageの管理者であれば、botアカウントでユーザーに返信することもできる。
Top comments (0)