You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确运行PHP Telegram机器人代码?代码报错问题排查

问题分析与解决:Telegram机器人PHP代码错误

你遇到的两个警告,根源都是同一个语法错误——把函数调用写成了数组访问:

错误原因详解

  1. 第一个警告 Use of undefined constant http_build_query:PHP看到http_build_query[$params]时,会误以为你要访问一个名为http_build_query的数组(把它当成了常量),但这个常量根本不存在,所以抛出警告。
  2. 第二个警告 Illegal offset type:你试图用数组$params作为数组的键,而PHP数组的键只能是整数或字符串,因此触发“非法偏移类型”的错误。

http_build_query是PHP的内置函数,正确的调用方式是用圆括号()传递参数,而不是方括号[]。

修正后的代码

<?php 
const TOKEN = "<some token>"; 
$url = "https://api.telegram.org/bot" . TOKEN . '/getUpdates'; 

// 增加网络请求失败的处理
$responseData = file_get_contents($url);
if ($responseData === false) {
    die('无法连接Telegram API,请检查网络或Token是否正确');
}

$response = json_decode($responseData, JSON_OBJECT_AS_ARRAY); 
// echo $response; 
// var_dump($response); 

$lastUpdateId = 934084308; 
$params = [ 'offset' => $lastUpdateId + 1 ]; 
// 关键修正:把[]改成(),正确调用http_build_query函数
$output = $url . '?' . http_build_query($params); 
echo $output; 

if ($response['ok']) { 
    foreach ($response['result'] as $update) { 
        // 增加字段存在性判断,避免Undefined index错误
        if (isset($update['message'], $update['message']['text'])) {
            echo $update['message']['text']; 
        }
    } 
} 

额外优化建议

  • 动态获取最新Update ID:硬编码$lastUpdateId只能获取一次新消息,实际使用中可以从返回的response['result']里取最后一条update的update_id,这样就能持续拉取新消息:
    $lastUpdateId = 0;
    if ($response['ok'] && !empty($response['result'])) {
        $lastUpdateId = end($response['result'])['update_id'];
    }
    
  • 处理非消息类型的Update:Telegram的Update不仅包含普通消息,还可能有回调查询、编辑消息等,增加isset()判断可以避免因字段不存在导致的错误。

内容的提问来源于stack exchange,提问作者Alexey Bereznyak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:07:42