企业微信发送消息--Python

企业微信内部消息推送——Python

我有一些自动化任务,这些自动化任务的执行结果,是成功和失败都是通过邮件发送的。但是邮件这个工具,有点正式,毕竟我只想一个通知。那有没有方法可以用微信接受通知呢?

微信我记得有个Server酱,不过好像收费(免费的限制比较多)
于是乎,退而其次,用企业微信。其实,个人也可以注册一个企业微信,不需要营业执照认证之类的。不过有一些更高级的功能就得用真实的企业资料进行认证了,但那些功能目前用不到。

准备工作:

    到企业微信官网,注册一个企业;登录企业微信后台,创建一个“自建”应用, 获取企业ID、agentid、secret这3个必要的参数;在企业微信的通讯录中,创建多个测试账号;在手机端安装“企业微信”APP,使用测试账号登录到企业微信,准备接收消息。

程序代码

    企业微信提供API开发接口,通过HTTPS的GET、POST方法与企业微信后台进行交互,完成获取令牌、发送数据、获取数据的操作。

    Python代码主要使用requests库,将企业微信API进行简单封装,模拟https的GET、POST操作,向指定的用户发送企业微信消息。

在学习开发企业微信内部应用的时候碰到很多问题,比如调用api、发送POST请求、POST请求上传文件等诸多问题 。

如何注册企业微信?
创建企业微信应用

 

 点进去查看信息,并记录几个关键的id

  • AgentId(每个应用都有唯一的agentid) 
  • Secret(secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏)

access_token的获取

在使用企业微信的api时候首先要知道自己所开发的应用的access_token的值。我们可以通过GET请求来得到access_token的值。

access_token是一个比较特殊的id,得通过接口调用之后获得。ta有时效性,失效之后还得重新获取。参见:https://developer.work.weixin.qq.com/document/path/91039

#需要注意的是,在Python中发送POST、GET等请求需要在前面加上requests库,
#还有就是处理字符串的时候需要使用到json库。

import requests
import json

corpid="XXXXXXXXX" #企业id值
corpsecret="XXXXXXXXXXXX" #应用secret值
 
#获取access_token
def get_access_token():
    get_act_url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}".format(corpid,corpsecret)
    act_res=requests.get(url=get_act_url).json()
    access_token=act_res["access_token"]
    return access_token

其中,corpid为企业id,可以在企业微信网页后台的“我的企业”——>“企业信息”——>“企业ID”中看到。

代码如下:
1、新建config.py文件,主要用于一些比较固定的参数的存放。比如:我要发给谁、他的部门是什么、使用哪个应用去发送等等。

access_token='XXXXXXXXXXXXXXXXXXXXXXX'
touser="XXXXXXXXXXXXXXX"# 多个用户用|隔开
toparty="1"# 多个部门用|隔开
totag="1"# 多个标签用|隔开
agentid_ceshi1=1000002# 应用id,可以在应用的设置页面查看,一个应用对应一个agentid
type_image = "image"# 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)

 2、新建access_token.py文件

import requests
import config

url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={config.cropid}&corpsecret={config.secretid}'

r = requests.get(url)
print(r.json())

 3、新建send_text.py文件

import requests
import json
import faker
from work_wechat import config # 我在work_wechat这个文件夹下面新建的文件
fk = faker.Faker()


