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


Posted in Python onNovember 10, 2020

一、创建飞书机器人  

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

二、调用飞书发送消息

自定义机器人添加完成后,就能向其 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]中排名不一致")

以上就是Python调用飞书发送消息的示例的详细内容,更多关于python 飞书发送信息的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python深入学习之对象的属性
Aug 31 Python
python九九乘法表的实例
Sep 26 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
提升Python程序性能的7个习惯
Apr 14 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
python打造爬虫代理池过程解析
Aug 15 Python
Python while循环使用else语句代码实例
Feb 07 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
python中常见错误及解决方法
Jun 21 Python
Python加载数据的5种不同方式(收藏)
Nov 13 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
Dec 16 Python
python实现简单的三子棋游戏
Apr 28 Python
python中pyplot基础图标函数整理
Nov 10 #Python
python图片合成的示例
Nov 09 #Python
python 实现&quot;神经衰弱&quot;翻牌游戏
Nov 09 #Python
Python字典dict常用方法函数实例
Nov 09 #Python
Python实现哲学家就餐问题实例代码
Nov 09 #Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 #Python
Python暴力破解Mysql数据的示例
Nov 09 #Python
You might like
php正则
2006/07/07 PHP
PHP得到mssql的存储过程的输出参数功能实现
2012/11/23 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
ext 同步和异步示例代码
2009/09/18 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
node.js中的events.emitter.once方法使用说明
2014/12/10 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
python概率计算器实例分析
2015/03/25 Python
Python中List.index()方法的使用教程
2015/05/20 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python 字符串格式化的示例
2020/09/21 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
MYSQL基础面试题
2012/05/13 面试题
2015年人事工作总结范文
2015/04/09 职场文书
办公室管理规章制度
2015/08/04 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python