|
@@ -15,19 +15,19 @@ class Person:
|
|
|
# 翻页初始值
|
|
|
next_t_list = [-1]
|
|
|
|
|
|
- person_x_b3_traceid = Feishu.get_range_value("person-log", "xiaoniangao", "dzcWHw", "C3:C3")[0]
|
|
|
- person_x_token_id = Feishu.get_range_value("person-log", "xiaoniangao", "dzcWHw", "C4:C4")[0]
|
|
|
- person_referer = Feishu.get_range_value("person-log", "xiaoniangao", "dzcWHw", "C5:C5")[0][0]["link"]
|
|
|
- person_uid = Feishu.get_range_value("person-log", "xiaoniangao", "dzcWHw", "C6:C6")[0]
|
|
|
- person_token = Feishu.get_range_value("person-log", "xiaoniangao", "dzcWHw", "C7:C7")[0]
|
|
|
+ person_x_b3_traceid = Feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "C3:C3")[0]
|
|
|
+ person_x_token_id = Feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "C4:C4")[0]
|
|
|
+ person_referer = Feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "C5:C5")[0][0]["link"]
|
|
|
+ person_uid = Feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "C6:C6")[0]
|
|
|
+ person_token = Feishu.get_range_value("person", "xiaoniangao", "dzcWHw", "C7:C7")[0]
|
|
|
|
|
|
# 过滤敏感词
|
|
|
@classmethod
|
|
|
- def sensitive_words(cls):
|
|
|
+ def sensitive_words(cls, log_type):
|
|
|
# 敏感词库列表
|
|
|
word_list = []
|
|
|
# 从云文档读取所有敏感词,添加到词库列表
|
|
|
- lists = Feishu.get_values_batch("person-logs", "xiaoniangao", "DRAnZh")
|
|
|
+ lists = Feishu.get_values_batch(log_type, "xiaoniangao", "DRAnZh")
|
|
|
for i in lists:
|
|
|
for j in i:
|
|
|
# 过滤空的单元格内容
|
|
@@ -52,7 +52,7 @@ class Person:
|
|
|
:return: 满足规则,返回 True;反之,返回 False
|
|
|
"""
|
|
|
# 视频时长
|
|
|
- if 600 >= int(float(d_duration)) >= 60:
|
|
|
+ if int(float(d_duration)) >= 40:
|
|
|
# 宽或高
|
|
|
if int(d_width) >= 0 or int(d_height) >= 0:
|
|
|
# 播放量
|
|
@@ -77,60 +77,60 @@ class Person:
|
|
|
|
|
|
# 获取关注用户列表
|
|
|
@classmethod
|
|
|
- def follow_person_list(cls):
|
|
|
+ def follow_person_list(cls, log_type):
|
|
|
try:
|
|
|
- if len(Feishu.get_values_batch("person-logs", "xiaoniangao", "oNpThi")) == 1:
|
|
|
- Common.person_logger().info("暂无定向爬取账号")
|
|
|
+ if len(Feishu.get_values_batch(log_type, "xiaoniangao", "oNpThi")) == 1:
|
|
|
+ Common.logger(log_type).info("暂无定向爬取账号")
|
|
|
else:
|
|
|
person_list = []
|
|
|
nick_list = []
|
|
|
- for i in range(2, len(Feishu.get_values_batch("person-logs", "xiaoniangao", "oNpThi")) + 1):
|
|
|
+ for i in range(2, len(Feishu.get_values_batch(log_type, "xiaoniangao", "oNpThi")) + 1):
|
|
|
time.sleep(0.5)
|
|
|
profile_mid = Feishu.get_range_value(
|
|
|
- "person-logs", "xiaoniangao", "oNpThi", "B" + str(i) + ":" + "B" + str(i))[0]
|
|
|
+ log_type, "xiaoniangao", "oNpThi", "B" + str(i) + ":" + "B" + str(i))[0]
|
|
|
time.sleep(0.5)
|
|
|
nick = \
|
|
|
- Feishu.get_range_value("person-logs", "xiaoniangao", "oNpThi",
|
|
|
+ Feishu.get_range_value(log_type, "xiaoniangao", "oNpThi",
|
|
|
"C" + str(i) + ":" + "C" + str(i))[0]
|
|
|
nick_list.append(nick)
|
|
|
person_list.append(profile_mid)
|
|
|
|
|
|
- Common.person_logger().info("已获取用户列表:{}", nick_list)
|
|
|
+ Common.logger(log_type).info("已获取用户列表:{}", nick_list)
|
|
|
return person_list
|
|
|
|
|
|
except Exception as e:
|
|
|
- Common.person_logger().error("获取用户列表异常:{}", e)
|
|
|
+ Common.logger(log_type).error("获取用户列表异常:{}", e)
|
|
|
|
|
|
# 获取取消关注用户列表
|
|
|
@classmethod
|
|
|
- def unfollow_person_list(cls):
|
|
|
+ def unfollow_person_list(cls, log_type):
|
|
|
try:
|
|
|
- if len(Feishu.get_values_batch("person-logs", "xiaoniangao", "tuMNhn")) == 1:
|
|
|
- Common.person_logger().info("暂无定向账号")
|
|
|
+ if len(Feishu.get_values_batch(log_type, "xiaoniangao", "tuMNhn")) == 1:
|
|
|
+ Common.logger(log_type).info("暂无定向账号")
|
|
|
else:
|
|
|
unfollow_person_list = []
|
|
|
nick_list = []
|
|
|
- for i in range(2, len(Feishu.get_values_batch("person-logs", "xiaoniangao", "tuMNhn")) + 1):
|
|
|
+ for i in range(2, len(Feishu.get_values_batch(log_type, "xiaoniangao", "tuMNhn")) + 1):
|
|
|
time.sleep(0.5)
|
|
|
profile_mid = Feishu.get_range_value(
|
|
|
- "person-logs", "xiaoniangao", "tuMNhn", "B" + str(i) + ":" + "B" + str(i))[0]
|
|
|
+ log_type, "xiaoniangao", "tuMNhn", "B" + str(i) + ":" + "B" + str(i))[0]
|
|
|
time.sleep(0.5)
|
|
|
nick = \
|
|
|
- Feishu.get_range_value("person-logs", "xiaoniangao", "tuMNhn",
|
|
|
+ Feishu.get_range_value(log_type, "xiaoniangao", "tuMNhn",
|
|
|
"C" + str(i) + ":" + "C" + str(i))[0]
|
|
|
nick_list.append(nick)
|
|
|
unfollow_person_list.append(profile_mid)
|
|
|
|
|
|
- Common.person_logger().info("取消关注用户列表:{}", nick_list)
|
|
|
+ Common.logger(log_type).info("取消关注用户列表:{}", nick_list)
|
|
|
return unfollow_person_list
|
|
|
|
|
|
except Exception as e:
|
|
|
- Common.person_logger().error("获取用户列表异常:{}", e)
|
|
|
+ Common.logger(log_type).error("获取用户列表异常:{}", e)
|
|
|
|
|
|
# 关注列表中的用户
|
|
|
@classmethod
|
|
|
- def sub_persons(cls):
|
|
|
- profile_mids = cls.follow_person_list()
|
|
|
+ def sub_persons(cls, log_type):
|
|
|
+ profile_mids = cls.follow_person_list(log_type)
|
|
|
for profile_mid in profile_mids:
|
|
|
url = "https://api.xiaoniangao.cn/V1/account/sub_user"
|
|
|
headers = {
|
|
@@ -176,18 +176,17 @@ class Person:
|
|
|
"wx_ver": "8.0.20",
|
|
|
"code_ver": "3.62.0"
|
|
|
}
|
|
|
-
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
r = requests.post(headers=headers, url=url, json=data, proxies=proxies, verify=False)
|
|
|
- Common.person_logger().info("关注用户:{},{}", profile_mid, r)
|
|
|
+ Common.logger(log_type).info("关注用户:{},{}", profile_mid, r)
|
|
|
except Exception as e:
|
|
|
- Common.person_logger().error("关注用户异常:{}", e)
|
|
|
+ Common.logger(log_type).error("关注用户异常:{}", e)
|
|
|
|
|
|
# 取消关注
|
|
|
@classmethod
|
|
|
- def unsub_persons(cls):
|
|
|
- unsub_profile_mids = cls.unfollow_person_list()
|
|
|
+ def unsub_persons(cls, log_type):
|
|
|
+ unsub_profile_mids = cls.unfollow_person_list(log_type)
|
|
|
for profile_mid in unsub_profile_mids:
|
|
|
url = "https://api.xiaoniangao.cn/V1/account/unsub_user"
|
|
|
headers = {
|
|
@@ -232,17 +231,16 @@ class Person:
|
|
|
"proj": "ma",
|
|
|
"wx_ver": "8.0.20",
|
|
|
"code_ver": "3.64.1"}
|
|
|
-
|
|
|
try:
|
|
|
urllib3.disable_warnings()
|
|
|
r = requests.post(headers=headers, url=url, json=data, proxies=proxies, verify=False)
|
|
|
- Common.person_logger().info("取消关注:{},{}", profile_mid, r)
|
|
|
+ Common.logger(log_type).info("取消关注:{},{}", profile_mid, r)
|
|
|
except Exception as e:
|
|
|
- Common.person_logger().error("取消关注异常:{}", e)
|
|
|
+ Common.logger(log_type).error("取消关注异常:{}", e)
|
|
|
|
|
|
# 从关注列表获取视频,并下载符合规则的视频,再进行上传
|
|
|
@classmethod
|
|
|
- def download_from_sub(cls, endtime):
|
|
|
+ def download_from_sub(cls, log_type, endtime):
|
|
|
url = "https://api.xiaoniangao.cn/album/get_user_trends"
|
|
|
headers = {
|
|
|
"x-b3-traceid": cls.person_x_b3_traceid,
|
|
@@ -302,18 +300,18 @@ class Person:
|
|
|
.replace(":", "").replace("*", "").replace("?", "") \
|
|
|
.replace("?", "").replace('"', "").replace("<", "") \
|
|
|
.replace(">", "").replace("|", "").replace(" ", "")
|
|
|
- Common.person_logger().info("标题:{}", video_title)
|
|
|
+
|
|
|
# 用户名
|
|
|
user_name = feeds[i]["user"]["nick"].strip().replace("\n", "") \
|
|
|
.replace("/", "").replace("快手", "").replace(" ", "") \
|
|
|
.replace(" ", "").replace("&NBSP", "").replace("\r", "")
|
|
|
- Common.person_logger().info("用户名:{}", user_name)
|
|
|
+
|
|
|
# 视频 ID
|
|
|
video_id = feeds[i]["vid"]
|
|
|
- Common.person_logger().info("视频ID:{}", video_id)
|
|
|
+
|
|
|
# 播放量
|
|
|
video_play_cnt = feeds[i]["play_pv"]
|
|
|
- Common.person_logger().info("播放量:{}", video_play_cnt)
|
|
|
+
|
|
|
# 评论数
|
|
|
video_comment_cnt = feeds[i]["comment_count"]
|
|
|
# 点赞
|
|
@@ -324,8 +322,7 @@ class Person:
|
|
|
video_duration = int(feeds[i]["du"] / 1000)
|
|
|
# 发布时间
|
|
|
video_send_time = feeds[i]["t"]
|
|
|
- Common.person_logger().info(
|
|
|
- "发布时间:{}", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(video_send_time) / 1000)))
|
|
|
+
|
|
|
# 宽和高
|
|
|
video_width = feeds[i]["w"]
|
|
|
video_height = feeds[i]["h"]
|
|
@@ -339,32 +336,39 @@ class Person:
|
|
|
cover_url = feeds[i]["url"]
|
|
|
# 视频播放地址
|
|
|
video_url = feeds[i]["v_url"]
|
|
|
- Common.person_logger().info("播放地址:{}", video_url)
|
|
|
+
|
|
|
+ Common.logger(log_type).info("标题:{}", video_title)
|
|
|
+ Common.logger(log_type).info("视频ID:{}", video_id)
|
|
|
+ Common.logger(log_type).info("用户名:{}", user_name)
|
|
|
+ Common.logger(log_type).info("播放量:{}", video_play_cnt)
|
|
|
+ Common.logger(log_type).info(
|
|
|
+ "发布时间:{}", time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(video_send_time) / 1000)))
|
|
|
+ Common.logger(log_type).info("播放地址:{}", video_url)
|
|
|
|
|
|
# 过滤无效视频
|
|
|
if video_id == "" or video_url == "" or video_send_time == "":
|
|
|
- Common.person_logger().info("无效视频")
|
|
|
+ Common.logger(log_type).info("无效视频")
|
|
|
elif int(video_send_time) < endtime:
|
|
|
- Common.person_logger().info("发布时间超过 48 小时")
|
|
|
+ Common.logger(log_type).info("发布时间超过 48 小时")
|
|
|
elif cls.download_rule(
|
|
|
video_duration, video_width, video_height, video_play_cnt,
|
|
|
video_like_cnt, video_share_cnt, video_send_time) is False:
|
|
|
- Common.person_logger().info("不满足基础门槛规则")
|
|
|
+ Common.logger(log_type).info("不满足基础门槛规则")
|
|
|
# 过滤敏感词
|
|
|
- elif any(word if word in video_title else False for word in cls.sensitive_words()) is True:
|
|
|
- Common.person_logger().info("视频已中敏感词:{}".format(video_title))
|
|
|
+ elif any(word if word in video_title else False for word in cls.sensitive_words(log_type)) is True:
|
|
|
+ Common.logger(log_type).info("视频已中敏感词:{}".format(video_title))
|
|
|
# 从 云文档 去重:https://w42nne6hzg.feishu.cn/sheets/shtcnYxiyQ1wLklo1W5Kdqc9cGh?sheet=yatRv2
|
|
|
- elif video_id in [j for i in Feishu.get_values_batch("person-logs", "xiaoniangao", "yatRv2") for j in i]:
|
|
|
- Common.person_logger().info("该视频已下载:{}", video_title)
|
|
|
+ elif video_id in [j for i in Feishu.get_values_batch(log_type, "xiaoniangao", "yatRv2") for j in i]:
|
|
|
+ Common.logger(log_type).info("该视频已下载:{}", video_title)
|
|
|
# 满足抓取规则
|
|
|
else:
|
|
|
- Common.person_logger().info("开始下载视频:{}", video_title)
|
|
|
+ Common.logger(log_type).info("开始下载视频:{}", video_title)
|
|
|
# 下载封面
|
|
|
Common.download_method(
|
|
|
- log_path="person-logs", text="cover", d_name=video_title, d_url=cover_url)
|
|
|
+ log_type=log_type, text="cover", d_name=video_title, d_url=cover_url)
|
|
|
# 下载视频
|
|
|
Common.download_method(
|
|
|
- log_path="person-logs", text="video", d_name=video_title, d_url=video_url)
|
|
|
+ log_type=log_type, text="video", d_name=video_title, d_url=video_url)
|
|
|
# 保存视频信息至 "./videos/{download_video_title}/info.txt"
|
|
|
with open(r"./videos/" + video_title
|
|
|
+ "/" + "info.txt", "a", encoding="UTF-8") as f_a:
|
|
@@ -382,32 +386,36 @@ class Person:
|
|
|
str(video_url) + "\n" +
|
|
|
str(cover_url) + "\n" +
|
|
|
str("xiaoniangao"))
|
|
|
- Common.person_logger().info("==========视频信息已保存至info.txt==========")
|
|
|
+ Common.logger(log_type).info("==========视频信息已保存至info.txt==========")
|
|
|
|
|
|
# 上传视频
|
|
|
- Common.person_logger().info("开始上传视频:{}".format(video_title))
|
|
|
- Publish.upload_and_publish("prod", "play")
|
|
|
- Common.person_logger().info("视频上传完成:{}", video_title)
|
|
|
+ Common.logger(log_type).info("开始上传视频:{}".format(video_title))
|
|
|
+ our_video_id = Publish.upload_and_publish(log_type, "prod", "play")
|
|
|
+ # Common.logger(log_type).info("our_video_id:{}", our_video_id)
|
|
|
+ our_video_link = "https://admin.piaoquantv.com/cms/post-detail/" + str(our_video_id) + "/info"
|
|
|
+ # Common.logger(log_type).info("our_video_link:{}", our_video_link)
|
|
|
+ Common.logger(log_type).info("视频上传完成:{}", video_title)
|
|
|
# 上传完成时间
|
|
|
upload_time = int(time.time())
|
|
|
|
|
|
# 保存视频信息到云文档
|
|
|
- Common.person_logger().info("添加视频到云文档:{}", video_title)
|
|
|
+ Common.logger(log_type).info("添加视频到云文档:{}", video_title)
|
|
|
# 插入空行
|
|
|
time.sleep(1)
|
|
|
- Feishu.insert_columns("person-logs", "xiaoniangao", "yatRv2", "ROWS", 1, 2)
|
|
|
+ Feishu.insert_columns(log_type, "xiaoniangao", "yatRv2", "ROWS", 1, 2)
|
|
|
# 视频信息写入云文档
|
|
|
- values = [[time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(upload_time))),
|
|
|
+ values = [[time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(upload_time))),
|
|
|
"定向账号爬取",
|
|
|
video_id,
|
|
|
video_title,
|
|
|
+ our_video_link,
|
|
|
video_play_cnt,
|
|
|
video_comment_cnt,
|
|
|
video_like_cnt,
|
|
|
video_share_cnt,
|
|
|
video_duration,
|
|
|
str(video_width) + "*" + str(video_height),
|
|
|
- time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(video_send_time) / 1000)),
|
|
|
+ time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(video_send_time) / 1000)),
|
|
|
user_name,
|
|
|
profile_id,
|
|
|
profile_mid,
|
|
@@ -415,10 +423,29 @@ class Person:
|
|
|
cover_url,
|
|
|
video_url]]
|
|
|
time.sleep(1)
|
|
|
- Feishu.update_values("person-logs", "xiaoniangao", "yatRv2", "A2:Q2", values)
|
|
|
+ Feishu.update_values(log_type, "xiaoniangao", "yatRv2", "F2:W2", values)
|
|
|
+
|
|
|
+ # 保存视频信息到监控表
|
|
|
+ Common.logger(log_type).info("添加视频到监控表:{}", video_title)
|
|
|
+ # 插入空行
|
|
|
+ time.sleep(1)
|
|
|
+ Feishu.insert_columns(log_type, "monitor", "N7e2yI", "ROWS", 1, 2)
|
|
|
+ # 视频信息写入监控表
|
|
|
+ values = [[time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(upload_time))),
|
|
|
+ video_id,
|
|
|
+ video_title,
|
|
|
+ our_video_link,
|
|
|
+ profile_id,
|
|
|
+ profile_mid,
|
|
|
+ user_name,
|
|
|
+ video_duration,
|
|
|
+ time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(int(video_send_time) / 1000)),
|
|
|
+ video_play_cnt]]
|
|
|
+ time.sleep(1)
|
|
|
+ Feishu.update_values(log_type, "monitor", "N7e2yI", "F2:O2", values)
|
|
|
return int(video_send_time)
|
|
|
except Exception as e:
|
|
|
- Common.person_logger().error("请求关注列表异常:{}", e)
|
|
|
+ Common.logger(log_type).error("下载/上传视频异常:{}", e)
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
@@ -427,4 +454,9 @@ if __name__ == "__main__":
|
|
|
# person.download_person_videos()
|
|
|
# person.sub_persons()
|
|
|
# print(person.unfollow_person_list())
|
|
|
- person.unsub_persons()
|
|
|
+ # person.unsub_persons()
|
|
|
+ print(person.person_uid)
|
|
|
+ print(person.person_token)
|
|
|
+ print(person.person_referer)
|
|
|
+ print(person.person_x_token_id)
|
|
|
+ print(person.person_x_b3_traceid)
|