Telegram instant messaging TelegramBot - Empfangen und Senden per FHEM

Begonnen von viegener, 20 Juni 2015, 18:59:41

Vorheriges Thema - Nächstes Thema

viegener

Zitat von: TobiasR am 30 Oktober 2017, 23:12:57
Das war die Richtige Lösung: '\@\@'

Besten Dank!
Tobias
Sorry wenn bei Dir mit doppeltem \@ geht, dann hast Du wohl nicht das Reading msgPeerId sondern msgPeer in Deinem Code ? Korrekt?

Das solltest Du ändern, denn damit verwendest Du einen Namen, der nicht unbedingt eindeutig ist.

Aber nochmals der Kommentar von oben, warum verwendest Du keine Favoriten, damit sind genau solche Befehle einfach konfigurierbar, ohne dass man gleich ein Sicherheitsloch aufreisst.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

TobiasR

Hi,

ehrlich gesagt verstehe ich den Zusammenhang zwischen den Favoriten (Vereinfachen von Befehlen) und meinem Ziel, dem Absender eine Nachricht zu senden, nicht.
Natürlich kann ich einen Favoriten für '\@\@'.ReadingVal("Telegram", "msgPeerId ", <deine defaultID>)  mit /Absender anlegen.
Aber was hat das dann mit dem schließen eines Sicherheitsloch zu tun?

Tobi

viegener

In dem Code, zumindest der um den es hier eigentlich ging, wurde ja ein Befehl in FHEM ausgeführt basierend auf einer Nachricht von aussen. Das ist aber genau die Domäne der Favoriten.

Die Sicherheitslücken sind:
- Im Bot werden konfigurierbar nur spezielle peers zugelassen, die Kommandos ausführen können
- Dabei wird auch peerids verwendet und nicht Namen

Aber das ist hier im Thread bereits mehrfach angesprochen worden und ich kann nur Empfehlungen geben, das Risiko kann ich nicht reduzieren.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

DD

Hallo viegener,

der Thread ist mittlerweile 115 Seiten lang. Die alle zu lesen ist schier unmöglich!

Ich werde aber mal auf die Suche gehen und deine Hinweise umsetzen.

Beste Grüße
Tobi

Baja197

#1714
Hallo,

auch wenn das vielleicht gerade nicht zum Thema passt könnt ihr mir ja eventuell doch helfen  ;D

Ich programmiere derzeit einen Telegram-Chatbot für die Firma in der ich derzeit Praktikum für mein Fachabitur mache.
Das Ziel ist es bei einem ausgelösten Alarm demjenigen dem die Sensoren gehören eine Nachricht zu schicken, dass der Alarm ausgelöst wurde.

Ich habe bereits einen /aktivieren Befehl der einen zufällig generierten Token an die Email des Users schickt und einen /register Befehl der nach Eingabe die Email des Nutzers verlangt. Leider speichert er nicht die Mail die ich dem Bot schicke sondern das /register als Variable in die Spalte E-Mail.

Hier der Code dazu:

<?php

// Error handling
   
  /**
   * Error handler, passes flow over the exception logger with new ErrorException.
   *
   * @param $num
   * @param $str
   * @param $file
   * @param $line
   * @param null $context
   */
  
http_response_code(200);
  function 
log_error$num$str$file$line$context null )  {
    
log_exception( new ErrorException$str0$num$file$line ) );
  }
  
  
/**
   * Uncaught exception handler.
   * @param \Exception $e
   */
  
function log_exception$e )  {

    
// setup notifier
    
$API_KEY  '417276917:AAH0Yy_y7RVWP46lZriNf_WxVa6bt4S9yk8'// Replace 'XXXXXXXXXX' with your bot's API token
    
$DEV_ID   '439425041'// Replace 'XXXXXXXXXX' with your Telegram user ID (use /whoami command)
    
    // get incomming message
    
$incoming file_get_contents('php://input');
    
    
// if message exist convert it into array
    
$incoming = !empty($incoming) ? json_decode(file_get_contents('php://input'), true) : false ;
    
    
// developer notification message text
    
$message  get_class$e ) . " - <b>{$e->getMessage()}</b>;".PHP_EOL."File: <b>{$e->getFile()}</b>; Line: <b>{$e->getLine()}</b>; Time: <b>".date("H:i:s / d.m.Y")."</b>;".PHP_EOL."<b>Incoming message:</b><pre>".(!empty($incoming)?var_export($incomingtrue).'</pre>':'</pre>'.PHP_EOL.'<b>Trace:</b><pre>'.$e->getTraceAsString().'</pre>');
    
    
// developer notification message settings
    