url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={config.access_token}&random=69152"
# python的json可以编码解码
# json.loads():json格式的字符串------------>字典
# json.dumps():字典转---------------------->json格式的字符串
payload = json.dumps({
   "touser": config.touser,
   "toparty": config.toparty,
   "totag": config.totag,
   "msgtype": "text",
   "agentid": config.agentid_ceshi1,
   "text": {
      "content": "已备份成功2,请查收!"
   },
   "safe": 0,
   "enable_id_trans": 0,
   "enable_duplicate_check": 0
})
headers = {
   'User-Agent': fk.user_agent(),
   'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

 说明:
touser:是发送给谁
toparty:哪个部门
totag:标签(企业微信对员工进行管理的时候,定义的标签)
agentid:就是上边让记到小本本上的AgentId,
各个参数的含义,见:https://developer.work.weixin.qq.com/document/path/90665
4、运行send_text.py文件
然后打开手机上的企业微信(我是发个我寄几的,所以在我自己手机上就收到了)

 发送文本消息的实现

#发送文本消息
def send_text_message(message):
    send_text_url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(get_access_token())
    data={
        "touser" : "@all", #接收消息的用户
        "msgtype" : "text", #消息类型
        "agentid" : 1000002, #应用id
        "text" : {
            "content" : message #消息内容
            },
        "safe":0, #0为公开信息,1为保密信息
        }
    text_message_res=requests.post(url=send_text_url,data=json.dumps(data)).json()
    return text_message_res

示例:
send_text_message("你好,开发者") #在括号中填入你要发送的消息,一定要加上单引号或双引号,因为这是字符串
#这里是支持使用转义符的

如果返回值中的errcode为0,则代表消息发送成功。如果发送失败,可以打开返回值中的网站,网站会根据你的错误码告诉你发送失败可能的原因。

agentid为应用id,可以在应用的详情界面找到。

字典data中的“touser”指的是接收消息的用户id,填写“@all”则代表这个应用的所有用户都能收到消息。如果想给指定的用户发送消息,则需要填写用户id,通过“|”分隔。

示例:

"touser" : "xiaozhang|xiaowang|xiaoli|xiaoming"
用户id查看方法:

点击通讯录中用户右侧的三个点,选择编辑

 在编辑页面可以看到用户的账号,也就是用户id,管理员也可以修改用户id

 除了使用用户id之外,还可以通过部门id、标签两种方式进行定向推送,使用方法同上,在这里就不再赘述。

附上参数表,即字典data的内容,可以根据实际需要来进行使用。

发送图片消息的实现

在使用应用消息推送的api时候,发送图片消息需要我们提供图片的media_id值,以此来获取我们要发送的图片。发送的图片是作为临时素材的,所以我们需要先把图片作为临时素材上传,上传完成后,api会给我们返回图片对应的media_id值。

上传临时素材并获取media_id

def get_media_id(filetype,path):
    upload_file_url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type={}".format(get_access_token(),filetype)
    files = {filetype: open(path, 'rb')}
    file_upload_result = requests.post(upload_file_url, files=files).json()
    return file_upload_result["media_id"]

函数的参数中,“filetype”为文件类型,在这里我们填“image”即可(image一定要加单引号或者双引号!)。path为文件路径,填写绝对路径和相对路径都可以。函数返回值为我们需要的media_id值。

示例:
get_media_id("image","a.jpg") #相对路径
get_media_id("image","C:/users/desktop/a.jpg") #绝对路径

得到media_id后,我们就可以发送图片消息了。

#发送图片消息
def send_picture_message(media_id):
    send_picture_url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(get_access_token())
    data={
        "touser" : "@all",
        "msgtype" : "image",
        "agentid" : 1000002,
        "image" : {
            "media_id" : media_id
            },
        "safe" : 0,
        }
    picture_message_res=requests.post(url=send_picture_url,data=json.dumps(data)).json()
    return picture_message_res

示例:
send_picture_message(get_media_id("image","a.jpg"))


可能出现的错误
如果在发送消息之后出现了48002的错误代码,那么极有可能是你的通讯录没有同步api。

解决办法:

在管理工具中找到“通讯录同步”

然后编辑权限,设置为API编辑通讯录即可。
————————————————
 

使用Python发送企业微信消息 

准备工作:

    到企业微信官网,注册一个企业;登录企业微信后台,创建一个“自建”应用, 获取企业ID、agentid、secret这3个必要的参数;在企业微信的通讯录中,创建多个测试账号;在手机端安装“企业微信”APP,使用测试账号登录到企业微信,准备接收消息。

程序代码

    企业微信提供API开发接口,通过HTTPS的GET、POST方法与企业微信后台进行交互,完成获取令牌、发送数据、获取数据的操作。

    Python代码主要使用requests库,将企业微信API进行简单封装,模拟https的GET、POST操作,向指定的用户发送企业微信消息。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import requests
import json


class WeChat:
    def __init__(self):
        self.CORPID = 'ww2e1234567895498f5498f'  #企业ID,在管理后台获取
        self.CORPSECRET = 'xy11234567898hk_ecJ123456789DhKy4_1y12345OI'#自建应用的Secret,每个自建应用里都有单独的secret
        self.AGENTID = '1000002'  #应用ID,在后台应用中获取
        self.TOUSER = "maomao|dingding"  # 接收者用户名,多个用户用|分割

    def _get_access_token(self):
        url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
        values = {'corpid': self.CORPID,
                  'corpsecret': self.CORPSECRET,
                  }
        req = requests.post(url, params=values)
        data = json.loads(req.text)
        return data["access_token"]

    def get_access_token(self):
        try:
            with open('./tmp/access_token.conf', 'r') as f:
                t, access_token = f.read().split()
        except:
            with open('./tmp/access_token.conf', 'w') as f:
                access_token = self._get_access_token()
                cur_time = time.time()
                f.write('	'.join([str(cur_time), access_token]))
                return access_token
        else:
            cur_time = time.time()
            if 0 < cur_time - float(t) < 7260:
                return access_token
            else:
                with open('./tmp/access_token.conf', 'w') as f:
                    access_token = self._get_access_token()
                    f.write('	'.join([str(cur_time), access_token]))
                    return access_token

    def send_data(self, message):
        send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
        send_values = {
            "touser": self.TOUSER,
            "msgtype": "text",
            "agentid": self.AGENTID,
            "text": {
                "content": message
                },
            "safe": "0"
            }
        send_msges=(bytes(json.dumps(send_values), 'utf-8'))
        respone = requests.post(send_url, send_msges)
        respone = respone.json()   #当返回的数据是json串的时候直接用.json即可将respone转换成字典
        return respone["errmsg"]


if __name__ == '__main__':
    wx = WeChat()
    wx.send_data("这是程序发送的第1条消息!
 Python程序调用企业微信API,从自建应用“告警测试应用”发送给管理员的消息!")
    wx.send_data("这是程序发送的第2条消息!")

运行截图:

      

python实现通过企业微信发送消息

实现了通过企业微信发送消息,平时用于运维的告警还是不错的,相对于邮件来说,实时性更高,不过就是企业微信比较麻烦,此处不做过多解释。

企业微信api的详细请看:http://work.weixin.qq.com/api/doc#10167

话不多说,直接代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# @Time    : 2018/4/25 17:06
# @Author  : zms
# @Site    :
# @File    : WeChat.py
# @Software: PyCharm Community Edition

# !/usr/bin/env python
# coding:utf-8
# file wechat.py

import time
import requests
import json

import sys

reload(sys)
sys.setdefaultencoding('utf8')


class WeChat:
    def __init__(self):
        self.CORPID = '***********'
        self.CORPSECRET = '*********************************'
        self.AGENTID = '**************'
        self.TOUSER = "**********"  # 接收者用户名

    def _get_access_token(self):
        url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
        values = {'corpid': self.CORPID,
                  'corpsecret': self.CORPSECRET,
                  }
        req = requests.post(url, params=values)
        data = json.loads(req.text)
        # print data
        return data["access_token"]

    def get_access_token(self):
        try:
            with open('./tmp/access_token.conf', 'r') as f:
                t, access_token = f.read().split()
        except:
            with open('./tmp/access_token.conf', 'w') as f:
                access_token = self._get_access_token()
                cur_time = time.time()
                f.write('\t'.join([str(cur_time), access_token]))
                return access_token
        else:
            cur_time = time.time()
            if 0 < cur_time - float(t) < 7260:
                return access_token
            else:
                with open('./access_token.conf', 'w') as f:
                    access_token = self._get_access_token()
                    f.write('\t'.join([str(cur_time), access_token]))
                    return access_token

    def send_data(self, message):
        msg = message.encode('utf-8')
        send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
        send_values = {
            "touser": self.TOUSER,
            "msgtype": "text",
            "agentid": self.AGENTID,
            "text": {
                "content": msg
                },
            "safe": "0"
            }
        send_data = '{"msgtype": "text", "safe": "0", "agentid": %s, "touser": "%s", "text": {"content": "%s"}}' % (
            self.AGENTID, self.TOUSER, msg)
        r = requests.post(send_url, send_data)
        # print r.content
        return r.content


if __name__ == '__main__':
    wx = WeChat()
    wx.send_data("test")

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
import requests
import json,os


class WeChat_SMS:
    def __init__(self):
        self.CORPID = 'XXXX'#企业ID, 登陆企业微信,在我的企业-->企业信息里查看
        self.CORPSECRET = 'XXXXX'#自建应用,每个自建应用里都有单独的secret
        self.AGENTID = 'XXXX' #应用代码
        self.TOUSER = "XXX"# 接收者用户名,@all 全体成员
        self.TOPARY = "2"    #部门ID


    def _get_access_token(self):
        url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
        values = {'corpid': self.CORPID,'corpsecret': self.CORPSECRET,}
        req = requests.post(url, params=values)
        data = json.loads(req.text)
        #print (data)
        return data["access_token"]

    def get_access_token(self):
        try:
            with open('access_token.conf', 'r') as f:
                t, access_token = f.read().split()
        except:
            with open('access_token.conf', 'w') as f:
                access_token = self._get_access_token()
                cur_time = time.time()
                f.write('\t'.join([str(cur_time), access_token]))
                return access_token
        else:
            cur_time = time.time()
            if 0 < cur_time - float(t) < 7200:#token的有效时间7200s
                return access_token
            else:
                with open('access_token.conf', 'w') as f:
                    access_token = self._get_access_token()
                    f.write('\t'.join([str(cur_time), access_token]))
                    return access_token

    def send_data(self, msg):
        send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
        send_values = {
            "touser": self.TOUSER,
            #"toparty": self.TOPARY, 	#设置给部门发送
            "msgtype": "text",
            "agentid": self.AGENTID,
            "text": {
            "content": msg
            },
            "safe": "0"
        }
        send_msges=(bytes(json.dumps(send_values), 'utf-8'))
        respone = requests.post(send_url, send_msges)
        respone = respone.json()#当返回的数据是json串的时候直接用.json即可将respone转换成字典
        #print (respone["errmsg"])
        return respone["errmsg"]


if __name__ == '__main__':
    wx = WeChat_SMS()
    wx.send_data(msg="服务崩了,你还在这里吟诗作对?")
    #以下是添加对日志的监控
    # srcfile = u"G:/123.txt"
    # file = open(srcfile)
    # file.seek(0, os.SEEK_END)
    # while 1:
    #     where = file.tell()
    #     line = file.readline()
    #     if not line:
    #         time.sleep(1)
    #         file.seek(where)
    #     else:
    #         print(line)
    #         wx.send_data(msg=line)

简易教程 - 接口文档 - 企业微信开发者中心

使用Python发送企业微信消息 - 走看看

python使用微信进行消息推送_我的口袋有三十三的博客-CSDN博客_python发送微信消息

https://blog.csdn.net/qq_37939940/article/details/125630492 

猜你喜欢

转载自blog.csdn.net/qq_22473611/article/details/126652105