feishuBotApi.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. """
  2. @author: luojunhui
  3. """
  4. import json
  5. import requests
  6. from applications.decoratorApi import retryOnTimeout
  7. mention_all = {
  8. "content": "<at id=all></at>\n",
  9. "tag": "lark_md",
  10. }
  11. def create_feishu_columns_sheet(sheet_type, sheet_name, display_name, width="auto",
  12. vertical_align="top", horizontal_align="left", number_format=None):
  13. """
  14. create feishu sheet
  15. :param number_format:
  16. :param horizontal_align:
  17. :param vertical_align:
  18. :param width:
  19. :param display_name:
  20. :param sheet_type:
  21. :param sheet_name:
  22. """
  23. match sheet_type:
  24. case "plain_text":
  25. return {
  26. "name": sheet_name,
  27. "display_name": display_name,
  28. "width": width,
  29. "data_type": "text",
  30. "vertical_align": vertical_align,
  31. "horizontal_align": horizontal_align
  32. }
  33. case "lark_md":
  34. return {
  35. "name": sheet_name,
  36. "display_name": display_name,
  37. "data_type": "lark_md"
  38. }
  39. case "number":
  40. return {
  41. "name": sheet_name,
  42. "display_name": display_name,
  43. "data_type": "number",
  44. "format": number_format,
  45. "width": width
  46. }
  47. case "date":
  48. return {
  49. "name": sheet_name,
  50. "display_name": display_name,
  51. "data_type": "date",
  52. "date_format": "YYYY/MM/DD"
  53. }
  54. case "options":
  55. return {
  56. "name": sheet_name,
  57. "display_name": display_name,
  58. "data_type": "options"
  59. }
  60. def create_feishu_table(title, columns, rows, mention):
  61. """
  62. create feishu table
  63. :param mention:
  64. :param title:
  65. :param columns:
  66. :param rows:
  67. """
  68. table_base = {
  69. "header": {
  70. "template": "blue",
  71. "title": {
  72. "content": title,
  73. "tag": "plain_text"
  74. }
  75. },
  76. "elements": [
  77. {
  78. "tag": "div",
  79. "text": mention_all,
  80. } if mention else {},
  81. {
  82. "tag": "table",
  83. "page_size": len(rows) + 1,
  84. "row_height": "low",
  85. "header_style": {
  86. "text_align": "left",
  87. "text_size": "normal",
  88. "background_style": "grey",
  89. "text_color": "default",
  90. "bold": True,
  91. "lines": 1
  92. },
  93. "columns": columns,
  94. "rows": rows
  95. }
  96. ]
  97. }
  98. return table_base
  99. @retryOnTimeout()
  100. def bot(title, detail, mention=True, table=False):
  101. """
  102. 报警机器人
  103. """
  104. url = "https://open.feishu.cn/open-apis/bot/v2/hook/b44333f2-16c0-4cb1-af01-d135f8704410"
  105. # url = "https://open.feishu.cn/open-apis/bot/v2/hook/f32c0456-847f-41f3-97db-33fcc1616bcd"
  106. headers = {"Content-Type": "application/json"}
  107. if table:
  108. card = create_feishu_table(
  109. title=title,
  110. columns=detail["columns"],
  111. rows=detail["rows"],
  112. mention=mention
  113. )
  114. else:
  115. card = {
  116. "elements": [
  117. {
  118. "tag": "div",
  119. "text": mention_all if mention else {},
  120. },
  121. {
  122. "tag": "div",
  123. "text": {
  124. "content": json.dumps(
  125. detail, ensure_ascii=False, indent=4
  126. ),
  127. "tag": "lark_md",
  128. },
  129. },
  130. ],
  131. "header": {"title": {"content": title, "tag": "plain_text"}},
  132. }
  133. payload = {
  134. "msg_type": "interactive",
  135. "card": card
  136. }
  137. res = requests.request("POST", url=url, headers=headers, data=json.dumps(payload), timeout=10)
  138. return res