feishu.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. """
  2. feishu python方法
  3. """
  4. import json
  5. import random
  6. import requests
  7. import datetime
  8. def get_app_token():
  9. """
  10. 获取飞书api token
  11. :return:
  12. """
  13. url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/"
  14. post_data = {
  15. "app_id": "cli_a51114cf8bf8d00c", # 这里账号密码是发布应用的后台账号及密码
  16. "app_secret": "cNoTAqMpsAm7mPBcpCAXFfvOzCNL27fe",
  17. }
  18. response = requests.request("POST", url=url, data=post_data)
  19. tenant_access_token = response.json()["tenant_access_token"]
  20. return tenant_access_token
  21. class Feishu(object):
  22. """
  23. feishu Python Object
  24. """
  25. def __init__(self):
  26. self.document_url = "https://w42nne6hzg.feishu.cn/sheets/C1Qrsa4HWh6bzEtv7aocrFlAnad"
  27. self.robot_url = "https://open.feishu.cn/open-apis/bot/v2/hook/34e2fdbc-0649-44d3-b5ce-b28b38cca1db"
  28. self.headers = {"Content-Type": "application/json"}
  29. self.document_token = "C1Qrsa4HWh6bzEtv7aocrFlAnad"
  30. def insert_columns_rows(self, sheet_id, major_dimension, start_index, end_index):
  31. """
  32. 写入飞书表格
  33. :param sheet_id: 表的id
  34. :param major_dimension:行或者列, ROWS, COLUMNS
  35. :param start_index:开始位置
  36. :param end_index:结束位置
  37. """
  38. insert_columns_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
  39. + self.document_token + "/insert_dimension_range"
  40. headers = {
  41. "Authorization": "Bearer " + get_app_token(),
  42. "Content-Type": "application/json; charset=utf-8",
  43. }
  44. body = {
  45. "dimension": {
  46. "sheetId": sheet_id,
  47. "majorDimension": major_dimension, # 默认 ROWS ,可选 ROWS、COLUMNS
  48. "startIndex": start_index, # 开始的位置
  49. "endIndex": end_index # 结束的位置
  50. },
  51. "inheritStyle": "AFTER" # BEFORE 或 AFTER,不填为不继承 style
  52. }
  53. response = requests.post(url=insert_columns_url, headers=headers, json=body, verify=False)
  54. print(json.dumps(response.json(), ensure_ascii=False, indent=4))
  55. def insert_value(self, sheet_id, ranges, values):
  56. """
  57. 在表的某一个sheet的ranges中插入数据,若该地方存在数据,会自动把已有的数据往下移动,再写如数据
  58. :param sheet_id: 飞书表的唯一ID
  59. :param ranges: 单元格位置的range, 从左上角到右下角, 两边都是闭区间
  60. :param values: 二维数组, 用于填充ranges的空格数组
  61. """
  62. insert_value_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{}/values_prepend".format(
  63. self.document_token)
  64. headers = {
  65. "Authorization": "Bearer " + get_app_token(),
  66. 'contentType': 'application/json'
  67. }
  68. body = {
  69. "valueRange": {
  70. "range": "{}!{}".format(sheet_id, ranges),
  71. "values": values
  72. }
  73. }
  74. response = requests.request("POST", url=insert_value_url, headers=headers, json=body)
  75. print(response.json())
  76. def bot(self, platform_name, flag=1):
  77. """
  78. 飞书机器人,在群里报警用
  79. :param platform_name: 小程序的名称
  80. :param flag: 通知 or 报警, 默认为1, 通知
  81. :return:
  82. """
  83. if flag == 1:
  84. payload = {
  85. "msg_type": "interactive",
  86. "card": {
  87. "elements": [
  88. {
  89. "tag": "div",
  90. "text": {
  91. "content": "**{}**\n数据自动导出完成;\n完成时间是:{}。".format(
  92. platform_name, datetime.datetime.now().__str__()
  93. ),
  94. "tag": "lark_md",
  95. },
  96. },
  97. ],
  98. "header": {"title": {"content": "We分析: 通知 ✅", "tag": "plain_text"}},
  99. },
  100. }
  101. else:
  102. payload = {
  103. "msg_type": "interactive",
  104. "card": {
  105. "elements": [
  106. {
  107. "tag": "div",
  108. "text": {
  109. "content": "**{}**\n自动导出失败 !!!".format(platform_name),
  110. "tag": "lark_md",
  111. },
  112. },
  113. ],
  114. "header": {
  115. "title": {"content": "We分析: 报警 ❌", "tag": "plain_text"}
  116. },
  117. },
  118. }
  119. w = requests.request(
  120. "POST", url=self.robot_url, headers=self.headers, data=json.dumps(payload)
  121. )
  122. print(w.json())
  123. def remind(self):
  124. """
  125. 飞书提醒机器人
  126. :return: None
  127. """
  128. payload = {
  129. "msg_type": "interactive",
  130. "card": {
  131. "elements": [
  132. {
  133. "tag": "div",
  134. "text": {
  135. "content": "扫码通知:记得要扫码导出we分析, ",
  136. "tag": "lark_md",
  137. },
  138. },
  139. ],
  140. "header": {"title": {"content": "We分析: 提醒 ⏰", "tag": "plain_text"}},
  141. },
  142. }
  143. w = requests.request(
  144. "POST", url=self.robot_url, headers=self.headers, data=json.dumps(payload)
  145. )
  146. print(w.json())
  147. if __name__ == "__main__":
  148. F = Feishu()
  149. for i in range(100):
  150. value = [[i + 1] + [random.randint(0, 100) for item in range(7)]]
  151. F.insert_value(sheet_id="gwzBOM", values=value, ranges="A2:G2")