luojunhui 4 месяцев назад
Родитель
Сommit
59ccd6a67c

+ 18 - 0
applications/const.py

@@ -108,4 +108,22 @@ class WeixinVideoCrawlerConst:
     NEED_SCAN_SOURCE_ACCOUNT = 1
     DO_NOT_NEED_SOURCE_ACCOUNT = 0
 
+    # 视频审核状态长文库
+    VIDEO_AUDIT_INIT_STATUS = 0
+    VIDEO_AUDIT_SUCCESS_STATUS = 1
+    VIDEO_AUDIT_FAIL_STATUS = 2
+    VIDEO_AUDIT_PROCESSING_STATUS = -1
+
+    # 票圈视频审核状态, 1 审核中,2 不通过 3 待修改,4 自己可见 5 通过
+    PQ_AUDIT_PROCESSING_STATUS = 1
+    PQ_AUDIT_FAIL_STATUS = 2
+    PQ_AUDIT_WAIT_STATUS = 3
+    PQ_AUDIT_SELF_VISIBLE_STATUS = 4
+    PQ_AUDIT_SUCCESS_STATUS = 5
+
+    # 默认账号
+    DEFAULT_ACCOUNT_UID = 76862180
+
+
+
 

+ 42 - 0
applications/pqFunctionApi.py

@@ -74,3 +74,45 @@ class PQAPI(object):
                 return False
         else:
             return False
+
+    @classmethod
+    def publish_to_pq(cls, oss_path, uid, title):
+        """
+        :return:
+        """
+        url = "https://vlogapi.piaoquantv.com/longvideoapi/crawler/video/send"
+        headers = {
+            "User-Agent": "PQSpeed/486 CFNetwork/1410.1 Darwin/22.6.0",
+            "cookie": "JSESSIONID=4DEA2B5173BB9A9E82DB772C0ACDBC9F; JSESSIONID=D02C334150025222A0B824A98B539B78",
+            "referer": "http://appspeed.piaoquantv.com",
+            "token": "524a8bc871dbb0f4d4717895083172ab37c02d2f",
+            "accept-language": "zh-CN,zh-Hans;q=0.9",
+            "Content-Type": "application/x-www-form-urlencoded",
+        }
+        payload = {
+            "deviceToken": "9ef064f2f7869b3fd67d6141f8a899175dddc91240971172f1f2a662ef891408",
+            "fileExtensions": "MP4",
+            "loginUid": uid,
+            "networkType": "Wi-Fi",
+            "platform": "iOS",
+            "requestId": "fb972cbd4f390afcfd3da1869cd7d001",
+            "sessionId": "362290597725ce1fa870d7be4f46dcc2",
+            "subSessionId": "362290597725ce1fa870d7be4f46dcc2",
+            "title": title,
+            "token": "524a8bc871dbb0f4d4717895083172ab37c02d2f",
+            "uid": uid,
+            "versionCode": "486",
+            "versionName": "3.4.12",
+            "videoFromScene": "1",
+            "videoPath": oss_path,
+            "viewStatus": "1",
+            "appType": 888888,
+            "repeatStatus": 1
+        }
+        response = requests.post(
+            url=url,
+            headers=headers,
+            data=payload
+        )
+        return response
+

+ 1 - 0
coldStartTasks/publish/__init__.py

@@ -1,3 +1,4 @@
 """
 @author: luojunhui
 """
+from .publish_video_to_pq_for_audit import PublishVideosForAudit

+ 145 - 0
coldStartTasks/publish/publish_video_to_pq_for_audit.py

