download_up.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2022/4/18
  4. """
  5. 下载并上传:上升榜视频
  6. 规则:
  7. 1.满足基本规则
  8. 2.每隔一小时,检查视频播放量,>=1000,则下载及上传
  9. 3.超过 2 小时,则删除该视频信息
  10. """
  11. import json
  12. import os
  13. import sys
  14. import time
  15. import requests
  16. import urllib3
  17. sys.path.append(os.getcwd())
  18. from main.common import Common
  19. from main.get_feeds import get_feeds
  20. from main.publish import Publish
  21. from main.feishu_lib import Feishu
  22. proxies = {"http": None, "https": None}
  23. class DownloadUp:
  24. @staticmethod
  25. def up_rule(up_width, up_height, up_duration, up_play_cnt):
  26. """
  27. 1.分辨率,宽或者高 >= 720 or ==0
  28. 2.600s >= 时长 >= 60s
  29. 3.视频播放量 >= 0
  30. """
  31. if int(up_width) >= 720 or int(up_height) >= 720 or str(up_width) == "0" or str(up_height) == "0":
  32. if 600 >= int(up_duration) >= 60:
  33. if int(up_play_cnt) >= 0:
  34. return True
  35. else:
  36. return False
  37. else:
  38. return False
  39. else:
  40. return False
  41. @classmethod
  42. def download_up_video(cls, env):
  43. """
  44. 1.从 kanyikan_feeds.txt 中获取 videoid
  45. 2.根据 videoid,从 videoinfo 接口,获取当前视频最新的信息
  46. 3.根据下载规则判断,符合规则进行下载:
  47. 1 更新视频 ID 到 https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=20ce0c
  48. 2 视频信息写入文件 "./videos/{d_title}/info.txt"
  49. 4.上传完成:
  50. 1 删除该视频在 https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM 中的信息
  51. """
  52. try:
  53. for i in range(1, len(Feishu.get_values_batch("SdCHOM"))+1):
  54. time.sleep(1)
  55. video_info_session = Common.get_session()
  56. download_time = Feishu.get_values_batch("SdCHOM")[i][0] # 第一次获取该视频的时间
  57. download_time = int(time.mktime(time.strptime(download_time, "%Y/%m/%d %H:%M:%S")))
  58. download_video_id = Feishu.get_values_batch("SdCHOM")[i][2] # 外网视频 ID
  59. download_video_title = Feishu.get_values_batch("SdCHOM")[i][3] # 视频标题
  60. download_video_play_cnt = Feishu.get_values_batch("SdCHOM")[i][4] # 播放量
  61. url = "https://search.weixin.qq.com/cgi-bin/recwxa/recwxagetonevideoinfo?"
  62. param = {
  63. "session": video_info_session,
  64. "vid": download_video_id,
  65. "wxaVersion": "3.9.2",
  66. "channelid": "208201",
  67. "scene": "32",
  68. "subscene": "1089",
  69. "model": "iPhone 11<iPhone12,1>14.7.1",
  70. "clientVersion": "8.0.18",
  71. "sharesearchid": "447665862521758270",
  72. "sharesource": "-1"
  73. }
  74. urllib3.disable_warnings()
  75. r = requests.get(url=url, params=param, proxies=proxies, verify=False)
  76. response = json.loads(r.content.decode("utf8"))
  77. if "data" not in response:
  78. Common.logger().error("获取视频info时错误,删除该视频:{}", download_video_title)
  79. # 删除行或列,可选 ROWS、COLUMNS
  80. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  81. else:
  82. data = response["data"]
  83. v_duration = data["duration"]
  84. v_play_cnt_up = data["played_cnt"]
  85. v_comment_cnt = data["comment_cnt"]
  86. v_liked_cnt = data["liked_cnt"]
  87. v_shared_cnt = data["shared_cnt"]
  88. v_width = data["width"]
  89. v_height = data["height"]
  90. v_resolution = str(v_width) + "*" + str(v_height)
  91. v_send_date = data["upload_time"]
  92. v_username = data["user_info"]["nickname"].strip().replace("\n", "")
  93. v_user_id = data["openid"]
  94. v_user_cover = data["user_info"]["headimg_url"]
  95. v_video_cover = data["cover_url"]
  96. if "items" not in data["play_info"]:
  97. if len(data["play_info"]) > 2:
  98. download_url_up = data["play_info"][2]["play_url"]
  99. else:
  100. download_url_up = data["play_info"][0]["play_url"]
  101. else:
  102. if len(data["play_info"]["items"]) > 2:
  103. download_url_up = data["play_info"]["items"][2]["play_url"]
  104. else:
  105. download_url_up = data["play_info"]["items"][0]["play_url"]
  106. Common.logger().info("正在判断第{}行,视频:{}", i, download_video_title)
  107. # 判断无效视频
  108. if download_video_id == "" \
  109. or download_video_id is None\
  110. and download_video_title == ""\
  111. or download_video_title is None\
  112. and v_duration == "" \
  113. and v_play_cnt_up == ""\
  114. and v_send_date == ""\
  115. and v_user_cover == "" \
  116. and v_video_cover == ""\
  117. and download_url_up == "":
  118. Common.logger().info("无效视频,删除该视频信息:{}", download_video_title)
  119. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  120. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  121. cls.download_up_video("prod")
  122. # 上升榜时长不足 1 小时
  123. elif int(time.time()) - int(download_time) < 3600:
  124. Common.logger().info("距上次获取该视频时间:{}分钟;{}",
  125. int((int(int(time.time()) - int(download_time))) / 60),
  126. download_video_title)
  127. # 上升榜时长超过 2 小时
  128. elif int(time.time()) - int(download_time) > 7200:
  129. Common.logger().info("距上次获取该视频时间:""{}分钟。超过2小时,删除该视频;标题:{}",
  130. int((int(time.time()) - int(download_time)) / 60),
  131. download_video_title)
  132. # 删除行或列,可选 ROWS、COLUMNS
  133. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  134. cls.download_up_video("prod")
  135. # 上升榜下载规则
  136. elif cls.up_rule(v_width, v_height, v_duration, v_play_cnt_up) is False:
  137. Common.logger().info("不满足上升榜下载规则,删除视频:{}", download_video_title)
  138. # 删除行或列,可选 ROWS、COLUMNS
  139. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  140. cls.download_up_video("prod")
  141. # 从已下载视频表中去重:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=20ce0c
  142. elif download_video_id in [j for m in Feishu.get_values_batch("20ce0c") for j in m]:
  143. Common.logger().info("视频已下载,删除该视频信息:{}", download_video_title)
  144. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  145. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  146. cls.download_up_video("prod")
  147. # 上升榜时长在 1-2 小时内,播放量增长>=1000
  148. elif (7200 >= int(time.time()) - int(download_time) >= 3600)\
  149. and (int(v_play_cnt_up) - int(download_video_play_cnt) >= 1000):
  150. Common.logger().info(
  151. "视频:{},在上升榜时间内的播放量{}>=1000,开始下载视频",
  152. download_video_title, int(v_play_cnt_up) - int(download_video_play_cnt))
  153. # 下载封面
  154. Common.download_method("cover", download_video_title, v_video_cover)
  155. # 下载视频
  156. Common.download_method("video", download_video_title, download_url_up)
  157. # 保存视频信息到 "./files/{视频标题}/videoinfo.txt"
  158. with open(r"./videos/" + download_video_title
  159. + "/" + "info.txt", "a", encoding="utf8") as f_a2:
  160. f_a2.write(str(download_video_id) + "\n" +
  161. str(download_video_title) + "\n" +
  162. str(v_duration) + "\n" +
  163. str(v_play_cnt_up) + "\n" +
  164. str(v_comment_cnt) + "\n" +
  165. str(v_liked_cnt) + "\n" +
  166. str(v_shared_cnt) + "\n" +
  167. str(v_resolution) + "\n" +
  168. str(v_send_date) + "\n" +
  169. str(v_username) + "\n" +
  170. str(v_user_cover) + "\n" +
  171. str(download_url_up) + "\n" +
  172. str(v_video_cover) + "\n" +
  173. str(video_info_session))
  174. Common.logger().info("==========视频信息已保存至info.txt==========")
  175. # 上传该视频
  176. Common.logger().info("开始上传视频:{}", download_video_title)
  177. Publish.upload_and_publish(env, "up")
  178. # 保存视频 ID 到云文档:
  179. # https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=20ce0c
  180. Common.logger().info("保存视频ID至云文档:{}", download_video_title)
  181. # 看一看+ ,视频ID工作表,插入首行
  182. Feishu.insert_columns("20ce0c", "ROWS", 1, 2)
  183. # 看一看+ ,视频ID工作表,首行写入数据
  184. upload_time = int(time.time())
  185. values = [[time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(upload_time)),
  186. "上升榜",
  187. str(download_video_id),
  188. str(download_video_title),
  189. v_play_cnt_up,
  190. v_comment_cnt,
  191. v_liked_cnt,
  192. v_shared_cnt,
  193. v_duration,
  194. v_resolution,
  195. time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(v_send_date)),
  196. str(v_username),
  197. str(v_user_id),
  198. str(v_user_cover),
  199. str(v_video_cover),
  200. str(download_url_up)]]
  201. time.sleep(1)
  202. Feishu.update_values("20ce0c", "A2:Q2", values)
  203. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  204. Common.logger().info("从云文档删除该视频信息:{}", download_video_title)
  205. # 删除行或列,可选 ROWS、COLUMNS
  206. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  207. cls.download_up_video("prod")
  208. # 上升榜时长在 1-2 小时内,播放量增长<1000
  209. elif (7200 >= int(time.time()) - int(download_time) >= 3600)\
  210. and (int(v_play_cnt_up) - int(download_video_play_cnt) < 1000):
  211. # 删除之前保存的该视频信息,并把现在的信息保存进去
  212. Common.logger().info("该视频1小时内的播放量:{}<1000;更新该视频信息:{}",
  213. int(v_play_cnt_up) - int(download_video_play_cnt),
  214. download_video_title)
  215. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  216. Common.logger().info("从云文档删除该视频信息:{}", download_video_title)
  217. # 删除行或列,可选 ROWS、COLUMNS
  218. Feishu.dimension_range("SdCHOM", "ROWS", i + 1, i + 1)
  219. # 看一看+工作表,插入首行
  220. Feishu.insert_columns("SdCHOM", "ROWS", 1, 2)
  221. # 获取当前时间
  222. download_up_time = int(time.time())
  223. values = [[time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(download_up_time)),
  224. "上升榜",
  225. str(download_video_id),
  226. str(download_video_title),
  227. v_play_cnt_up,
  228. v_comment_cnt,
  229. v_liked_cnt,
  230. v_shared_cnt,
  231. v_duration,
  232. v_resolution,
  233. time.strftime("%Y/%m/%d %H:%M:%S", time.localtime(v_send_date)),
  234. str(v_username),
  235. str(v_user_id),
  236. str(v_user_cover),
  237. str(v_video_cover),
  238. str(download_url_up)]]
  239. time.sleep(1)
  240. Feishu.update_values("SdCHOM", "A2:Q2", values)
  241. except Exception as e:
  242. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  243. Common.logger().error("获取视频info异常:{}", e)
  244. if __name__ == "__main__":
  245. downloadup = DownloadUp()
  246. get_feeds()
  247. downloadup.download_up_video("dev")