download_up.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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. if len(Feishu.get_values_batch("SdCHOM")) == 1:
  54. pass
  55. else:
  56. for i in range(len(Feishu.get_values_batch("SdCHOM"))):
  57. time.sleep(1)
  58. try:
  59. video_info_session = Common.get_session()
  60. Common.logger().info("获取视频info时,session:{}", video_info_session)
  61. download_time = Feishu.get_values_batch("SdCHOM")[i+1][0] # 第一次获取该视频的时间
  62. download_video_id = Feishu.get_values_batch("SdCHOM")[i+1][1] # 外网视频 ID
  63. download_video_play_cnt = Feishu.get_values_batch("SdCHOM")[i+1][2] # 播放量
  64. download_video_title = Feishu.get_values_batch("SdCHOM")[i+1][3]
  65. url = "https://search.weixin.qq.com/cgi-bin/recwxa/recwxagetonevideoinfo?"
  66. param = {
  67. "session": video_info_session,
  68. "vid": download_video_id,
  69. "wxaVersion": "3.9.2",
  70. "channelid": "208201",
  71. "scene": "32",
  72. "subscene": "1089",
  73. "model": "iPhone 11<iPhone12,1>14.7.1",
  74. "clientVersion": "8.0.18",
  75. "sharesearchid": "447665862521758270",
  76. "sharesource": "-1"
  77. }
  78. urllib3.disable_warnings()
  79. r = requests.get(url=url, params=param, proxies=proxies, verify=False)
  80. response = json.loads(r.content.decode("utf8"))
  81. if "data" not in response:
  82. Common.logger().error("获取视频info时错误,删除该视频:{}", download_video_title)
  83. # 删除行或列,可选 ROWS、COLUMNS
  84. Feishu.dimension_range("SdCHOM", "ROWS", i + 2, i + 2)
  85. else:
  86. data = response["data"]
  87. v_duration = data["duration"]
  88. v_play_cnt_up = data["played_cnt"]
  89. v_comment_cnt = data["comment_cnt"]
  90. v_liked_cnt = data["liked_cnt"]
  91. v_shared_cnt = data["shared_cnt"]
  92. v_width = data["width"]
  93. v_height = data["height"]
  94. v_resolution = str(v_width) + "*" + str(v_height)
  95. v_send_date = data["upload_time"]
  96. v_username = data["user_info"]["nickname"].strip().replace("\n", "")
  97. v_user_cover = data["user_info"]["headimg_url"]
  98. v_video_cover = data["cover_url"]
  99. if "items" not in data["play_info"]:
  100. if len(data["play_info"]) > 2:
  101. download_url_up = data["play_info"][2]["play_url"]
  102. else:
  103. download_url_up = data["play_info"][0]["play_url"]
  104. else:
  105. if len(data["play_info"]["items"]) > 2:
  106. download_url_up = data["play_info"]["items"][2]["play_url"]
  107. else:
  108. download_url_up = data["play_info"]["items"][0]["play_url"]
  109. # 判断基本规则
  110. if cls.up_rule(v_width, v_height, v_duration, v_play_cnt_up) is True \
  111. and download_video_id != "" and download_video_title != "" and v_duration != "" \
  112. and v_play_cnt_up != "" and v_comment_cnt != "" and v_liked_cnt != "" \
  113. and v_shared_cnt != "" and v_width != "" and v_height != "" \
  114. and v_send_date != "" and v_username != "" and v_user_cover != "" \
  115. and v_video_cover != "" and download_url_up != "":
  116. if int(time.time()) - int(download_time) < 3600:
  117. Common.logger().info("距上次获取该视频时间:{}分钟;{}",
  118. int((int(int(time.time()) - int(download_time))) / 60),
  119. download_video_title)
  120. elif 7200 >= int(time.time()) - int(download_time) >= 3600:
  121. if int(v_play_cnt_up) - int(download_video_play_cnt) >= 1000:
  122. Common.logger().info("该视频:{}在1小时内的播放量{}>=1000",
  123. download_video_title,
  124. int(v_play_cnt_up) - int(download_video_play_cnt))
  125. # 下载封面
  126. Common.download_method("cover", download_video_title, v_video_cover)
  127. # 下载视频
  128. Common.download_method("video", download_video_title, download_url_up)
  129. # 保存视频信息到 "./files/{视频标题}/videoinfo.txt"
  130. with open(r"./videos/" + download_video_title
  131. + "/" + "info.txt", "a", encoding="utf8") as f_a2:
  132. f_a2.write(str(download_video_id) + "\n" +
  133. str(download_video_title) + "\n" +
  134. str(v_duration) + "\n" +
  135. str(v_play_cnt_up) + "\n" +
  136. str(v_comment_cnt) + "\n" +
  137. str(v_liked_cnt) + "\n" +
  138. str(v_shared_cnt) + "\n" +
  139. str(v_resolution) + "\n" +
  140. str(v_send_date) + "\n" +
  141. str(v_username) + "\n" +
  142. str(v_user_cover) + "\n" +
  143. str(download_url_up) + "\n" +
  144. str(v_video_cover) + "\n" +
  145. str(video_info_session))
  146. # 上传该视频
  147. Common.logger().info("开始上传视频:{}", download_video_title)
  148. Publish.upload_and_publish(env, "up")
  149. # 保存视频 ID 到云文档:
  150. # https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=20ce0c
  151. Common.logger().info("保存视频ID至云文档:{}", download_video_title)
  152. # 看一看+ ,视频ID工作表,插入首行
  153. Feishu.insert_columns("20ce0c")
  154. # 看一看+ ,视频ID工作表,首行写入数据
  155. Feishu.update_values("20ce0c", download_video_id, "", "", "",
  156. "", "", "", "", "", "", "", "", "", "", "")
  157. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  158. Common.logger().info("从云文档删除该视频信息:{}", download_video_title)
  159. # 删除行或列,可选 ROWS、COLUMNS
  160. Feishu.dimension_range("SdCHOM", "ROWS", i + 2, i + 2)
  161. else:
  162. # 删除之前保存的该视频信息,并把现在的信息保存进去
  163. Common.logger().info("该视频1小时内的播放量:{}<1000;更新该视频信息:{}",
  164. int(v_play_cnt_up) - int(download_video_play_cnt),
  165. download_video_title)
  166. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  167. Common.logger().info("从云文档删除该视频信息:{}", download_video_title)
  168. # 删除行或列,可选 ROWS、COLUMNS
  169. Feishu.dimension_range("SdCHOM", "ROWS", i + 2, i + 2)
  170. # 看一看+工作表,插入首行
  171. Feishu.insert_columns("SdCHOM")
  172. # 获取当前时间
  173. download_up_time = int(time.time())
  174. # 看一看云文档,工作表 kanyikan_feeds_1 中写入数据
  175. Feishu.update_values("SdCHOM",
  176. a1=str(download_up_time),
  177. b1=str(download_video_id),
  178. c1=str(v_play_cnt_up),
  179. d1=str(download_video_title),
  180. e1=str(v_duration),
  181. f1=str(v_comment_cnt),
  182. g1=str(v_liked_cnt),
  183. h1=str(v_shared_cnt),
  184. i1=str(v_resolution),
  185. j1=str(v_send_date),
  186. k1=str(v_username),
  187. l1=str(v_user_cover),
  188. m1=str(v_video_cover),
  189. n1=str(download_url_up),
  190. o1=str(video_info_session))
  191. elif int(time.time()) - int(download_time) > 7200:
  192. Common.logger().info("距上次获取该视频时间:""{}分钟。超过2小时,删除该视频;标题:{}",
  193. int((int(time.time()) - int(download_time)) / 60),
  194. download_video_title)
  195. # 删除行或列,可选 ROWS、COLUMNS
  196. Feishu.dimension_range("SdCHOM", "ROWS", i + 2, i + 2)
  197. else:
  198. Common.logger().info("不满足下载规则:{}", download_video_title)
  199. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  200. Common.logger().info("从云文档删除该视频信息:{}", download_video_title)
  201. # 删除行或列,可选 ROWS、COLUMNS
  202. Feishu.dimension_range("SdCHOM", "ROWS", i + 2, i + 2)
  203. except Exception as e:
  204. # 从云文档删除该视频信息:https://w42nne6hzg.feishu.cn/sheets/shtcngRPoDYAi24x52j2nDuHMih?sheet=SdCHOM
  205. Common.logger().error("获取视频info异常:{},删除该视频", e)
  206. # 删除行或列,可选 ROWS、COLUMNS
  207. Feishu.dimension_range("SdCHOM", "ROWS", i + 2, i + 2)
  208. except Exception as e:
  209. Common.logger().error(e)
  210. if __name__ == "__main__":
  211. downloadup = DownloadUp()
  212. get_feeds()
  213. downloadup.download_up_video("dev")