基于windows服务器的微信机器初体验(带http插件)

前言

今天收到消息推送,微信对公众号的限制极大的打击了server酱(大哭),服务器与程序员之间的通信手段又少了一个。再加上之前腾讯对第三方qq机器人的打压,那些有趣的机器人插件也消失了很多...

在查询服务器主动推送消息的方式时,又想到了采用qq机器人的方式,通过机器人发送消息到qq提醒我们服务器的状态,但是大多数机器人采用被动触发事件来发送消息。

业务场景是有一个python程序,我们想要在程序每天定时跑完之后发送回执信息给我们,又不想通过邮箱这样繁琐的方式来操作。找来找去找到了一个微信机器人,它最吸引我的是拥有http插件,允许我通过们调用服务器的某个端口来执行特定的操作。

可爱猫机器人

正如介绍所说,可爱猫是一个轻巧、免费、高效的wx机器人核心,功能需要安装“应用”实现。免费是它一大优点,基于微信应用也是它的不足之处。

下载与安装

系统:Windows10,Windows7,Windows Server2012,Windows Server2008均可(本例运行在Windows Server2012)

下载地址页:http://www.keaimao.com.cn/forum.php?mod=viewthread&tid=127&extra=page%3D1

为了方便我把群里的最新版进行下载后上传

可爱猫4.4.1

微信客户端v2.6.8.52

在服务器上解压可爱猫主程序,同时给安装指定版本微信客户端

