返回顶部
首页 > 资讯 > 后端开发 > GO >GO制作微信机器人的流程分析
  • 491
分享到

GO制作微信机器人的流程分析

2024-04-02 19:04:59 491人浏览 泡泡鱼
摘要

目录0.回顾流程1.项目基础配置2. Redis封装3.消息体封装4.核心代码5.本地测试这些天在学习Go,也写了几篇关于阅读Gin后端项目代码的博客。但编程这种,一定要实际上手练习

这些天在学习Go,也写了几篇关于阅读Gin后端项目代码的博客。但编程这种,一定要实际上手练习,要不然都是纸上谈兵。于是就想上手自己实际写一些代码来练练手。思来想去,不知道能写些什么来练手。后来突然想到,之前写过用python微信聊天机器人(博客传送门),当时代码没有放到git上,后来重置了服务器导致代码全部没了。现在正好苦于不知道做什么项目练手,可以用Go也实现一套微信聊天机器人。

说干就干,照着之前自己写的博客,看了下当时Python的代码。转而用Go优化了下并实现。

0.回顾流程

根据之前Python写的自动发消息的机器人可知,要想发消息就需要三个参数:company_id、secret、angent_id。 对于这三个参数如何获取,可参考文章开头的传送门。整个发送消息过程就是 首先通过company_id和secret来调用接口获取token,再通过token和angent_id来给对应接口发送post请求,就可以把post请求体中的信息发送到微信上。

1.项目基础配置

由于目前对Go的项目布局学习的还不是特别熟练,而且对于项目基础部分如果从头开始做的话,需要耗费大量时间。因此我使用了基于开源gin项目进行二次开发的方法,实现这个机器人。

前几天在学习Gin时,发现了一位老哥封装了个Gin脚手架,可以达到开箱即用目的。项目地址: GitHub传送门。 里边把读取配置文件,编写路由,连接数据库等多个操作均进行了实现。因此可以基于这个项目来进行二次开发,做微信机器人。

在把项目clone下来后,可以先看下整个项目的布局,主要的业务核心代码都放在了internal 下面。如果我们要实现一个主动给微信发消息的功能,那么多说了就是写一个发送消息的方法,让后端调用这个方法即可。

要想基于此项目来开发微信机器人,首先就要将三个参数配置上。项目中,对于各种参数均在config.yaml中配置,因为可以在这个配置文件中增加这三个参数的配置:

然后在代码的config/autoload目录下新增一个weCaht.go 文件,接收配置文件中的配置。

package autoload
type WeChatConfig struct {
AgentId string ini:"wechat" yaml:"agent_id"
Secret string ini:"wechat" yaml:"secret"
CompanyId string ini:"wechat" yaml:"company_id"
}
var WeChat = WeChatConfig{}

并且,将此配置加入到项目的配置集合中。在config/config.go中添加如下代码:

这样操作,就可以通过代码来读取配置文件了。在其他包中,可以通过如下方式来访问对应的值

config.Config.WeChat.CompanyId //yaml中的company_id字段

2. Redis封装

因为要给微信发送消息,首先要获取到token,而官方介绍此token的有效时长为2小时。在之前Python的项目中,是直接将token写到了文件中,通过文件来读取。在此项目中,我想直接使用redis来存储。因为使用redis来存储的话,可以设置key值时长,过了这个时长就自动清除,这样就方便了许多。

而我们基于这个gin-layout项目中,已经对redis做了一层封装,具体代码可查看data/redis.go,主要是通过对外暴露一个Rdb的结构体,来操作redis

而目前我们这边使用redis,只会用到对应的set和get方法。因此我对这个项目中的redis又做了一层封装。只对外暴露set,get,del方法。
首先将Rdb变量名改为小写,这样就代表不对外暴露,然后在此文件中添加如下代码

func SetRedis(key string, value string, t int64) bool {
expire := time.Duration(t) * time.Second
if err := rdb.Set(ctx, key, value, expire).Err(); err != nil {
return false
}
return true
}

func GetRedis(key string) string {
result, err := rdb.Get(ctx, key).Result()
if err != nil {
return “”
}
return result
}

func DelRedis(key string) bool {
_, err := rdb.Del(ctx, key).Result()
if err != nil {
return false
}
return true
}

这样,后续使用redis时候,只需要调用data.SetRedis(xxx) 即可。
然后就是修改配置文件,启用redis,这里根据实际的redis配置来写即可。

3.消息体封装

在最终给微信服务器发送post请求时,对应的请求体格式如下:

{
“touser”: “@all”,
“msgtype”: “text”,
“agentid”: “xxxxx”,
“text”: {“content”: “xxxx”}
}

因此,接下来可以对这个结构体做一个封装。在model包下,新建一个send_msg.go文件

package model
type wcSendcontent struct {
Content string JSON:"content"
}
type WcSendMsg struct {
ToUser string json:"touser"
MsgType string json:"msgtype"
AgentId string json:"agentid"
Text wcSendcontent json:"text"
}
func (t *WcSendMsg) SetMessage(message string) {
t.Text.Content = message
}

这里针对message信息,专门对外暴露了一个方法来进行设置。

