TBXark / ChatGPT-Telegram-Workers

Deploy your own Telegram ChatGPT bot on Cloudflare Workers with ease.
https://t.me/ChatGPT_Telegram_Workers
MIT License
3.5k stars 834 forks source link

[BUG] ChatGPT 生成的文本中包含特殊字符导致消息发送失败 #130

Closed linepro6 closed 1 year ago

linepro6 commented 1 year ago

版本号

你可以在代码编辑器中前几行找到, 它们分别是BUILD_TIMESTAMPBUILD_VERSION, 这俩个数据对于我们定位问题非常重要]

  • ts: 1678945730
  • sha: 9e23846

描述问题 ChatGPT 生成的文本中包含 Markdown 或者 HTML 中规定的特殊字符时会导致 Telegram API 调用失败,进而导致消息发送失败。

来自 api.telegram.org 的参考失败响应如下:

{"ok":false,"error_code":400,"description":"Bad Request: can't parse entities: Can't find end of the entity starting at byte offset 23"}

复现问题 重现问题的步骤:

  1. 令 ChatGPT 生成一段包含下划线 _ 的文本
  2. 机器人无任何回复。

预期行为

  1. 对 Telegram API 的失败调用进行记录和提示,便于 debug。
  2. 对 ChatGPT 所生成的文本转义,规避特殊字符。

    但这样做又会导致真正的 Markdown 格式文本被误杀,可能需要想办法识别区分,或者仅在发送失败时进行转义操作。 参考转义代码(此代码会丢失所有的 Markdown 格式,仅供参考)

    
    // https://github.com/kemitchell/markdown-escape.js/blob/main/index.js
    function escapeMarkdown(string, skips) {
    const replacements = [
    [/\*/g, '\\*', 'asterisks'],
    [/#/g, '\\#', 'number signs'],
    [/\//g, '\\/', 'slashes'],
    [/\(/g, '\\(', 'parentheses'],
    [/\)/g, '\\)', 'parentheses'],
    [/\[/g, '\\[', 'square brackets'],
    [/\]/g, '\\]', 'square brackets'],
    [/</g, '&lt;', 'angle brackets'],
    [/>/g, '&gt;', 'angle brackets'],
    [/_/g, '\\_', 'underscores'],
    [/`/g, '\\`', 'codeblocks']
    ];
    skips = skips || []
    return replacements.reduce(function (string, replacement) {
    var name = replacement[2]
    return name && skips.indexOf(name) !== -1
    ? string
    : string.replace(replacement[0], replacement[1])
    }, string)
    }

// https://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript function escapeHtml(unsafe) { return unsafe.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", '''); }

async function sendMessageToTelegram(message, token, context) { console.log("\u53D1\u9001\u6D88\u606F:\n", message); const botToken = token || SHARE_CONTEXT.currentBotToken; const chatContext = context || CURRENT_CHAT_CONTEXT; if (message.length <= 4096) { return await sendMessage(escapeMarkdown(message), botToken, chatContext); } console.log("\u6D88\u606F\u5C06\u5206\u6BB5\u53D1\u9001"); const limit = 4e3; chatContext.parse_mode = "HTML"; for (let i = 0; i < message.length; i += limit) { const msg = message.slice(i, i + limit); await sendMessage(<pre> ${escapeHtml(msg)} </pre>, botToken, chatContext); } return new Response("MESSAGE BATCH SEND", { status: 200 }); }



**截图**
无

**其他信息**
无
TBXark commented 1 year ago

THANKS,稍后在dev分支中尝试修复

TBXark commented 1 year ago

dev分支添加了,markdown格式发送失败尝试使用HTML格式发送,你可以尝试一下