Python通過飛書機器人傳送訊息到群
阿新 • • 發佈:2021-01-07
一、建立飛書機器人
自定義飛書機器人操作步驟,具體詳見飛書官方文件:《機器人 | 如何在群聊中使用機器人?》
二、呼叫飛書傳送訊息
自定義機器人新增完成後,就能向其 webhook 地址傳送 POST 請求,從而在群聊中推送訊息了。支援推送的訊息格式有文字、富文字、圖片訊息,也可以分享群名片等。
引數msg_type代表訊息型別,可傳入:text(文字)/post(富文字)/image(圖片)/share_chat(分享群名片)/interactive(訊息卡片),可參照飛書介面文件:https://open.feishu.cn/document/ukTMukTMukTM/uUjNz4SN2MjL1YzM
傳送文字訊息
使用Python封裝飛書請求
接下來我們以傳送文字格式訊息型別,進行以下封裝,上程式碼:
#!/usr/bin/env python # -*- coding: utf-8 -* 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 if __name__ == '__main__': webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/bd86c59"#注意儲存webhook不要洩露 feishu = FeiShutalkChatbot(webhook) feishu.send_text("鵬哥!" "我們是大藍遊戲的搬運工")