Lav nemt en Telegram bot

Chat platformen telegram giver mulighed for at man kan selv nemt kan lave chat bots, dvs små programmer som andre brugere kan chatte med. Disse chats behøver ikke være traditionelle chats, det kan også være kommandoer til programmer der udfører opgraver for brugerne.

Denne guide vil vise dig hvordan du laver en ny telegram bot i PHP der udføre diverse netværks kommandoer (MX lookup, find reverse DNS osv). Guiden forventer at du har en basal programmerings erfaring.

Du kan selv skrive med botten her hvis du har telegram installeret.

Selve botten fungere ved at du har en webside som telegram kontakter når nogen skriver til botten, siden kan så skrive indhold tilbage til brugeren.

Din bot kan kører på en hvilken som helst PHP server med den begrænsning at telegram kun vil snakke med HTTPS (SSL) websites, så du skal have en server eller website du kan installere et SSL certifikat på. Det behøver ikke være et købe certifikat, et selv signeret certifikat fungerer også fint.

Telegram har selv nogle udemærkede eksempler på PHP kode og denne bot tager udgangspunkt i en af dem.

Først skal man registrere sin bot hos telegram for at reservere navnet og få en API nøgle.

Det gør man ved at chatte med den bot der hedder @BotFather

Skærmbillede 2015-12-11 kl. 08.34.37

Her starter man med kommandoen /newbot hvorefter den spørger efter bottens navn og brugernavn. Derefter bruger skal man skrive de kommandoer ens bot skal understøtte (man kan ændre det senere) i formattet kommando – forklaring uden det foranstillede /.

Skærmbillede 2015-12-11 kl. 08.38.39

Nu er man næsten klar.

Nu skal man sætte den bot nøgle man fik af botfather op så telegram serverne ved hvem man er:

  
define(‘BOT_TOKEN’, ‘Nøglen’);
  
<span style="line-height: 1.7;">define(&#8216;API\_URL&#8217;, &#8216;https://api.telegram.org/bot&#8217;.BOT\_TOKEN.&#8217;/&#8217;);
  
</span>

og så kommer selve den funktion der snakker med brugeren


function processMessage($message) {
  
// process incoming message
  
$message\_id = $message[&#8216;message\_id&#8217;];
  
$chat_id = $message\[&#8216;chat&#8217;\]\[&#8216;id&#8217;\];
  
if (isset($message[&#8216;text&#8217;])) {
  
// incoming text message
  
$text = $message[&#8216;text&#8217;];

if (strpos($text, "/start") === 0) {
  
apiRequest("sendMessage", array(&#8216;chat\_id&#8217; => $chat\_id, "text" => &#8216;Hi, dnsbot lets you do basic DNS lookups like get host name, get reverse DNS and a MX lookup.&#8217;));
  
}
  
else if (strpos($text, "/mx") === 0) {
  
$domain = explode(" ", $text)[1]; //The command is written /mx example.com so extract example.com
  
$hosts = array();
  
getmxrr($domain, $hosts); //Get MX record command, returns a array with the domain names
  
if($hosts != null)
  
{
  
error_log("command from telegram: \n"); //Log to /var/log/apache2/error.log
  
error_log($hosts);
  
foreach($hosts as $host) { //Loop throught the array
  
$result = $result . $host . &#8216; &#8216; . gethostbyname($host) . chr(10); //add domain name and IP address to the string.
  
}
  
}
  
else {
  
$result = "unknown host or server error";
  
}
  
apiRequest("sendMessage", array(&#8216;chat\_id&#8217; => $chat\_id, "text" => $result)); //Send the message back to the user
  
}
  
else if (strpos($text, "/getip") === 0) {
  
$ip = explode(" ", $text)[1]; //get the domain
  
error_log("command from telegram: \n");
  
$result = gethostbyname($ip);
  
if($result != null) //Check if there is a result otherwise print a error. Either the user put in garbage or the domain dont exist
  
{
  
error_log($result);
  
}
  
else {
  
$result = "unknown host or server error";
  
}
  
apiRequest("sendMessage", array(&#8216;chat\_id&#8217; => $chat\_id, "text" => $result));
  
}
  
else if (strpos($text, "/gethost") === 0) {
  
$ip = explode(" ", $text)[1];
  
error_log("command from telegram: \n");
  
$result = gethostbyaddr($ip);;
  
error_log($result);
  
if($result != null)
  
{
  
error_log($result);
  
}
  
else {
  
$result = "unknown host or server error";
  
}
  
apiRequest("sendMessage", array(&#8216;chat\_id&#8217; => $chat\_id, "text" => $result));
  
}
  
else if (strpos($text, "/stop") === 0) {
  
// stop now
  
} else {
  
apiRequestWebhook("sendMessage", array(&#8216;chat\_id&#8217; => $chat\_id, "reply\_to\_message\_id" => $message\_id, "text" => &#8216;Unknown command!&#8217;)); //User send a command that we dont understand
  
}
  
} else {
  
apiRequest("sendMessage", array(&#8216;chat\_id&#8217; => $chat\_id, "text" => &#8216;I understand only text messages&#8217;)); //User send a file or something else&#8230;
  
}
  
}
  

Du kan hente hele filen her.

Når man har lagt koden op på sin server skal man fortælle telegram hvor den kan findes.

Det gør man ved at bruge kommandolinie programmet curl. På Linux og Mac er det indbygget. Til windows kan man hente det her.

Der er to varianter af kommandoen, en til hvis man bruger et selvsigneret certifikat og en til et “almindeligt” certifikat.

Hvis du bruger et selvsigneret certifikat er kommandoen:

curl -F “url=https://example.com/bot.php” -F “[email protected]” https://api.telegram.org/botDINAPINØGLE/setWebhook

Uden certifikatet:

curl -F “url=https://example.com/bot.php” https://api.telegram.org/botDINAPINØGLE/setWebhook

Nu er du klar til at snakke med din bot!