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 18 Python
Python最基本的输入输出详解
Apr 25 Python
python基础教程之匿名函数lambda
Jan 17 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
python2.7读取文件夹下所有文件名称及内容的方法
Feb 24 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
Python requests设置代理的方法步骤
Feb 23 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
python怎么自定义捕获错误
Jun 29 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
python字符串常规操作大全
May 02 Python
 python中的元类metaclass详情
May 30 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php的正则处理函数总结分析
2008/06/20 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
php数组查找函数总结
2014/11/18 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
javascript基础知识
2016/06/07 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
html5版canvas自由拼图实例
2014/10/15 HTML / CSS
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
总经理助理职责
2014/02/04 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
争先创优公开承诺书
2014/08/30 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis