Telegram als Messenger einbauen
Verfasst: Mo 3. Apr 2023, 18:53
Hier ist meine Implementierung dazu. Wenns gefällt, bitte übernehmen!
Mit 700 Mio aktiven Usern ist Telegram eine sehr verbreitete App.
Diese Funktion ist dazu gedacht, dass man sie in der funktionen.inc.php vor po_send_message eingefügt.
Wie man am Ende sehen kann, ruft dieses Interface für andere Messenger die existierende Funktion po_send_message auf.
Um zu verhindern, dass die gleiche Message mehrmals hintereinander geschickt wird, habe ich auch noch folgende Funktion geschrieben. Diese ruft die obige Funktion auf, wenn die Message nicht schon in der gleichen Minute, Stunde, Tag, Monat ... an den Messenger geschickt wurde. Das wird über den letzten Parameter cache-period gesteuert.
In der user.config.php muss man folgende Parameter eintragen:
Token und ChannelID von Telegram besorgen
Voraussetzung ist natürlich, dass man einen (kostenlosen) Telegram-Account hat. Nachrichten können von der Solaranzeige mit folgendem URL an einen Telegram-Kanal/Channel gesendet werden. Alle Telegram-User, die den Kanal abonnieren (z.B. Familienmitglieder) erhalten dann diese Nachrichten aufs Handy.
Damit das funktioniert, braucht man also den <access-token> und die <channelID> . Die muss man in Telegram (kostenlos) anlegen.
Access Token und Messagebot erzeugen
Telegram-App öffnen und einen Chat mit dem Telegram Botfather Bot öffnen. Aufpassen dass man den offiziellen erwischt! Dort folgendes Kommando eingeben
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.
Done! Congratulations on your new bot. You will find it at t.me/SolarParis_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.
Use this token to access the HTTP API:
123456789ABCDEFGHIJ
Keep your token secure and store it safely, it can be used by anyone to control your bot.
For a description of the Bot API, see this page: https://core.telegram.org/bots/api
Telegram Kanal erstellen und channelID ermitteln
Kanal erstellen und MessageBot hinzufügen
Telegram-App öffnen und rechts oben in der Chat-Übersicht auf den Button mit dem Stift klicken. Dann „Neuer Kanal“ auswählen. Dem Kanal einen Namen geben. Z.B.:
Sichtbarkeit des Kanals auf: „öffentlich“ einstellen.
Einen Channel-Link Namen für den Channel-Link festlegen. z.B.:
Dann auf „weiter“ klicken.
Im nächsten Schritt den zuvor erzeugten MessageBot „SolarParis_bot“ als Administrator zum Kanal hinzufügen. GGf. weitere Familienmitglieder zum Channel hinzufügen/einladen. Diese müssen natürlich einen Telegram-Account haben. Dann „weiter“ klicken.
ChannelID ermitteln
Im Web-Browser folgenden URL eingeben. Dabei als chat-ID ein @ gefolgt vom Namen im Channel-Link eingeben.
Z.B. :
Telegram antwortet mit
Unter Id findet sich der ChannelID z.B. -100123456789 . (Beginnt immer mit minus 100)
Anschließend den Channel wieder auf „private“ umstellen.
Testweise Nachrichten an Telegram-Channel versenden
Nun kann man mit HTTP-Requests Messages an den Channel senden.
z.B.Alle Telegram-User, die den Channel abonniert haben, können die dort eintreffenden Nachrichten in der Telegram-App am Handy und im Web-Browser lesen .
Mit 700 Mio aktiven Usern ist Telegram eine sehr verbreitete App.
Diese Funktion ist dazu gedacht, dass man sie in der funktionen.inc.php vor po_send_message eingefügt.
Code: Alles auswählen
function send_template_message( $Token, $Key, $Message, $Bild = 0, $DevName = "", $Messenger = "telegram") {
$URL_Template = array();
$URL_Template["telegram"] = "https://api.telegram.org/bot<UserToken>/sendmessage?chat_id=<channel_ID>&text=<Message>";
//$this->log_schreiben( $Messenger." send_template_message.", "* ", 5 );
// Versand nach Telegram Messenger
if (isset( $URL_Template[strtolower($Messenger)])) {
$url = str_replace( "<UserToken>",$Token,$URL_Template[strtolower($Messenger)]);
$url = str_replace( "<channel_ID>",$Key,$url);
$url = str_replace( "<Message>",htmlspecialchars($Message,ENT_QUOTES),$url);
//$this->log_schreiben( $Messenger." send_template_message : ".$url, "* ", 5 );
if ($ch = curl_init( $url )) {
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
$result = curl_exec( $ch );
$rc_info = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
if (curl_errno( $ch )) {
$this->log_schreiben( "Curl Fehler! Daten nicht zu ".$Messenger." gesendet! Curl ErrNo. ".curl_errno( $ch ), " ", 3 );
} elseif ($rc_info["http_code"] == 200 or $rc_info["http_code"] == 204 or $rc_info["http_code"] == 203) {
$this->log_schreiben( "Daten zum Messenger ".$Messenger." gesendet. ", "* ", 3 );
} elseif ($rc_info["http_code"] == 400) {
$this->log_schreiben( $Messenger." bad Request: Channel-ID falsch. ", "* ", 3 );
} elseif ($rc_info["http_code"] == 401) {
$this->log_schreiben( $Messenger." bad Request: Token falsch.", "* ", 3 );
} else {
curl_close( $ch );
$this->log_schreiben( $Messenger." sent ", "* ", 8 );
return true;
}
}
return false;
} else {
// use standard-Interface
$result = $this->po_send_message( $Key, $Token, $Message, $Bild, $DevName, $Messenger );
return $result;
}
}
Um zu verhindern, dass die gleiche Message mehrmals hintereinander geschickt wird, habe ich auch noch folgende Funktion geschrieben. Diese ruft die obige Funktion auf, wenn die Message nicht schon in der gleichen Minute, Stunde, Tag, Monat ... an den Messenger geschickt wurde. Das wird über den letzten Parameter cache-period gesteuert.
Code: Alles auswählen
function send_cached_message( $Token, $Key, $Message, $Bild = 0, $DevName = "", $Messenger = "pushover", $cache_period="YmdHi" ) {
// prüfen, ob Message heute schon gesendet wurde und im cache steht
//
// $cache_period = false : die gleiche Message wird immer gesendet
// $cache_period = "Ym" : die gleiche Message wird max einmal pro Monat.
// $cache_period = "Ymd" : max einmal pro Tag .
// $cache_period " "YmdH" : max einmal pro Stunde oder
// $cache_period " "YmdHi" : max einmal pro Minute gesendet
$message_cache_filename = "/var/www/html/database/message_cache.php";
if (in_array($cache_period, array("Ym","Ymd","YmdH", "YmdHi"))) {
$jetzt = date($cache_period);
$message_cache = array();
if (file_exists( $message_cache_filename )) {
require($message_cache_filename);
}
$messengerkey = strtolower($Messenger);
$msgkey = htmlspecialchars($Message, ENT_QUOTES);
$this->log_schreiben( "send: ".$msgkey." if not in ".print_r($message_cache,true), " ", 9 );
if (isset($message_cache[$messengerkey][$msgkey][$cache_period])) {
$last_sent = $message_cache[$messengerkey][$msgkey][$cache_period];
if ($last_sent == $jetzt) {
// wurde schon gesendet
$this->log_schreiben( "Msg not sent (in cache)", " ", 8 );
return true;
}
}
if ($this->send_template_message( $Token, $Key, $Message, $Bild, $DevName, $Messenger )) {
// Message erfolgreich gesendet
$message_cache[$messengerkey][$msgkey][$cache_period] = $jetzt;
$conf="<?php".PHP_EOL .
"\$message_cache=array();".PHP_EOL;
foreach ($message_cache as $mgrkey => $mgrvalue) {
foreach ($mgrvalue as $meskey => $mesvalue) {
foreach ($mesvalue as $pkey => $pvalue) {
$conf = $conf."\$message_cache['".$mgrkey."']['".$meskey."']['".$pkey."']='".$pvalue."';".PHP_EOL;
}
}
}
$conf = $conf."?>";
file_put_contents ( $message_cache_filename , $conf);
return true;
} else {
return false;
}
} else {
$this->log_schreiben( "send_cached_message: Cache_period ungültig : ".$cache_period, " ", 5 );
}
}
In der user.config.php muss man folgende Parameter eintragen:
Code: Alles auswählen
$Messenger = true;
//
// Welcher Messengerdienst soll benutzt werden?
$Messengerdienst[1] = "telegram"; // Telegram, Pushover, Signal oder WhatsApp
$API_Token[1] = "<yourtoken>";
$User_Key[1] = "<yourChannelID>";
Voraussetzung ist natürlich, dass man einen (kostenlosen) Telegram-Account hat. Nachrichten können von der Solaranzeige mit folgendem URL an einen Telegram-Kanal/Channel gesendet werden. Alle Telegram-User, die den Kanal abonnieren (z.B. Familienmitglieder) erhalten dann diese Nachrichten aufs Handy.
Code: Alles auswählen
https://api.telegram.org/bot<access-token>/sendmessage?chat_id=<channelID>&text=<nachrichtentext>
Access Token und Messagebot erzeugen
Telegram-App öffnen und einen Chat mit dem Telegram Botfather Bot öffnen. Aufpassen dass man den offiziellen erwischt! Dort folgendes Kommando eingeben
Code: Alles auswählen
/newbot
Code: Alles auswählen
SolaranzeigeParisBot
Code: Alles auswählen
SolarParis_bot
Use this token to access the HTTP API:
123456789ABCDEFGHIJ
Keep your token secure and store it safely, it can be used by anyone to control your bot.
For a description of the Bot API, see this page: https://core.telegram.org/bots/api
Telegram Kanal erstellen und channelID ermitteln
Kanal erstellen und MessageBot hinzufügen
Telegram-App öffnen und rechts oben in der Chat-Übersicht auf den Button mit dem Stift klicken. Dann „Neuer Kanal“ auswählen. Dem Kanal einen Namen geben. Z.B.:
Code: Alles auswählen
Smarthome-Paris
Einen Channel-Link Namen für den Channel-Link festlegen. z.B.:
Code: Alles auswählen
http:/t.me/[b]Smarthome_Paris[/b]
Im nächsten Schritt den zuvor erzeugten MessageBot „SolarParis_bot“ als Administrator zum Kanal hinzufügen. GGf. weitere Familienmitglieder zum Channel hinzufügen/einladen. Diese müssen natürlich einen Telegram-Account haben. Dann „weiter“ klicken.
ChannelID ermitteln
Im Web-Browser folgenden URL eingeben. Dabei als chat-ID ein @ gefolgt vom Namen im Channel-Link eingeben.
Code: Alles auswählen
https://api.telegram.org/bot<access-token>/sendmessage?chat_id=<channelLinkName>&text=<nachrichtentext>
Code: Alles auswählen
https://api.telegram.org/bot123456789ABCDEFGHIJ/sendmessage?chat_id=@Smarthome_Paris&text=some-text-to-you
Code: Alles auswählen
Ok True
result
message_id 6
sender_chat
Id -100123456789
….
Anschließend den Channel wieder auf „private“ umstellen.
Testweise Nachrichten an Telegram-Channel versenden
Nun kann man mit HTTP-Requests Messages an den Channel senden.
z.B.
Code: Alles auswählen
https://api.telegram.org/bot123456789ABCDEFGHIJ/sendmessage?chat_id=-100123456789&text=some-text-to-you2