内联键盘 Telegram 机器人 [PHP]
Inline keyboard Telegram bot [PHP]
我希望我的机器人在我写 /orario 时用内联键盘回答我。
所以..我用这种方式为我的键盘创建了一个数组:
$tastierino_giorno = '[{"text":"Testo","callback_data":"StampaMessaggio"}]';
在另一个函数中我这样写:
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);
}
在此之后,通过 if,我检查用户是否写入了“/orario”。
} elseif($message == "/orario"){
tastieraInline($chatid, $tastierino_giorno);
}
现在的问题是它不起作用...有什么问题?
您应该注意电报调用的结果 return。 file_get_contents
非常适合快速运行,但不会 return 任何错误信息。
您应该使用 curl 或类似 guzzle 的库。卷曲示例:
$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 变得更加容易。
改变
$tastiera = '&reply_markup={"inline_keyboard":
['.urlencode($tastierino).'],"resize_keyboard":true}';
至
$tastiera = '&reply_markup='.urlencode('{"inline_keyboard":
['.$tastierino.'],"resize_keyboard":true}');
你应该URL编码整个JSON数据
我希望我的机器人在我写 /orario 时用内联键盘回答我。
所以..我用这种方式为我的键盘创建了一个数组:
$tastierino_giorno = '[{"text":"Testo","callback_data":"StampaMessaggio"}]';
在另一个函数中我这样写:
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);
}
在此之后,通过 if,我检查用户是否写入了“/orario”。
} elseif($message == "/orario"){
tastieraInline($chatid, $tastierino_giorno);
}
现在的问题是它不起作用...有什么问题?
您应该注意电报调用的结果 return。 file_get_contents
非常适合快速运行,但不会 return 任何错误信息。
您应该使用 curl 或类似 guzzle 的库。卷曲示例:
$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 变得更加容易。
改变
$tastiera = '&reply_markup={"inline_keyboard":
['.urlencode($tastierino).'],"resize_keyboard":true}';
至
$tastiera = '&reply_markup='.urlencode('{"inline_keyboard":
['.$tastierino.'],"resize_keyboard":true}');
你应该URL编码整个JSON数据