it-swarm.com.de

Bekam Probleme mit Webhook zu Telegram Bot API

Warum funktioniert mein Webhook nicht? Ich bekomme keine Daten von der Telegramm-Bot-API. Hier ist die detaillierte Erklärung meines Problems:

Ich habe SSL cert von StartSSL erhalten, es funktioniert gut auf meiner Website (laut GeoCerts SSL checker ), aber es scheint immer noch so, als ob mein Webhook zur Telegram Bot API nicht funktioniert (obwohl er sagt, dass Webhook war Set bekomme ich keine Daten).

Ich mache einen Webhook zu meinem Skript auf meiner Website in folgender Form:

https://api.telegram.org/bot<token>/setWebhook?url=https://mywebsite.com/path/to/giveawaysbot.php

Ich bekomme diesen Text als Antwort:

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

Es muss also funktionieren, aber eigentlich nicht.

Hier ist mein Skriptcode:

<?php 

ini_set('error_reporting', E_ALL);

$botToken = "<token>";
$website = "https://api.telegram.org/bot".$botToken;

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

print_r($update); // this is made to check if i get any data or not

$chatId = $update["message"]["chat"]["id"];
$message = $update["message"]["text"];


switch ($message) {
    case "/test":
        sendMessage($chatId,"test complete");
        break;
    case "/hi":
        sendMessage($chatId,"hey there");
        break;
    default:
        sendMessage($chatId,"nono i dont understand you");
}


function sendMessage ($chatId, $message) {
    $url = $GLOBALS[website]."/sendMessage?chat_id=".$chatId."&text=".urlencode($message);
    file_get_contents($url);
}

?>

Ich erhalte keine Daten für $ update. Webhook funktioniert also nicht. Warum?

20
markelov

Ich war bei diesem Problem. Ich habe versucht, überall nachzuschauen und konnte keine Lösung für mein Problem finden, da die Leute immer sagten, das Problem sei das SSL-Zertifikat. Aber ich fand das Problem, und es fehlte eine Menge Dinge, die im Code fehlten, um mit dem Telegramm-API-Webhook zu interagieren, der curl und diese Art von Daten enthält. Nachdem ich mir in einem Beispiel die Dokumentation des Telegrammbots angesehen hatte, habe ich mein Problem gelöst. Schauen Sie sich dieses Beispiel an https://core.telegram.org/bots/samples/hellobot

<?php
//telegram example
define('BOT_TOKEN', '12345678:replace-me-with-real-token');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/');

function apiRequestWebhook($method, $parameters) {
  if (!is_string($method)) {
    error_log("Method name must be a string\n");
    return false;
  }

  if (!$parameters) {
    $parameters = array();
  } else if (!is_array($parameters)) {
    error_log("Parameters must be an array\n");
    return false;
  }

  $parameters["method"] = $method;

  header("Content-Type: application/json");
  echo json_encode($parameters);
  return true;
}

function exec_curl_request($handle) {
  $response = curl_exec($handle);

  if ($response === false) {
    $errno = curl_errno($handle);
    $error = curl_error($handle);
    error_log("Curl returned error $errno: $error\n");
    curl_close($handle);
    return false;
  }

  $http_code = intval(curl_getinfo($handle, CURLINFO_HTTP_CODE));
  curl_close($handle);

  if ($http_code >= 500) {
    // do not wat to DDOS server if something goes wrong
    sleep(10);
    return false;
  } else if ($http_code != 200) {
    $response = json_decode($response, true);
    error_log("Request has failed with error {$response['error_code']}: {$response['description']}\n");
    if ($http_code == 401) {
      throw new Exception('Invalid access token provided');
    }
    return false;
  } else {
    $response = json_decode($response, true);
    if (isset($response['description'])) {
      error_log("Request was successfull: {$response['description']}\n");
    }
    $response = $response['result'];
  }

  return $response;
}

function apiRequest($method, $parameters) {
  if (!is_string($method)) {
    error_log("Method name must be a string\n");
    return false;
  }

  if (!$parameters) {
    $parameters = array();
  } else if (!is_array($parameters)) {
    error_log("Parameters must be an array\n");
    return false;
  }

  foreach ($parameters as $key => &$val) {
    // encoding to JSON array parameters, for example reply_markup
    if (!is_numeric($val) && !is_string($val)) {
      $val = json_encode($val);
    }
  }
  $url = API_URL.$method.'?'.http_build_query($parameters);

  $handle = curl_init($url);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5);
  curl_setopt($handle, CURLOPT_TIMEOUT, 60);

  return exec_curl_request($handle);
}

function apiRequestJson($method, $parameters) {
  if (!is_string($method)) {
    error_log("Method name must be a string\n");
    return false;
  }

  if (!$parameters) {
    $parameters = array();
  } else if (!is_array($parameters)) {
    error_log("Parameters must be an array\n");
    return false;
  }

  $parameters["method"] = $method;

  $handle = curl_init(API_URL);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5);
  curl_setopt($handle, CURLOPT_TIMEOUT, 60);
  curl_setopt($handle, CURLOPT_POSTFIELDS, json_encode($parameters));
  curl_setopt($handle, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));

  return exec_curl_request($handle);
}