4.核心代码

在设置好redis,消息体封装后,就可以编写核心的代码了。主要就是通过发送Http请求,获取token,再通过token发送post请求来发送消息。我们可以在service包下新建一个weChat.go的文件,里边新建一个SendWeChat方法来进行消息发送操作。

package service

import (
“bytes”
“encoding/json”
“errors”
“fmt”
c "github.com/wannanbigpig/gin-layout/config"
"github.com/wannanbigpig/gin-layout/data"
"github.com/wannanbigpig/gin-layout/internal/model"
log "github.com/wannanbigpig/gin-layout/internal/pkg/logger"
"github.com/wannanbigpig/gin-layout/pkg/utils"
"go.uber.org/zap"
)


func SendWeChat(message string, msgType string) error {
redis_key := “access_token”
// 尝试从redis中读取token
accessToken := data.GetRedis(redis_key)
http := &utils.HttpRequest{}
// 若redis中的token已过期,则重新请求api获取token
if accessToken == “” {
log.Logger.Info(“access token is null, will recall”)
getTokenUrl := fmt.Sprintf(“https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s”,
c.Config.WeChat.CompanyId, c.Config.WeChat.Secret)
log.Logger.Info(“token_url”, zap.String(“url”, getTokenUrl))
http.Request(“GET”, getTokenUrl, nil)
ret := make(map[string]interface{})
if err := http.ParseJson(&ret); err != nil {
return err
}
marshal, _ := json.Marshal(ret)
log.Logger.Info(string(marshal))
accessToken = fmt.Sprintf("%v", ret[“access_token”])
// 写入redis 有效期2小时
data.SetRedis(redis_key, accessToken, 7200)
}
msg := &model.WcSendMsg{
ToUser: “@all”,
MsgType: msgType,
AgentId: c.Config.WeChat.AgentId,
}
msg.SetMessage(message)
sendMsgUrl := fmt.Sprintf(“https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%v”, accessToken)
log.Logger.Info(“sendMsgUrl = " + string(sendMsgUrl))
header := map[string]string{“Content-Type”: “application/json”}
bytesData, _ := json.Marshal(msg)
http.Request(“POST”, sendMsgUrl, bytes.NewReader(bytesData), header)
log.Logger.Info(“bytes data = " + string(bytesData))
ret := make(map[string]interface{})
err := http.ParseJson(&ret)
if err != nil {
return err
}
if ret[“errcode”].(float64) != 0 {
errmsg := fmt.Sprintf(”%v”, ret[“errmsg”])
return errors.New(errmsg)
}
return nil
}

从上面代码中可以看出,首先是通过redis来获取token,若没有则请求api获取token,并将其写入到redis中,有效期为2小时。然后生成一个之前封装的消息的结构体,将AgentId和message进行填充后,通过发送post请求,已达到发消息的目的。

5.本地测试

若想验证这个方法,可以通过对外提供一个接口,访问此接口后调用发送消息的方法。
可以在controller目录下新建一个weChat.go,在里边实现一个get请求的方法,获取请求中的msg参数,然后调用刚才实现的发送企微的方法。

package wechat

import (
“github.com/gin-gonic/gin”
“github.com/wannanbigpig/gin-layout/internal/pkg/error_code”
log “github.com/wannanbigpig/gin-layout/internal/pkg/logger”
r “github.com/wannanbigpig/gin-layout/internal/pkg/response”
“github.com/wannanbigpig/gin-layout/internal/service”
)

func SendMsg(c *gin.Context) {
msg, ok := c.GetQuery(“msg”)
if !ok {
msg = “please input message”
}
log.Logger.Info("send wechat message: " + msg)
err := service.SendWeChat(msg, “text”)
if err != nil {
r.Resp().FailCode(c, error_code.FAILURE, err.Error())
return
}
r.Success(c, “success”)
}

写好后,将此方法绑定到路由上。在routers包下新建一个weChatRouter.go文件

package routers

import (
“github.com/gin-gonic/gin”
w “github.com/wannanbigpig/gin-layout/internal/controller/wechat”
)

func setWeChatRouter(r *gin.Engine) {
// version 1
v1 := r.Group(“wechat”)
{
v1.GET("/send", w.SendMsg)
}
}

这样,后续可以通过wechat/send的url来请求这个接口。最后就是调用此绑定路由的方法,在routers/router.go中添加一行代码即可

接下来启动项目,比如发送一个msg=Hello,golang 的请求

curl --location --request GET “http:// I P : {IP}: IP:{PORT}/wechat/send?msg=Hello,Golang”

执行这个命令,就可以得到本文开头的截图。

当然,这个api接口主要是为了让我们验证,实际项目运行时,建议不要这么搞。因为这接口没有任何鉴权的措施,如果对外暴露了出去,那么别人也可以肆意的调用这个接口给你的企微发送消息。

到此这篇关于利用go制作微信机器人的文章就介绍到这了,更多相关go微信机器人内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GO制作微信机器人的流程分析

本文链接: https://lsjlt.com/news/121008.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • GO制作微信机器人的流程分析
    目录0.回顾流程1.项目基础配置2. Redis封装3.消息体封装4.核心代码5.本地测试这些天在学习Go,也写了几篇关于阅读Gin后端项目代码的博客。但编程这种,一定要实际上手练习...
    99+
    2024-04-02
  • Python制作微信机器人教程详解
    目录一、环境配置二、登录三、 第一个简单的消息发送监控四、指定某个微信好友发送消息五、所有微信群监控六、公众号监听七、定时发送消息八、微信智能聊天机器人一、环境配置 大多数人无法登录...
    99+
    2024-04-02
  • Python是如何制作微信机器人
    这期内容当中小编将会给大家带来有关Python是如何制作微信机器人,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、环境配置大多数人无法登录网页版,所以饶过它模拟电脑登录,这个模块一定记得安装:pip&n...
    99+
    2023-06-22
  • node打造微信个人号机器人的示例分析
    这篇文章将为大家详细讲解有关node打造微信个人号机器人的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。wechaty( https://chatie.io/we...
    99+
    2024-04-02
  • 分析Android微信小程序开发的运行机制
    这篇文章主要讲解了“分析Android微信小程序开发的运行机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Android微信小程序开发的运行机制”吧!...
    99+
    2024-04-02
  • Go语言流程控制的示例分析
    这篇文章给大家分享的是有关Go语言流程控制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、流程控制流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑。流程控...
    99+
    2023-06-29
  • 微信小程序运行流程实例分析
    本文小编为大家详细介绍“微信小程序运行流程实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序运行流程实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.微信小程序是啥本质其实就是(混合)的a...
    99+
    2023-06-26
  • 微信小程序中swiper制作tab切换的示例分析
    这篇文章主要介绍微信小程序中swiper制作tab切换的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序 swiper制作tab切换实现效果图:swiper制作tab...
    99+
    2024-04-02
  • 微信小程序中登陆流程的示例分析
    这篇文章主要介绍了微信小程序中登陆流程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。微信小程序 登陆流程1:session_key...
    99+
    2024-04-02
  • 微信小程序个人中心页怎么制作
    这篇“微信小程序个人中心页怎么制作”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“微信小程序个人中心页怎么制作”文章吧。先进行...
    99+
    2023-06-26
  • Python自制微信机器人:群发消息、自
    运营公众号也有半年了,今年5月份开始的,之前一直用一款windows工具来运营自动接受好友请求、群发文章、自动回复等操作,但颇有不便。 举几个场景: 突然在外面看到一篇文章很好,临时写了一篇,想群发一下。 好友加我微信后,每次都要手动...
    99+
    2023-01-31
    机器人 消息 Python
  • OpenCV NAO机器人辅助捡球丢球流程分析
    目录1. 概述2. 相关技术2.1 NAO机器人2.2 Choregraphe3. 总体设计与详细设计3.1 系统模块划分3.2 主要功能模块4 视频展示1. 概述 NAO机器人身高...
    99+
    2024-04-02
  • 用python自制微信机器人,定时发送天
    前段时间找到了一个免费的天气预报API,费了好段时间把这个API解析并组装成自己想用的格式了,就想着如何实现每天发送天气信息给自己。最近无意中发现了wxpy库,用它来做再合适不过了。以下是wxpy库的简介: wxpy基于itchat,...
    99+
    2023-01-31
    机器人 python
  • 微信小程序的示例分析
    这篇文章主要介绍微信小程序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!未来的发展趋势未来的发展趋势是一切触手可及。比如去餐馆吃饭,扫一扫二维码就可以看菜单、点菜、付款;到公交站台,扫一扫二维码就知道有哪些...
    99+
    2023-06-26
  • 微信小程序官方人脸核身认证的示例分析
    这篇文章主要介绍微信小程序官方人脸核身认证的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!小程序收集了下用户个人信息上传被打回来说:你好,小程序页面功能涉及:采集用户生物特征(人脸照片或视频)及其他敏感信息,...
    99+
    2023-06-15
  • 如何深入分析Kafka架构的工作流程、存储机制、分区策略
    这期内容当中小编将会给大家带来有关如何深入分析Kafka架构的工作流程、存储机制、分区策略,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、前言在开始之前首先要明确一点,kafka是一个分布式流平台,本质...
    99+
    2023-06-02
  • 微信UnionID作用的示例分析
    这篇文章将为大家详细讲解有关微信UnionID作用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。摘要微信想用UnionID连接一起1、通过这...
    99+
    2024-04-02
  • Spring Boot实现微信扫码登录功能流程分析
    目录1. 授权流程说明第一步:请求CODE第二步:通过code获取access_token第三步:通过access_token调用接口2. 授权流程代码3. 用户登录和登出4. Sp...
    99+
    2024-04-02
  • web开发之网站制作流程的示例分析
    这篇文章主要介绍了web开发之网站制作流程的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  1、关于网站的页面设计  对于网站的页面设计这一部分主要是由设计师完成,...
    99+
    2023-06-10
  • 如何分析python流程的控制
    本篇文章给大家分享的是有关如何分析python流程的控制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言:经过简单的了解python基本语法和使用后,发现其都是一些顺序执行语...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作