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

Telegram Bot开发:如何对比本地图片与机器人发送的图片?

问题分析与解决方案

首先,你遇到的两个核心问题:

  • message.photo 为 None:说明机器人未正确接收图片消息,或用户发送的并非图片类型(比如是文档、贴纸而非图片)。
  • 直接对比文件对象与 message.photo 完全不可行:open() 返回的是本地文件句柄,而 message.photo(正常接收时)是 Telegram 返回的图片尺寸对象列表,两者类型、内容完全不同,无法用 == 直接对比。

第一步:解决 message.photo 为 None 的问题

  • 确认用户发送的是原生图片消息,而非文档、表情包等其他类型。
  • 在 BotFather 中检查机器人权限:发送 /setprivacy 选择你的机器人,设置为 Disable,确保机器人能接收所有对话消息。
  • 代码中先判断消息类型:用 if message.photo: 过滤图片消息,进入分支则说明 message.photo 不为空。

第二步:正确对比本地图片与机器人收到的图片

直接对比文件对象行不通,需通过图片内容的哈希值验证一致性,步骤如下:

  1. 预计算本地目标图片的哈希值(比如 MD5、SHA256)。
  2. 机器人收到图片时,下载图片到临时文件,计算其哈希值。
  3. 对比两个哈希值,一致则执行后续插入带描述链接的逻辑。

示例代码(基于 python-telegram-bot)

import hashlib
import os
from telegram import Update
from telegram.ext import Updater, MessageHandler, Filters, CallbackContext

# 计算文件的MD5哈希值
def get_file_hash(file_path):
    md5 = hashlib.md5()
    with open(file_path, 'rb') as f:
        while chunk := f.read(4096):
            md5.update(chunk)
    return md5.hexdigest()

# 预计算本地目标图片的哈希值
TARGET_PHOTO_HASH = get_file_hash("img/1 (1).jpg")

def handle_photo(update: Update, context: CallbackContext):
    message = update.effective_message
    if not message.photo:
        return  # 非图片消息直接返回
    
    # 获取最大尺寸的图片文件ID(message.photo按尺寸从小到大排列,取最后一个)
    largest_photo = message.photo[-1]
    file = context.bot.get_file(largest_photo.file_id)
    
    # 下载图片到临时文件
    temp_file = "temp_received.jpg"
    file.download(temp_file)
    
    # 计算接收图片的哈希值
    received_hash = get_file_hash(temp_file)
    
    # 对比哈希值,匹配则执行逻辑
    if received_hash == TARGET_PHOTO_HASH:
        print(10)  # 此处替换为插入带描述链接的代码
        # 示例:发送带描述的链接
        context.bot.send_message(
            chat_id=message.chat.id,
            text="对应图片的相关链接:[示例描述](替换为你的链接)"
        )
    
    # 清理临时文件
    os.remove(temp_file)

def main():
    # 替换为你的机器人TOKEN
    updater = Updater("YOUR_BOT_TOKEN")
    dp = updater.dispatcher
    # 添加图片消息处理器
    dp.add_handler(MessageHandler(Filters.photo, handle_photo))
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

额外说明

  • 若 Telegram 对用户上传的图片进行了压缩,本地原图与压缩后的图片哈希值会不一致。这种场景下可改用**感知哈希(pHash)**进行特征匹配,实现更宽松的图片相似度对比,但复杂度会更高。
  • 如果你使用的是其他 Telegram Bot 库(如 pyTelegramBotAPI),核心逻辑一致:获取图片文件 ID → 下载图片 → 计算哈希对比。

内容的提问来源于stack exchange,提问作者eue zxc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:10:30