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