Python呼叫飛書傳送訊息

江楓對愁眠發表於2020-11-09

一、建立飛書機器人  

  自定義飛書機器人操作步驟,具體詳見飛書官方文件:《機器人 | 如何在群聊中使用機器人?

二、呼叫飛書傳送訊息

  自定義機器人新增完成後,就能向其 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]中排名不一致")

 

 

相關文章