Diary of Duc

PHP – Viết Chatbot Facebook

2017-11-23

Dạo đây mình có hứng thú tìm hiểu về Chatbot và có viết 1 con để thư giãn bằng PHP, nay xin chia sẻ lại cho mọi người .

Cơ chế hoạt động

Để người dùng và page giao tiếp được với nhau, ta cần 1 Webhooks. Hiểu đơn giản Webhooks là cầu nối trung gian giữa người dùng và page, nếu người dùng gửi tới page ‘đang xem phim hả’, thì tin nhắn đó sẽ được chuyển tới Webhooks và nó kiểm tra điều kiện, sau đó gửi nội dung tin nhắn trả lời ‘Phim gì?’ cho page qua một API, page gửi lại cho người dùng.

Viết Webhooks

Viết code cấu hình Webhooks:

Mình đặt tên là boot.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php
header('Content-Type: text/html; charset=utf-8');
if(isset($_GET['hub_verify_token'])){
if($_GET['hub_verify_token'] === '123456789'){
echo $_GET['hub_challenge'];
return true;
}
else{
echo 'Invalid Verify Token';
return false;
}
}

$_GET[‘hub_verify_token’] là tùy ý đặt

Viết xử lý tin nhắn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
$input = json_decode(file_get_contents('php://input'), true);

if(isset($input['entry'][0]['messaging'][0]['sender']['id'])){

$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
$message = $input['entry'][0]['messaging'][0]['message']['text'];

$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<mã_token>';

$ch = curl_init($url);

$jsonData = '{
"recipient":{
"id":"' . $sender . '"
},';

$message_chuan_hoa = mb_strtolower($message);

if(strpos($message_chuan_hoa, 'xin chào') !== false || strpos($message_chuan_hoa, 'chào') !== false ){
$jsonData.= '"message":{
"text":"Chào anh!"
}
}';
}

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

if(!empty($message)){
$result = curl_exec($ch);
}
}
?>

php://input trả về dữ liệu thô trong header, ở đây là dạng json. Sau đó đọc ID và nội dung tin nhắn của người dùng lưu vào biến $sender$message. Dùng hàm mb_strtolower() chuẩn hóa tin nhắn của người dùng từ chữ hoa thành chữ thường để dễ so sánh.

Biến $jsonData lưu tin nhắn cần gửi lại người dùng, các trường:

* recipient : Người nhận tin nhắn, với id người nhận lưu trong key id
* message : Nội dung tin nhắn cần gửi, với key text là tin nhắn dạng text (văn bản thuần)

Dùng curl để gửi kèm tin nhắn $jsonData dạng json với phương thức post khi gọi API, nếu thành công thì người dùng sẽ nhận được tin nhắn từ page.

Cấu hình ứng dụng

Bạn cần phải có một ứng dụng Facebook, bạn có thể tạo một ứng dụng tại đây https://developers.facebook.com

Sau đó nhấn chọn “thêm sản phẩm” và thêm Messenger.

Thiết lập token:

Chọn page cần áp dụng, nhớ dán mã truy cập trang vào <mã_token> trong biến $url ở Webhooks viết bên trên

Thiết lập Webhooks:

Thực ra mình đã thiết lập Webhooks xong từ trước rồi, nhưng mọi người có thể nhấn vào “thiết lập webhooks” điền theo như hình dưới.

Mã xác minh nhập trùng với $_GET[‘hub_verify_token’] trong Webhooks viết ở bên trên.

URL gọi lại là đường dẫn tới Webhooks, lưu ý là URL phải có chứng chỉ https mới được facebook chấp nhận, trong hình là đường dẫn của mình.

Các trường gửi thì chỉ cần những quyền như mình tích ở ảnh là được, không thì tùy theo nhu cầu của bạn.

Nhấn “xác minh và lưu”, thành công được như hình dưới.

Không được quên chọn đăng ký page.

Bây giờ mình sẽ gửi tin nhắn “xin chào” cho page:

Page trả lời “Chào anh”

Viết thêm vài dòng code:

1
2
3
4
5
6
7
8
9
10
11
12
if(strpos($message_chuan_hoa, 'đang làm gì') !== false ){
$jsonData.= '"message":{
"text":"EM không biết! anh đoán đi :p!"
}
}';
}
if(strpos($message_chuan_hoa, 'phim') !== false ){
$jsonData.= '"message":{
"text":"Phim gì?"
}
}';
}


Vậy là Ok.

URL QR