Python调用飞书发送消息的示例

作者:江枫对愁眠 时间:2022-10-20 14:21:23 

一、创建飞书机器人

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

二、调用飞书发送消息

自定义机器人添加完成后,就能向其 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 content<at user_id=\"ou_88a56e7e8e9f680b682f6905cc09098e\">test</at>"
}
}

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 content<at user_id=\"ou_88a56e7e8e9f680b682f6905cc09098e\">test</at>"
 }
}'

使用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 = "https://open.feishu.cn/open-apis/bot/v2/hook/1d7b5d0c-03a5-44a9-8d7a-4d09b24bfea1"
 feishu = FeiShutalkChatbot(webhook)
 feishu.send_text("重庆百货-新世纪鱼胡路店内商品'1000800370-牛心白 约1kg'在商详[8]和榜单[7]中排名不一致")

来源:https://www.cnblogs.com/dy99/p/13950641.html

标签:python,飞书,发送消息
0
投稿

猜你喜欢

  • 解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题

    2024-04-27 16:17:33
  • python实现自动更换ip的方法

    2023-06-16 21:43:06
  • 关于vue父组件调用子组件的方法

    2024-04-09 10:47:43
  • 关于HTML5的data-*自定义属性的总结

    2024-04-19 10:17:50
  • Python中生成器和迭代器的区别详解

    2022-12-04 02:32:08
  • Python数据类型详解(二)列表

    2021-10-26 08:47:11
  • python3列表删除大量重复元素remove()方法的问题详解

    2021-02-02 19:26:03
  • Python 动态绑定属性和方法 

    2021-03-02 21:25:34
  • JavaScript通过改变文字透明度实现的文字闪烁效果实例

    2024-04-16 09:13:28
  • Yii2框架整合Xunsearch搜索引擎的方法

    2024-06-05 09:37:48
  • python 列表降维的实例讲解

    2023-08-28 16:44:54
  • 利用Python实现Picgo图床工具

    2023-10-09 16:10:45
  • Python实现快速傅里叶变换的方法(FFT)

    2022-09-18 07:21:47
  • python使用建议与技巧分享(一)

    2023-07-25 05:45:52
  • MySQL GRANT用户授权的实现

    2024-01-19 16:56:12
  • Python基础之模块相关知识总结

    2021-09-06 21:39:39
  • tesseract-ocr使用以及训练方法

    2022-07-06 17:23:37
  • 详解MySql自连接,外连接,内连接 ,左连接,右连接

    2024-01-25 05:40:52
  • 分享javascript、jquery实用代码段

    2024-04-17 10:02:54
  • Python监听剪切板实现方法代码实例

    2023-11-10 13:48:32
  • asp之家 网络编程 m.aspxhome.com