Harry Zhang
@21120
Mixin机器人 - 开发实践 - 2
编程 Bot开发 Go Linux
2022-01-23 06:27
Words count: 2084
本篇将完成:IDE 安装,Go 语言编译器安装,配置,创建一个项目;申请一个Mixin机器人,用 MM 的消息系统跟 User 聊天

本篇将完成: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


然后 build 可执行文件;传入参数,运行程序:

$ go build
$ .\bot-learn.exe -config .\keystore.json

打开 MM 添加刚刚创建的机器人,发送内容,我们可以确认到 Bot 返回我们发送的内容。

这篇先到这,下一篇丰富消息处理,增加转账功能;

欢迎同学们交流学习经验,指出我的不足。

Arweave TX
NrsoLGDz-LrBrjx2whvh2CKz7PT97XltkEHeqcCNlQA
Content Digest
423af5f50c5b9db9d3a86ef47c693b80210c3eb51659c23513b3ee0295647f5a
Reward
11 : 0
0 times bought, 1 times reward
0.0
Price(BTC)
1
Paid Times
0.3529
Revenue(USD)
0.0
My Share(%)
Comments
Subscribe
Harry Zhang
@21120
Subscribing: 8 Subscribers: 30
A life-long learner
Subscribe
Related Posts
Defi乐高之借贷协议(2)--MarginFi 隐身3个月通关编程实战项目,升级进取型思维分享。 macOS系统多开Google Chrome浏览器 从小白到科学家(二)之脱胎换骨 Invoke the closed source contract tutorial with MetaMask
Rules Stats Help Github Twitter Discord
Harry Zhang
@21120
Subscribing: 8 Subscribers: 30
A life-long learner
Subscribe
Related Posts
Defi乐高之借贷协议(2)--MarginFi 隐身3个月通关编程实战项目,升级进取型思维分享。 macOS系统多开Google Chrome浏览器 从小白到科学家(二)之脱胎换骨 Invoke the closed source contract tutorial with MetaMask
Rules Stats Help Github Twitter Discord