本篇将完成:IDE 安装,Go 语言编译器安装,配置,创建一个项目;申请一个Mixin机器人,用 MM 的消息系统跟 User 聊天
Go编译器的安装和配置
工欲善其事必先利其器,一个好的开发工具会加速学习和使用体验;开发工具我用 Vs Code ,可以同时编写不同类型,不同语言的文件,并有很好的辅助插件;安装好 Vs Code 后,在插件库里搜索安装 Go 插件 (v0.30.xx, 600m下载量)。当然 Go 也有更专业的付费 IDE 如 Goland 等。Go语言的入门,我选的是看云上的一个学习资源 Golang 快速过一遍,然后在实践中遇到问题再回来找答案。
大部分时间我都是使用的 Windows 系统进行编程和调试,部署机器人的时候也会用到 Linux ;所以在Win系统中安装 Win版的编译器,在 WSL 上安装 Linux版的编译器。分别下载 Win 和 Linux最新版编译器 go1.17.6 并安装,Win版直接安装就可以,我就不细写了。
详细写一下 Linux版编译器的安装,Linux 我用 WSL 一个内置在 Win10 系统里面的 Linux 系统,装的是Ubuntu;Ubuntu 默认黑屏终端太丑了,我用 ConEmu 替代,大概这个样子,
安装完 WSL 后,在终端执行:
$ sudo apt-get update //同步Ubuntu更新内容
$ sudo apt-get upgrade //升级Ubuntu
$ sudo apt install golang-go //安装go编译器
$ go version //查看当前版本
如果不是最新版本就卸载旧版,重新安装刚刚下载的最新的安装包。
$ sudo apt remove golang-go //卸载旧版本
$ sudo tar -C /usr/local -xzf go1.17.6.linux-amd64.tar.gz //在编译器下载目录下,将安装包解压到/usr/local目录下
修改 /etc/profile 文件,添加环境变量
$ sudo vim /etc/profile
//在 /etc/profile 文件最后加上下面两条命令,然后保存退出
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
$ source /etc/profile //启用/etc/profile文件
$ go version //查看当前版本
修改 Go 环境变量
$ go env -w GO111MODULE=on //启动gomod避免以后因为gopath导致的路径问题
$ go env -w GOPROXY=https://goproxy.cn,direct //修改国内镜像代理,在国外可以不用修改
$ go env //查看当前go环境
至此,Win 和 Linux 的 Go 编译器安装完毕。
创建 Bot 机器人项目
用 ConEmu 打开 Window PowerShell,在实践目录下执行:
$ mkdir bot-learn //创建项目目录
$ cd .\bot-learn\ //进入项目目录
$ go mod init bot-learn //创建bot-learn项目
$ code ..\bot-learn\ //启动vscode,开始项目开发
这时项目目录里,只有一个 go.mod 文件,里面是项目名称和当前 Go 环境版本。我们创建一个 main.go 写一个 hello world 程序:
package main //go语法内容我就不赘述了
import "fmt"
func main() {
fmt.Println("Hello World!")
}
保存后,打开 vscode 的 Terminal 执行:
> go build //升成一个可执行文件,默认名称是项目名称
> .\bot-learn.exe //执行可执行文件,输出执行结果
Hello World!
至此,我们完成了一个可执行的 Go项目。
申请Mixin机器人
进入 Mixin开发者后台 创建新应用:
每个人可以免费获得2个机器人账号;再多就需要花 xin 购买。进入 bot 详情页添加详细内容:
选择 密钥 tab:
分别生成应用的密钥(授权访问Network信息的时候须要)和应用 Session;应用 Session 会导出一个基于 Ed25519 加密的 keystore 文件,这是机器人的 Network 账号信息,类似于 User 的 Network 账号一样唯一决定该机器人的资产,所以要妥善保管,最好将 pin码 和 keystore 分开加密保存,使用的时候临时解密使用。将 pin码 剔除后的 keystore 文件保存到项目目录中,我们进行下一步
用MM的消息系统与User对话
做个最简单的应用:User 加 Bot,给 Bot 发送信息,Bot 返回 User 发送的内容。
这个样子的:
实现代码和注释如下:
package main
import (
"context"
"encoding/json"
"flag"
"log"
"os"
"time"
"github.com/fox-one/mixin-sdk-go"
"github.com/gofrs/uuid"
)
var (
//定义一个Mixin机器人和配置文件的全局变量
client *mixin.Client
config = flag.String("config", "", "keystore file path")
)
func main() {
var err error
//解析命令行,读取命令行传输的config文件(keystore.json)
flag.Parse()
f, err := os.Open(*config)
if err != nil {
log.Panicln(err)
}
//用Mixin keystore的结构体解析刚刚打开的keystore.json文件
var store mixin.Keystore
if err := json.NewDecoder(f).Decode(&store); err != nil {
log.Panicln(err)
}
//通过keystore,创建机器人实例
client, err = mixin.NewFromKeystore(&store)
if err != nil {
log.Panicln(err)
}
//定义一个回调函数,准备传递给MM的消息引擎,目的是返回机器人接到的信息
h := func(ctx context.Context, msg *mixin.MessageView, userID string) error {
//丢弃非有效用户的信息
if userid, _ := uuid.FromString(msg.UserID); userid == uuid.Nil {
return nil
}
//获取接收到信息的 messageID
messageID, _ := uuid.FromString(msg.MessageID)
//创建一个返回消息的,Mixin结构体,写入接收到的消息内容;
//其中messageID需要,在接收到消息的ID基础上创建个新的messageID
reply := &mixin.MessageRequest{
ConversationID: msg.ConversationID,
RecipientID: msg.UserID,
MessageID: uuid.NewV5(messageID, "reply").String(),
Category: msg.Category,
Data: msg.Data,
}
//Bot将上面结构体的内容,发送给用户
return client.SendMessage(ctx, reply)
}
ctx := context.Background()
//开启消息循环,处理每一条接收到的消息
for {
//将回调函数h,传输给MM的消息处理引擎
if err := client.LoopBlaze(ctx, mixin.BlazeListenFunc(h)); err != nil {
log.Printf("LoopBlaze: %v", err)
}
//休息1秒
time.Sleep(time.Second)
}
}
写完代码之后,打开 go.mod 文件,点击 Run go mod tidy ,编译器自动更新相关依赖;也可以用命令行,如下安装对应的依赖。
$ go get github.com/fox-one/mixin-sdk-go
$ go get github.com/gofrs/uuid
$ go build
$ .\bot-learn.exe -config .\keystore.json
打开 MM 添加刚刚创建的机器人,发送内容,我们可以确认到 Bot 返回我们发送的内容。
这篇先到这,下一篇丰富消息处理,增加转账功能;
欢迎同学们交流学习经验,指出我的不足。