go 跨域问题解决

我在go中其实已经写好了corsMiddleware中间件,只需要给每一个请求都套上即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main() {
booksHandler := &booksHandler{}
bookHandler := &bookHandler{}
articleHandler := &articleHandler{}
registerHandler := &registerHandler{}
loginHandler := &loginHandler{}
searchHandler := &searchHandler{}
http.Handle("/api/register", registerHandler)
http.Handle("/api/login", corsMiddleware(loginHandler))
http.Handle("/api/books", corsMiddleware(authMiddleware(booksHandler)))
http.Handle("/api/search/", http.StripPrefix("/api/search", corsMiddleware(authMiddleware(searchHandler))))
http.Handle("/api/book/", http.StripPrefix("/api/book", corsMiddleware(authMiddleware(bookHandler))))
http.Handle("/api/article/", http.StripPrefix("/api/article", corsMiddleware(authMiddleware(articleHandler))))
log.Fatal(http.ListenAndServe(":8089", nil))
}

原来问题其实出在了这里/api/article/以及前端代码中的路径,需要对应才可以

1
2
3
4
5
6
7
8
const ApiService = {
register: (username, password) => api.post("/api/register/", { username, password }),
login: (username, password) => api.post("/api/login/", { username, password }),
getBooks: (page) => api.get("/api/books/", { params: { page } }),
searchBooks: (search_keyword) => api.get("/api/search/", { params: { search_keyword } }),
getBookDetails: (book_id) => api.get("/api/book/", { params: { book_id } }),
getArticleDetails: (article_id) => api.get("/api/article/", { params: { article_id } }),
}

本地测试的时候发现前端vue无法根据set-cookie设置cookie 于是各种修改,最后发现应该增加cookie的path和httponly就可以了。

使用spaCy处理文本

希望可以处理一下旧的文本内容,之前文章的数据全都变成了一行,希望可以根据语义进行分段。

这里找到的是spaCy这个库。

https://spacy.io/usage

通过这个网站获取需要使用的命令进行安装即可

设置power shell的代理

1
2
3
$proxy='http://127.0.0.1:7890'
$ENV:HTTP_PROXY=$proxy
$ENV:HTTPS_PROXY=$proxy
1
$ENV:ALL_PROXY ='http://127.0.0.1:7890'

Charles解析protobuf之初探

前言

在程序开发以及网络通信传输过程中最常见的数据格式就是JSON、XML,或者是一种压缩效率更高的数据格式——Google的ProtoBuf。ProtoBuf在传输过程中是以二进制的格式传输的,测试抓包的时候如果需要查看请求或返回消息中携带的参数信息就需要对它进行解析。小编之前在Windows环境下使用公司童鞋开发的Fiddler插件可以完成解析工作,但小编在家办公使用的抓包工具是Mac上的Charles。对于不熟悉Charles的小编而言,如何借助Charles来解析并展示ProtoBuf中的内容就尤为重要。本文就介绍一下小编尝试的几种在Mac环境中将ProtoBuf数据流转换为可以直观观察的数据格式的方法。。

1 ProtoBuf简介

