微信企业号
企业号是微信为企业客户提供的移动应用入口,只有企业通讯录的成员才能关注企业号,分级管理员、保密消息等各种特性确保企业内部信息的安全。
企业可自行在企业号中可配置多个服务号,可以连接不同的企业应用系统,只有授权的企业成员才能使用相应的服务号。
以上来自腾讯faq,想了解更多请度娘。
然后我们有了个企业号后,就能使用微信提供的api进行操作了,最经典的是发送消息。
企业号授权(AccessToken)
首先我们要经过授权,就是说要获得这个企业号的操作权限,通过获取AccessToken体现。
AccessToken是企业号的全局唯一票据,调用接口时需携带AccessToken。
AccessToken需要用CorpID和Secret来换取,不同的Secret会返回不同的AccessToken。
请求说明
Https请求方式: GET
https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
参数说明
参数 |
必须 |
说明 |
corpid |
是 |
企业Id |
corpsecret |
是 |
管理组的凭证密钥 |
权限说明
每个secret代表了对应用、通讯录的不同权限;不同的管理组拥有不同的secret。
返回说明
a)正确的Json返回结果:
1 2 3 4
| { "access_token": "accesstoken000001", "expires_in": 7200 }
|
参数 |
说明 |
access_token |
获取到的凭证。长度为64至512个字节 |
expires_in |
凭证的有效时间(秒) |
b)错误的Json返回示例:
1 2 3 4
| { "errcode": 43003, "errmsg": "require https" }
|
结合以上信息,我们可以很容易使用python写出代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import requests class WeixinMsg(object): def __init__(self, corpid, corpsecret): self.__corpsecret = corpsecret self.__corpid = corpid self.__token = self.__getToken() def __getToken(self): gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.__corpid, self.__corpsecret) r = requests.get(gettoken_url) if r.status_code == 200: return r.json()["access_token"] else: return r.status_code
|
发送消息
也是经典的场景,通过构造特定的json数据格式传送到微信api来实现
首先传递给企业号api的json格式是这个:
1 2 3 4 5 6 7 8 9 10 11
| { "touser": "UserID1|UserID2|UserID3", "toparty": " PartyID1 | PartyID2 ", "totag": " TagID1 | TagID2 ", "msgtype": "text", "agentid": 1, "text": { "content": "Holiday Request For Pony(http://xxxxx)" }, "safe":0 }
|
参数 |
必须 |
说明 |
touser |
否 |
成员ID列表(消息接收者,多个接收者用‘ |
toparty |
否 |
部门ID列表,多个接收者用‘ |
totag |
否 |
标签ID列表,多个接收者用‘ |
msgtype |
是 |
消息类型,此时固定为:text (支持消息型应用跟主页型应用) |
agentid |
是 |
企业应用的id,整型。可在应用的设置页面查看 |
content |
是 |
消息内容,最长不超过2048个字节,注意:主页型应用推送的文本消息在微信端最多只显示20个字(包含中英文) |
safe |
否 |
表示是否是保密消息,0表示否,1表示是,默认0 |
其他消息类型可以看api文档
请求说明
Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
消息型应用支持文本、图片、语音、视频、文件、图文等消息类型。主页型应用只支持文本消息类型,且文本长度不超过20个字。
代码示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import requests class WeixinMsg(object): def __init__(self, corpid, corpsecret): self.__corpsecret = corpsecret self.__corpid = corpid self.__token = self.__getToken() def __getToken(self): gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.__corpid, self.__corpsecret) r = requests.get(gettoken_url) if r.status_code == 200: return r.json()["access_token"] else: return r.status_code def send(self, user, content): send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s'% self.__token send_values = '''{ "touser": "%s", "msgtype":"text", "agentid": 1, "text":{ "content": "%s" }, "safe": 0 }''' % (user, content) r = requests.post(send_url, data=send_values, headers = {"Content-Type": "application/json; charset=utf-8"}) return r.json()["errcode"]
|
发送图片
发送图片比发送文本消息复杂一点,首先需要把图片上传到微信,微信把这个叫素材,素材不单指图片,还有语音、视频、普通文件。素材分临时素材和永久素材,临时素材保存3天。
上传临时素材
请求说明
Https请求方式: POST
https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
参数说明
参数 |
必须 |
说明 |
access_token |
是 |
调用接口凭证 |
type |
是 |
媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) |
media |
是 |
form-data中媒体文件标识,有filename、filelength、content-type等信息 |
返回说明
1 2 3 4 5
| { "type": "image", "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0", "created_at": "1380000000" }
|
参数 |
说明 |
type |
媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) |
media_id |
媒体文件上传后获取的唯一标识。最大长度为256字节 |
created_at |
媒体文件上传时间戳 |
上传的媒体文件限制
- 所有文件size必须大于5个字节
- 图片(image):2MB,支持JPG,PNG格式
- 语音(voice):2MB,播放长度不超过60s,支持AMR格式
- 视频(video):10MB,支持MP4格式
- 普通文件(file):20MB
代码示例如下:
使用requests的post方法,可以方便的上传,headers会自动设置成form-data。Mfile是我们要上传图片的路径,必须可读,这样上传后我们就得到了media_id。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import requests from os.path import sep, getsize class WeixinMedia(object): WEIXIN_TOKEN = '' def __init__(self, Weixin): self.__Weixin = Weixin self.refershWXToken() def refershWXToken(self): global WEIXIN_TOKEN WEIXIN_TOKEN = self.__Weixin.token def upload(self): pass def get(self): pass class WeixinTmpMedia(WeixinMedia): def __init__(self, Weixin): super(WeixinTmpMedia, self).__init__(Weixin) def uploadImage(self, Mfile): upurl = 'https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type=image'.format(WEIXIN_TOKEN) f = open(Mfile, 'rb') suf = f.name.split('.')[-1].lower() if suf <> 'jpg' and suf <> 'png': return 'Not a image file!' elif getsize(Mfile) > 2097152L: return 'Image file too large!' else: files = {'file': (f.name.split(sep)[-1], f)} r = requests.post(upurl, files=files) f.close() if 'media_id' in r.json(): return r.json()['media_id'] else: return 'errcode: {}, errmsg: {}'.format(r.json()['errcode'], r.json()['errmsg'])
|
发送图片给公众号
我们改造一下之前的代码,把消息抽象出来,消息可以是文本和图片,他们共同点是token和send方法,传入的weixin类带有token:
1 2 3 4 5 6 7 8 9 10 11
| class WeixinMsg(object): WEIXIN_TOKEN = '' def __init__(self, Weixin): self.__Weixin = Weixin self.refershWXToken() def refershWXToken(self): global WEIXIN_TOKEN WEIXIN_TOKEN = self.__Weixin.token def send(self): pass
|
发送图片代码继承上面的消息类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class WeixinImg(WeixinMsg): def __init__(self, Weixin): super(WeixinImg, self).__init__(Weixin) def send(self, user, mediaID): send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}' send_values = '''{ "touser": "%s", "msgtype":"image", "agentid": 1, "image":{ "media_id": "%s" }, "safe": 0 }''' % (user, mediaID) r = requests.post(send_url.format(WEIXIN_TOKEN), data=send_values, headers = {"Content-Type": "application/json; charset=utf-8"}) return r.json()["errcode"]
|
这样就能发生图片给关注公众号的人了。