getOffVideosDaily.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. """
  2. @author: luojunhui
  3. @description: GetOffVideos Daily
  4. """
  5. import time
  6. import datetime
  7. import traceback
  8. from tqdm import tqdm
  9. from applications import longArticlesMySQL, PQAPI, log, bot
  10. EXPIRE_TIME = 3 * 24 * 60 * 60
  11. class AutoGetOffVideos(object):
  12. """
  13. 自动下架视频
  14. """
  15. def __init__(self):
  16. self.db_client = None
  17. self.pq_api = None
  18. def base_init(self):
  19. """
  20. 初始化数据库和票圈公共方法
  21. :return:
  22. """
  23. try:
  24. self.db_client = longArticlesMySQL()
  25. except Exception as e:
  26. error_msg = traceback.format_exc()
  27. bot(
  28. title="自动下架视频任务,数据库初始化失败",
  29. detail={
  30. "error": str(e),
  31. "error_msg": error_msg,
  32. "server": "new_server"
  33. }
  34. )
  35. return False
  36. try:
  37. self.pq_api = PQAPI()
  38. except Exception as e:
  39. error_msg = traceback.format_exc()
  40. bot(
  41. title="自动下架视频任务,pq公共方法连接失败",
  42. detail={
  43. "error": str(e),
  44. "error_msg": error_msg,
  45. "server": "new_server"
  46. }
  47. )
  48. return False
  49. return True
  50. def get_long_articles_videos(self, timestamp):
  51. """
  52. 获取待下架的视频
  53. :return:
  54. """
  55. select_sql = f"""
  56. SELECT video_id
  57. FROM get_off_videos
  58. WHERE video_status = 1 and publish_time < {timestamp};
  59. """
  60. result = self.db_client.select(sql=select_sql)
  61. log(
  62. task="getOffVideosDaily",
  63. function="get_long_articles_videos",
  64. message="查找到视频 id_list,一共{}条视频".format(len(result))
  65. )
  66. return result
  67. def update_video_id_status(self, video_id):
  68. """
  69. 修改数据库内视频状态
  70. :param video_id:
  71. :return:
  72. """
  73. timestamp = int(time.time())
  74. select_sql = f"""
  75. UPDATE get_off_videos
  76. SET video_status = 0, get_off_time = {timestamp}
  77. WHERE video_id = %s;
  78. """
  79. try:
  80. self.db_client.update(
  81. sql=select_sql,
  82. params=video_id
  83. )
  84. log(
  85. task="getOffVideosDaily",
  86. function="update_video_id_status",
  87. message="成功修改视频状态",
  88. data={"video_id": video_id}
  89. )
  90. except Exception as e:
  91. log(
  92. task="getOffVideosDaily",
  93. function="update_video_id_status",
  94. message="修改视频状态失败--- 推测 sql 问题,报错信息:{}".format(e),
  95. status="fail",
  96. data={"video_id": video_id}
  97. )
  98. def change_video_id_status(self, video_id):
  99. """
  100. 修改视频id状态
  101. :return:
  102. """
  103. response = self.pq_api.changeVideoStatus(video_id, 2)
  104. if response:
  105. self.update_video_id_status(video_id=video_id)
  106. else:
  107. log(
  108. task="getOffVideosDaily",
  109. function="change_video_id_status",
  110. status="fail",
  111. message="请求票圈修改状态异常: ---video_id = {}".format(video_id),
  112. )
  113. bot(
  114. title="get_off_videos 下架视频异常",
  115. detail={
  116. "video_id": video_id
  117. },
  118. mention=False
  119. )
  120. def get_off_job(self):
  121. """
  122. 已经请求超过3天的视频全部下架
  123. :return:
  124. """
  125. now_stamp = int(time.time())
  126. three_days_before = now_stamp - EXPIRE_TIME
  127. video_tuple = self.get_long_articles_videos(timestamp=three_days_before)
  128. vid_list = [i[0] for i in video_tuple]
  129. for video_id in tqdm(vid_list):
  130. try:
  131. self.change_video_id_status(video_id=video_id)
  132. except Exception as e:
  133. log(
  134. task="getOffVideosDaily",
  135. function="get_off_job",
  136. status="fail",
  137. message="get_off_job下架单个视频失败,video_id={}, 报错信息={}".format(video_id, e),
  138. )
  139. def check_job(self):
  140. """
  141. 校验 3 天前发布的视频是否已经下架
  142. :return:
  143. """
  144. three_days_ago = int(time.time()) - EXPIRE_TIME
  145. sql = f"""
  146. SELECT video_id
  147. FROM get_off_videos
  148. WHERE publish_time < {three_days_ago}
  149. AND video_status = 1;
  150. """
  151. vid_tuple = self.db_client.select(sql)
  152. if vid_tuple:
  153. vid_list = [i[0] for i in vid_tuple]
  154. for vid in vid_list:
  155. try:
  156. self.change_video_id_status(video_id=vid)
  157. except Exception as e:
  158. log(
  159. task="getOffVideosDaily",
  160. function="check_job",
  161. status="fail",
  162. message="task2下架单个视频失败,video_id={}, 报错信息={}".format(vid, e),
  163. )
  164. time.sleep(10)
  165. vid_tuple2 = self.db_client.select(sql)
  166. if vid_tuple2:
  167. vid_list2 = [i[0] for i in vid_tuple2]
  168. bot(
  169. title="getOffVideosDaily_check_job",
  170. detail={
  171. "video_list": vid_list2
  172. }
  173. )
  174. else:
  175. return
  176. else:
  177. return
  178. def main():
  179. """
  180. main function
  181. :return:
  182. """
  183. auto_get_off_job = AutoGetOffVideos()
  184. if auto_get_off_job.base_init():
  185. auto_get_off_job.get_off_job()
  186. time.sleep(60)
  187. auto_get_off_job.check_job()
  188. bot(
  189. title="get_off_jobs任务执行完成通知",
  190. mention=False,
  191. detail={
  192. "finish_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
  193. "server": "new server"
  194. }
  195. )
  196. if __name__ == '__main__':
  197. main()