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对比C语言的编程思想差异
Aug 30 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
Python中的浮点数原理与运算分析
Oct 12 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
Python做智能家居温湿度报警系统
Sep 25 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
python原类、类的创建过程与方法详解
Jul 19 Python
Django logging配置及使用详解
Jul 23 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
Oct 23 Python
关于Keras Dense层整理
May 21 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使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php 数组元素快速去重
2017/05/05 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
js获取变量
2006/08/24 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
javascript回到顶部特效
2016/07/30 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
Vue2.x中的父组件传递数据至子组件的方法
2017/05/01 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
详解C++编程中一元运算符的重载
2016/01/19 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python数据集切分实例
2018/12/08 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
python实现三次样条插值
2018/12/17 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
2020/04/07 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
美国女性运动零售品牌:Lady Foot Locker
2017/05/12 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
八年级历史教学反思
2014/01/10 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
红楼梦读书笔记
2015/06/25 职场文书
党员公开承诺书2016
2016/03/24 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
MySQL下载安装配置详细教程 附下载资源
2022/09/23 MySQL