J'ai des problèmes avec webhook pour L'API de bot de télégramme.

Pourquoi mon webhook ne fonctionne pas? Je ne reçois aucune donnée de l'API de bot de télégramme. Voici l'explication de mon problème:

je suis SSL cert from StartSSL, il fonctionne très bien sur mon site (selon geocerts SSL checker), mais il semble toujours que mon webhook pour L'API de Bot de télégramme ne fonctionne pas (bien que cela indique que webhook a été configuré, Je ne reçois pas de données).

je fais un webhook à mon script sur mon site dans ce forme:

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

je reçois ce texte en réponse:

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

donc ça doit marcher, mais en fait ça ne marche pas.

Voici mon code de script:

<?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);
}

?>

Je ne reçois aucune donnée pour $ update. Donc webhook ne fonctionne pas. Pourquoi?

19
demandé sur Charles Okwuagwu 2015-10-23 16:07:56

7 réponses

j'étais avec ce problème. J'essayais de chercher partout et je n'arrivais pas à trouver la solution à mon problème, parce que les gens disaient tout le temps que le problème était le certificat SSL. Mais j'ai trouvé le problème, et il y avait beaucoup de choses manquantes sur le code pour interagir avec l'API de télégramme webhook envolving curl et ce genre de choses. Après j'ai regardé dans un exemple au télégramme bot documentation, j'ai résolu mon problème. Regardez cet exemple 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
répondu bzim 2016-05-26 14:29:52

j'ai eu le même problème. Maintenant résolu. Le problème réside peut-être dans un certificat public erroné. Merci de suivre avec attention les instructions que je propose dans mon projet:

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"

Telegram setWebhooks API ne Vérifiez pas les données à l'intérieur de votre certificat numérique auto-signé, en retournant "ok" même si par exemple vous ne spécifiez pas un /CN valide! Si attention à générer un public .le certificat pem contenant / CN = your_domain correspondant à votre vrai nom de domaine HOST!

3
répondu Giorgio Robino 2015-12-01 13:55:56

Il est peut-être le SSL cert. J'ai eu le même problème: Webhook confirmé mais effectivement SSL cert borked.

ce fil reddit a été utile: https://www.reddit.com/r/Telegram/comments/3b4z1k/bot_api_recieving_nothing_on_a_correctly/

2
répondu robin 2015-10-31 14:08:43

j'ai eu ce problème aussi, après que d'une certaine façon le télégramme n'ait pas lancé mon bot, donc j'ai essayé de renouveler le certificat et de remettre les crochets web, mais encore une fois cela n'a pas fonctionné, donc j'ai mis à jour mon VPS(yum update) et puis renouveler mon certificat et remettre les crochets web. après ces il a commencé à travailler à nouveau.

1
répondu Afshin Izadi 2017-12-17 15:01:45

cela peut aider qui travaille avec Laravel Telegram SDK. J'ai eu un problème avec l'auto-signé webhook dans Laravel 5.3. Après la mise en place et L'obtention de résultat OK de télégramme avec le message "Webhook a été mis", il n'a pas fonctionné.

Le problème était lié à la vérification de la FCRR. J'ai donc ajouté l'url webhook aux exceptions CSRF et maintenant tout fonctionne comme un charme.

0
répondu Khalil Laleh 2017-04-02 08:16:36

essayez ce code. Si vous avez un SSL valide sur votre hôte web et que vous avez correctement lancé le setWebhook, il devrait fonctionner (fait pour moi). Assurez-vous de créer un fichier appelé "log.txt" et donner la permission d'écrire:

<?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
répondu wmac 2017-09-02 19:22:07

C'est parce que vous ne définissez pas le certificat comme ceci

curl -F "url=https://bot.sapamatech.com/tg" -F "certificate=@/etc/apache2/ssl/bot.pem" https://api.telegram.org/bot265033849:AAHAs6vKVlY7UyqWFUHoE7Toe2TsGvu0sf4/setWebhook

Cochez cette lien comment régler Télégramme Certificat Auto-Signé

-1
répondu Edwin M 2016-09-28 13:33:37