
CÁC VÍ DỤ LẬP TRÌNH RASPBERRY PI PICO WIRELESS VỚI MICROPYTHON
Xem thêm...
Time: 21:59 19/03/2024 | Cao Văn Vinh
---------------------------------
Tiếp tục Serial về những project hay ho, hôm nay mình sẽ giới thiệu xây dựng một Chat Bot Telegram với PHP
Mục đích của project này sẽ hỗ trợ những bạn làm bên mảng Web hay IoT đều được. Bởi bạn có thể xây dựng chat bot cho riêng mình, đồng thời bên nhúng - IoT, bạn có thể xây dựng từ bot chat này để lấy những giá trị như nhiệt độ, độ ẩm,... và gửi giá trị qua telegram khi cần! Rất hay phải không nào? Xin lưu ý rằng ở bài viết này, bạn cần sở hữu tên miền & hosting riêng đã đăng ký. Mình sẽ trỏ con Bot này tới địa chỉ tên miền đó.
Các bước thực hiện như sau:
Đầu tiên, bạn vào telegram và tìm BotFather -> Sau đó nhập dòng lệnh /NewBot. Sau đó nhập tên chatbot bạn muốn đặt, lưu ý cuối tên phải có chữ "Bot". Như bạn thấy hình bên dưới, mình đã xây dựng một chatbot tên là Canh Bao Khi Gas Bot. Sau khi xong bạn thấy một mã API ở bên dưới: cụ thể như hình ở dưới! Bây giờ việc của chúng ta là test API này trước xem nó có hoạt động không. Sau đó trỏ con bot này về một tệp tin php mà mình tự lập trình.
Để test con bot này tồn tại hay chưa, bạn nhập câu lệnh sau vào thanh trình duyệt:
https://api.telegram.org/bot(api)/getMe
Ví dụ như mình ở đây thì mình sẽ nhập là:
https://api.telegram.org/bot7106862022:AAGscdm_QSei8Xmt0fDqJ9dzuM-3JF8fTxk/getMe
Ở đây, api sẽ trả về giá trị như sau:
{"ok":true,"result":{"id":7106862022,"is_bot":true,"first_name":"Canh Bao Khi Gas","username":"CanhBaoKhiGasBot","can_join_groups":true,"can_read_all_group_messages":false,"supports_inline_queries":false}}
Như bạn có thể thấy, ở đây API trả về các giá trị liên quan tới thông tin về con botchat mình vừa tạo. Mình đã gặp trường hợp không nhận được phản hồi từ máy chủ, các bạn spam F5 là được!
Việc tiếp theo, bạn cần làm là trỏ chatbot về một file PHP trên website của bạn. Sau đó lập trình trong file PHP đó. Ở đây, mình sử dụng tên miền đã đăng ký sẵn: vinhcaodatabase.com & hosting của Tenten. Bây giờ mình sẽ tiến hành vào cpnel và tải lên một file PHP. Giải sử bây giờ mình sẽ tải lên một file là bot.php ở folder esp32. Lúc này mình sẽ trỏ tới file PHP có địa chỉ:
https://vinhcaodatabase.com/esp32/bot.php
Để trỏ tới địa chỉ file này, chúng ta nhập trên thanh địa chỉ của trình duyệt cú pháp sau:
https://api.telegram.org/bot7106862022:AAGscdm_QSei8Xmt0fDqJ9dzuM-3JF8fTxk/setWebhook?url=(urlwebsite của bạn)
Ở ví dụ của mình, để mình trỏ tới file php trên trang web của mình, mình nhập vào thanh địa chỉ như sau:
https://api.telegram.org/bot7106862022:AAGscdm_QSei8Xmt0fDqJ9dzuM-3JF8fTxk/setWebhook?url=https://vinhcaodatabase.com/esp32/bot.php
Nếu thành công, website sẽ trả về giá trị:
{"ok":true,"result":true,"description":"Webhook was set"}
Bước tiếp theo, chúng ta sẽ lập trình cho PHP
Bạn click vào đây để download code mình đã lập trình sẵnBây giờ bạn sẽ có một file PHP, lưu ý rằng bạn cần chèn $BOT_TOKEN giá trị API. Như mình sẽ là 7106862022:AAGscdm_QSei8Xmt0fDqJ9dzuM-3JF8fTxk
<?php
$BOT_TOKEN = "";
$update = file_get_contents('php://input');
$update = json_decode($update, true);
$userChatId = $update["message"]["from"]["id"]?$update["message"]["from"]["id"]:null;
if($userChatId){
$userMessage = $update["message"]["text"]?$update["message"]["text"]:"Nothing";
$firstName = $update["message"]["from"]["first_name"]?$update["message"]["from"]["first_name"]:"N/A";
$lastName = $update["message"]["from"]["last_name"]?$update["message"]["from"]["last_name"]:"N/A";
$fullName = $firstName." ".$lastName;
$replyMsg = "Hello ".$fullName."\nYou said: ".$userMessage;
$parameters = array(
"chat_id" => $userChatId,
"text" => $replyMsg,
"parseMode" => "html"
);
send("sendMessage", $parameters);
}
function send($method, $data){
global $BOT_TOKEN;
$url = "https://api.telegram.org/bot$BOT_TOKEN/$method";
if(!$curld = curl_init()){
exit;
}
curl_setopt($curld, CURLOPT_POST, true);
curl_setopt($curld, CURLOPT_POSTFIELDS, $data);
curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
curl_close($curld);
return $output;
}
?>
Ta sẽ phân tích code một chúng nhé, ở đây dòng đầu tiên $BOT_TOKEN là để các bạn chèn API vào. 3 dòng tiếp theo, đặc biệt là dòng cuối nhằm mục đích dùng nhận được id của người chat tới bot khi có sự kiện trả về. Bạn để ý trong lệnh điều khiện if. Ở đây mình kiểm tra $userChatId tức mình đang kiểm tra từ chính ID Telegram mà người dùng nhắn tin vào cho bot. Mỗi tài khoản telegram sẽ có ID khác nhau nên giá trị trả về cho mỗi người là khác nhau. Khi có tin nhắn từ một ID nào đó, mình tiến hành đọc các giá trị về tin nhắn của user đã nhắn gì, lấy các giá trị về name.Sau đó mình viết một biến với kiểu String là $replyMessage. Biến này mục đích mình sẽ gửi đi lại cho người dùng bằng một function mình viết ở dưới.
Function này có 2 giá trị tham số truyền vào là $method và $data. Mục đích của function này nhằm gửi là cho chat bot nội dung bằng phương thức GET HTTP. Tên function này là send. Mình đã gọi function này ở chương trình trên.
Việc của các bạn lúc này là hãy để code này vào chính file bot.php trên Hosting mà ngay ban đầu mình đã đề cập. Như mình đã đẩy source code này lên rồi, mình sẽ test con chat bot này thử nhé!
Các bạn có thể, chatbot này đã hoạt động rồi. Bây giờ, mình và bạn sẽ làm những ứng dụng to hơn để tận dụng sức mạnh của chatbot này. Ở trường hợp của mình, mình sẽ dùng chatbot này để nhận những dữ liệu đọc từ database. Dữ liệu này bao gồm nhiệt độ, độ ẩm & khí gas. Bây giờ, mình sẽ trỏ tới một file khác. File của mình ở đây là data_ajax.php. Nói nôn na, file này là file mình nhận dữ liệu từ database và sử dụng kỹ thuật ajax để nhận dữ liệu liên tục
Khi đọc từ database về, mình có những biến chính về 4 thông số chính như sau:
$last_reading_temp = $last_reading["value1"];
$last_reading_humi = $last_reading["value2"];
$last_reading_gas = $last_reading["value3"];
$last_reading_time = $last_reading["reading_time"];
Nhìn sơ qua đoạn code, ta có thể thấy các giá trị được lưu vào 4 biến và chúng là những kết quả cuối cùng đọc được database từ những cột khác nhau. Hàm last_reading được mình viết ở một file khác. Bây giờ, mình sẽ tiến hành gửi những liệu đó qua bot chat telegram
<?php
$BOT_TOKEN = "7106862022:AAGscdm_QSei8Xmt0fDqJ9dzuM-3JF8fTxk";
$update = file_get_contents('php://input');
$update = json_decode($update, true);
$userChatId = $update["message"]["from"]["id"]?$update["message"]["from"]["id"]:null;
if($last_reading_gas==1){
$userMessage = $update["message"]["text"]?$update["message"]["text"]:"Nothing";
$firstName = $update["message"]["from"]["first_name"]?$update["message"]["from"]["first_name"]:"N/A";
$lastName = $update["message"]["from"]["last_name"]?$update["message"]["from"]["last_name"]:"N/A";
$fullName = $firstName." ".$lastName;
$replyMsg = "CẢNH BÁO! \nCẢNH BÁO CÓ KHÍ GAS. \nTruy cập vinhcaodatabase.com/esp32/ để xem dữ liệu!";
$parameters = array(
"chat_id" => 2102482150,
"text" => $replyMsg,
"parseMode" => "html"
);
send("sendMessage", $parameters);
}
if($userChatId){
$userMessage = $update["message"]["text"]?$update["message"]["text"]:"Nothing";
$firstName = $update["message"]["from"]["first_name"]?$update["message"]["from"]["first_name"]:"N/A";
$lastName = $update["message"]["from"]["last_name"]?$update["message"]["from"]["last_name"]:"N/A";
$fullName = $firstName." ".$lastName;
if($userMessage=="xin chao"or"xin chào") {$replyMsg = "Xin chào! ".$fullName."\nRất vui được gặp bạn! Tôi là Bot Canh Bao Khi Gas - Được xây dựng và phát triển bởi nhóm 3 trong môn TT Nhúng. \nBạn có thể ra lệnh cho tôi như sau: \n
nhiet do: để nhận dữ liệu nhiệt độ hiện tại
do am: để nhận dữ liệu độ ẩm hiện tại
khi gas: để nhận dữ liệu từ MQ2 đang thu thập được
info: để xem thông tin về nhóm tác giả
" ; }
if($userMessage=="nhiet do") {$replyMsg = "Xin chào! ".$fullName."\nNhiệt độ đang đo được là: ".$last_reading_temp. " độ C"."\nLần nhận được dữ liệu là vào lúc\n".$last_reading_time; }
if($userMessage=="do am") {$replyMsg = "Xin chào! ".$fullName."\nĐộ ẩm đang đo được là: ".$last_reading_humi. " %"."\nLần nhận được dữ liệu là vào lúc\n".$last_reading_time; }
if($userMessage=="khi gas") {$replyMsg = "Xin chào! ".$fullName."\nHiện tại chúng tôi không phát hiện bất kỳ vấn đề bất thường nào về khí GAS"."\nLần nhận được dữ liệu là vào lúc\n".$last_reading_time; }
if($userMessage=="info") {$replyMsg = "Thông tin tác giả:\n1. Cao Văn Vinh\n2. Trần Tuấn Việt\n3. Nguyễn Phúc Huy\nSĐT LH: 0865.700.435"; }
$parameters = array(
"chat_id" => $userChatId,
"text" => $replyMsg,
"parseMode" => "html"
);
send("sendMessage", $parameters);
}
function send($method, $data){
global $BOT_TOKEN;
$url = "https://api.telegram.org/bot$BOT_TOKEN/$method";
if(!$curld = curl_init()){
exit;
}
curl_setopt($curld, CURLOPT_POST, true);
curl_setopt($curld, CURLOPT_POSTFIELDS, $data);
curl_setopt($curld, CURLOPT_URL, $url);
curl_setopt($curld, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($curld);
curl_close($curld);
return $output;
}
?>
Ở đoạn code này khác ở trên một chút. Ở đây mình lấy giá trị từ biến $last_reading_gas để mình kiểm tra. Bình thường lúc không có khí gas thì giá trị là 0, khi có khí gas sẽ được đưa lên 1. Lúc này điều khiền trong lệnh if được thoải mãn. Lúc này cảnh báo khí gas sẽ được gửi cho chính tài khoản của mình, vì lúc này chat_id mình đã định nghĩa sẵn id tài khoản telegram của mình. Mục đích là tạo tin nhắn chủ động từ chatbot gửi về khi có những dấu hiệu bất thường từ cảm biến, chứ không phải do người dùng đưa ra yêu cầu thì chatbot mới gửi kết quả về. Đồng thời mình sẽ kiểm tra người dùng có nhắn tin tới bot chat không, nếu kiểm tra có thì trả về các giá trị tương ứng như nhiệt độ, độ ẩm, khí gas,,...
Như bạn đã thấy mình test, chatbot hoạt động rất tốt. Nếu bạn có nhu cầu thực hiện đề tài hoặc thực hiện đồ án tương tự và cần sự trợ giup. Hãy liên hệ với mình!
Và đừng quên, mình có hỗ trợ code đồ án thuê với các dự án liên quan tới vi xử lý (PIC, Arduino, Rapsberry Pi, ESP32/ESP8266). Hỗ trợ giao tiếp webserver, database. Hỗ trợ truyền dữ liệu không dây như Lora, RF.... Đặc biệt nhận thiết kế xe điều khiển, xe tự hành, xe tránh vật cản,... với giá hạt dẻ. Chi tiết liên hệ 0865700435 hoặc bất kỳ phương tiện nào nha!