Protocol buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers是一种灵活,高效,自动化机制的结构数据序列化方法-可类比XML,但是比XML更小(310倍)、更快(20100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

2 Charles简介

Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows、Mac、Linux上使用,安装Charles的时候要先装好Java环境。Charles的具体安装方法就不在此详细展开了,但是Charles应该算是Mac上最好用的抓包工具了。下面详细介绍下使用Charles查看PB文件的方法。

3 方法一:Charles的Rewrite功能

通过阅读Charles关于ProtoBuf的官方文档可以得出当Content-Type的类型为application/x-protobuf时,通过Charles查看内容可以使用两个新的HTTP正文内容查看器,Protobuf文本查看器和Protobuf结构化查看器。但是小编在测试过程中发现我们的请求的Content-type并不是application/x-protobuf的,而是text/plain; charset=utf-8的,所以考虑使用Charles的Rewrite功能将Content-type修改替换一下。

正常看到的请求如下图所示:

img

打开Tools->Rewrite界面配置,新增配置如下:

img

其中规则的详细配置是:

img

配置完成之后再去请求就可以看到Content-Type如下图所示。

img

此时就可以在Contents中看到对应的ProtoBuf以及ProtoBuf Text内容了。

img

需要注意的是使用这种方式查看到的都是ProtoBuf里的value内容,没有对应的key,所以可读性较差,下面介绍可读性更强的第二种方式。

4 方法二:Charles解析PB功能

一、生成ProtoBuf的.desc解析文件

protoc工具安装:如果想解析一个ProtoBuf数据流,就必须要有对应的.proto文件,Charles需要一个.proto文件转换的.desc文件才能完成后续的解析工作。首先需要在Mac上安装protoc工具:brew install protobuf。

img

执行protoc –version能够展示以下内容就代表protoc工具安装成功了。

img

单个proto文件生成.desc文件:将proto_test.proto文件放到固定路径/xx/下,然后执行命令:protoc -I=/xx/ –descriptor_set_out=/xx/proto_test.desc /xx/proto_test.proto就可以在对应路径下生成proto_test.desc文件了。

多个proto文件生成.desc文件:多个proto文件对应生成一个desc文件命令:protoc -I=/x/xx/ –descriptor_set_out=/x/xx/test.desc /x/xx/a.proto /x/xx/b.proto。

二、解析ProtoBuf格式

PB文件未解析时的Request和Response内容如下,可以看到基本全是乱码,可读性极差,通过添加之前生成的.desc文件并配置解析规则就完成PB文件的解析工作,步骤如下:

img

View Request/Response As:在对应的请求上右键选择View Request(Response) As->Protocol Buffers。

img

添加.desc文件:进入Charles提供的解析ProtoBuf的配置界面后,可通过点击Open Descriptot Registry将自己的ProtoBuf描述性文件(.desc文件)注册进去。

img

Descriptor Registry有两个默认支持的desc描述文件,我们可通过点击add添加自己需要的desc文件。

img

配置message type:添加成功后,可以在Message type中搜索需要解析的消息体对应的ProtoBuf Message,并配置对应的payload encoding。

img

设置成功后,可以通过ProtoBuf以及ProtoBuf Text两种方式查看PB数据,其中ProtoBuf Text可以看到二进制的消息体已经转换为可以直观查看的类似JSON的数据体了,到此为止简单的PB数据解析工作就告一段落了。

5 Charles的相关配置

Viewer Mappings功能:View Request/Response As功能只能设置单一请求的request body或者response body的proto解析,但如果是批量请求的解析需要进行大量的重复性工作,比较繁琐,具有较差的便利性,此时可通过Viewer Mappings功能解决该问题。

img

Protobuf Settings功能:desc文件的添加不仅可以通过Viewer Mappings功能和View Request/Response As功能,还可以通过菜单栏上的Protobuf Settings功能进行设置。

img

从开发到部署:一站式指南创建个性化 Slack App 问答机器人

从开发到部署:一站式指南创建个性化 Slack App 问答机器人

介绍 - 开场白

  • 自我介绍:介绍你自己,包括你的背景和经验,以便观众了解你的资质。
  • 说明视频的目的和主题:明确说明你要录制这个视频的目的,例如教观众如何开发 Slack App 问答机器人。
    • 为知识付费值得,但是为免费的知识付费就不值得了
      • 当然这里其实别人把免费的整理起来还是可以的,但是⬇
    • 拒绝割韭菜,从我做起
      • 割其实我不反对,我也想。但是好多大佬都把小白当成白痴来割,让人不爽。
      • 明明有的大佬分享干货,各种解答疑惑,才赚那么点钱
      • 而有的人拿着免费的东西,却能大割特割
    • 通过Chat GPT开发Slack App问答机器人 语音识别+gpt3.5+gpt4
      • 回复速度挺慢的,api生成速度比较缓慢再加上网络问题

Slack App 问答机器人简介

  • 解释什么是 Slack App:介绍 Slack App 的概念和功能,以及它如何为用户提供沟通和协作的平台。

    • slack类似于一个全端聊天工具,是一款企业级的团队协作和沟通工具。提供了bot接口,可以让开发者自己开发应用。

    • 利用slack的app来实现gpt问答功能

    • 增加语音对话,其实没什么东西,使用slack的app会有发送语音的功能,然后机器人将语音->文本->gpt->语音即可

      • 这个其实是看微信公众号的一个人割韭菜发的,然后简单实现了一下,理论上讲功能差距应该不大。

        image-20230525163101755

    • 文案机器人,各种不同的对话。没啥乱用,直接用Chat GPT也可以实现

  • 说明问答机器人的用途和好处:阐述为什么开发一个问答机器人对于团队或组织来说是有价值的,例如提高效率、解答常见问题等。

    • 这里其实只是单纯看不惯别人割韭菜,虽然我也想割。
    • 没有什么好的中文参考资料
    • 简单分享

准备工作

  • Slack 工作区的创建和设置:演示如何创建一个新的 Slack 工作区,并设置所需的频道和权限。

  • 创建一个新的 Slack App:步骤展示如何创建一个新的 Slack App,并选择适当的权限和功能。

    • 这里我简单演示一下

      image-20230525151056272

      • 点击From scratch

      image-20230525151148255

  • 生成认证令牌和安装应用到工作区:演示如何生成用于认证的令牌,并将应用程序安装到 Slack 工作区中。

    • 弄好权限后点击install App即可

编写问答机器人的代码

  • 选择适合的编程语言和开发环境:介绍一些常用的编程语言和开发环境,让观众了解可选项。
    • 这里选择的是python,然后用到的库有
      • slack_bolt
      • logging
      • gtts
      • whisper
      • openai
      • json
      • io
      • requests
      • redis
      • re
      • time
    • 开发其实主要依靠Chat GPT写大概,然后通过我来补全详细功能
      • 利用slack_bolt接入bot
      • 接收用户信息
      • 单独回复
      • 接入openai
      • 获取语音消息
      • 文本转换
      • 流式输出
    • 用到的工具有:
      • Pycharm
      • Chat GPT
      • Google
      • Redis
  • 初始化一个新的项目:演示如何创建一个新的项目,并设置必要的依赖项。
    • pip install -i https://mirrrors.cloud.tencent.com/pypi/simple
    • pip install --proxy http://127.0.0.1:7890
    • 通过Chat GPT写初始代码
    • 写语音转文本,文本转语音代码
    • 流式输出回答
  • 引入 Slack App 相关的库或 SDK:介绍可用的 Slack App 开发库或 SDK,并演示如何导入和配置它们。
    • 利用到的方法有
      • chat_update 更新文本–流式输出(很丑陋,没有Claude的优雅)
      • chat_postMessage 发送消息
      • files_upload_v2 上传文件
      • conversations_replies 读取历史文本(可选)
  • 创建问答机器人的基本结构和功能:展示如何创建问答机器人的基本代码结构,并解释每个组件的作用。
    • chat
      • 调用openai
    • download
      • 下载音频附件
    • get_text
    • is_chinese
      • 判断是否为中文
    • gen_voice
      • 生成语音
        • 文本转语音使用pyttsx3在Windows上效果非常好,可惜在Linux上不行
        • 使用gtts效果一般
    • handle_app_mention_events
      • bot主进程

设置事件订阅和处理

  • 注册和处理 Slack 事件:解释如何注册并处理 Slack 事件,以便与用户的消息和互动进行交互。
    • 通过@app.event("app_mention")驱动进程
    • 利用body里的event获取对话参数
    • 将对话数据存入redis中/读取历史文本
  • 监听用户消息和应答:演示如何监听用户发送的消息,并根据特定的触发条件做出相应的应答。
    • 通过app_mention监听@事件
      • View messages that directly mention @chatgpt in conversations that the app is in
    • 通过channel_id以及thread_ts固定对话
  • 报错

添加问答功能

  • 创建问题和答案的数据结构:介绍如何设计和组织问题和答案的数据结构,以便问答机器人能够进行匹配。
    • 无结构
  • 实现问答匹配逻辑:演示如何编写匹配算法,使问答机器人能够根据用户的问题找到相应的答案。
    • 调用openai
  • 响应用户的问题并返回正确的答案:展示如何编写代码,使机器人能够根据匹配结果向用户提供正确的答案。
    • 等待回答生成返回
    • 流式生成返回
  • 根据聊天记录来进行连续对话
    • 通过redis存储对话数据来进行连续对话
      • channel_id:thread_ts对应一个对话
      • 通过get获取历史数据
        • 存在则加载历史记录
        • 不存在则创建新对话
    • conversations_replies(channel, ts)提供channel_id以及thread_ts即可获取对话历史
      • 这个我记得有弊端还是因为懒得处理返回数据。

部署问答机器人

  • 配置部署环境:演示如何设置部署环境,例如选择服务器或云平台,并进行相应的配置。
    • 用的美国服务器,国内貌似墙了openai
      • 解密中国长城防火墙(GWF)背后的数据
      • 中国为什么要架长城防火墙? 这墙该不应架
  • 部署应用程序到生产环境:展示如何将问答机器人的应用程序部署到选定的环境中,并确保其正常运行。
    • 无需更改代码,使用docker搭建环境
      • 没有打包镜像,直接创建的python容器然后pip install
  • 配置应用在 Slack 工作区中的设置:演示如何在 Slack 工作区中配置问答机器人的设置,例如添加命令、权限和触发条件。
    • 无需修改

在 Slack 中测试问答机器人

  • 在 Slack 工作区中使用问答机器人:演示在 Slack 中与问答机器人进行实际的测试对话,以验证其功能和准确性。
  • 演示不同的问题和回答:展示多个例子,涵盖不同类型的问题和相应的答案,以展示机器人的灵活性和适应性。
  • 检查问答机器人的性能和准确性:讨论如何评估问答机器人的性能,并提供一些建议来改进和优化其准确性和响应速度。
  • 利用的是openai所以其实准确度是要看openai的,简单问几个问题/部分问题来自于弱智吧
    • In the room there are John, Mark, a cat, a box, and a basket. Joh n takes the cat and puts it in the basket. He leaves the room and goes to school. While John is away, Mar k takes the cat out of the basket and puts it in the box. Mark leaves the room and goes to work. John and ! Mark come back and enter the room. They don’t know what happened in the room when they were a way. What do they think?
    • 介绍一下你自己
    • 如何评价如何评价
    • 昨天朋友家孩子考上大学了,我去吃酒身上没现金,向他借了800元随礼,回家后我就微信转800元还给他,结果他说我白吃了他一顿饭。问,谁对谁错?
    • 眼镜蛇在人们发明眼镜之前叫做什么
    • 马上要上游泳课了,昨天洗的泳裤还没干,怎么办
    • 桑拿房里那么热也不装空调是为什么?
    • 几十年过去了,第一个登月的人还是阿姆斯特朗,这是怎么回事?
      A.资本主义的阴谋 B.西方政府的阴谋 C.三体人的阴谋
    • 郭富城为斯蒂芬尼做了一件非常成功的工作:他打开桌子,揉了揉指甲。你和你老婆春节后生了一个坏女孩。盖尔和白鸟王被萨克兄弟的车吓了一跳。孙武汉手机壳健康,每次洗内裤手机壳驾驶室依然健康
      1.联系上下文,说一说“非常成功的工作”在文中指什么
      2.白鸟王的人物形象是怎么样的?结合你的生活,分析白鸟王的形象
      3.文中的“手机壳驾驶室”和前文中萨克兄弟的车有什么关系?
      4.本文描写了一副什么样的景色?请为本文起上三个合适的题目,并选择一个填在题目栏中
      5.文中各处文字无不透露出作者对当时社会腐朽昏暗,人们自甘堕落的愤怒与忧伤,请选出文中的一处描写,对其加以分析,不少于250字
    • 活人和死人结婚是冥婚,那死人和活人结婚叫什么?
    • 骄兵必败,而败兵必哀,而哀兵必胜,所以骄兵必胜

总结和结语

  • 回顾视频中的主要内容和步骤:总结你在整个视频中介绍的关键步骤和概念,以帮助观众复习和理解。
  • 强调问答机器人的优点和潜在应用:提供更多关于问答机器人的优势和潜在应用领域的信息,激发观众对其可能性的兴趣。
    • 前面已经说了,其实最方便的就是国内可用。
    • 但是需要非国内邮箱注册,推荐outlook
    • gpt的账号实际上买才2.5元一个,还有5刀的api余额
      • 如果自己注册的话,除了冲接码平台的钱以外几乎一分不花
    • 利用搜索引擎
      • bing
      • phind
      • duckduckgo
      • google
      • 百度
    • 利用Ai
      • ChatGPT
      • 文心一言
      • new bing
  • 提供有用的资源和链接:分享相关文档、教程、库或其他资源的链接,供观众深入学习和进一步开发。
  • 结束视频:感谢观众的观看,并鼓励他们在评论或其他方式中提供反馈和问题。

Linux服务器时间同步

首先查看服务器当前时区

1
date -R

然后使用

1
2
apt-get install -y tzdata
ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

docker需要给权限才可以修改相关数据

启动时增加命令

1
--privileged=true

pixel3刷机记录

root通过magisk

首先需要下载镜像

image-20230323141410804

打开开发者模式,狂戳Setting -> Build number,打开USB调试,Setting -> System -> Developer Options打开Usb debugging,勾选oem unlocking

之后打开usb调试使用adb reboot bootloader或者关机后按开机键+音量下键

然后下载android-platform-tools工具包

解压下载的镜像文件以及内部的zip文件

image-20230323141617174

然后运行flash-all.bat等待刷机成功

之后安装magisk

然后将解压后的boot.img文件push到手机中

1
adb push ./blueline-rq2a.210505.002/image-blueline-rq2a.210505.002/boot.img sdcard/Download

然后打开magisk选择安装然后修补选择boot.img等待修补完成后会生成一个patched将它pull到本地

1
adb pull /sdcard/Download/magisk_patched-23000_J2eHI.img

之后进入fastboot adb reboot bootloader

然后fastboot解锁,fastboot flashing unlock 如果已解锁则跳过

然后刷入patched.img

1
fastboot flash boot magisk_patched-23000_J2eHI.img

之后重启手机就行了。

刷入电信支持

  1. github下载china_telecom_supporter,https://github.com/apporc/china_telecom_supporter

  2. 把压缩包push到手机上
    adb push ./china_telecom_supporter.zip /sdcard/Download

  3. adb命令解压

    1
    unzip -d /sdcard/Download/china_telecom_supporter /sdcard/Download/china_telecom_supporter.zip
  4. 移动解压后的文件夹到系统目录/data/adb/modules/

    1
    mv /sdcard/Download/china_telecom_supporter /data/adb/modules/china_telecom_supporter
  5. 删除 fdr_check 文件
    rm /data/vendor/modem_fdr/fdr_check

  6. 重启,如果刷入成功此时进入系统可以看到电信的信号了,能正常打电话和流量上网~

验证码每次请求都会变解决方法

如果利用模拟浏览器等方式通过验证码会遇到验证码每次请求都会变,那么这样就不能直接请求获取到验证码数据了。

所以这里其实直接通过js下载图片就行了。

1
2
3
4
5
let c = document.createElement('canvas');let ctx = c.getContext('2d');
let img = document.querySelector('.mac_verify_img') // 获取验证码元素
c.height=img.naturalHeight;c.width=img.naturalWidth;
ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);
let base64String = c.toDataURL();

