Membina telegram bot menggunakan PHP sahaja!

telegram bot

Telegram ialah perkhidmatan pemesejan popular yang lengkap dengan ciri keselamatan. Ia mempunyai semua ciri yang anda harapkan daripada platform sembang moden, termasuk chatbots: ejen berasaskan perisian yang boleh anda atur cara untuk membaca dan membalas mesej pengguna lain.

Dalam panduan ringkas ini, saya akan membantu bagaimana anda boleh menulis bot Telegram sendiri dalam masa kurang dari 30 minit hanya menggunakan PHP.

Langkah Satu: Sediakan Profil Telegram Bot Anda

Menyediakan profil bot anda dengan mendapatkan token dari API Telegram.

Untuk menyediakan profil bot baharu, log masuk ke akaun Telegram anda dan mulakan perbualan dengan BotFather (@BotFather), iaitu akaun rasmi yang membolehkan anda membuat dan mengurus bot. Dalam perbualan itu, masukkan arahan /newbot.

BotFather akan meminta anda memilih nama paparan dan nama pengguna untuk bot anda. Nama pengguna mesti berakhir dengan "bot" dan mestilah unik. Dalam contoh, saya menetapkan nama paparan Waktu Solat Bot dan nama pengguna tutowsolat_bot.

botfather newbot command

Sebaik sahaja anda mendapat nama pengguna yang sah, BotFather akan mendaftarkan bot anda secara automatik dan membalas dengan API telegram token unik untuk bot itu. Pastikan anda tidak berkongsi token anda dengan sesiapa.

Langkah Kedua: Buat Webhook untuk Bot Anda

Langkah seterusnya dalam mencipta bot Telegram ialah menyediakan webhook yang akan berkomunikasi dengan bot anda. Webhooks ialah cara API memberitahu anda bahawa sesuatu telah berlaku, yang menghalang anda daripada perlu menanyakan API setiap beberapa minit (atau saat) untuk mengetahui sama ada, sebagai contoh, mesej baharu telah dihantar.

Telegram menggunakan satu jenis webhook yang menghantar kemaskini (update) objek kepada anda apabila apa-apa berlaku.

Menyediakan webhook adalah sangat mudah. Hanya terdapat dua perkara yang perlu anda ketahui: token API anda (dalam langkah satu) dan URL tempat anda akan hostkan bot anda. URL akan menjadi seperti https://yourdomain.com/yourbot.php. Pastikan anda memasukkan https pada permulaan URL; jika tidak, Telegram tidak akan menghantar webhook.

Sekarang, pada web brower anda, navigasi ke url ini:

https://api.telegram.org/bot/setwebhook?url=https://yourdomain.com/yourbot.php

{"ok":true,"result":true,"description":"Webhook was set"}

Sekarang webhook anda kini tersedia dan berjaya!

Langkah Tiga: Tulis Coding untuk Bot Anda

Masa untuk bahagian yang menyeronokkan! Pada ketika ini, anda mempunyai semua yang diperlukan untuk menulis coding bot Telegram anda. Kita teruskan…

Saya akan membuka Notepad++ dan mula menulis kod saya di sana. Memandangkan ini adalah PHP, pastikan anda memasukkan coding anda dengan

<?php 
//coding anda
?>

Perkara pertama yang perlu dilakukan ialah memulakan pembolehubah yang akan memudahkan kita memanggil API Telegram.

$BOT_TOKEN ="<yourtoken>";
$url= "https://api.telegram.org/bot".$BOT_TOKEN;

Memandangkan saya akan menerima update melalui webhook, mari kita update susunan data kita:

$update = file_get_contents('php://input');
$update = json_decode($update, true);

