前言
目前能够方便提供推送的工具不多,而企业微信在这块做的非常好,我们来看下怎么利用企业微信来实现一些消息推送的功能
步骤
注册企业微信
选择企业,如果使用的人有多个人的话,只需要一个人注册即可,后面的应用是可以创建多个的
创建应用
一个应用可以管理一个环境
登陆企业微信
https://work.weixin.qq.com/
填写基本的信息
创建成功以后就会出现下面的信息了
这里我们先记住第一个信息
AgentId:1000002
secret需要点击后获取,也获取一下
Secret需要通过手机端获取,获取到了以后记录下来即可
打通消息
企业微信发消息有两种方式:
- 第一种是主动发送消息,这个不需要设置一个服务器,直接通过api发送消息即可
- 第二种是回复消息,这里是客户发送消息给应用,应用会判断消息以后返回消息
主动发送消息
提前获取需要的信息
获取corpid(上面图中的企业ID即是)
获取corpsecret(上面的步骤里面获取过)
获取账号名称,后面的touser会用到
主动发送消息的比较简单,我们看下python代码的实现
#! /usr/bin/python
#-*- coding:utf-8 -*-
import requests
import json
corpid="xxxxxxxxxxxxx"
corpsecret="xxxxxxxxxxxxxxxxxxxxx"
# 获取token
def get_token():
global corpid
global corpsecret
res=requests.get('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' %(corpid,corpsecret))
print(res.json())
access_token=res.json()["access_token"]
return access_token
my_token=get_token()
# 定义发送的数据给谁,数据的类型
data={"touser": "MoZha","msgtype": "markdown","agentid": "1000002","markdown": {"content": ""},"safe": 0,"enable_id_trans": 0,"enable_duplicate_check": 0}
message="""
测试发送数据
"""
# 发送数据的模块
def send_messages(data,message):
global my_token
data["markdown"]["content"]=message
data = json.dumps(data)
json_str=json.loads(data)
print(type(data))
print(data)
URL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % my_token
r=requests.post(url=URL,data=data)
print(r.json())
send_messages(data,message)
使用python执行上面的脚本,数据就发送给了指定的用户了
上面的比较简单,就是一个主动发送
我们再看下怎么通过API获取客户端发送过来的信息
通过API获取客户端的发来的信息
通过客户端的获取消息的难点在于需要处理中间的消息加解密的问题,这个地方我们通过官方提供的加解密的会方便很多,也是官方推荐的方式
设置API接收
这里需要准备一个地址,这个需要公网的地址,进行设置的时候就需要校验,所以我们需要准备一个restful的服务,这个用flask实现比较简单
假设我的地址是(下面应该为公网IP地址)
http://127.0.0.1:5000/testapi
官方的python加解密的库地址
https://github.com/sbzhu/weworkapi_python/tree/master/callback
把上面的内容拷贝到跟下面的代码一个目录里面
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask,request
import ConfigParser as cp
from WXBizMsgCrypt import WXBizMsgCrypt
import xml.etree.cElementTree as ET
import sys
app = Flask(__name__)
@app.route('/testapi',methods=['GET', 'POST'])
def hello_world():
sToken ="xxxxxxxxxxxxx"
sEncodingAESKey="xxxxxxxxxxxxxxx"
sCorpID ="xxxxxxxxxxxxxxxxxxxx"
wxcpt=WXBizMsgCrypt(sToken,sEncodingAESKey,sCorpID)
if request.method == 'GET':
sVerifyMsgSig = request.args.get("msg_signature")
sVerifyTimeStamp=request.args.get("timestamp")
sVerifyNonce=request.args.get("nonce")
sVerifyEchoStr=request.args.get("echostr")
print("start sEchoStr")
ret,sEchoStr=wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,sVerifyNonce,sVerifyEchoStr)
if(ret!=0):
print "ERR: VerifyURL ret: " + str(ret)
return sEchoStr
if request.method == 'POST':
sReqMsgSig=request.args.get("msg_signature")
sReqTimeStamp=request.args.get("timestamp")
sReqNonce=request.args.get("nonce")
sReqData = request.stream.read()
ret,sMsg=wxcpt.DecryptMsg( sReqData, sReqMsgSig, sReqTimeStamp, sReqNonce)
xml_tree = ET.fromstring(sMsg)
content = xml_tree.find("Content").text
if content == "ceph":
print("OKOK")
return "ok"
if __name__ == "__main__":
app.run(host='0.0.0.0',port=5000,debug=True)
下面三个信息:
sToken =“xxxxxxxxxxxxx”,设置页面随机生成
sEncodingAESKey=“xxxxxxxxxxxxxxx” 设置页面随机生成
sCorpID =“xxxxxxxxxxxxxxxxxxxx” 自己的企业ID
然后点设置,设置成功就是没问题,如果失败需要检查上面的设置restful服务是否正常
上面的方法是获取消息后,直接返回的OK,我们可以在print的地方自己去调用模块,去返回自己想返回的数据,可以自己加入即可
部门发送
如果想发送给整个部门,需要添加应用的可见范围为某个部门,然后在发送里面添加下面的部门id
“toparty”: “2”
总结
上面就是把企业微信的消息发送通过后台实现了一遍,基于上面的可以做一些消息的发送了