我想知道如何捕获 telegram bot API 中任何可能的错误。 因为当发生错误时,电报会坚持下去,不会回答其他请求。 如果我的代码中的错误或我正在使用的网络服务或阻止机器人或... 如何避免使用 PHP 在 telegram bot API 中坚持一个请求? 我认为我需要的是类似于下面的代码,但对于任何类型的错误都更通用:
try {
$telegram->sendMessage([
'chat_id' => '<PERSONS_ID>',
'text' => 'Here is some text',
]);
} catch (TelegramResponseException $e) {
$errorData = $e->getResponseData();
if ($errorData['ok'] === false) {
$telegram->sendMessage([
'chat_id' => '<ADMINISTRATOR ID>',
'text' => 'There was an error for a user. ' . $errorData['error_code'] . ' ' . $errorData['description'],
]);
}
}
最后我通过一个技巧解决了这个问题。我创建了另一个机器人来处理错误。 所以我有一个机器人 X 和一个错误处理机器人 Y。 这里是我从电报接收 webhook 的 POST 方法:
public function postWebhook(Request $request)
{ .....
try
{ ....
bot X token
everything the bot want to do...
}
catch (\Exception $e)
{
bot Y send me the probable problem in my code....
}
catch (Throwable $e)
{
bot Y send me the probable problem in telegram such
as blocking ,..
}
现在我可以防止陷入错误,并且机器人工作得很好。如果我的网络服务的一部分出现问题或我的代码有错误,即使我也会收到通知。
间接相关,但添加此答案以防有人发现此搜索与 WordPress 一起使用,因为我昨天想出了这个:
// https://developer.wordpress.org/reference/hooks/is_wp_error_instance/
add_action('is_wp_error_instance', 'log_registration_errors' );
function telegram_log ( $message ) {
$apiToken = "[YOUR API TOKEN]";
$data = [
'chat_id' => '[YOUR CHAT ID]',
'text' => get_site_url() .chr(10).chr(10). $message,
"parse_mode" => "Markdown"
];
$ch = curl_init();
// Set query data here with the URL
curl_setopt($ch, CURLOPT_URL, "http://api.telegram.org/bot$apiToken/sendMessage?". http_build_query($data) );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// the old file_get_contents solution limited the length of the query string.
// return file_get_contents("http://api.telegram.org/bot$apiToken/sendMessage?" . http_build_query($data) );
$response = curl_exec($ch);
curl_close($ch);
}
使用curl而不是file_read_contents,因为由于某种原因它限制了查询字符串,因此只有一半的消息通过并且代码没有突出显示。
将对象和数组编码为 JSON 以进行传输:
function json_code_block ($code) {
return chr(96).chr(96).chr(96)."json".chr(10).
json_encode( $code, JSON_PRETTY_PRINT )
.chr(10).chr(96).chr(96).chr(96);
}
使用示例:
telegram_log(
"WP Error: " . chr(10) . json_code_block( $errors )
. chr(10) . "POST: " . chr(10) . json_code_block( $_POST )
. chr(10) . "QUERY:" .chr(10) . json_code_block( $wp_query )
);