Python调用飞书发送消息
阅读原文时间:2022年04月16日阅读:1

使用飞书机器人发送消息,本质是使用Python的requests类库发送http请求,请求地址即为创建机器时保存的webhook链接,发送的内容实际为json串,请求header为{'Content-Type': 'application/json; charset=utf-8'}

  自定义飞书机器人操作步骤,具体详见飞书官方文档:《机器人 | 如何在群聊中使用机器人?

  自定义机器人添加完成后,就能向其 webhook 地址发送 POST 请求,从而在群聊中推送消息了。支持推送的消息格式有文本、富文本、图片消息,也可以分享群名片等。

  参数msg_type代表消息类型,可传入:text(文本)/ post(富文本)/ image(图片)/ share_chat(分享群名片)/ interactive(消息卡片),可参照飞书接口文档:https://open.feishu.cn/document/ukTMukTMukTM/uUjNz4SN2MjL1YzM

发送文本消息

  请求的消息体示例:

{
"open_id":"ou_5ad573a6411d72b8305fda3a9c15c70e",
"root_id":"om_40eb06e7b84dc71c03e009ad3c754195",
"chat_id":"oc_5ad11d72b830411d72b836c20",
"user_id": "92e39a99",
"email":"fanlv@gmail.com",
"msg_type":"text",
"content":{
"text":"text contenttest"
}
}

Curl 请求 Demo

curl -X POST \
https://open.feishu.cn/open-apis/message/v4/send/ \
-H 'Authorization: Bearer t-fee42159a366c575f2cd2b2acde2ed1e94c89d5f' \
-H 'Content-Type: application/json' \
-d '{
"chat_id": "oc_f5b1a7eb27ae2c7b6adc2a74faf339ff",
"msg_type": "text",
"content": {
"text": "text contenttest"
}
}'

使用Python封装飞书请求

接下来我们以发送文本格式消息类型,进行以下封装,上代码:

# -*- coding:utf-8 -*-
'''
@File : feiShuTalk.py
@Time : 2020/11/9 11:45
@Author : DY
@Version : V1.0.0
@Desciption:
'''

import requests
import json
import logging
import time
import urllib
import urllib3
urllib3.disable_warnings()

try:
JSONDecodeError = json.decoder.JSONDecodeError
except AttributeError:
JSONDecodeError = ValueError

def is_not_null_and_blank_str(content):
"""
非空字符串
:param content: 字符串
:return: 非空 - True,空 - False
"""
if content and content.strip():
return True
else:
return False

class FeiShutalkChatbot(object):

def \_\_init\_\_(self, webhook, secret=None, pc\_slide=False, fail\_notice=False):  
    '''  
    机器人初始化  
    :param webhook: 飞书群自定义机器人webhook地址  
    :param secret:  机器人安全设置页面勾选“加签”时需要传入的密钥  
    :param pc\_slide:  消息链接打开方式,默认False为浏览器打开,设置为True时为PC端侧边栏打开  
    :param fail\_notice:  消息发送失败提醒,默认为False不提醒,开发者可以根据返回的消息发送结果自行判断和处理  
    '''  
    super(FeiShutalkChatbot, self).\_\_init\_\_()  
    self.headers = {'Content-Type': 'application/json; charset=utf-8'}  
    self.webhook = webhook  
    self.secret = secret  
    self.pc\_slide = pc\_slide  
    self.fail\_notice = fail\_notice

def send\_text(self, msg, open\_id=\[\]):  
    """  
    消息类型为text类型  
    :param msg: 消息内容  
    :return: 返回消息发送结果  
    """  
    data = {"msg\_type": "text", "at": {}}  
    if is\_not\_null\_and\_blank\_str(msg):    # 传入msg非空  
        data\["content"\] = {"text": msg}  
    else:  
        logging.error("text类型,消息内容不能为空!")  
        raise ValueError("text类型,消息内容不能为空!")

    logging.debug('text类型:%s' % data)  
    return self.post(data)

def post(self, data):  
    """  
    发送消息(内容UTF-8编码)  
    :param data: 消息数据(字典)  
    :return: 返回消息发送结果  
    """  
    try:  
        post\_data = json.dumps(data)  
        response = requests.post(self.webhook, headers=self.headers, data=post\_data, verify=False)  
    except requests.exceptions.HTTPError as exc:  
        logging.error("消息发送失败, HTTP error: %d, reason: %s" % (exc.response.status\_code, exc.response.reason))  
        raise  
    except requests.exceptions.ConnectionError:  
        logging.error("消息发送失败,HTTP connection error!")  
        raise  
    except requests.exceptions.Timeout:  
        logging.error("消息发送失败,Timeout error!")  
        raise  
    except requests.exceptions.RequestException:  
        logging.error("消息发送失败, Request Exception!")  
        raise  
    else:  
        try:  
            result = response.json()  
        except JSONDecodeError:  
            logging.error("服务器响应异常,状态码:%s,响应内容:%s" % (response.status\_code, response.text))  
            return {'errcode': 500, 'errmsg': '服务器响应异常'}  
        else:  
            logging.debug('发送结果:%s' % result)  
            # 消息发送失败提醒(errcode 不为 0,表示消息发送异常),默认不提醒,开发者可以根据返回的消息发送结果自行判断和处理  
            if self.fail\_notice and result.get('errcode', True):  
                time\_now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))  
                error\_data = {  
                    "msgtype": "text",  
                    "text": {  
                        "content": "\[注意-自动通知\]飞书机器人消息发送失败,时间:%s,原因:%s,请及时跟进,谢谢!" % (  
                            time\_now, result\['errmsg'\] if result.get('errmsg', False) else '未知异常')  
                    },  
                    "at": {  
                        "isAtAll": False  
                    }  
                }  
                logging.error("消息发送失败,自动通知:%s" % error\_data)  
                requests.post(self.webhook, headers=self.headers, data=json.dumps(error\_data))  
            return result

  封装后我们就可以直接调用封装的类,进行消息代码发送;webhook即是创建机器人时生成的webhook链接,执行以下代码后,就可以使用飞书发送消息咯~

webhook = "https://open.feishu.cn/XXXXXXX"  
feishu = FeiShutalkChatbot(webhook)  
feishu.send\_text("重庆百货-新世纪鱼胡路店内商品'1000800370-牛心白 约1kg'在商详\[8\]和榜单\[7\]中排名不一致")