feishu.py 5.9 KB

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