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

目录
  • 0.回顾流程
  • 1.项目基础配置
  • 2. Redis封装
  • 3.消息体封装
  • 4.核心代码
  • 5.本地测试

这些天在学习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"
)

/**

@description: 给企微发送消息
@param {string} message 消息内容
@param {string} msgType 消息类型
@return {*}
*/
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微信机器人内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Django为窗体加上防机器人的验证码功能过程解析

    这里我们使用 django-simple-captcha 模块,官方介绍如下:https://github.com/mbi/django-simple-captcha 一键安装: pip install django-simple-captcha 在 setting.py 中把 'captcha' 加到 INSTALLED_APP 的区块中 INSTALLED_APPS = ( # ... 'captcha', # ... ) 由于此模块会到数据库建立自己的数据表,因此要先执行数据库的 migr

  • Golang两行代码实现发送钉钉机器人消息

    废话不多说, 先看代码 创建一个钉钉机器人, 必须使用加签方式 1. 安装 ding 模块包 go get -u github.com/wanghuiyt/ding 2. 普通群消息使用 使用你自己生成的AccessToken和Secret d := ding.Webhook{AccessToken: "8c03f...", Secret: "SECef..."} _ = d.SendMessage("这是普通的群消息") 效果: 详细教程 创建

  • Django实现聊天机器人

    演示效果如下所示: 实现原理 用户在聊天界面调用Celery异步任务,Celery异步任务执行完毕后发送结果给channels,然后channels通过websocket将结果实时推送给用户.对于简单的算术运算,Celery一般自行计算就好了.对于网上查找诗人简介这样的任务,Celery会调用Python爬虫(requests+parsel)爬取古诗文网站上的诗人简介,把爬取结果实时返回给用户. 接下来我们来看下具体的代码实现吧. 第一步 安装环境依赖 首先在虚拟环境中安装django和以下主要

  • php获取Google机器人访问足迹的方法

    本文实例讲述了php获取Google机器人访问足迹的方法.分享给大家供大家参考.具体如下: <?php $email = "test@test.com"; if(eregi("googlebot",$HTTP_USER_AGENT)) { if ($QUERY_STRING != "") { $url = "http://".$SERVER_NAME.$PHP_SELF.'?'.$QUERY_STRING; } else

  • SpringBoot搭建go-cqhttp机器人的方法实现

    目录 参考文档: 一.搭建go-cqhttp机器人 二.搭建SpringBoot环境 1.HTTP通信 2.WebScoket 通信 三.补充 百度一下搭建go-cqhttp,千篇一律都是采用python搭建的,Java搭建根本没有.导致自己在搭建的时候可折磨了,出现了许多的问题.唯一能参考就只有官方文档.文档对小白也不是太友好,所以出这篇博客弥补一下Java 的搭建版本. 搭建环境: winndows 系统 + Java + Idea 2020.2 注意:本博客写的比较简单,存在很多不完善的地

  • Go语言使用钉钉机器人推送消息的实现示例

    学习了Go语言后,打算利用最近比较空一点,写一个前端部署工具,不需要每次都复制粘贴的麻烦,我们希望再部署开始之前和部署结束后推送钉钉消息 创建一个钉钉机器人 这个比较简单 添加完后会给你一个webhook就是我们发送消息的地址 推送消息 show code! func SendDingMsg(msg string) { //请求地址模板 webHook := `https://oapi.dingtalk.com/robot/send?access_token=04c381fc31944ad290

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

    目录 0.回顾流程 1.项目基础配置 2. Redis封装 3.消息体封装 4.核心代码 5.本地测试 这些天在学习Go,也写了几篇关于阅读Gin后端项目代码的博客.但编程这种,一定要实际上手练习,要不然都是纸上谈兵.于是就想上手自己实际写一些代码来练练手.思来想去,不知道能写些什么来练手.后来突然想到,之前写过用Python做微信聊天机器人(博客传送门),当时代码没有放到git上,后来重置了服务器导致代码全部没了.现在正好苦于不知道做什么项目练手,可以用Go也实现一套微信聊天机器人. 说干就干

  • Python制作微信机器人教程详解

    目录 一.环境配置 二.登录 三. 第一个简单的消息发送监控 四.指定某个微信好友发送消息 五.所有微信群监控 六.公众号监听 七.定时发送消息 八.微信智能聊天机器人 一.环境配置 大多数人无法登录网页版,所以饶过它模拟电脑登录,这个模块一定记得安装: pip install itchat-uos pip install itchat 二.登录 #码登录个人微信账号 import itchat itchat.auto_login(hotReload=True)#hotReload= True可

  • Python超简单分析评论提取关键词制作精美词云流程

    目录  一.抓取全部评论 1.找到评论接口 2.Python 获取评论 二.文本分词.词云制作 1.文本分析 2.生成词云 3.初步效果-模糊不清 4.最终效果-高清无马  一.抓取全部评论 吾的这篇文章,有 1022 次评论,一条条看,吾看不过来,于是想到 Python 词云,提取关键词,倒也是一桩趣事. 评论情况: {'android': 545 次, 'ios': 110 次, 'pc': 44 次, 'uniapp': 1 次} 一个小细节:给我评论的设备中,安卓苹果比是 5:1. Bu

  • Python实现发票自动校核微信机器人的方法

    制作初衷: 外地开了票到公司后发现信息有错误,无法报销: 公司的行政和财务经常在工作日被问及公司开票信息,影响心情和工作: 引入相应的专业APP来解决发票问题对于一般公司成本较高: 看到朋友孟要早睡写过脚本来解决这个问题,但因为公司场景不相同,无法复用,所以新写了一个 本代码使用简单的封装方法,并做了比较走心的注释,希望能给初学Python的小伙伴提供一些灵感,也能让有实际需求的人可以快速修改.使用. 源码地址:https://github.com/yc2code/WechatInvoicePa

  • 撤回我也能看到!教你用Python制作微信防撤回脚本

    一.之前解决方案 大概是这样:短时间内同一位好友发送了多条消息,当他随便撤回一条消息时,我们不能确定他到底撤回的到底是哪一条消息.只能猜他可能是撤回了最近的一条消息,然后将其他消息贴出来作为备选.代码如下: target_msg_pattern = '"{}" 撤回了一条消息'.format(sender_name) if content == target_msg_pattern: return_msg = '[{}]撤回了一条消息:\n'.format(sender_name) i

  • Python 一键制作微信好友图片墙的方法

    wxpy.pyinstalller 库的使用. 上午发了张我微信近 2000 位好友的头像拼图,让大伙儿看能不能快速找到自己的头像,没想到反响很强烈,引得阵阵惊呼与膜拜,没有料到. 有没有犯密集恐惧症?这并不震撼,如果你有 5000 位好友的话,做出来的图看着会更刺激些. 看完了图,你可能想知道这个图咋做出来的,不会是我闲着无聊把把好友头像一个个保存下来再用 PS 拼的吧? 自然不是了,Python 做的,是不是觉得没有 Python 干不了的事儿.其实,这种图很早就有人玩过了,不过下面还是来说

  • itchat-python搭建微信机器人(附示例)

    itchat是python开源第三方库,用于搭建微信机器人,几十行代码就能帮你实现自动的处理所有信息.比如,添加好友,搭建自动回复机器人,还原撤销信息,分析好友男女比例,地理分布情况,爬朋友圈做数据分析- 本文只是简单实现聊天机器人,想了解更多关于itchat的用法请参照:https://itchat.readthedocs.io/zh/latest/ 安装 pip install itchat 登录 itchat.auto_login(hotReload=True) 执行后会出现一个二维码,扫

  • 手把手教你使用Python创建微信机器人

    微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地,今天我们要将便是如何用Python来生成一个微信机器人,突然想起鲁迅先生曾经说过的一句话: 因为是微信机器人系列的第一篇文章,所以猪哥会特别详细的讲解每一地方,尽量使每一位想学习的同学都能顺顺利利的开始,下面就让我们一起来做些有趣的事吧! 一.项目介绍 1.微信库选择 python关于开发微信的库主要有itchat和wxpy,而wxpy底层是调用的itchat,所以如果你只是要使用的话建议使用wxpy库,它比

  • Python制作微信好友背景墙教程(附完整代码)

    引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟每个人的微信好友是不一样的.本文就教大家用Python来实现这种效果. 环境 操作系统:Windows Python版本:3.7.3 代码实现 我们需要首先需要获取好友的头像信息,接下来处理图像并完成图像的拼接. 准备工作 在这里,我们登录微信获取好友信息,使用的是 wxpy 模块:处理并生成最终的

  • vue实现的微信机器人聊天功能案例【附源码下载】

    本文实例讲述了vue实现的微信机器人聊天功能.分享给大家供大家参考,具体如下: 先看效果: 实现过程: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>HTML5模拟微信聊天界面</title> <style> /**重置标签默认样式*/ * { margin: 0; padding: 0; list-style: none; fo

随机推荐