Python构建企业微信自动消息转发服务端
一、背景
目前有在项目分组,就小组成员中,微信群消息回复较多的情况下,想根据组来转发特定消息,包含文字、图片、语言等。在此只是自己实现仅供参考,可以根据自身需求修改更多功能。
二、代码
2.1 企业微信相关信息
- 企业ID:corpid
- 自建应用appid
- 自建应用secret
2.2 服务端部署
运行环境:
python 版本 2.7
git clone https://github.com/redhatxl/wechatmsg.git nohup python2.7 wechatmsg/wx_msg_server.py &
2.3 参考RUL:
2.4 代码
- 核心代码
github地址
# flask 框架后台 def server_run(self): app = Flask(__name__) @app.route('/index', methods=['GET', 'POST']) def index(): wxcpt = WXBizMsgCrypt(self.sToken, self.sEncodingAESKey, self.sCorpID) # 获取url验证时微信发送的相关参数 sVerifyMsgSig = request.args.get('msg_signature') sVerifyTimeStamp = request.args.get('timestamp') sVerifyNonce = request.args.get('nonce') sVerifyEchoStr = request.args.get('echostr') # 验证url if request.method == 'GET': ret, sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr) print type(ret) print type(sEchoStr) if (ret != 0): print "ERR: VerifyURL ret:" + str(ret) sys.exit(1) return sEchoStr # 接收客户端消息 if request.method == 'POST': sReqMsgSig = sVerifyMsgSig sReqTimeStamp = sVerifyTimeStamp sReqNonce = sVerifyNonce sReqData = request.data print(sReqData) ret, sMsg = wxcpt.DecryptMsg(sReqData, sReqMsgSig, sReqTimeStamp, sReqNonce) print ret, sMsg if (ret != 0): print "ERR: DecryptMsg ret: " + str(ret) sys.exit(1) # 解析发送的内容并打印 xml_tree = ET.fromstring(sMsg) print('xml_tree is ', xml_tree)
- 消息内容发送
def _send_text_msg(self, content): data = { "touser": ('|').join(self.userid.split(',')), "toparty": ('|').join(self.partid.split(',')), # "toparty":int(self.partid), "msgtype": "text", "agentid": self.agent_id, "text": { "content": content }, "safe": 0 } try: response = requests.post(self.send_msg_url.format(self.access_token), json.dumps(data)) self.logoper.info(response.text) print(response.text) result_msg = json.loads(response.content)['errmsg'] return result_msg except Exception as e: self.logoper.info(e)
- 日志
def create_dir(self): """ 创建目录 :return: 文件名称 """ _LOGDIR = os.path.join(os.path.dirname(__file__), self.logdir_name) _TIME = time.strftime('%Y-%m-%d', time.gmtime()) + '-' _LOGNAME = _TIME + self.logfile_name LOGFILENAME = os.path.join(_LOGDIR, _LOGNAME) if not os.path.exists(_LOGDIR): os.mkdir(_LOGDIR) return LOGFILENAME def create_logger(self, logfilename): """ 创建logger对象 :param logfilename: :return: logger对象 """ logger = logging.getLogger() logger.setLevel(logging.INFO) handler = logging.FileHandler(logfilename) handler.setLevel(logging.INFO) formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formater) logger.addHandler(handler) return logger
配置文件
# 定义微信公众号信息 [common] # 企业微信企业ID corpid = wxe23xxxxxxxxxxx # 接收消息服务器配置 [recmsg] Token = mVNAAw3xxxxxxxxxxxxxxxxx EncodingAESKey = vwbKImxc3WPeE073xxxxxxxxxxxxxxxxxx # 自建应用信息 [appconfig] # 自建应用agentid agentid = 1000002 # 自建应用secret secret = 6HAGX7Muw36pv5anxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 消息接收信息 # 消息接收用户id,如果多个用户用英文','隔开 userid = xuel|yaoy # 消息接收部门id,如果多个用英文','隔开 partid = 11 [urlconfig] # 获取应用token的api接口 get_access_token_url = https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={} # 发送消息api接口 send_msg_url = https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={} # 上传媒体api接口,获取mediaid upload_media_url = https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type=image # 上传高清语音接口 upload_video_url = https://qyapi.weixin.qq.com/cgi-bin/media/get/jssdk?access_token={}&media_id={} [loginfo] #日志目录 logdir_name = logdir #日志文件名称 logfile_name = wechat_server.log
三、测试
在企业微信发送消息,可以修改配置文件制定转发到特定的群组,从而避免消息分流。
启用应用API,设置回调地址
测试发送消息
查看接受消息
四、优化
- 后期可以配合数据库将每次获取的access_token 保存至数据库,待2小时过期后,再重新获取新的。
- 更多内容转发
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
数据恢复工程师视角看腾讯云静默损坏事件
腾讯云在这次事件中的结论表述为因受所在物理硬盘固件版本Bug导致的静默错误,文件系统元数据损坏:根据这个表述,故障应出现在硬盘固件故障导致的文件系统元数据损坏。这其中,涉及具备因果关系的三个知识点:硬盘固件故障—>文件系统元数据损坏—>文件损坏。在此大致画一下腾讯云可能用到的存储架构方案。带*号的是不一定存在的存储链。事实上,这个逻辑肯定不准确,比如有些环节精减或不需要,有些环节有更详细的设计等。但是不是和真实场景一致不重要,重要的是,问题如果出现,总会出现在我列出的项或我没列出的项中(废话),这些项是相互关联的。我们再重复一下现象:硬盘固件故障(层1故障)导致的文件系统元数据损坏,从而导致部分文件校验出错,导致文件损坏。针对现象,努力从上述10个环节匹配,每一层会有可能出错,导致上述故障吗: 第1层:存储介质 以硬盘为例,每个构成数据的最小单位扇区都会有严格的校验,包括扇区头部的CRC校验以及地址标识校验。理论上,如果层1的数据出现磁力失真(或闪存状态丢失)等比特出错,其头部校验不匹配时,介质控制器就会向上层反馈错误(一般表现为坏扇区),上层会启动修正模式进行修正。当然也...
- 下一篇
记一次混合监控的反思
一、背景 作为最底层的技术人员,目前由于有客户在运维中遇到混合架构,公有云上使用了产品级别Redis数据库,同时由于业务在云服务器和kubnets的容器内也有redis数据库,因此对于这种混合模式数据库的监控,进行简单的分析总结,在此记录笔记,在此抛砖引玉,也曾希望对各位有一点点益处。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,在原子化操作的基础上,有具有数据持久化的功能,同时也支持主从同步和集群搭建,支持发布订阅机制,大大提高了数据操作的扩展性和数据冗余安全性。在目前SAAS无论是共有云还是私有云,自建集群,还是docker容器,监控方式多样化,针对不同的场景各种方式互补来更好的提供监控。 二、监控方式 2.1 云平台监控 目前对于SAAS产品级别数据库产品,即开即用底层均依托于各云厂商的多副本或集群方式,来保障数据的安全性和服务的稳定性,但在目前的几次云故障中,我们也要心怀对数据的敬畏之心,各方面多方式做好数据的备份,没有绝对的安全,无论在多少个9的SLA面前,数据一旦发生不可挽回性丢失或损坏那将是百分之百的损失,数据无...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果