Night-stars-1 / LiteLoaderQQNT-Plugin-QQPromote

LiteLoader插件|QQ增强|复读姬|+1|二维码识别|时间显示|翻译|屏蔽更新|链接预览|ChatGPT|禁止回复自动AT|侧边栏管理|自动登录|屏蔽通话|群聊名称扩展
3 stars 0 forks source link

fix: 修复网页预览非utf8乱码 #61

Closed xmexg closed 8 months ago

xmexg commented 8 months ago

https://github.com/Night-stars-1/LiteLoaderQQNT-Plugin-QQPromote/issues/57
新引入了iconv-lite用于转换编码。创建了testScript文件夹用于存放测试用例(可删)。

Night-stars-1 commented 8 months ago

https://github.com/Night-stars-1/LiteLoaderQQNT-Plugin-QQPromote/blob/74b191a35fdf385ecd0fd0d170d1c9a02c618434/src/main/link_preview.js#L17 content-type不一定携带charset 并且所有请求都使用iconv解码会拖慢整体处理速度,这在包体较大时尤为明显

该项目去除open-graph-scraper的原因这个

xmexg commented 8 months ago

好,那就先utf8获取,读head,看head里的charset,如果非utf8,再获取一次,我再改改

Night-stars-1 commented 8 months ago

好,那就先utf8获取,读head,看head里的charset,如果非utf8,再获取一次,我再改改

👌

MliKiowa commented 8 months ago

好,那就先utf8获取,读head,看head里的charset,如果非utf8,再获取一次,我再改改

👌

@Night-stars-1 修好了 性能方面应该还行 @xmexg 没测试 你自己测测了

async function getHtml(url) {
    const response = await axios.get(url, { responseType: 'arraybuffer' });
    let u8Array = ["utf8", "UTF8", "utf-8", "UTF-8"];
    let charType = 'utf-8';
    let htmlData = response.data.toString();
    let headContent = htmlData.match(/<head([\s\S]*?)\/head>/i)[0];
    if (response.headers['content-type'].includes('charset')) {
        charType = response.headers['content-type'].match(/charset=(.*)/i)[1];
    } else if (headContent.includes('charset=')) {
        charType = headContent.match(/charset="(.*)"/i)[1];
    }
    if (charType !== "utf-8" && u8Array.indexOf(charType) == -1 && iconv.encodingExists(charType)) {
        headContent = iconv.decode(response.data, charType).match(/<head([\s\S]*?)\/head>/i)[0];
    }
    return headContent;
}
xmexg commented 8 months ago

@MliKiowa 事实上,我在等着另一个pr image

MliKiowa commented 8 months ago

@MliKiowa 事实上,我在等着另一个pr image

事实这么写有一个问题 编码值设置UTF8大写或者UTF-8会走向错误分支 并不优雅 同时await配then展开有点不好看

xmexg commented 8 months ago

事实这么写有一个问题 编码值设置UTF8大写或者UTF-8会走向错误分支 并不优雅 同时await配then展开有点不好看

用你的了