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'

pycharm远程调试python程序

常规链接远程ssh发现无法调试程序

出现错误

1
Cannot find remote credentials for target config com.jetbrains.plugins.remotesdk.target.webDeploymen

这里其实是因为在创建环境的时候,没有选择对路径

一定要修改,这个sync folders到文件路径才可以进行同步

image-20230721155515830

GLIBCXX_3.4.20 not found

安装各式各样的东西都有可能出现/lib64/libstdc++.so.6: version GLIBCXX_3.4.20 not found这个报错

解决方案如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
1. 查看系统版本
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

发现少了GLIBCXX_3.4.20,解决方法是升级libstdc++.

2.
sudo yum provides libstdc++.so.6
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
libstdc++-4.8.5-39.el7.i686 : GNU Standard C++ Library
Repo : base
Matched from:
Provides : libstdc++.so.6

3.
cd /usr/local/lib64
# 下载最新版本的libstdc.so_.6.0.26
sudo wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
unzip libstdc.so_.6.0.26.zip
# 将下载的最新版本拷贝到 /usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64
cd /usr/lib64
# 查看 /usr/lib64下libstdc++.so.6链接的版本
ls -l | grep libstdc++
libstdc++.so.6 ->libstdc++.so.6.0.19
# 删除/usr/lib64原来的软连接libstdc++.so.6,删除之前先备份一份
sudo rm libstdc++.so.6
# 链接新的版本
sudo ln -s libstdc++.so.6.0.26 libstdc++.so.6
# 查看新版本,成功
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
...
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_DEBUG_MESSAGE_LENGTH
...

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

centos yum更新失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
bash-4.2# sudo yum makecache
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors

base: mirrors.aliyun.com
extras: mirrors.aliyun.com
updates: mirrors.aliyun.com
base | 3.6 kB 00:00
extras | 2.9 kB 00:00
https://dl.bintray.com/tigervnc/stable/el7/RPMS/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: dl.bintray.com; Unknown error"
Trying other mirror.
One of the configured repositories failed (TigerVNC-el7),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:

applescript
Copy

1. Contact the upstream for the repository and get them to fix the problem.

2. Reconfigure the baseurl/etc. for the repository, to point to a working
upstream. This is most often useful if you are using a newer
distribution release than is supported by the repository (and the
packages for the previous distribution release still work).

3. Run the command with the repository temporarily disabled
yum --disablerepo=tigervnc-el7 ...

4. Disable the repository permanently, so yum won't use it by default. Yum
will then just ignore the repository until you permanently enable it
again or use --enablerepo for temporary usage:

yum-config-manager --disable tigervnc-el7

or
subscription-manager repos --disable=tigervnc-el7

5. Configure the failing repository to be skipped, if it is unavailable.
Note that yum will try to contact the repo. when it runs most commands,
so will have to try and fail each time (and thus. yum will be be much
slower). If it is a very temporary problem though, this is often a nice
compromise:

yum-config-manager --save --setopt=tigervnc-el7.skip_if_unavailable=true

failure: repodata/repomd.xml from tigervnc-el7: [Errno 256] No more mirrors to try.
https://dl.bintray.com/tigervnc/stable/el7/RPMS/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: dl.bintray.com; Unknown error"

在用centos的时候,更换yum源,在创建新缓存的时候报错。

这里直接禁用tigervnc-el7即可yum-config-manager --disable tigervnc-el7之后重新创建即可

CentOS Docker 安装

CentOS Docker 安装

Docker 支持以下的 64 位 CentOS 版本:

  • CentOS 7
  • CentOS 8
  • 更高版本…

使用官方安装脚本自动安装

安装命令如下:

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

手动安装

卸载旧版本

较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。

$ sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine

安装 Docker Engine-Community

使用 Docker 仓库进行安装

在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。

设置仓库

安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

$ sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2

使用以下命令来设置稳定的仓库。

使用官方源地址(比较慢)

$ sudo yum-config-manager
–add-repo
https:**//download.docker.com/linux/centos/**docker-ce.repo

可以选择国内的一些源地址:

阿里云

$ sudo yum-config-manager
–add-repo
http:**//mirrors.aliyun.com/docker-ce/linux/centos/**docker-ce.repo

清华大学源

$ sudo yum-config-manager
–add-repo
https:**//mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/**docker-ce.repo

安装 Docker Engine-Community

安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:

1
$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

如果提示您接受 GPG 密钥,请选是。

有多个 Docker 仓库吗?

如果启用了多个 Docker 仓库,则在未在 yum install 或 yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。

Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。

要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:

1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。

$ yum list docker-ce –showduplicates | sort -r

docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable

2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

1
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

启动 Docker。

1
$ sudo systemctl start docker

通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community 。

1
$ sudo docker run hello-world

卸载 docker

删除安装包:

1
yum remove docker-ce

删除镜像、容器、配置文件等内容:

1
rm -rf /var/lib/docker

docker安装clash

有的代理发现跑在clash for linux上节点全部超时,于是找了台服务器用shellclash跑了一下,发现是正常的。

所以问题其实出在了clash for linux上,但是shellclash用docker跑有点复杂,于是找了一下docker直接跑clash的教程。

找到了这一篇使用 Docker 搭建图形化 Clash 服务端并添加订阅

不错!

首先找到一个文件夹用来存放配置文件

这里我找的是/home/clash,我将不同的配置文件分别命名成config1.yaml等

之后启动容器

1
docker run -d --name=clash1 -v '/home/clash/config1.yaml:/root/.config/clash/config.yaml' -p 7899:7890 -p 9099:9090 --restart=unless-stopped dreamacro/clash

7899就是代理的端口

9099就是ui面板的端口

这里可以用外部提供的链接http://yacd.haishan.me/访问ui

也可以自己搭建

1
docker run -p 1234:80 -d --rm --name yacd haishanh/yacd

1234就是访问的端口

之后操作ui界面即可

go+vue实现掘金小册阅读

之前通过爬虫采集了一些掘金小册的内容,当时只保存了对应的html。

一直希望可以找个开源的项目将掘金小册展示出来供自己阅读,但是翻遍了GitHub都没有找到我喜欢的。

所以只能自己开发。

技术选取

本来是想要用python+html实现一个简单的页面:当时的构思是用fastapi构建接口,然后利用html+jquery+bootstrap实现前端页面。

但是感觉都2023年了还是这样实现有点low,然后因为工作有点忙以及需要打游戏,就搁置了。

但是最近又想要实现这个项目了。

这次选取的是利用go实现接口,然后用vue构建前端页面。

接口

大概实现了注册,登录,获取所有图书信息,获取单独图书信息,获取文章详情这几个接口

获取所有图书信息

  • 请求方式:GET
  • URL:/books
  • 描述:用于获取所有图书的信息
  • 返回数据格式:
    • [{“book_name”:””, “book_id”:””, “article_count”:””, “tag”:””}]

分页获取图书信息

  • 请求方式:GET
  • URL:/books?page={page_number}
  • 描述:用于分页获取图书的信息,每页返回10条数据
  • 参数:
    • page_number (必需):页码,表示需要获取的页数
  • 返回数据格式:
    • [{“book_name”:””, “book_id”:””, “article_count”:””, “tag”:””}]

获取书籍详情

  • 请求方式:GET
  • URL:/book?book_id={book_id}
  • 描述:用于获取特定书籍的详细信息
  • 参数:
    • book_id (必需):书籍ID,表示需要获取的书籍的唯一标识
  • 返回数据格式:
    • {“book”:{“book_name”:””, “book_id”:””, “article_count”:””, “tag”:””}, “article”:[{“id”: 1,”book_id”: “”,”title”: “”,”content”: “”,”num”: 1 }]}

获取文章详情

  • 请求方式:GET
  • URL:/article?article_id={article_id}
  • 描述:用于获取特定文章的详细信息
  • 参数:
    • article_id (必需):文章ID,表示需要获取的文章的唯一标识
  • 返回数据格式:
    • {“id”:””, “book_id”:””, “title”:””, “content”:””, “num”: “”}

登录

  • 请求方式:POST
  • URL:/login
  • 描述:用于登录,设置cookie
  • 参数:
    • username (必需):用户名
    • password (必需):用户密码

注册

  • 请求方式:POST
  • URL:/register
  • 描述:用于注册
  • 参数:
    • username (必需):用户名
    • password (必需):用户密码

前端

这里我选择的是利用vue cli创建项目,然后通过axios构建请求获取数据。

踩坑

  1. 一个很难受的坑就是跨域请求。这里是问了一下做前端的同事,然后他跟我说用proxy代理解决。但是我设置代理后,发现response会返回set-cookie,但是浏览器并没有设置,最后发现是我的cookie设置有问题

    1
    2
    3
    4
    5
    cookie := &http.Cookie{
    Name: "auth",
    Value: cookieValue,
    Expires: time.Now().Add(24 * time.Hour), // 设置Cookie过期时间
    }

    这里我没有加Path以及HttpOnly,然后就设置不上去,加上后就可以了。