Contoh bila kita taip command /wsolat di telegram (https://t.me/RawDataBot) :

{
    "update_id": 824960055,
    "message": {
        "message_id": 1875348,
        "from": {
            "id": 700873795,
            "is_bot": false,
            "first_name": "IKnerd",
            "last_name": "MY",
            "username": "iknerdmy",
            "language_code": "en"
        },
        "chat": {
            "id": 700873795,
            "first_name": "IKnerd",
            "last_name": "MY",
            "username": "iknerdmy",
            "type": "private"
        },
        "date": 1675178518,
        "text": "/wsolat",
        "entities": [
            {
                "offset": 0,
                "length": 7,
                "type": "bot_command"
            }
        ]
    }
}

Sekarang kita keluarkan dua data penting daripada update iaitu ID pengguna dan mesej pengguna telegram (jika tiada mesej baru, data ini mungkin kosong dan kita akan merekodkannya nanti):

$userChatId = $update["message"]["from"]["id"];
$userMessage = $update["message"]["text"];

Gunakan JSON viewer dan JSON beautifier untuk memudahkan anda faham struktur telegram data :

enter image description here

Sekiranya anda masih belum dapat meneka apa yang bot ini akan lakukan, saya mahu ia memberitahu waktu solat semasa mengikut zon pilihan saya. Untuk itu, saya akan mencipta arahan /wsolat [lokasi].

Untuk berbuat demikian, mari buat statement if untuk melihat mesej kita yang bermula dengan /wsolat. Kita boleh lakukan dengan fungsi strpos(), dengan memberitahu kita kedudukan substring di dalam string:

if (strpos($userMessage, "/wsolat") === 0) {
}

Di dalam statement if itu, mari tulis beberapa kod untuk mengekstrak lokasi dengan membuang lapan aksara pertama mesej (iaitu bilangan aksara yang digunakan oleh arahan /wsolat, serta tambah satu spacebar selepas itu) serta %20 mengantikan spacebar bagi lokasi (zone) kita (contoh: bagan serai):

if (strpos($userMessage, "/wsolat") === 0) {
location = substr($userMessage, 8);
$location2 = str_replace(" ","%20", $location);
$location3 = $location2;
}

Sekarang mari dapatkan data waktu solat untuk lokasi tersebut daripada waktu solat api percuma (filter by zone) dari zaim ramlan:

curl https://waktu-solat-api.herokuapp.com/api/v1/zones.json?zon=ZONE_NAME

ekstrak data solat seperti ini :

$datasolat = json_decode(file_get_contents("https://waktu-solat-api.herokuapp.com/api/v1/prayer_times.json?zon=".$location3), TRUE);

Sebagai contoh saya ambil zon bagan serai :

enter image description here enter image description here

Saya akan susun data saya mengikut waktu solat dan masanya seperti berikut :

$negeri = $datasolat["data"][0]["negeri"];
$zone = $datasolat["data"][0]["zon"];
$waktusolatimsak = $datasolat["data"][0]["waktu_solat"][0]["time"];
$waktusolatsubuh = $datasolat["data"][0]["waktu_solat"][1]["time"];
$waktusolatsyuruk = $datasolat["data"][0]["waktu_solat"][2]["time"];
$waktusolatzohor = $datasolat["data"][0]["waktu_solat"][3]["time"];
$waktusolatasar = $datasolat["data"][0]["waktu_solat"][4]["time"];
$waktusolatmaghrib = $datasolat["data"][0]["waktu_solat"][5]["time"];
$waktusolatisyak = $datasolat["data"][0]["waktu_solat"][6]["time"];
$noresult = $datasolat["message"];

Mari kita keluarkan result seperti berikut. Harap final output nanti seperti yang kita harapkan.

$replyMsg =
"Waktu Solat
=================
Negeri : ".$negeri."
Zon : ".$zone."
=================
Imsak : ".$waktusolatimsak."
Subuh :".$waktusolatsubuh."
Syuruk : ".$waktusolatsyuruk."
Zohor : ".$waktusolatzohor."
Asar :".$waktusolatasar."
Maghrib : ".$waktusolatmaghrib."
Isyak : ".$waktusolatisyak."
=================";
file_get_contents($url."/sendmessage?chat_id=".$userChatId."&text=".$replyMsg);

Mari kita kumpulkan semua coding kita dari awal tutorial dalam satu php file :

<?php
$BOT_TOKEN = "6188536181:AAFRNG7NPulmqq8ZUO10HUlDmc2B957_UJ8";
$update = file_get_contents('php://input');
$update = json_decode($update, true);
$userChatId = $update["message"]["from"]["id"];
$userMessage = $update["message"]["text"];
$url = "https://api.telegram.org/bot".$BOT_TOKEN;

if (strpos($userMessage, "/wsolat") === 0) {

$location = substr($userMessage, 8);
$location2 = str_replace(" ","%20", $location);
$location3 = $location2;
$datasolat = json_decode(file_get_contents("https://waktu-solat-api.herokuapp.com/api/v1/prayer_times.json?zon=".$location3), TRUE);
$negeri = $datasolat["data"][0]["negeri"];
$zone = $datasolat["data"][0]["zon"];
$waktusolatimsak = $datasolat["data"][0]["waktu_solat"][0]["time"];
$waktusolatsubuh = $datasolat["data"][0]["waktu_solat"][1]["time"];
$waktusolatsyuruk = $datasolat["data"][0]["waktu_solat"][2]["time"];
$waktusolatzohor = $datasolat["data"][0]["waktu_solat"][3]["time"];
$waktusolatasar = $datasolat["data"][0]["waktu_solat"][4]["time"];
$waktusolatmaghrib = $datasolat["data"][0]["waktu_solat"][5]["time"];
$waktusolatisyak = $datasolat["data"][0]["waktu_solat"][6]["time"];
$noresult = $datasolat["message"];

$replyMsg =
"Waktu Solat
=================
Negeri : ".$negeri."
Zon : ".$zone."
=================
Imsak : ".$waktusolatimsak."
Subuh :".$waktusolatsubuh."
Syuruk : ".$waktusolatsyuruk."
Zohor : ".$waktusolatzohor."
Asar :".$waktusolatasar."
Maghrib : ".$waktusolatmaghrib."
Isyak : ".$waktusolatisyak."
=================";

file_get_contents($url."/sendmessage?chat_id=".$userChatId."&text=".$replyMsg);
}
?>

Output akhir kita adalah seperti berikut. Oleh kerana kita menggunakan text output, jadi ia tak seperti yang kita mahukan. Betul tak? Tapi telegram bot anda berjaya mengeluarkan output walaupun tak berapa nak cantik. Betul kan?

enter image description here

Saya akan baiki coding dengan menambah function send method dan curl serta array data bagi text output kita nanti, serta kita akan tambah dengan statement if jika input user tidak memberikan result atau input user tanpa lokasi (kosong atau NULL) :

<?php
$BOT_TOKEN = "6188536181:AAFRNG7NPulmqq8ZUO10HUlDmc2B957_UJ8";
$update = file_get_contents('php://input');
$update = json_decode($update, true);
$userChatId = $update["message"]["from"]["id"];
$userMessage = $update["message"]["text"];
//$url = "https://api.telegram.org/bot".$BOT_TOKEN;

if (strpos($userMessage, "/wsolat") === 0) {

$location = substr($userMessage, 8);
$location2 = str_replace(" ","%20", $location);
$location3 = $location2;
$datasolat = json_decode(file_get_contents("https://waktu-solat-api.herokuapp.com/api/v1/prayer_times.json?zon=".$location3), TRUE);
$negeri = $datasolat["data"][0]["negeri"];
$zone = $datasolat["data"][0]["zon"];
$waktusolatimsak = $datasolat["data"][0]["waktu_solat"][0]["time"];
$waktusolatsubuh = $datasolat["data"][0]["waktu_solat"][1]["time"];
$waktusolatsyuruk = $datasolat["data"][0]["waktu_solat"][2]["time"];
$waktusolatzohor = $datasolat["data"][0]["waktu_solat"][3]["time"];
$waktusolatasar = $datasolat["data"][0]["waktu_solat"][4]["time"];
$waktusolatmaghrib = $datasolat["data"][0]["waktu_solat"][5]["time"];
$waktusolatisyak = $datasolat["data"][0]["waktu_solat"][6]["time"];
$noresult = $datasolat["message"];

//tambah if statement
//jika data tiada dalam json
if ($noresult === "No results found" ){
$replyMsg = 
"Waktu Solat
n=================
n".$noresult."
n=================";       
}
// jika taip /wsolat tanpa lokasi   
else {
if ($zone === NULL ){
$replyMsg =
"Waktu Solat
=================
No results found. Zone cannot be empty";      
}
// jika taip /wsolat bagan serai  
else {  
$replyMsg =
"Waktu Solat
=================
Negeri : ".$negeri."
Zon : ".$zone."
=================
Imsak : ".$waktusolatimsak."
Subuh :".$waktusolatsubuh."
Syuruk : ".$waktusolatsyuruk."
Zohor : ".$waktusolatzohor."
Asar :".$waktusolatasar."
Maghrib : ".$waktusolatmaghrib."
Isyak : ".$waktusolatisyak."
=================";
    }
}
//tutup if statement condition

//file_get_contents($url."/sendmessage?chat_id=".$userChatId."&text=".$replyMsg);

//array output data
$parameters = array(
"chat_id" => $userChatId,
"text" => $replyMsg,
"parseMode" => "html"
);
//keluarkan output array data  
send("sendMessage", $parameters);
}

//function send
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_HTTPHEADER, array("Content-Type:multipart/form-data"));
    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;
}
?>

Result Akhir Kita. Selamat Mencuba semua.

enter image description here