$fields_string '';
    
$url 'https://api.telegram.org/bot'.$API_KEY.'/sendMessage';
    
    
$fields = [
        
'chat_id' => urlencode($DEV_ID),
        
'parse_mode' => urlencode('HTML'),
        
'text' => urlencode(''.$message)
    ];
    
    
//url-ify the data for the POST
    
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
    
rtrim($fields_string'&');
    
    
//open connection
    
$ch curl_init();
    
    
//set the url, number of POST vars, POST data
    
curl_setopt($ch,CURLOPT_URL$url);
    
curl_setopt($ch,CURLOPT_POSTcount($fields));
    
curl_setopt($ch,CURLOPT_POSTFIELDS$fields_string);
    
curl_setopt($ch,CURLOPT_RETURNTRANSFERtrue);
    
    
//execute post
    
$result curl_exec($ch);
        
    
//close connection
    
curl_close($ch);
    
    
// Uncomment following line and change path to store errors log in custom file
    // file_put_contents( __DIR__ .'/custom_errors.log', ($result?'Notified: '.var_export($result, true).PHP_EOL:'Not notified: '.var_export($result, true).PHP_EOL).$message . PHP_EOL, FILE_APPEND );
  
    // Sending 200 response code
    
header('X-PHP-Response-Code: 200'true200);
    
    exit();
  }
  
  
/**
   * Checks for a fatal error, work around for set_error_handler not working on fatal errors.
   */
  
function check_for_fatal()
  {
    
$error error_get_last();
    if ( 
$error["type"] == E_ERROR )
      
log_error$error["type"], $error["message"], $error["file"], $error["line"] );
  }
  
  
register_shutdown_function"check_for_fatal" );
  
set_error_handler"log_error" );
  
set_exception_handler"log_exception" );
  
ini_set"display_errors""off" );
  
error_reportingE_ALL );

$botToken "417276917:AAH0Yy_y7RVWP46lZriNf_WxVa6bt4S9yk8";
$website "https://api.telegram.org/bot".$botToken;


function 
crypto_rand_secure($min$max)
{
    
$range $max $min;
    if (
$range 1) return $min// not so random...
    
$log ceil(log($range2));
    
$bytes = (int) ($log 8) + 1// length in bytes
    
$bits = (int) $log 1// length in bits
    
$filter = (int) (<< $bits) - 1// set all lower bits to 1
    
do {
        
$rnd hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
        
$rnd $rnd $filter// discard irrelevant bits
    
} while ($rnd $range);
    return 
$min $rnd;
}

function 
getToken($length)
{
    
$token "";
    
$codeAlphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
    
$codeAlphabet.= "0123456789";
    
$max strlen($codeAlphabet); // edited

    
for ($i=0$i $length$i++) {
        
$token .= $codeAlphabet[crypto_rand_secure(0$max-1)];
    }

    return 
$token;
}

$connection mysqli_connect ('localhost','id3057414_niklas','DerAdmin2017!','id3057414_testuser','3306');
if(!
$connection){
die('Verbindung zur Datenbank konnte nicht hergestellt werden!' .mysqli_error());
}
echo 
'Erfolgreich Verbunden';
$auswahl=mysqli_select_db($connection,"id3057414_testuser");
if(!$auswahl)
{
die('Zugriff auf die Datenbank nicht möglich! Existiert sie wirklich?');
}


$update file_get_contents("php://input");
$update json_decode($updateTRUE);



$chatID $update["message"]["chat"]["id"];;

$text =  $update["message"]["text"];

$lesen "SELECT * FROM Kundenalarm";
if(
$text=="/register")
{
http_response_code(200);
sleep(3);
$name file_get_contents("php://input");
$name json_decode($nameTRUE);
$name =  $name["message"]["from"]["first_name"];
$aufnahme mysqli_query($connection,"INSERT INTO Kundenalarm (Name,Kennung,GeraeteID,Alarm,EMail,Aktiviert,Token) VALUES ('$name','$chatID','','','','0','')");
if(isset($name))
{
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Gib deine Email ein!");
http_response_code(200);
sleep(10);

$email file_get_contents("php://input");
$email json_decode($emailTRUE);
$Email =  $email["message"]["text"];

http_response_code(200);


file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=$Email");

$datenbankmysqli_query($connection,"INSERT INTO Kundenalarm (Name,Kennung,GeraeteID,Alarm,EMail,Aktiviert,Token) VALUES ('$name','$chatID','','','','0','')");


if(!$aufnahme||!$datenbank)
{
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Dein Name wurde nicht in die Datenbank aufgenommen !");

}
else
{

file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Dein Name wurde nun in die Datenbank aufgenommen!");
}
}
}

