嵌入式键盘Telegram机器人[PHP]

时间:2018-09-24 19:30:54

标签: php telegram telegram-bot

当我写/ orario时,我想要我的机器人,他用嵌入式键盘回答我。

所以..我以此方式为键盘创建了一个数组:

crictl logs <container-id>

在另一个函数中,我这样写:

$tastierino_giorno = '[{"text":"Testo","callback_data":"StampaMessaggio"}]';

在此之后,使用if,检查用户是否写了“ / orario”。

function tastieraInline($chatid, $tastierino)
{
    global $token;
    $messaggio = "Scegli per che giorno inviare il messaggio:";
    $tastiera = '&reply_markup={"inline_keyboard": 
  ['.urlencode($tastierino).'],"resize_keyboard":true}';
    $url = "https://api.telegram.org/$token/sendMessage?chat_id=$chatId&parse_mode=HTML&text=".urlencode($messaggio).$tastiera;

    file_get_contents($url);

}

现在的问题是它不起作用...是什么问题?

2 个答案:

答案 0 :(得分:0)

您应注意电报呼叫返回的结果。 file_get_contents非常适合快速使某项工作正常,但不会返回任何错误信息。

您应该使用curl或类似guzzle的库。 curl的示例:

$ch = curl_init( $url );
if ( $ch == FALSE )
{
  error_log( "Error initialising curl" );
  return FALSE;
}

curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
curl_setopt( $ch, CURLOPT_POST, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $ch, CURLOPT_FORBID_REUSE, 1 );
// Set TCP timeout to 30 seconds
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 30 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Connection: Close' ) );

$result = curl_exec( $ch );
$error = curl_errno( $ch );
$errorStr = curl_error( $ch );
curl_close( $ch );
if ( $error != 0 )
{
  return array( $errorStr, $result );
}
return $result;

如果您不介意安装其他库,则Guzzle会简单得多。

希望这将使您从失败的电报呼叫中得到错误字符串。

关于您的实际问题。您应该使用json_encode为键盘标记创建json,而不是附加字符串。 http_build_query使构建URL更加容易。

答案 1 :(得分:0)

更改

$tastiera = '&reply_markup={"inline_keyboard": 
  ['.urlencode($tastierino).'],"resize_keyboard":true}';

$tastiera = '&reply_markup='.urlencode('{"inline_keyboard": 
  ['.$tastierino).'],"resize_keyboard":true}');

您应该使用URL对整个JSON数据进行编码