机器人配置

  1. 打开主页,我这边已经登录过了所以不会弹出。默认它会打开你系统中安装的微信,弹出登录框后扫码登录即可(建议用小号

  2. 功能界面可以看到当前存在的插件

    首次进入默认有关键词回复和KamWebHttp插件,安装插件只需要拖拽dll文件到此处就好。

    本次我们看重的是机器人的http插件(允许http通信的模块),这里对其他插件的开发就不做说明了,我暂时也不会去写微信机器人插件,之后会介绍我主要写的qq机器人的插件。

    1. 我们右键KamWebHttp插件,点击设置,可以看到这个插件的配置页,目前我们只需要用到第一个地址,即Api接口地址,用来操控机器人的。http://127.0.0.1:2020/Send/此地址关键在于使用2020端口,我们需要在服务器的防火墙添加2020入站规则,云服务器要对应开启对应端口安全组。

  3. 接着我们我们看到后台菜单,有日志、账号登陆(看到我们目前登录的机器人账号的信息)、自动回复(对应关键词回复插件,可以直接添加回复关键词很好用),及条款。可以试着简单添加几个自动回复,用加了好友的微信号对机器人微信进行私聊发消息,看受否成功返回预定信息。

    至此我们机器人部分配置完毕,此时机器人已经具备了【关键词回复】、【基于http控制】的功能

机器人的Http插件

下面是本篇的重点,即:如何通过发送http请求来主档控制机器人

​ 我们使用的是KamWebHttp插件,插件的文档如下:https://mubu.com/doc/6DfKlgxdsnP#

文档包含了插件的介绍、定价、demo和接口调用方式

初体验

我们直奔主题

私聊文本消息发送 参考:Id=10001&Type=10001&robot_wxid=机器人wxid&to_wxid=收信人wxid&msg=消息内容(值,都是需要编码的,看下面一行)

PS:这里是你调用我们的接口来实现发送消息等等功能;请注意大小写,对于大小写是敏感的;需要先用URL编码后再BASE64编码,全部参数值均需统一编码!

Id[参数名,总调参数必须匹配Type]

  • 10001 [Id参数值,发送私聊消息]
  • 10002 [Id参数值,发送群聊消息]
  • 10003 [Id参数值,其他接口调用]

划重点划重点:value值要进行urlencode后进行base64编码。

介绍工具:

https://base64.us/

http://tool.chinaz.com/tools/urlencode.aspx

我们测试对某个用户发送私聊消息,所以我们需要对robot_wxid、to_wxid、msg的值的内容进行变更。

robot_wxid是你当前可爱猫登录的微信号,to_wxid是你要发送消息的对象的微信号

不要忘了把10001也进行两次编码

当你这弄好的query表达式拼接到前面说过的api地址http:127.0.0.1:2020/Send/上,即

http:127.0.0.1:2020/Send/?Id=10001&Type=10001&robot_wxid=机器人wxid&to_wxid=收信人wxid&msg=消息内容

之后可以在服务器浏览器上访问(执行get请求),测试成功,框架成功帮我们发送消息给指定的人。

为了方便,我这里没有对值进行替换和编码。

服务器本地测试成功后,我们可以把127.0.0.1替换成你的服务器ip进行测试,测试成功!

错误提示:

1.检查是否开启2020端口(服务器和云服务器管理控制台安全组都要开开)

2.检查是否正确编码,即先url编码再base64编码

编写简单的python包

我们最终的目的是什么还记得吗?是我们在python程序跑完后主动发消息给我们的微信上。所以我们需要写一个简单的python包,封装一下发送消息的接口,简化编码的过程。

在此声明:我们参考了作者给出的python sdk的一部分代码,对代码针对我们的需求进行了改进,再次感谢作者。

开发环境:python3.8+windows10

目录结构

我们封装一个WxBot的包,平级Run.py是对包进行测试用的。内层Config包包含了应用的简单配置,KamBot_Api.py是我们的主体文件

KamBot_Api.py

# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name:     KamBot_Api.py
   Description :   可爱猫对接接口API
   Author :        fay
   date:          2021/2/3
-------------------------------------------------
   Change Activity:
                    2021/2/3: 文件初创
-------------------------------------------------
"""
import requests
import base64
from .Config import Setting as SETTINGS

class KamBot:
    def __init__(self):
        self.__server=SETTINGS.server_opt
    def __send_request(self, data):
        '''通用消息发送接口 get请求,需要把请求的参数以dict的格式组合发送过来'''
        try:
            url = self.__server.get("send_url")
            try:
                requests.post(url, params=data)
            except Exception:
                raise Exception("request error")
            return True
        except Exception as e:
            raise Exception("load url error")

    def __bs64_url_data_encode(self, st):
        '''进行文本编码 url 编码 -> Bs64 编码'''
        from urllib.parse import unquote
        new_str = str(st)
        new_str = unquote(new_str)
        encode_str = base64.b64encode(new_str.encode()).decode("utf-8")
        return encode_str

    def __send_text_msg(self,robwxid,to_wxid,msg):
        '''私聊文本消息发送 事件接口位置: Id:10001 -> Type:10001'''
        data = {}
        data["Id"] = self.__bs64_url_data_encode(10001)
        data["Type"] = self.__bs64_url_data_encode(10001)
        data["robot_wxid"] = self.__bs64_url_data_encode(robwxid)
        data["to_wxid"] = self.__bs64_url_data_encode(to_wxid)
        data["msg"] = self.__bs64_url_data_encode(msg)
        return self.__send_request(data)

    def __send_group_at_msg(self,robwxid, group_wxid, at_wxid, at_name, msg):
        '''群发消息 事件接口位置:Id:10003 -> Type:20001 '''
        data = {}
        data["robwxid"] = robwxid
        data["Id"] = self.__bs64_url_data_encode(10003)
        data["Type"] = self.__bs64_url_data_encode(20001)
        data["robot_wxid"] = self.__bs64_url_data_encode(robwxid)
        data["group_wxid"] = self.__bs64_url_data_encode(group_wxid)
        data["member_wxid"] = self.__bs64_url_data_encode(at_wxid)
        data["member_name"] = self.__bs64_url_data_encode(at_name)
        data["msg"] = self.__bs64_url_data_encode(msg)
        return self.__send_request(data)

    def send_text_msg_user(self,nickname,msg):
        try:
            #load system settings
            robwxid = SETTINGS.server_opt.get('bot_wxid')
            #get wxid through nickname
            to_wxid=SETTINGS.wxid_opt.get(nickname,None)
            if(to_wxid==None):
                raise("nickname doesn't exist!")
        except Exception:
            raise Exception("get settings error")

        return self.__send_text_msg(robwxid,to_wxid,msg)

    #improving...
    def send_text_msg_group(self,groupnickname,msg):
        return "cannot find goupid,you can you up"

因为查找微信群组id的方法十分复杂,我就没有写这个方法,只写了对某人发送消息的方法,并采取常用通讯录的方式,放在config里进行配置

Setting.py

# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name:     Setting.py
   Description :   配置文件
   Author :        fay
   date:          2021/2/3
-------------------------------------------------
   Change Activity:
                   2021/2/3: 文件初创

-------------------------------------------------
"""

#可爱猫server相关配置
server_opt = {
    "bot_wxid": "wxid_*****2", #botwxid
    "send_url": "http://8******:2020/Send/", #服务器地址
}
#wx好友wxid相关配置
wxid_opt={
    "f**":"wxid_*****2",
    "l**":"*wxid_*****21"
}
#wx群组id相关配置
groupid_opt={

}

把常用的发送人放在wxid_opt里,上面server_opt为我们机器人的基本配置,框架登录的机器人的wxid和服务器地址。群组id配置是对应发送群聊消息的,因为我们没有写这个函数,就留空了。

使用测试

使用非常简单

from WxBot import wxBot
wxBot.send_text_msg_user('nickname',"hh")

其中,函数是有bool类型的返回值的。我们只需要把这条语句插入到我们执行完python程序的后面即可。

总结

这款wx机器人的主要重点在于http插件的支持(且是系统自带),我们关心的是如何只使用一行request请求就让服务端发送消息到我们的微信,这和server酱简单易用的作风非常相似。

另外,使用机器人有风险,建议大家只是自己使用作为和服务器的通讯手段。微信检测到同时群发消息可能会封号,请谨慎使用高频的消息发送。

简易的python包只是为了契合我的需求,我不需要大量的外网访问、自定义消息推送、消息处理队列等功能,如果需要,大家可以参考作者的python sdk。另外,目前KamHttp插件作者也只是写了部分的python sdk,仅仅是在消息主动发送方面,但是其实接口还有很多很多,作者都写了进去,大家可以积极去探索,去开发!

后记

今天很开心的一件事,我发现我的小站被百度收录啦!!今后我一定要勤奋写日记,这也将是我的一大动力!!

希望能用这个fay小站记录程序幼猿点点滴滴,也希望能把我遇到的坑、把我用过的好工具好代码分享给大家,大家有什么想说的可以积极留言,我看到了都会回复的!

基于windows服务器的微信机器初体验(带http插件)

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注