这里的base64String就是当前验证码的base64地址了

image-20230324104359504

twitter api申请

申请链接 link

点击后可看到如下页面,点击右上角的create an app

image-20230323170208341

点击apply

image-20230323170216081

填写基本信息

image-20230323170235080

填写完信息后同意条款,务必绑定手机号

image-20230323170329740

然后验证邮件

image-20230323170613519

image-20230323170716106

填写基本信息

image-20230323170838764

image-20230323170859739

确认信息

image-20230323171621076

同意协议和政策

image-20230323171653262

提交后等待48小时知晓结果

image-20230323171713402

如果通过后,那么需要发送一下进一步激化,然后发送邮件即可。

微软登录提示我们无法向此号码发送短信

发现登录提示需要手机号验证,但是输入手机号都不可以发送短信。

image-20230330094610026

然后看到提示说联系微软客服来进行操作。

1
2
3
4
5
6
7
8
9
10
您好,欢迎咨询Microsoft 社区,我是Li,很荣幸能为您提供技术支持。

这是一个bug导致发送短信时会提示‘’我们无法向此号码发送短信‘’,微软已经在开始调查,在这期间您可以联系Microsoft客服解锁账号。

https://support.microsoft.com/zh-cn/contactus/

希望这对您有帮助。
Give back to the Community. Help the next person who has this issue by indicating if this reply solved your problem. Click Yes or No below.

Tao Li - Microsoft 社区独立顾问

然后呢,我就找到了这个链接[联系 - Microsoft 支持部门](https://support.microsoft.com/zh-cn/home/contact?SourceApp=smc2&ContactUsExperienceEntryPointAssetId=S.HP.SmcContactUsLanding)

之后下面有一个登录以联系支持人员

image-20230330094700029

点击按钮,然后发现弹出来的一个框是一个英文的,然后输入手机号发现居然可以发送短信了。

Centos安装Jupyter

推荐使用anaconda管理python版本,或者别的虚拟环境对python进行管理。

首先新建一个python版本

1
conda create --name py39 python=3.9

然后进入环境安装jupyter

1
2
conda activate py39
pip install jupyter

如果报错的话,应该是因为pip的版本低

可以更新一下pip的版本

1
pip install --upgrade pip

然后设置一下密码

1
2
3
4
# 生成配置文件
jupyter notebook --generate-config
# 设置密码,提示两次输入密码,然后密码被保存到jupyter_notebook_config.json中
jupyter notebook password

之后执行命令启动即可

1
jupyter notebook --ip 0.0.0.0 --allow-root