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

基于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的限制规则。

修复方案

  1. 修正OpenAI请求参数:避免重复传入历史消息,精简prompt:
completion = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0301",
    messages=[{"role": "user", "content": f'Предыдущие сообщения: {oldmes}; Запрос: {message.text}'}], 
    presence_penalty=0.6
)
  1. 修复超长消息处理逻辑:按字符数拆分回答,替换原错误的列表处理代码:
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)
  1. 删除错误的历史消息判断代码:原代码中判断len(lines) > 4095并发送列表的逻辑完全错误,直接删除该段。

问题2:访问api.openai.com被Cloudflare拦截

问题根源

本地环境直接调用OpenAI API,易被Cloudflare反爬机制识别为非人类请求,尤其是IP未合规或请求头不符合浏览器规范时。

解决方法

  1. 配置代理:给OpenAI库设置可访问的代理节点:
openai.proxy = "http://你的代理地址:端口"
  1. 模拟浏览器请求头:修改默认请求头,避免被识别为脚本:
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"
  1. 使用合规中转服务:国内用户可选择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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:18:13