Telegram Bot发送本地cute_dogs目录随机图片报400 wrong HTTP URL错误如何修复
报错根因
- 触发
wrong HTTP URL specified报错的核心逻辑:telebot的send_photo方法收到字符串类型的图片入参时,会直接把字符串当作公网可访问的HTTP/HTTPS URL传给Telegram官方服务器,要求服务器自行拉取该URL的图片。你传入的是本地相对路径字符串,不符合合法URL格式,因此接口返回400错误。
修复实现方案
核心改造点
- 不再直接传递本地路径字符串,改为以二进制只读模式打开本地图片文件,将文件句柄作为
send_photo的入参,此时telebot会直接读取本地文件内容上传给Telegram,不需要走URL拉取流程 - 加入随机选取逻辑,从目录的有效图片列表中随机抽选1张发送
- 加入文件格式校验,避免误传非图片文件
完整参考代码
import os import random from telebot import TeleBot # 替换为你自己的Bot Token bot = TeleBot("YOUR_BOT_TOKEN") # 基于当前脚本路径拼接图片目录绝对路径,避免相对路径定位偏差 DOG_IMG_FOLDER = os.path.join(os.path.dirname(os.path.abspath(__file__)), "cute_dogs") def pick_random_dog_image(): # 定义合法图片后缀 SUPPORTED_EXTS = (".jpg", ".jpeg", ".png", ".gif", ".webp") all_entries = os.listdir(DOG_IMG_FOLDER) # 过滤出目录下的有效图片文件 valid_imgs = [] for entry in all_entries: full_path = os.path.join(DOG_IMG_FOLDER, entry) if os.path.isfile(full_path) and entry.lower().endswith(SUPPORTED_EXTS): valid_imgs.append(full_path) if not valid_imgs: return None # 随机选一张图片的完整路径 selected_path = random.choice(valid_imgs) # 返回二进制打开的文件句柄 return open(selected_path, "rb") # 匹配关键词的消息处理逻辑 @bot.message_handler(func=lambda msg: "狗狗" in msg.text and "发图" in msg.text) def handle_dog_pic_request(message): img_file = pick_random_dog_image() if not img_file: bot.reply_to(message, "当前没有可用的狗狗图片") return # 传入文件句柄发送图片 bot.send_photo(message.chat.id, img_file) # 发送完成后关闭文件句柄,释放系统资源 img_file.close() # 启动bot轮询 bot.infinity_polling()
避坑提示
- 不要为了图省事直接把路径字符串塞给
send_photo,本地路径永远会触发这个400报错 - 长期运行的服务一定要记得关闭打开的文件句柄,否则会出现系统文件句柄耗尽的问题
- 尽量用绝对路径定位图片目录,不要直接写"cute_dogs/xxx.jpg"这类相对路径,换运行目录后会出现找不到文件的问题
- 过滤文件列表时不要只检查后缀,要判断条目是文件而非子目录,避免遍历嵌套文件夹触发错误
内容的提问来源于stack exchange,提问作者BELEЦKIY
相关产品推荐
相关产品推荐

