beego框架下的coolq平台qqbot——DDL提醒员

之前冰岩实习期的遗留作品,留着当个记录吧,指不定哪天闲下来还想继续弄呢。

环境

  • 服务器:腾讯云学生云服务器
  • 操作系统:Ubuntu Server 18.04.1 LTS 64位
  • 使用工具:docker, Coolq http apiMySQL, Beego
  • 开发环境:Ubuntu 18.04(是笔记本上安装的双系统)

前期准备——资料搜集

Golang语言学习

Go语言中文网

Go 语言中文开源图书、资料或文档

Go by Example中文文档

GCTT - Go 中文翻译组

Go 系列教程(Golang tutorial series)

golang的时区和神奇的time.Parse

golang time.Duration() 问题

golang包time用法详解

关于Golang开发Coolq相关的资料

Coolq http api 使用说明书

Golang 开发Coolq接口用的SDK

qqbotapi package的使用说明

CQ码

如何接收图片

关于一些特殊地址在docker使用中的问题

关于一些特殊地址的了解

docker内通过127.0.0.1访问出错的原因与解决方法

其他问题

关于字符集以及编码方式的知识笔记

docker修改保存后的景象

关于在SDK例子中见到的webhook的一些了解

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官方文档

Beego控制器发送GET/POST请求并获取返回信息

docker 中文手册

dockerfile的使用

golang中struct、json、map互相转化

Go如何响应http请求?

理解 Go interface 的 5 个关键点

Beego框架中还有好多有意思的东西,没来得及探索!

DDL提醒

加好友

为了方便测试,又加了一个加好友的功能,可以根据验证信息进行选择加好友,但是我没有设置,现在是随便加。

需要用的数据库选择了MySQL

net/http中json的使用方法

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';
FieldTypeNullKeyDefaultExtra
idint(10) unsignedNOPRINULLauto_increment
user_idbigint(20)YESNULL
nicknamevarchar(40)YESNULL
use_ddl_reminderchar(1)YESN

以上是用户总表的设计,需要提前在数据库容器中设置好其实也是可以从代码中预处理的,我懒了

[go get golang.org/x 包失败解决方法](https://github.com/AlexWoo/doc/blob/master/GOLang/go get golang.org:x 包失败解决方法.md)

docker笔记(五、docker安装mysql数据库

docker笔记(六、docker将beego程序和mysql关联起来

Git冲突:commit your changes or stash them before you can merge.

mysql设置主键从1开始自增

package strconv

beego_orm

提醒机制

在计算提醒时间以及其他时间相关的事情的时候,在time库上疯狂踩坑。

用了一个特别愚蠢的提醒机制,是每次新加一个任务,就新开一个进程。缺点是,任务过多的时候,进程会无上限增长,内存消耗巨大,延迟巨高。解决办法是