|
@@ -2,7 +2,6 @@
|
|
|
# @Author: wangkun
|
|
|
# @Time: 2022/5/6
|
|
|
import json
|
|
|
-import time
|
|
|
|
|
|
import requests
|
|
|
import urllib3
|
|
@@ -16,12 +15,37 @@ class Feishu:
|
|
|
"""
|
|
|
编辑飞书云文档
|
|
|
"""
|
|
|
- feishu_url = "https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?"
|
|
|
- spreadsheetToken = "shtcngRPoDYAi24x52j2nDuHMih"
|
|
|
+ # 看一看爬虫数据表
|
|
|
+ kanyikan_url = "https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?"
|
|
|
+ # 快手爬虫数据表
|
|
|
+ kuaishou_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnp4SaJt37q6OOOrYzPMjQkg?"
|
|
|
+ # 微视爬虫数据表
|
|
|
+ weishi_url = "https://w42nne6hzg.feishu.cn/sheets/shtcn5YSWg91JfVGzj0SFZIRRPh?"
|
|
|
+ # 小年糕爬虫数据表
|
|
|
+ xiaoniangao_url = "https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh?"
|
|
|
+ # 数据监控表
|
|
|
+ crawler_monitor = "https://w42nne6hzg.feishu.cn/sheets/shtcnlZWYazInhf7Z60jkbLRJyd?"
|
|
|
+
|
|
|
+ # 飞书路径token
|
|
|
+ @classmethod
|
|
|
+ def spreadsheettoken(cls, crawler):
|
|
|
+ """
|
|
|
+ :param crawler: 哪个爬虫
|
|
|
+ """
|
|
|
+ if crawler == "kanyikan":
|
|
|
+ return "shtcngRPoDYAi24x52j2nDuHMih"
|
|
|
+ elif crawler == "kuaishou":
|
|
|
+ return "shtcnp4SaJt37q6OOOrYzPMjQkg"
|
|
|
+ elif crawler == "weishi":
|
|
|
+ return "shtcn5YSWg91JfVGzj0SFZIRRPh"
|
|
|
+ elif crawler == "xiaoniangao":
|
|
|
+ return "shtcnYxiyQ1wLklo1W5Kdqc9cGh"
|
|
|
+ elif crawler == "monitor":
|
|
|
+ return "shtcnlZWYazInhf7Z60jkbLRJyd"
|
|
|
|
|
|
# 获取飞书api token
|
|
|
@classmethod
|
|
|
- def get_token(cls):
|
|
|
+ def get_token(cls, log_type):
|
|
|
"""
|
|
|
获取飞书api token
|
|
|
:return:
|
|
@@ -32,23 +56,24 @@ class Feishu:
|
|
|
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- time.sleep(1)
|
|
|
response = requests.post(url=url, data=post_data, proxies=proxies, verify=False)
|
|
|
tenant_access_token = response.json()["tenant_access_token"]
|
|
|
return tenant_access_token
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("获取飞书 api token 异常:{}", e)
|
|
|
+ Common.logger(log_type).error("获取飞书 api token 异常:{}", e)
|
|
|
|
|
|
# 获取表格元数据
|
|
|
@classmethod
|
|
|
- def get_metainfo(cls):
|
|
|
+ def get_metainfo(cls, log_type, crawler):
|
|
|
"""
|
|
|
获取表格元数据
|
|
|
:return:
|
|
|
"""
|
|
|
- url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" + cls.spreadsheetToken + "/metainfo"
|
|
|
+ get_metainfo_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/metainfo"
|
|
|
+
|
|
|
headers = {
|
|
|
- "Authorization": "Bearer " + cls.get_token(),
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
}
|
|
|
params = {
|
|
@@ -57,24 +82,26 @@ class Feishu:
|
|
|
}
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- r = requests.get(url=url, headers=headers, params=params, proxies=proxies, verify=False)
|
|
|
+ r = requests.get(url=get_metainfo_url, headers=headers, params=params, proxies=proxies, verify=False)
|
|
|
response = json.loads(r.content.decode("utf8"))
|
|
|
return response
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("获取表格元数据异常:{}", e)
|
|
|
+ Common.logger(log_type).error("获取表格元数据异常:{}", e)
|
|
|
|
|
|
# 读取工作表中所有数据
|
|
|
@classmethod
|
|
|
- def get_values_batch(cls, sheetid):
|
|
|
+ def get_values_batch(cls, log_type, crawler, sheetid):
|
|
|
"""
|
|
|
读取工作表中所有数据
|
|
|
+ :param log_type: 启用哪个 log
|
|
|
+ :param crawler: 哪个爬虫
|
|
|
:param sheetid: 哪张表
|
|
|
:return: 所有数据
|
|
|
"""
|
|
|
-
|
|
|
- url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" + cls.spreadsheetToken + "/values_batch_get"
|
|
|
+ get_values_batch_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/values_batch_get"
|
|
|
headers = {
|
|
|
- "Authorization": "Bearer " + cls.get_token(),
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
}
|
|
|
params = {
|
|
@@ -85,7 +112,7 @@ class Feishu:
|
|
|
# valueRenderOption=FormattedValue 计算并格式化单元格;
|
|
|
# valueRenderOption=Formula单元格中含有公式时返回公式本身;
|
|
|
# valueRenderOption=UnformattedValue计算但不对单元格进行格式化
|
|
|
- "valueRenderOption": "FormattedValue",
|
|
|
+ "valueRenderOption": "ToString",
|
|
|
|
|
|
# dateTimeRenderOption=FormattedString 计算并将时间日期按照其格式进行格式化,但不会对数字进行格式化,返回格式化后的字符串。
|
|
|
"dateTimeRenderOption": "",
|
|
@@ -95,29 +122,29 @@ class Feishu:
|
|
|
}
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- time.sleep(0.5)
|
|
|
- r = requests.get(url=url, headers=headers, params=params, proxies=proxies, verify=False)
|
|
|
+ r = requests.get(url=get_values_batch_url, headers=headers, params=params, proxies=proxies, verify=False)
|
|
|
response = json.loads(r.content.decode("utf8"))
|
|
|
values = response["data"]["valueRanges"][0]["values"]
|
|
|
return values
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("读取工作表所有数据异常:{}", e)
|
|
|
+ Common.logger(log_type).error("读取工作表所有数据异常:{}", e)
|
|
|
|
|
|
# 工作表,插入行或列
|
|
|
@classmethod
|
|
|
- def insert_columns(cls, sheetid, majordimension, startindex, endindex):
|
|
|
+ def insert_columns(cls, log_type, crawler, sheetid, majordimension, startindex, endindex):
|
|
|
"""
|
|
|
- 工作表,插入行或列
|
|
|
- :param sheetid: 哪张表
|
|
|
- :param majordimension: 行或列,默认 ROWS ,可选 ROWS、COLUMNS
|
|
|
- :param startindex: 开始的位置
|
|
|
- :param endindex: 结束的位置
|
|
|
- :return:插入首行
|
|
|
+ 工作表插入行或列
|
|
|
+ :param log_type: 日志路径
|
|
|
+ :param crawler: 哪个爬虫的云文档
|
|
|
+ :param sheetid:哪张工作表
|
|
|
+ :param majordimension:行或者列
|
|
|
+ :param startindex:开始位置
|
|
|
+ :param endindex:结束位置
|
|
|
"""
|
|
|
- url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/"\
|
|
|
- + cls.spreadsheetToken + "/insert_dimension_range"
|
|
|
+ insert_columns_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/insert_dimension_range"
|
|
|
headers = {
|
|
|
- "Authorization": "Bearer " + cls.get_token(),
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
}
|
|
|
body = {
|
|
@@ -131,26 +158,26 @@ class Feishu:
|
|
|
}
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- time.sleep(0.5)
|
|
|
- r = requests.post(url=url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
- Common.logger().info("插入空行或列:{}", r.json()["msg"])
|
|
|
+ r = requests.post(url=insert_columns_url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
+ Common.logger(log_type).info("插入行或列:{}", r.json()["msg"])
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("插入空行或列异常:{}", e)
|
|
|
+ Common.logger(log_type).error("插入行或列异常:{}", e)
|
|
|
|
|
|
- # 工作表,写入数据
|
|
|
+ # 写入数据
|
|
|
@classmethod
|
|
|
- def update_values(cls, sheetid, ranges, values):
|
|
|
+ def update_values(cls, log_type, crawler, sheetid, ranges, values):
|
|
|
"""
|
|
|
写入数据
|
|
|
- :param sheetid: 哪张工作表
|
|
|
- :param ranges: 单元格范围
|
|
|
- :param values: 更新值
|
|
|
- :return:
|
|
|
+ :param log_type: 日志路径
|
|
|
+ :param crawler: 哪个爬虫的云文档
|
|
|
+ :param sheetid:哪张工作表
|
|
|
+ :param ranges:单元格范围
|
|
|
+ :param values:写入的具体数据,list
|
|
|
"""
|
|
|
-
|
|
|
- url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" + cls.spreadsheetToken + "/values_batch_update"
|
|
|
+ update_values_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/values_batch_update"
|
|
|
headers = {
|
|
|
- "Authorization": "Bearer " + cls.get_token(),
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
}
|
|
|
body = {
|
|
@@ -161,33 +188,65 @@ class Feishu:
|
|
|
},
|
|
|
],
|
|
|
}
|
|
|
+
|
|
|
+ try:
|
|
|
+ urllib3.disable_warnings()
|
|
|
+ r = requests.post(url=update_values_url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
+ Common.logger(log_type).info("写入数据:{}", r.json()["msg"])
|
|
|
+ except Exception as e:
|
|
|
+ Common.logger(log_type).error("写入数据异常:{}", e)
|
|
|
+
|
|
|
+ # 合并单元格
|
|
|
+ @classmethod
|
|
|
+ def merge_cells(cls, log_type, crawler, sheetid, ranges):
|
|
|
+ """
|
|
|
+ 合并单元格
|
|
|
+ :param log_type: 日志路径
|
|
|
+ :param crawler: 哪个爬虫
|
|
|
+ :param sheetid:哪张工作表
|
|
|
+ :param ranges:需要合并的单元格范围
|
|
|
+ """
|
|
|
+ merge_cells_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/merge_cells"
|
|
|
+ headers = {
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
+ "Content-Type": "application/json; charset=utf-8"
|
|
|
+ }
|
|
|
+
|
|
|
+ body = {
|
|
|
+ "range": sheetid + "!" + ranges,
|
|
|
+ "mergeType": "MERGE_ROWS"
|
|
|
+ }
|
|
|
+
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- r = requests.post(url=url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
- Common.logger().info("写入数据:{}", r.json()["msg"])
|
|
|
+ r = requests.post(url=merge_cells_url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
+ Common.logger(log_type).info("合并单元格:{}", r.json()["msg"])
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("写入数据异常:{}", e)
|
|
|
+ Common.logger(log_type).error("合并单元格异常:{}", e)
|
|
|
|
|
|
# 读取单元格数据
|
|
|
@classmethod
|
|
|
- def get_range_value(cls, sheetid, cell):
|
|
|
+ def get_range_value(cls, log_type, crawler, sheetid, cell):
|
|
|
"""
|
|
|
读取单元格内容
|
|
|
+ :param log_type: 日志路径
|
|
|
+ :param crawler: 哪个爬虫
|
|
|
:param sheetid: 哪张工作表
|
|
|
:param cell: 哪个单元格
|
|
|
:return: 单元格内容
|
|
|
"""
|
|
|
- url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
- + cls.spreadsheetToken + "/values/" + sheetid + "!" + cell
|
|
|
+ get_range_value_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/values/" + sheetid + "!" + cell
|
|
|
headers = {
|
|
|
- "Authorization": "Bearer " + cls.get_token(),
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
}
|
|
|
params = {
|
|
|
# valueRenderOption=ToString 可返回纯文本的值(数值类型除外);
|
|
|
# valueRenderOption=FormattedValue 计算并格式化单元格;
|
|
|
- # valueRenderOption=Formula单元格中含有公式时返回公式本身;
|
|
|
- # valueRenderOption=UnformattedValue计算但不对单元格进行格式化。
|
|
|
+ # valueRenderOption=Formula 单元格中含有公式时返回公式本身;
|
|
|
+ # valueRenderOption=UnformattedValue 计算但不对单元格进行格式化。
|
|
|
"valueRenderOption": "FormattedValue",
|
|
|
|
|
|
# dateTimeRenderOption=FormattedString 计算并对时间日期按照其格式进行格式化,但不会对数字进行格式化,返回格式化后的字符串。
|
|
@@ -198,26 +257,28 @@ class Feishu:
|
|
|
}
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- time.sleep(0.5)
|
|
|
- r = requests.get(url=url, headers=headers, params=params, proxies=proxies, verify=False)
|
|
|
+ r = requests.get(url=get_range_value_url, headers=headers, params=params, proxies=proxies, verify=False)
|
|
|
return r.json()["data"]["valueRange"]["values"][0]
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("读取单元格数据异常:{}", e)
|
|
|
+ Common.logger(log_type).error("读取单元格数据异常:{}", e)
|
|
|
|
|
|
# 删除行或列,可选 ROWS、COLUMNS
|
|
|
@classmethod
|
|
|
- def dimension_range(cls, sheetid, major_dimension, startindex, endindex):
|
|
|
+ def dimension_range(cls, log_type, crawler, sheetid, major_dimension, startindex, endindex):
|
|
|
"""
|
|
|
删除行或列
|
|
|
+ :param log_type: 日志路径
|
|
|
+ :param crawler: 哪个爬虫
|
|
|
:param sheetid:工作表
|
|
|
:param major_dimension:默认 ROWS ,可选 ROWS、COLUMNS
|
|
|
:param startindex:开始的位置
|
|
|
:param endindex:结束的位置
|
|
|
:return:
|
|
|
"""
|
|
|
- url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" + cls.spreadsheetToken + "/dimension_range"
|
|
|
+ dimension_range_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/" \
|
|
|
+ + cls.spreadsheettoken(crawler) + "/dimension_range"
|
|
|
headers = {
|
|
|
- "Authorization": "Bearer " + cls.get_token(),
|
|
|
+ "Authorization": "Bearer " + cls.get_token(log_type),
|
|
|
"Content-Type": "application/json; charset=utf-8"
|
|
|
}
|
|
|
body = {
|
|
@@ -230,31 +291,19 @@ class Feishu:
|
|
|
}
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
- r = requests.delete(url=url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
- Common.logger().info("删除视频数据:{}", r.json()["msg"])
|
|
|
+ r = requests.delete(url=dimension_range_url, headers=headers, json=body, proxies=proxies, verify=False)
|
|
|
+ Common.logger(log_type).info("删除视频数据:{}", r.json()["msg"])
|
|
|
except Exception as e:
|
|
|
- Common.logger().error("删除视频数据异常:{}", e)
|
|
|
+ Common.logger(log_type).error("删除视频数据异常:{}", e)
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
feishu = Feishu()
|
|
|
|
|
|
- # 获取飞书api token
|
|
|
- # print(feishu.get_token())
|
|
|
- # # 获取表格元数据
|
|
|
- # feishu.get_metainfo()
|
|
|
-
|
|
|
- # 读取工作表中所有数据
|
|
|
- # print(feishu.get_values_batch("Zt2PGQ")[1][3])
|
|
|
- # print(len(feishu.get_values_batch("SdCHOM")))
|
|
|
-
|
|
|
- # # 看一看+工作表,插入首行
|
|
|
- # print(feishu.insert_columns("Y8N3Vl"))
|
|
|
-
|
|
|
- # # 查询单元格内容
|
|
|
- # print(feishu.get_range_value("Y8N3Vl", "B8:C8"))
|
|
|
- #
|
|
|
- # # 删除行或列,可选 ROWS、COLUMNS
|
|
|
- # feishu.dimension_range("Y8N3Vl", "ROWS")
|
|
|
+ print(feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "B3:B3")[0])
|
|
|
+ print(feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "B4:B4")[0])
|
|
|
+ print(feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "C5:C5")[0][0]["link"])
|
|
|
+ print(feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "B6:B6")[0])
|
|
|
+ print(feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "B7:B7")[0])
|
|
|
|
|
|
pass
|