@@ -0,0 +1,145 @@
+"""
+@author: luojunhui
+将抓取的视频发送至pq获取视频的审核结果
+"""
+from typing import List, Dict
+
+from tqdm import tqdm
+from pymysql.cursors import DictCursor
+
+from applications import PQAPI
+from applications import longArticlesMySQL
+from applications.const import WeixinVideoCrawlerConst
+
+const = WeixinVideoCrawlerConst()
+pq_functions = PQAPI()
+
+
+class PublishVideosForAudit(object):
+    """
+    发布视频到pq,获取video_id,并且轮询获取视频id状态
+    """
+
+    def __init__(self):
+        self.db = longArticlesMySQL()
+
+    def get_publish_video_list(self) -> List[Dict]:
+        """
+        获取视频的信息
+        :return:
+        """
+        sql = f"""SELECT id, article_title, video_oss_path FROM publish_single_video_source WHERE audit_status = {const.VIDEO_AUDIT_INIT_STATUS};"""
+        response = self.db.select(sql, cursor_type=DictCursor)
+        return response
+
+    def update_audit_status(self, video_id: int, ori_audit_status: int, new_audit_status: int) -> int:
+        """
+        更新视频的审核状态
+        :param new_audit_status:
+        :param ori_audit_status:
+        :param video_id:
+        :param
+        :return:
+        """
+        update_sql = f"""
+            UPDATE publish_single_video_source
+            SET audit_status = %s 
+            WHERE audit_video_id = %s and audit_status = %s;
+        """
+        affected_rows = self.db.update(
+            sql=update_sql,
+            params=(new_audit_status, video_id, ori_audit_status)
+        )
+        return affected_rows
+
+    def publish_each_video(self, video_obj: Dict) -> None:
+        """
+        发布视频到pq
+        :param video_obj:
+        :return:
+        """
+        response = pq_functions.publish_to_pq(
+            oss_path=video_obj.get("video_oss_path"),
+            uid=const.DEFAULT_ACCOUNT_UID,
+            title=video_obj.get("article_title")
+        )
+        response_json = response.json()
+        if response_json.get("code") == const.REQUEST_SUCCESS:
+            video_id = response_json['data']['id']
+            update_sql = f"""
+                UPDATE publish_single_video_source
+                SET audit_status = %s, audit_video_id = %s
+                WHERE id = %s;
+            """
+            affected_rows = self.db.update(
+                sql=update_sql,
+                params=(const.VIDEO_AUDIT_PROCESSING_STATUS, video_id, video_obj['id'])
+            )
+            if affected_rows:
+                print("视频发布成功--{}".format(video_id))
+            else:
+                print("视频发布失败--{}".format(video_id))
+        else:
+            print("视频发布失败--{}".format(video_obj.get("video_oss_path")))
+
+    def get_check_article_list(self) -> List[Dict]:
+        """
+        获取需要检查的视频列表
+        :return:
+        """
+        sql = f"""SELECT audit_video_id FROM publish_single_video_source WHERE audit_status = {const.VIDEO_AUDIT_PROCESSING_STATUS};"""
+        response = self.db.select(sql, cursor_type=DictCursor)
+        return response
+
+    def check_video_status(self, video_id: int) -> bool:
+        """
+        检查视频的状态,若视频审核通过or不通过,修改记录状态
+        :param video_id:
+        :return:
+        """
+        response = pq_functions.getPQVideoListDetail([video_id])
+        audit_status = response.get("data")[0].get("auditStatus")
+        if audit_status == const.PQ_AUDIT_SUCCESS_STATUS:
+            affected_rows = self.update_audit_status(
+                video_id=video_id,
+                ori_audit_status=const.VIDEO_AUDIT_PROCESSING_STATUS,
+                new_audit_status=const.VIDEO_AUDIT_SUCCESS_STATUS
+            )
+            if affected_rows:
+                return True
+            else:
+                return False
+        elif audit_status in {const.PQ_AUDIT_SELF_VISIBLE_STATUS, const.PQ_AUDIT_FAIL_STATUS}:
+            affected_rows = self.update_audit_status(
+                video_id=video_id,
+                ori_audit_status=const.VIDEO_AUDIT_PROCESSING_STATUS,
+                new_audit_status=const.VIDEO_AUDIT_FAIL_STATUS
+            )
+            if affected_rows:
+                return True
+            else:
+                return False
+        else:
+            return False
+
+    def publish_job(self):
+        """
+        发布视频到pq
+        :return:
+        """
+        video_list = self.get_publish_video_list()
+        for video_obj in tqdm(video_list[:5], desc="视频发布"):
+            self.publish_each_video(video_obj)
+        print("视频发布完成")
+
+    def check_job(self):
+        """
+        检查视频的状态
+        :return:
+        """
+        video_list = self.get_check_article_list()
+        for video_obj in tqdm(video_list, desc="视频检查"):
+            video_id = video_obj.get("audit_video_id")
+            self.check_video_status(video_id)
+        print("视频检查完成")
+