if(
$text=="/aktivieren")
{
$atoken=getToken(5);
$name file_get_contents("php://input");
$name json_decode($nameTRUE);
$name =  $name["message"]["from"]["first_name"];
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=$atoken");
$result mysqli_query($connection,"SELECT EMail FROM Kundenalarm WHERE Kennung = '$chatID'");
$zeile mysqli_fetch_object($result);
$empfaenger$zeile->EMail;
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=$empfaenger");
mail($empfaenger,"Aktivierungstoken Kadsoft","$atoken","Von KadsoftBot generiert!");
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Email gesendet!");
$mysqlsafe mysqli_query($connection,"INSERT INTO Kundenalarm (Name,Kennung,GeraeteID,Alarm,EMail,Aktiviert,Token) VALUES ('$name','$chatID','','','','0','$atoken')");
if(!$mysqlsafe)
{
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Datenbankaufnahme gescheitert!");

}


}

mysqli_query($connection,"SET NAMES 'utf8'");
$resultat mysqli_query($connection,$lesen)
or die ("Anfrage Fehlgeschlagen");

print_r($text);

print_r($chatID); 

if(
$text=="Hallo"||$text=="Hi")
{
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Hallo schön dich hier zu sehen!");

}

if(
$text=="Wie ist das Wetter?")
{
file_get_contents($website."/sendmessage?chat_id=".$chatID."&text=Heute ist es bewölkt!");
}
?>


Ich würde mich über eine schnelle und hilfreiche Antwort freuen und bedanke mich bereits im Vorraus

Mit freundlichen Grüßen
Niklas

math78

Hallo,

ich benötige auch einmal eure Hilfe.

Bei folgender Def.
Zitat
([Haustuerklingel] eq "on") ({my $var = "/volume1/surveillance/".(ReadingsVal("Cam_Haustuer","LastSnapFilename",""));; set telebot sendImage $var})

bekomme ich folgende Fehlermeldung:
Zitat
Bild_Haustuer_Telebot: {my $var = "/volume1/surveillance/".(ReadingsVal("Cam_Haustuer","LastSnapFilename",""));; set telebot sendImage $var}: Can't locate object method "sendImage" via package "/volume1/surveillance/Haustuer-20171031-1232435757.jpg" (perhaps you forgot to load "/volume1/surveillance/Haustuer-20171031-1232435757.jpg"?) at (eval 15666) line 1.

Kann mir jemand weiterhelfen?

Danke.

Matthias

DeeSPe

Zitat von: math78 am 01 November 2017, 09:47:47
Hallo,

ich benötige auch einmal eure Hilfe.

Bei folgender Def.
Zitat
([Haustuerklingel] eq "on") ({my $var = "/volume1/surveillance/".(ReadingsVal("Cam_Haustuer","LastSnapFilename",""));; set telebot sendImage $var})

bekomme ich folgende Fehlermeldung:
Zitat
Bild_Haustuer_Telebot: {my $var = "/volume1/surveillance/".(ReadingsVal("Cam_Haustuer","LastSnapFilename",""));; set telebot sendImage $var}: Can't locate object method "sendImage" via package "/volume1/surveillance/Haustuer-20171031-1232435757.jpg" (perhaps you forgot to load "/volume1/surveillance/Haustuer-20171031-1232435757.jpg"?) at (eval 15666) line 1.

Kann mir jemand weiterhelfen?

Danke.

Matthias

Das könnte/sollte so klappen:
([Haustuerklingel] eq "on") (set telebot sendImage /volume1/surveillance/[Cam_Haustuer:LastSnapFilename])

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

math78


viegener

Zitat von: Baja197 am 01 November 2017, 09:46:32
auch wenn das vielleicht gerade nicht zum Thema passt könnt ihr mir ja eventuell doch helfen  ;D
Ich würde mich über eine schnelle und hilfreiche Antwort freuen und bedanke mich bereits im Vorraus


Jetzt kann ich nicht sagen, ob Du Dich über meine Antwort freust, bei der Anfrage nach schnell und hilfreich und Ja Du bist hier völlig offtopic, denn hier geht es NICHT um telegrambot-Programmierung sondern Nutzung in FHEM.

Ich habe Deinen Code leider nicht verstanden (bin aber auch kein PHP-Programmierer) - Vielleicht versuchst Du es in einem PHP-Forum=

