Telegram API:messages.getHistory能否用GET请求?PHP无依赖实现
问题解答
1. messages.getHistory能否用GET请求调用?
不能。原因如下:
- 你之前调用的
sendMessage属于Telegram HTTP Bot API,这类接口基于REST设计,支持GET/POST请求,地址格式为https://api.telegram.org/bot{TOKEN}/{METHOD}。 - 而
messages.getHistory是Telegram MTProto API的方法,这是Telegram的底层客户端协议,并非HTTP Bot API的一部分,无法通过普通HTTP GET请求直接调用,因此会返回404。
如果你只是需要获取聊天记录,HTTP Bot API提供了对应的getChatHistory方法,这个可以用GET或POST请求调用。
2. 最简PHP实现方案
方案一:使用HTTP Bot API的getChatHistory(推荐,无依赖)
直接用原生PHP curl发起请求,示例代码:
<?php $token = '你的Bot Token'; $chatId = '目标聊天ID'; $limit = 10; // 要获取的消息数量 // 构造请求URL $url = "https://api.telegram.org/bot{$token}/getChatHistory?chat_id={$chatId}&limit={$limit}"; // 发起GET请求 $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); // 处理响应 $result = json_decode($response, true); if ($result['ok']) { print_r($result['result']); } else { echo "请求失败:" . $result['description']; } ?>
方案二:调用MTProto API的messages.getHistory(无依赖,但复杂度高)
由于MTProto需要加密通信,无依赖的实现需要处理AuthKey生成、消息加密等步骤,以下是极简的基础框架(仅作演示,实际使用需完善加密逻辑):
<?php // 注意:此示例仅展示MTProto请求的基本结构,完整实现需要处理MTProto的加密、AuthKey等 $apiId = '你的API ID'; // 从my.telegram.org获取 $apiHash = '你的API Hash'; $chatId = 123456; // 目标聊天ID $limit = 10; // MTProto的基础请求地址 $url = 'https://api.telegram.org/'; // 构造messages.getHistory的请求结构(需加密) $request = [ '_' => 'messages.getHistory', 'peer' => ['_' => 'inputPeerChat', 'chat_id' => $chatId], 'limit' => $limit ]; // 此处省略MTProto的序列化、加密、AuthKey处理等关键步骤 // 最终需将加密后的数据包通过POST发送 $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $encryptedRequest); // 替换为加密后的内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); // 响应需解密和反序列化后才能处理 ?>
注意:MTProto API的实现复杂度远高于HTTP Bot API,若仅为实现Bot的聊天记录获取需求,强烈推荐使用HTTP Bot API的
getChatHistory方法。
内容的提问来源于stack exchange,提问作者freeze2001
相关产品推荐
相关产品推荐

