getOffVideosDaily.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. """
  2. @author: luojunhui
  3. @description: GetOffVideos Daily
  4. """
  5. import json
  6. import time
  7. import requests
  8. import schedule
  9. from tqdm import tqdm
  10. from applications import PQMySQL, Functions, PQAPI, log
  11. from applications.decoratorApi import retryOnTimeout
  12. @retryOnTimeout()
  13. def bot(account_list):
  14. """
  15. 机器人
  16. """
  17. url = "https://open.feishu.cn/open-apis/bot/v2/hook/b44333f2-16c0-4cb1-af01-d135f8704410"
  18. headers = {"Content-Type": "application/json"}
  19. payload = {
  20. "msg_type": "interactive",
  21. "card": {
  22. "elements": [
  23. {
  24. "tag": "div",
  25. "text": {
  26. "content": "存在视频下架失败<at id=all></at>\n",
  27. "tag": "lark_md",
  28. },
  29. },
  30. {
  31. "tag": "div",
  32. "text": {
  33. "content": json.dumps(
  34. account_list, ensure_ascii=False, indent=4
  35. ),
  36. "tag": "lark_md",
  37. },
  38. },
  39. ],
  40. "header": {"title": {"content": "【重点关注】", "tag": "plain_text"}},
  41. },
  42. }
  43. requests.request("POST", url=url, headers=headers, data=json.dumps(payload), timeout=10)
  44. class AutoGetOffVideos(object):
  45. """
  46. 自动下架视频
  47. """
  48. pqMysql = PQMySQL()
  49. pqAPI = PQAPI()
  50. @classmethod
  51. def getLongArticlesVideos(cls, time_stamp):
  52. """
  53. 获取待下架的视频
  54. :return:
  55. """
  56. select_sql = f"""
  57. SELECT video_id
  58. FROM get_off_videos
  59. WHERE video_status = 1 and publish_time < {time_stamp};
  60. """
  61. result = cls.pqMysql.select(sql=select_sql)
  62. log(
  63. task="getOffVideosDaily",
  64. function="getLongArticlesVideos",
  65. message="查找到视频 id_list,一共{}条视频".format(len(result))
  66. )
  67. return result
  68. @classmethod
  69. def updateVideoIdStatus(cls, video_id):
  70. """
  71. 修改数据库内视频状态
  72. :param video_id:
  73. :return:
  74. """
  75. time_stamp = int(time.time())
  76. select_sql = f"""
  77. UPDATE get_off_videos
  78. SET video_status = 0, get_off_time = {time_stamp}
  79. WHERE video_id = %s;
  80. """
  81. try:
  82. cls.pqMysql.update(
  83. sql=select_sql,
  84. params=video_id
  85. )
  86. log(
  87. task="getOffVideosDaily",
  88. function="updateVideoIdStatus",
  89. message="成功修改视频状态",
  90. data={"video_id": video_id}
  91. )
  92. except Exception as e:
  93. log(
  94. task="getOffVideosDaily",
  95. function="updateVideoIdStatus",
  96. message="修改视频状态失败--- 推测 sql 问题,报错信息:{}".format(e),
  97. status="fail"
  98. )
  99. @classmethod
  100. def changeVideoIdStatus(cls, video_id):
  101. """
  102. 修改视频id状态
  103. :return:
  104. """
  105. response = cls.pqAPI.changeVideoStatus(video_id, 2)
  106. if response:
  107. cls.updateVideoIdStatus(video_id=video_id)
  108. else:
  109. log(
  110. task="getOffVideosDaily",
  111. function="changeVideoIdStatus",
  112. status="fail",
  113. message="请求票圈修改状态异常: ---video_id = {}".format(video_id),
  114. )
  115. @classmethod
  116. def task1(cls):
  117. """
  118. 已经请求超过3天的视频全部下架
  119. :return:
  120. """
  121. now_stamp = int(time.time())
  122. three_days_before = now_stamp - 3 * 24 * 60 * 60
  123. video_set = cls.getLongArticlesVideos(time_stamp=three_days_before)
  124. vid_list = [i[0] for i in video_set]
  125. for video_id in tqdm(vid_list):
  126. try:
  127. cls.changeVideoIdStatus(video_id=video_id)
  128. except Exception as e:
  129. log(
  130. task="getOffVideosDaily",
  131. function="task1",
  132. status="fail",
  133. message="task1下架单个视频失败,video_id={}, 报错信息={}".format(video_id, e),
  134. )
  135. @classmethod
  136. def task2(cls):
  137. """
  138. 校验 3 天前发布的视频是否已经下架
  139. :return:
  140. """
  141. three_days_ago = int(time.time()) - 3 * 24 * 3600
  142. sql = f"""
  143. SELECT video_id
  144. FROM get_off_videos
  145. WHERE publish_time < {three_days_ago} and video_status = 1;
  146. """
  147. vid_tuple = cls.pqMysql.select(sql)
  148. if vid_tuple:
  149. vid_list = [i[0] for i in vid_tuple]
  150. for vid in vid_list:
  151. try:
  152. cls.changeVideoIdStatus(video_id=vid)
  153. except Exception as e:
  154. log(
  155. task="getOffVideosDaily",
  156. function="task2",
  157. status="fail",
  158. message="task2下架单个视频失败,video_id={}, 报错信息={}".format(vid, e),
  159. )
  160. time.sleep(10)
  161. vid_tuple2 = cls.pqMysql.select(sql)
  162. if vid_tuple2:
  163. vid_list2 = [i[0] for i in vid_tuple2]
  164. bot(vid_list2)
  165. else:
  166. return
  167. else:
  168. return
  169. def getOffJob():
  170. """
  171. 下架任务
  172. :return:
  173. """
  174. AGV = AutoGetOffVideos()
  175. AGV.task1()
  176. def checkJob():
  177. """
  178. 校验 3 天前发布的视频是否已经被下架
  179. :return:
  180. """
  181. AGV = AutoGetOffVideos()
  182. AGV.task2()
  183. if __name__ == '__main__':
  184. schedule.every().day.at("09:30").do(Functions().job_with_thread, getOffJob)
  185. schedule.every().day.at("10:30").do(Functions().job_with_thread, checkJob)
  186. schedule.every().day.at("14:30").do(Functions().job_with_thread, getOffJob)
  187. schedule.every().day.at("15:00").do(Functions().job_with_thread, checkJob)
  188. while True:
  189. schedule.run_pending()
  190. time.sleep(1)