如何捕获电报机器人中的任何错误?

问题描述 投票:0回答:2

我想知道如何捕获 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'],
        ]);
    }
}
php laravel try-catch telegram-bot
2个回答
0
投票

最后我通过一个技巧解决了这个问题。我创建了另一个机器人来处理错误。 所以我有一个机器人 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 ,..
        }

现在我可以防止陷入错误,并且机器人工作得很好。如果我的网络服务的一部分出现问题或我的代码有错误,即使我也会收到通知。


0
投票

间接相关,但添加此答案以防有人发现此搜索与 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 )
);
© www.soinside.com 2019 - 2024. All rights reserved.