php - 内联键盘电报机器人 [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);
}
现在的问题是它不起作用......有什么问题?
解决方案
您应该注意电报调用返回的结果。file_get_contents
非常适合让某些东西快速运行,但不返回任何错误信息。
您应该使用 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 变得更加容易。
推荐阅读
- python - else 子句中的“删除”更改了 json dict 上的循环结果
- azure-cosmosdb - Cosmos db 按“计算字段”排序
- html - 以网站为中心的广告空间
- ios - 添加到父视图控制器时如何修复子视图未显示在子视图控制器中
- kubernetes - 在带有命名空间的 YML 中指定一个秘密
- r - 基于索引的字符串拆分
- asp.net-core - 发生致命错误,找不到所需的库 libhostfxr.dylib
- javascript - 过滤嵌套的 JSON
- sql - 如何从第一个重复项开始删除具有相同 ID 的其余行?
- c++ - std::wcout,为什么打印的字符和输入的不一样?