之前冰岩实习期的遗留作品,留着当个记录吧,指不定哪天闲下来还想继续弄呢。
环境
- 服务器:腾讯云学生云服务器
- 操作系统:Ubuntu Server 18.04.1 LTS 64位
- 使用工具:
docker
,Coolq http api
,MySQL
,Beego
- 开发环境:Ubuntu 18.04(是笔记本上安装的双系统)
前期准备——资料搜集
Golang语言学习
Go 系列教程(Golang tutorial series)
关于Golang开发Coolq相关的资料
关于一些特殊地址在docker使用中的问题
docker内通过127.0.0.1访问出错的原因与解决方法
其他问题
Coolq平台使用过程中遇到问题
修改过的Coolq平台的docker容器运行命令
一开始不懂这些参数是啥意思,简单通过CV是无法完成任务的,长记性了,下一次用的时候需要把命令都搞明白,要不然真的会导致莫名其妙的问题。
docker run -ti --rm --name http-api \
-v $(pwd)/coolq:/home/ubuntu/coolq \ # 将宿主目录挂载到容器内用于持久化 酷Q 的程序文件
-p 9000:9000 \ # noVNC 端口,用于从浏览器控制 酷Q
-p 5700:5700 \ # HTTP API 插件开放的端口
-e COOLQ_ACCOUNT=1092443987 \ # 要登录的 QQ 账号,可选但建议填
-e CQHTTP_POST_URL=http://127.0.0.1:8080 \ # 事件上报地址
-e CQHTTP_SERVE_DATA_FILES=yes \ # 允许通过 HTTP 接口访问 酷Q 数据文件
richardchien/cqhttp:latest
登录Coolq平台之类的东西,在Coolq http api说明书中都有提到,这些就不赘述了。QQ号尽量要那种没有问题的,要不然会出现一些验证,还是比较耽误时间的。
什么是事件上报
Coolq会把登录的QQ号上接受到的信息,包括但不限于:群消息、好友信息、添加好友请求,以http协议post请求的方式发送到指定的事件上报地址。事件上报地址一般是在docker运行coolq容器的时候,给出的一个地址。
从post中提取信息,只需要把post中报文主体中的json类型的信息解析出来,通过Golang语言的特性,转存到自己写的对应的Golang语言结构体中就行。示例如下:
type MessageQQ struct {
Post_type string`json:"post_type"`
Request_type string`json:"request_type"`
Comment string`json:"comment"`
Flag string`json:"flag"`
Message_type string`json:"message_type"`
Message_id int64`json:"message_id"`
User_id int64`json:"user_id"`
Sender *Sender`json:"sender"`
Group_id int64`json:"group_id"`
Discuss_id int64`json:"discuss_id"`
Message string`json:"message"`
Raw_message string`json:"raw_message"`
}
即需要在对应的元素后面增加以反引号注明的json中对应的名称。
Coolq也能通过websock上报信息,不过websock不是很了解,为了赶时间,也没再看,直接用了前一星期速成的http的内容。
如何使用Golang开发Coolq接口用的SDK
通过go get
命令,把这些内容下载到GOPATH指定好的位置就行。Go 1.8 版本之后,GOPATH 默认在用户目录的 go 文件夹下。在docker
中使用时需要自己配置GOPATH变量的位置,**无法通过直接修改.bashsh
docker中使用网桥连通容器而不是用link命令
需要明白一件事,docker容器内部是一个类似于虚拟化的环境,在这个环境中访问的127.0.0.1
以及localhost
都是访问的这个环境本身,而不是如同之前自己臆想的会访问到外部宿主机。
Linux下的docker容器互相访问可以使用建立一个网桥,命令如下
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 localNet
- localNet是自定义的网桥的名字,可以使用其他的
- 建立的
192.168.0.0
这个子网也是可以自定义 - 建立完成之后,在容器内部访问
192.168.0.1
这个地址就是访问宿主机了
存放代码的容器的配置
这个容器中,不需要什么其他镜像的东西,直接去pull
一个Ubuntu
的镜像来用就行了,需要注意的是,之前coolq容器中设定的事件上报地址是宿主机的8080端口,所以这个地方,接收事件上报的容器,也就是装代码的容器,就需要链接上宿主机的8080端口
docker run ... -p 8080:8080 ...
好像后来还因为GOPATH的配置出现问题,容器中无法永久配置PATH,只能是通过重新封存镜像,然后编写dockerfile来进行,内容如下
FROM mybot2:v1
ENV GOPATH /root/go
ENV PATH $PATH:$GOPATH/bin
我把之前做的那些东西封成了mybot2,然后打上了标签v1,后两行的意思是,设置GOPATH和PATH环境变量。
设置这两个变量的作用就是,方便使用go get这个命令去获取开发用的SDK以及coolq相关的东西
Beego框架使用
Beego框架中还有好多有意思的东西,没来得及探索!
DDL提醒
加好友
为了方便测试,又加了一个加好友的功能,可以根据验证信息进行选择加好友,但是我没有设置,现在是随便加。
需要用的数据库选择了MySQL
mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法
数据库设计
分成了1+n个table,1是用户总表,获取好友列表后自动生成,n是每个用户的ddl内容。
ALTER TABLE users CHANGE COLUMN use_ddl_reminder use_ddl_reminder CHAR DEFAULT 'N';
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(10) unsigned | NO | PRI | NULL | auto_increment |
user_id | bigint(20) | YES | NULL | ||
nickname | varchar(40) | YES | NULL | ||
use_ddl_reminder | char(1) | YES | N |
以上是用户总表的设计,需要提前在数据库容器中设置好,其实也是可以从代码中预处理的,我懒了
[go get golang.org/x 包失败解决方法](https://github.com/AlexWoo/doc/blob/master/GOLang/go get golang.org:x 包失败解决方法.md)
docker笔记(六、docker将beego程序和mysql关联起来
Git冲突:commit your changes or stash them before you can merge.
提醒机制
在计算提醒时间以及其他时间相关的事情的时候,在time库上疯狂踩坑。
用了一个特别愚蠢的提醒机制,是每次新加一个任务,就新开一个进程。缺点是,任务过多的时候,进程会无上限增长,内存消耗巨大,延迟巨高。解决办法是