如何使用 Telegram API 接收图像?

Posted

技术标签:

【中文标题】如何使用 Telegram API 接收图像?【英文标题】:How to receive images with the Telegram API? 【发布时间】:2015-09-19 06:12:28 【问题描述】:

是否可以接收任何用户发送给机器人的图像(并将其存储在服务器上)?

如果发送了图片,我会收到此 JSON 帖子。这是 Telegram Bot-API 描述的链接。不知道能不能收到全图:https://core.telegram.org/bots/api#available-types

"update_id":XXXXX,
"message":"message_id":2222,"from":"id":XXXXX,"first_name":"Christoph","last_name":"XXXXX","chat":"id":XXXXX,"first_name":"Christoph","last_name":"XXXXX","date":1435704055,"forward_from":"id":XXXXX,"first_name":"Christoph","last_name":"XXXXX","forward_date":1435703471,"photo":["file_id":"AgADAgADmaoxG9KknwF4O978o3EMqb_EWSoABI5s-WWq46dqiR0AAgI","file_size":998,"width":51,"height":90,"file_id":"AgADAgADmaoxG9KknwF4O978o3EMqb_EWSoABHax4HvxYqktiB0AAgI","file_size":9912,"width":180,"height":320,"file_id":"AgADAgADmaoxG9KknwF4O978o3EMqb_EWSoABNzzDwp3sT2whx0AAgI","file_size":41020,"width":450,"height":800,"file_id":"AgADAgADmaoxG9KknwF4O978o3EMqb_EWSoABE0Gg-AefJ7Yhh0AAgI","file_size":66058,"width":720,"height":1280]

【问题讨论】:

你的 php 代码在哪里? 此时我什么都没有,因为我不知道在这种情况下该怎么办。现在,只将 Telegram Webhook-Call 的内容存储到我的脚本中。 假设我们不知道 Telegram API,并引导我们了解正在发生的事情。这里的 JSON 是来自 Telegram 的回复消息吗?它引用了一些file_id 代码——它们存储在哪里?是否有 API 调用来获取它们? 您能否指出文档中有助于我们回答的相关部分? 我最初链接了电报api文档,但它似乎被删除了。 JSON Here 是来自 Telegram 的回复,它将通过 Webhook 发送到我的脚本。我使用 file_get_contents('php://input') 为传入的 JSON 数据创建了一个日志文件,整个内容都在我的第一篇文章的代码框中。没有 Api-Call 来获取它们,但是 Telegram 是否可以在 Webhook 中以任何其他格式发送 Pic?我尝试 print_r($_POST) 和 $_GET 等等,但是每次我尝试时数组都是空的,所以看起来上面是我唯一收到的。对不起我的英语不好 【参考方案1】:

接受的答案很好。但这里有一个更详细的答案。在获得实际图像文件之前,涉及三个主要步骤。 1) 向 Telegram 请求file_id。 2) 加载 Guzzle 客户端。 3) 向 Telegram 请求file_path。请密切注意下面的不同 URL 路径。

// get file id
$id = $update['message']['photo'][0]['file_id'];
$file_id = "https://api.telegram.org/bot" . 
 config('app.telegram_api_key') . "/getFile?file_id=" . $id;

// guzzle client
$guzzle_client = new GuzzleClient();
$request = $guzzle_client->get($file_id);
$response = json_decode($request->getBody(),true);

// get file path
$file_url = "https://api.telegram.org/file/bot" .
 config('app.telegram_api_key') . "/" . $response['result']['file_path'];

【讨论】:

【参考方案2】:

可以从 Telegram 服务器下载图像。 这样做: 1.使用getFileapi获取文件

//Telegram link
$telegram_link = 'https://api.telegram.org/bot' . $this->tg_configs['api_key'] . '/getFile?file_id=' . $photo['file_id'];

2。获取文件路径 //创建guzzle客户端 $guzzle_client = new GuzzleClient();

//Call telegram
$request = $guzzle_client->get($telegram_link);
//Decode json
$json_response = json_decode($request->getBody(), true);
if ($json_response['ok'] == 'true') 

    //Telegram file link
    $telegram_file_link = 'https://api.telegram.org/file/bot' . $this->tg_configs['api_key'] . '/' . $json_response['result']['file_path'];

3。如果使用 PHP,请使用 Intervention/Image 下载图像并将其保存在您的服务器上。

//Build upload path
$upload_path = public_path() . \Config::get('media::media.uploadPath');
//Get image
$image = $thumbnail = InterventionImage::make($telegram_file_link);

//Get mime
$mime = $image->mime();

if ($mime == 'image/jpeg') 
    $extension = '.jpg';
 elseif ($mime == 'image/png') 
    $extension = '.png';
 elseif ($mime == 'image/gif') 
    $extension = '.gif';
 else 
    $extension = '';
//E# if else statement
//Resize images
$image->resize(\Config::get('media::media.mainWidth'), \Config::get('media::media.mainHeight'));
$thumbnail->resize(\Config::get('media::media.thumbnailWidth'), \Config::get('media::media.thumbnailHeight'));

//Build media name
$media_name = \Str::random(\Config::get('media::media.mediaNameLength')) . $extension;

//Save images
$image->save($upload_path . '/' . $media_name);
$thumbnail->save($upload_path . '/thumbnails/' . $media_name);

【讨论】:

【参考方案3】:

Telegram 支持下载文件现在getFile:

可以在api文档中看到:https://core.telegram.org/bots/api#getfile

【讨论】:

以上是关于如何使用 Telegram API 接收图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Telegram Bot API 获取 Telegram 频道用户列表

如何与 Telegram API 交互

Excel VBA 使用 Telegram bot api 发送图像

如何使用 Telegram API 实现授权?

如何使用 Telegram Bot API 发送表情符号?

如何在 C# 中使用 Telegram API 发送消息