Ich habe Deine Erklärung auch nicht verstanden, da hier munter Telegram-Chats und Emails genutzt werden ist mir der Sinn auch völlig unklar. Es finden sich leider keine Kommentare, die weiterhelfen können ausser in offensichtlich kopiertem Code.
Wenn Du Dein Fachabitur machst würde ich annehmen, es gibt einen Betreuer, den man auch fragen kann?

Sorry, wenn das nicht weiterhilft, aber ohne etwas mehr Erklärung und Kommentierung kann ich Dir hier wohl nicht helfen, ich habe ja nicht mal eine Stelle gefunden, wo die Emailadresse in der Datenbank landen könnte...
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Baja197

#1719
Guten Morgen,

Ich hatte die Speicherung nur Testweise geschrieben und da ich die Variable Email ausgeben lasse habe ich das erstmal wieder raus genommen ...

Mein Betreuer hat zwar in PHP programmiert kennt sich aber mit Telegram nicht aus .... welche Informationen brauchst du denn?

Baja197

#1720
Also mit /register erstellt der Bot einen Datensatz in der Mysql Datenbank der zur Registrierung des Kunden dient.

Mit /aktivieren soll der Bot dem User einen zufällig generierten Aktivierungstoken senden den der User innerhalb von 10 Minuten eingeben muss damit er aktiviert ist

Am Ende soll der Bot sobald ein Signal von einem Alarmsensor an die Datenbank übermittelt wird (0 ist dabei Alarm aus und 1 an) dem Kunden dem dieser Sensor zugeordnet ist bei Alarm eine Nachricht schicken, dass der Alarm ausgelöst wurde

Baja197

Dafür gibt es schon eine Vorgefertigte Datenbank die ich aber zu Testzwecken im Moment nicht verwenden soll

Einen Screen vom Chat und von der DB schicke ich dir sobald ich auf der Arbeit bin

viegener

Zitat von: Baja197 am 02 November 2017, 06:13:23
Also mit /register erstellt der Bot einen Datensatz in der Mysql Datenbank der zur Registrierung des Kunden dient.

Mit /aktivieren soll der Bot dem User einen zufällig generierten Aktivierungstoken senden den der User innerhalb von 10 Minuten eingeben muss damit er aktiviert ist

Am Ende soll der Bot sobald ein Signal von einem Alarmsensor an die Datenbank übermittelt wird (0 ist dabei Alarm aus und 1 an) dem Kunden dem dieser Sensor zugeordnet ist bei Alarm eine Nachricht schicken, dass der Alarm ausgelöst wurde

Sorry die Teilinfos helfen mir hier nur begrenzt.
- Es wäre für das Verständnis gut, wenn Du beschreibst, wie das PHP-Skript überhaupt läuft, also wie wird es überhaupt eingebunden läuft es in einem Apache-Webserver und wie wird es gestartet?
- Ist das ein callback des telegramBot-APIs? --> Wenn scheint jegliche Überprüfung auf Existenz von Feldern im Code zu fehlen (message ist z.B. ein optionaler Parameter)
- Wie gesagt Kommentare, was bestimmte Teile tun sollen wären hilfreich
- Was funktioniert denn überhaupt?
- Funktionsdefinitionen und Code der immer ausgeführt wird scheinen mir munter durcheinander zu sein, das macht es schwer lesbar
- Wenn Der Benutzer auf register mit einer Emailadresse antworten muss, dann ist das ja eine separate Nachricht vom telegram server, die als getrennter update kommt, ich vermute mal mit sleep(10) kannst Du das nicht abhandeln

Also wenn ich die Punkte von oben bedenke, habe ich den Eindruck, dass Dein Code konzeptionell nicht funktionieren kann, aber vielleicht irre ich mich da. Einen funktionierenden Code zu erstellen kann ich aber für Dich nicht leisten aber es gibt funktionierende PHP-TelegramBot-Code ich denke das wäre ein besserer Start, z.B. hier:
https://github.com/php-telegram-bot/core

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Baja197

Also er speichert das was er soll in die Datenbank ... ne Email hatte ich auch schon bekommen mit dem Token.  Allerdings nur nach manuellem Eintragen der Mail in die Datenbank.

Verbunden ist der Bot über nen Webhook auf einem Webspace mit https

Sorry für die Unübersichtlichkeit ist mein zweites Projekt in PHP habe vorher die Firmen-Intranet-Seite zusammen geschustert.

Ich schicke mir das ganze jetzt nachhause und strukturiere es heute Abend.


marvin78

Warum bitte lernst du vor solchen Projekten nicht php und stellst deine Fragen dann in einem php und/oder Entwickler-Forum?