123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- import json
- import requests
- class Feishu:
- # 外部服务号投流监测机器人
- outside_gzh_monitor_bot = "https://open.feishu.cn/open-apis/bot/v2/hook/0899d43d-9f65-48ce-a419-f83ac935bf59"
- # 长文 daily 报警机器人
- long_articles_bot = "https://open.feishu.cn/open-apis/bot/v2/hook/b44333f2-16c0-4cb1-af01-d135f8704410"
- # 测试环境报警机器人
- long_articles_bot_dev = "https://open.feishu.cn/open-apis/bot/v2/hook/f32c0456-847f-41f3-97db-33fcc1616bcd"
- def __init__(self):
- self.token = None
- self.headers = {"Content-Type": "application/json"}
- self.mention_all = {
- "content": "<at id=all></at>\n",
- "tag": "lark_md",
- }
- self.not_mention = {}
- def fetch_token(self):
- url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"
- post_data = {
- "app_id": "cli_a51114cf8bf8d00c",
- "app_secret": "cNoTAqMpsAm7mPBcpCAXFfvOzCNL27fe",
- }
- response = requests.request("POST", url=url, data=post_data)
- tenant_access_token = response.json()["tenant_access_token"]
- self.token = tenant_access_token
- class FeishuSheetApi(Feishu):
- def prepend_value(self, sheet_token, sheet_id, ranges, values):
- insert_value_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{}/values_prepend".format(
- sheet_token
- )
- headers = {
- "Authorization": "Bearer " + self.token,
- "contentType": "application/json; charset=utf-8",
- }
- body = {
- "valueRange": {"range": "{}!{}".format(sheet_id, ranges), "values": values}
- }
- response = requests.request(
- "POST", url=insert_value_url, headers=headers, json=body
- )
- print(response.json())
- def insert_value(self, sheet_token, sheet_id, ranges, values):
- insert_value_url = (
- "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{}/values".format(
- sheet_token
- )
- )
- headers = {
- "Authorization": "Bearer " + self.token,
- "contentType": "application/json; charset=utf-8",
- }
- body = {
- "valueRange": {"range": "{}!{}".format(sheet_id, ranges), "values": values}
- }
- response = requests.request(
- "PUT", url=insert_value_url, headers=headers, json=body
- )
- print(response.json())
- class FeishuBotApi(Feishu):
- @classmethod
- def create_feishu_columns_sheet(
- cls,
- sheet_type,
- sheet_name,
- display_name,
- width="auto",
- vertical_align="top",
- horizontal_align="left",
- number_format=None,
- ):
- match sheet_type:
- case "plain_text":
- return {
- "name": sheet_name,
- "display_name": display_name,
- "width": width,
- "data_type": "text",
- "vertical_align": vertical_align,
- "horizontal_align": horizontal_align,
- }
- case "lark_md":
- return {
- "name": sheet_name,
- "display_name": display_name,
- "data_type": "lark_md",
- }
- case "number":
- return {
- "name": sheet_name,
- "display_name": display_name,
- "data_type": "number",
- "format": number_format,
- "width": width,
- }
- case "date":
- return {
- "name": sheet_name,
- "display_name": display_name,
- "data_type": "date",
- "date_format": "YYYY/MM/DD",
- }
- case "options":
- return {
- "name": sheet_name,
- "display_name": display_name,
- "data_type": "options",
- }
- case _:
- return {
- "name": sheet_name,
- "display_name": display_name,
- "width": width,
- "data_type": "text",
- "vertical_align": vertical_align,
- "horizontal_align": horizontal_align,
- }
- # 表格形式
- def create_feishu_table(self, title, columns, rows, mention):
- table_base = {
- "header": {
- "template": "blue",
- "title": {"content": title, "tag": "plain_text"},
- },
- "elements": [
- self.mention_all if mention else self.not_mention,
- {
- "tag": "table",
- "page_size": len(rows) + 1,
- "row_height": "low",
- "header_style": {
- "text_align": "left",
- "text_size": "normal",
- "background_style": "grey",
- "text_color": "default",
- "bold": True,
- "lines": 1,
- },
- "columns": columns,
- "rows": rows,
- },
- ],
- }
- return table_base
- def create_feishu_bot_obj(self, title, mention, detail):
- """
- create feishu bot object
- """
- return {
- "elements": [
- {
- "tag": "div",
- "text": self.mention_all if mention else self.not_mention,
- },
- {
- "tag": "div",
- "text": {
- "content": json.dumps(detail, ensure_ascii=False, indent=4),
- "tag": "lark_md",
- },
- },
- ],
- "header": {"title": {"content": title, "tag": "plain_text"}},
- }
- # bot
- def bot(self, title, detail, mention=True, table=False, env="prod"):
- match env:
- case "dev":
- url = self.long_articles_bot_dev
- case "prod":
- url = self.long_articles_bot
- case "outside_gzh_monitor":
- url = self.outside_gzh_monitor_bot
- case _:
- url = self.long_articles_bot_dev
- headers = {"Content-Type": "application/json"}
- if table:
- card = self.create_feishu_table(
- title=title,
- columns=detail["columns"],
- rows=detail["rows"],
- mention=mention,
- )
- else:
- card = self.create_feishu_bot_obj(
- title=title, mention=mention, detail=detail
- )
- payload = {"msg_type": "interactive", "card": card}
- res = requests.request(
- "POST", url=url, headers=headers, data=json.dumps(payload), timeout=10
- )
- return res
|