基于Python的Telegram ChatGPT翻译Bot报错:消息过长(400错误)
问题解决:ChatGPT Telegram Bot的两类报错处理
问题1:Telegram API返回400错误(Bad Request: message is too long)
问题根源
代码里两处逻辑问题引发消息超长:
- 调用OpenAI接口时,重复传入历史消息
oldmes,导致prompt冗余,可能让返回的回答长度超出Telegram单条消息4096字符限制; - 错误地将历史消息的行列表
lines直接传给bot.reply_to,Telegram无法解析列表格式内容,且判断条件用行数量而非字符数,完全不符合Telegram的限制规则。
修复方案
- 修正OpenAI请求参数:避免重复传入历史消息,精简prompt:
completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-0301", messages=[{"role": "user", "content": f'Предыдущие сообщения: {oldmes}; Запрос: {message.text}'}], presence_penalty=0.6 )
- 修复超长消息处理逻辑:按字符数拆分回答,替换原错误的列表处理代码:
response_text = completion.choices[0].message["content"] # 处理编辑初始提示消息时的超长问题 if len(response_text) > 4095: bot.delete_message(chat_id=message.chat.id, message_id=send_message.message_id) # 按4095字符拆分发送 for i in range(0, len(response_text), 4095): bot.send_message(chat_id=message.chat.id, text=response_text[i:i+4095]) else: bot.edit_message_text(text=response_text, chat_id=message.chat.id, message_id=send_message.message_id)
- 删除错误的历史消息判断代码:原代码中判断
len(lines) > 4095并发送列表的逻辑完全错误,直接删除该段。
问题2:访问api.openai.com被Cloudflare拦截
问题根源
本地环境直接调用OpenAI API,易被Cloudflare反爬机制识别为非人类请求,尤其是IP未合规或请求头不符合浏览器规范时。
解决方法
- 配置代理:给OpenAI库设置可访问的代理节点:
openai.proxy = "http://你的代理地址:端口"
- 模拟浏览器请求头:修改默认请求头,避免被识别为脚本:
from openai import api_requestor api_requestor.DEFAULT_HEADERS["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
- 使用合规中转服务:国内用户可选择OpenAI官方认可的中转域名,或合规第三方中转服务(需遵守相关规定)。
完整修复后代码
import os import openai import telebot print('Bot started') NUMBERS_ROWS = 2 openai.api_key = "你的OpenAI API密钥" # 可选:配置代理 # openai.proxy = "http://你的代理地址:端口" # 设置浏览器请求头 from openai import api_requestor api_requestor.DEFAULT_HEADERS["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" bot = telebot.TeleBot('你的Telegram Bot Token') if not os.path.exists("users"): os.mkdir("users") @bot.message_handler(content_types=['text']) def msg(message): user_file = f"users/{message.chat.id}.txt" if not os.path.exists(user_file): with open(user_file, "x", encoding='utf-8') as f: f.write('') with open(user_file, 'r', encoding='utf-8') as file: oldmes = file.read() if message.text == '/clear': with open(user_file, 'w', encoding='utf-8') as file: file.write('') return bot.send_message(chat_id=message.chat.id, text='История очищена!') try: send_message = bot.send_message(chat_id=message.chat.id, text='Обрабатываю запрос, пожалуйста подождите!') # 精简prompt,避免重复传历史 completion = openai.ChatCompletion.create( model="gpt-3.5-turbo-0301", messages=[{"role": "user", "content": f'Предыдущие сообщения: {oldmes}; Запрос: {message.text}'}], presence_penalty=0.6 ) response_text = completion.choices[0].message["content"] # 处理超长消息 if len(response_text) > 4095: bot.delete_message(chat_id=message.chat.id, message_id=send_message.message_id) for i in range(0, len(response_text), 4095): bot.send_message(chat_id=message.chat.id, text=response_text[i:i+4095]) else: bot.edit_message_text(text=response_text, chat_id=message.chat.id, message_id=send_message.message_id) # 保存对话历史 with open(user_file, 'a+', encoding='utf-8') as file: file.write(message.text.replace('\n', ' ') + '\n' + response_text.replace('\n', ' ') + '\n') # 截断历史,保留最近NUMBERS_ROWS条对话(每条对话是用户+助手两行) with open(user_file, 'r', encoding='utf-8') as f: lines = f.readlines() if len(lines) >= NUMBERS_ROWS * 2 + 1: with open(user_file, 'w', encoding='utf-8') as f: f.writelines(lines[2:]) except Exception as e: bot.send_message(chat_id=message.chat.id, text=str(e)) bot.infinity_polling()
内容的提问来源于stack exchange,提问作者Salatik
相关产品推荐
相关产品推荐

