上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

草履虫都能看懂的chatGPT-AI接入谷歌必应实战教学(三)

[复制链接]
  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2022-12-14 19:45:00 | 显示全部楼层 | 阅读模式

    本帖最后由 bigonion 于 2023-5-3 01:53 编辑

    本帖最后由 bigonion 于 2023-3-11 12:49 编辑

    本帖最后由 bigonion 于 2023-3-11 12:49 编辑

    本帖最后由 bigonion 于 2023-3-11 12:38 编辑

    本帖最后由 bigonion 于 2022-12-14 20:00 编辑

    本帖最后由 bigonion 于 2022-12-14 19:51 编辑

    chatGPT 接入搜索引擎实战教学(三)eventStream的数据处理

    chatGPT tools plus++

    example example example example example

    难度级别

    • 草履虫
    • 大妈
    • 小学生
    • 博士生

    那些Uint8Array数组是什么?

    上回说到,看到一堆不停打印的Uint8Array数组,em?这都是啥?Alt text
    难道是?看到这些数字基本没有超过120的,我心里有了一个答案,也许是ASCII码?什么?你不知道ASCII码?点我了解ASCII码此时对其中一个数组点击展开然后,只需要点击这个小图标来到内存查看器Alt text
    Alt text
    真的看到解码后的数据了耶!让我们来看看他到底经历了什么变换吧!首先我们的原始数据为

    [100, 97, 116, 97, 58, 32, 123, 34......]

    对其每一项十进制转十六进制可以得到

    [64,61,74,61,3A,20,7B,22]
    dec hex character
    100 64 d
    97 61 a
    116 74 t
    97 61 a
    ...... ...... ......

    这不就轻轻松松拿到了真正的数据了吗,只需要把所有的数组里面的数字都转成ASCII字符,我们只需要打表,循环转换,然后...那当然是不可能滴,js中有现成的转换ASCII函数:String.fromCharCode()只需要丢给他十进制数字,他就能帮你转成ASCII字符,例如:

    String.fromCharCode(103,103,110,98)

    返回什么大家可以自己试试看输出什么就当我以为胜券在握的时候,没想到直接往里面丢数组居然报错了

    String.fromCharCode([1,2,3,4,5])

    这样居然不可以!
    我也想过丢字符串去掉"[""]"进去,但是发现这个函数只能接收1,2,3,4,5这种形式,最后还是Google到了解决方法:
    String.fromCharCode.apply(null,Array)这个我在MDN也没找到解释,但是真的能用。。。

    String.fromCharCode.apply(null,[100,97,100,97]) //大家自个试试

    接下来我们看看转成字符后的输出吧!
    Alt text

    那么再接下来的事情就很清晰明朗了,对所有返回的8bitarray转成ASCII字符后,接着想办法拿到真正的回复内容,回复内容是parts里面的东西,一看就知道用的是Unicode编码,这个js中也有现成的函数。什么,还不知道什么是Unicode编码?点我,了解Unicode和utf-8的区别与关系

    unescape("\u8f6c\u6362") //输出:转换

    好的我们已经拿到parts里面的数据了
    我比较喜欢用正则匹配,大家也可以各显神通,什么Slice,什么Split啊包括JSON.parse转成JSON对象再调用啊都可以,下面就只用正则匹配的方式来阐述。什么?你还不知道什么是正则表达式?点我,十分钟了解正则!下面是示例代码

    const chunk = value;
    result += chunk;
    normalArray = Array.from(chunk) //没有这一步也可以
    nowResult = String.fromCharCode.apply(null, normalArray).match(/(?<=\[).*(?=\])/g)[0] //取出真正的回答内容
    
    if (nowResult !== "DONE") {
    finalResult = nowResult
    }
    
    document.getElementById('gptAnswer').innerHTML = mdConverter(decodeUnicode(finalResult.replace(/\\n+/g, "\n")))
    
    function decodeUnicode(str) {
        str = str.replace(/\\/g, "%");
        str = unescape(str);
        str = str.replace(/%/g, "\\");
        str = str.replace(/\\/g, "");
        return str;
    }

    finalResult取出来之后,观察发现带有很多形如\nn的换行符,所以需要稍微修剪一下把他们统一换成\n,最后用Unicode解码,然后用第三方markdown转HTML的解析js库来转换,最后改改样式,呈现到浏览器页面上!Alt text

    杂谈

    • GM_xmlhttprequest提供的fetch方式难道不可以吗?答案是,可以,但是返回的也是一个ReadableStream对象,和XMLHttpRequest在这里的处理方式基本没有区别,也是要在onloadstart对这个对象进行读取处理,并且fetch有一个问题,即不能对其进行abort也不支持超时控制,所以在这里,XHR是更为优质的选择
    • 其实这中间经历了很多无用的尝试,教程里面其实也没有都写出来,主要是为了阅读体验能好一点,当然也不会像教程里说的那么轻描淡写啦

    后记

    找到解决方法后,和zbbgg分享了如何解决的方法,也是荣幸出现在致谢表里了😁
    Alt text

    项目地址

    chatGPT tools Plus ++ (cookie版)
    欢迎大家下载使用!

    关于

    Author:bigonion
    e-Mail:[email]bigonion@bigonion.cn[/email]

    NameSpace: 大聪花的家

    Origin: 大聪花的博客

    Powered by markdown在线编辑

    声明:未经本人同意,禁止转载、搬运、抄袭!

    (三)完结

    传送门

    已有1人评分好评 油猫币 理由
    脚本体验师001 + 1 + 5 很给力!

    查看全部评分 总评分:好评 +1  油猫币 +5 

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    860

    回帖

    1359

    积分

    荣誉开发者

    积分
    1359

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2022-12-14 21:32:02 | 显示全部楼层
    apply那个用扩展运算符更简单:
    1. String.fromCharCode(...[103, 103, 110, 98])
    复制代码

    \u应该不用转换吧,直接可以做为字符串使用的,有很多js加密就是用\u替换降低可读性:
    1. console.log('\u8f6c\u6362'.length);
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-2-27 14:20
  • 签到天数: 88 天

    [LV.6]常住居民II

    22

    主题

    97

    回帖

    306

    积分

    荣誉开发者

    积分
    306

    油中2周年新人报道荣誉开发者生态建设者

    发表于 2023-5-3 01:53:11 | 显示全部楼层
    cxxjackie 发表于 2022-12-14 21:32
    apply那个用扩展运算符更简单:

    %u应该不用转换吧,直接可以做为字符串使用的,有很多js加密就是用%u替换 ...

    gg说得对!
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表