function processMessage($message) {
  // process incoming message
  $message_id = $message['message_id'];
  $chat_id = $message['chat']['id'];
  if (isset($message['text'])) {
    // incoming text message
    $text = $message['text'];

    if (strpos($text, "/start") === 0) {
      apiRequestJson("sendMessage", array('chat_id' => $chat_id, "text" => 'Hello', 'reply_markup' => array(
        'keyboard' => array(array('Hello', 'Hi')),
        'one_time_keyboard' => true,
        'resize_keyboard' => true)));
    } else if ($text === "Hello" || $text === "Hi") {
      apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Nice to meet you'));
    } else if (strpos($text, "/stop") === 0) {
      // stop now
    } else {
      apiRequestWebhook("sendMessage", array('chat_id' => $chat_id, "reply_to_message_id" => $message_id, "text" => 'Cool'));
    }
  } else {
    apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'I understand only text messages'));
  }
}


define('WEBHOOK_URL', 'https://my-site.example.com/secret-path-for-webhooks/');

if (php_sapi_name() == 'cli') {
  // if run from console, set or delete webhook
  apiRequest('setWebhook', array('url' => isset($argv[1]) && $argv[1] == 'delete' ? '' : WEBHOOK_URL));
  exit;
}


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

if (!$update) {
  // receive wrong update, must not happen
  exit;
}

if (isset($update["message"])) {
  processMessage($update["message"]);
}
?>
6
bzim

Ich hatte ein ähnliches Problem. Jetzt gelöst .. Das Problem liegt möglicherweise in einem falschen öffentlichen Zertifikat. Bitte folgen Sie den Anweisungen, die ich in meinem Projekt vorgeschlagen habe: 

https://github.com/solyaris/BOTServer/blob/master/wiki/usage.md#step-4-create-self-signed-certificate

openssl req -newkey rsa:2048 -sha256 -nodes -keyout /your_home/BOTServer/ssl/PRIVATE.key -x509 -days 365 -out /your_home/BOTServer/ssl/PUBLIC.pem -subj "/C=IT/ST=state/L=location/O=description/CN=your_domain.com"

Telegramm-SetWebhooks-API prüft keine Daten in Ihrem selbstsignierten digitalen Zertifikat und gibt "ok" zurück, auch wenn Sie beispielsweise kein gültiges/CN angeben! Seien Sie also vorsichtig, um ein öffentliches .pem-Zertifikat zu generieren, das / CN = Ihre_Domäne enthält, die Ihrem REAL Host-Domänennamen entspricht!

3
Giorgio Robino

Es kann das SSL-Zertifikat sein. Ich hatte das gleiche Problem: Webhook bestätigte, aber tatsächlich verschlug es SSL-Zertifikat.

Dieser reddit-Thread war hilfreich: https://www.reddit.com/r/Telegram/comments/3b4z1k/bot_api_recieving_nothing_on_a_correctly/

2
robin

Ich hatte auch dieses Problem, nachdem das Telegramm meinen Bot irgendwie nicht ausgeführt hatte, also versuchte ich, das Zertifikat zu erneuern und Webhooks erneut zu setzen, aber es funktionierte nicht, daher habe ich meine VPS (yum update) aktualisiert und dann erneuert mein Zertifikat und setze Webhaken wieder. danach fing es wieder an zu arbeiten.

1
Afshin Izadi

Versuchen Sie diesen Code. Wenn Sie auf Ihrem Webhost ein gültiges SSL-Zertifikat haben und setWebhook ordnungsgemäß ausgeführt haben, sollte es funktionieren. Stellen Sie sicher, dass Sie eine Datei mit dem Namen "log.txt" erstellen, und geben Sie ihr Schreibrechte:

<?php 
define('BOT_TOKEN', '????');
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/');

// read incoming info and grab the chatID
$content    = file_get_contents("php://input");
$update     = json_decode($content, true);
$chatID     = $update["message"]["chat"]["id"];
$message    = $update["message"]["text"];

// compose reply
$reply ="";
switch ($message) {
    case "/start":
        $reply =  "Welcome to Siamaks's bot. Type /help to see commands";
        break;
    case "/test":
        $reply =  "test complete";
        break;
    case "/hi":
        $reply =  "hey there";
        break;
    case "/help":
        $reply =  "commands: /start , /test , /hi , /help ";
        break;
    default:
        $reply =  "NoNo, I don't understand you";
}

// send reply
$sendto =API_URL."sendmessage?chat_id=".$chatID."&text=".$reply;
file_get_contents($sendto);

// Create a debug log.txt to check the response/repy from Telegram in JSON format.
// You can disable it by commenting checkJSON.
checkJSON($chatID,$update);
function checkJSON($chatID,$update){

    $myFile = "log.txt";
    $updateArray = print_r($update,TRUE);
    $fh = fopen($myFile, 'a') or die("can't open file");
    fwrite($fh, $chatID ."nn");
    fwrite($fh, $updateArray."nn");
    fclose($fh);
}
0
wmac

Dies kann hilfreich sein, wer mit Laravel Telegram SDK arbeitet . Ich hatte ein Problem mit einem selbst signierten Webhook in Laravel 5.3 .
Das Problem war mit der Überprüfung der CSRF verbunden. Also habe ich die Webhook-URL zu den CSRF-Ausnahmen hinzugefügt und jetzt funktioniert alles wie ein Zauber.

0
Khalil Laleh

Dies liegt daran, dass Sie das Zertifikat nicht so einstellen

curl -F "url=https://bot.sapamatech.com/tg" -F "[email protected]/etc/Apache2/ssl/bot.pem" https://api.telegram.org/bot265033849:AAHAs6vKVlY7UyqWFUHoE7Toe2TsGvu0sf4/setWebhook

Überprüfen Sie dies Link , um zu erfahren, wie Sie das selbstsignierte Telegrammzertifikat einstellen

0
Edwin M