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 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
Python合并两个字典的常用方法与效率比较
Jun 17 Python
Python中functools模块函数解析
Mar 12 Python
Python 异常处理的实例详解
Sep 11 Python
python实现学生管理系统
Jan 11 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
python实现图片中文字分割效果
Jul 22 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 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音乐采集(部分代码)
2007/02/14 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
jQuery遍历Form示例代码
2013/09/03 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
python概率计算器实例分析
2015/03/25 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
python中ASCII码和字符的转换方法
2018/07/09 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
python调用其他文件函数或类的示例
2019/07/16 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
2020/01/05 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
2012/05/10 HTML / CSS
党校学习思想汇报
2014/01/06 职场文书
工厂搬迁方案
2014/05/11 职场文书
环保倡议书格式范文
2014/05/14 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
2014学习十八届四中全会精神思想汇报范文
2014/10/23 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
python爬取某网站原图作为壁纸
2021/06/02 Python