123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- """
- @author: luojunhui
- """
- import json
- import time
- import random
- import hashlib
- import uuid
- import urllib.parse
- from applications.functions.common import async_post
- from applications.functions.log import logging
- from static.config import db_article
- async def publishToPQ(video_obj):
- """
- publish video to pq
- :return:
- """
- oss_path = video_obj['videoPath']
- uid = video_obj['uid']
- title = video_obj['title']
- cover = video_obj['coverPath']
- 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 = {
- "coverImgPath": cover,
- "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",
- }
- response = await async_post(url, headers, payload)
- print(response)
- return response
- async def getPQVideoDetail(video_id):
- """
- 获取票圈视频详情信息
- :return:
- """
- url = "https://longvideoapi.piaoquantv.com/longvideoapi/openapi/video/batchSelectVideoInfo"
- data = {
- "videoIdList": [video_id]
- }
- header = {
- "Content-Type": "application/json",
- }
- response = await async_post(url, header, json.dumps(data))
- print(response)
- return response
- class FinalResponse(object):
- """
- 视频发布至pq并且获取video_id
- """
- def __init__(self, params, mysql_client):
- """
- :param params:
- :param mysql_client:
- :return:
- """
- self.kimi_title = None
- self.video_obj_list = None
- self.mini_type = None
- self.gh_id = None
- self.trace_id = None
- self.params = params
- self.mysql_client = mysql_client
- self.mini_map = {
- 25: {
- "avatar": "https://rescdn.yishihui.com/0temp/ttmhzfsh.png",
- "id": "wx0b7d95eb293b783b",
- "name": "天天美好祝福生活",
- "index": 25,
- },
- 29: {
- "avatar": "https://rescdn.yishihui.com/0temp/cyfyld.png",
- "id": "wx65c76bb4c67934db",
- "name": "财运福运来到",
- "index": 29,
- },
- 31: {
- "avatar": "https://rescdn.yishihui.com/0temp/mhzfshxf2.png",
- "id": "wx2e4478b1641b3b15",
- "name": "美好祝福生活幸福",
- "index": 31,
- },
- 36: {
- "avatar": "https://rescdn.yishihui.com/0temp/zfyfyc.jpeg",
- "id": "wxcddf231abd0dabdc",
- "name": "祝福有福有财",
- "index": 36,
- },
- 27: {
- "avatar": "https://rescdn.yishihui.com/0temp/xymhfqdd.png",
- "id": "wx7187c217efef24a7",
- "name": "幸运美好福气多多",
- "index": 27,
- },
- 33: {
- "avatar": "https://rescdn.yishihui.com/0temp/ssnnfqd.jpeg",
- "id": "wx5e67713277549b6f",
- "name": "年年岁岁福气多",
- "index": 33,
- },
- }
- def checkParams(self):
- """
- 校验参数
- :return:
- """
- try:
- self.trace_id = self.params['traceId']
- self.kimi_title = self.params['kimiTitle']
- self.gh_id = self.params['ghId']
- self.mini_type = self.params['miniType']
- self.video_obj_list = self.params['videoObjList']
- return None
- except Exception as e:
- response = {
- "traceId": self.trace_id,
- "error": str(e),
- "info": "参数校验失败"
- }
- return response
- def createGzhPath(self, video_id, shared_uid, gh_id):
- """
- :param gh_id: 公众号账号的gh_id
- :param video_id: 视频 id
- :param shared_uid: 分享 id
- """
- def generate_source_id():
- """
- generate_source_id
- :return:
- """
- timestamp = str(int(time.time() * 1000))
- random_str = str(random.randint(1000, 9999))
- hash_input = f"{timestamp}-{random_str}"
- return hashlib.md5(hash_input.encode()).hexdigest()
- root_share_id = str(uuid.uuid4())
- if self.mini_type == 2:
- source_id = (
- "touliu_tencentGzhArticle_{}_".format(gh_id) + generate_source_id()
- )
- elif self.mini_type == 1:
- source_id = "longArticles_" + generate_source_id()
- elif self.mini_type == 3:
- source_id = "WeCom_" + generate_source_id()
- else:
- source_id = "Error mini_program_type {}".format(self.mini_type)
- url = f"pages/user-videos?id={video_id}&su={shared_uid}&fromGzh=1&rootShareId={root_share_id}&shareId={root_share_id}&rootSourceId={source_id}"
- # 自动把 root_share_id 加入到白名单
- # auto_white(root_share_id)
- return (
- root_share_id,
- source_id,
- f"pages/category?jumpPage={urllib.parse.quote(url, safe='')}",
- )
- def chooseMiniProgram(self, mini_id):
- """
- 获取小程序分享卡片
- :return:
- """
- mini_info = self.mini_map[mini_id]
- return (
- mini_info["avatar"],
- mini_info["id"],
- mini_info["name"],
- mini_info["index"],
- )
- async def generateSingleCard(self, video_id, title, index, gh_id, mini_id):
- """
- 生成单个分享卡片
- :return:
- """
- response = await getPQVideoDetail(video_id)
- print(response)
- productionCover = response["data"][0]["shareImgPath"]
- videoUrl = response["data"][0]["videoPath"]
- user_id = response["data"][0]["user"]["uid"]
- programAvatar, programId, programName, pqMiniId = self.chooseMiniProgram(mini_id)
- root_share_id, source_id, productionPath = self.createGzhPath(video_id, user_id, gh_id)
- logging(
- code="1002",
- info="root_share_id --{}, productionPath -- {}".format(
- root_share_id, productionPath
- ),
- function="process",
- trace_id=self.trace_id,
- )
- result = {
- "productionCover": productionCover,
- "productionName": title,
- "programAvatar": programAvatar,
- "programId": programId,
- "programName": programName,
- "source": "web",
- "rootShareId": root_share_id,
- "productionPath": productionPath,
- "videoUrl": videoUrl,
- "mini_id": mini_id,
- "paragraphPosition": index * 0.25,
- }
- update_result_sql = f"""
- UPDATE {db_article}
- SET
- result{index} = %s,
- success = %s
- WHERE
- trace_id = %s;
- """
- await self.mysql_client.async_insert(
- sql=update_result_sql,
- params=(json.dumps(result, ensure_ascii=False), 1, self.trace_id),
- )
- logging(
- code="2000",
- info="统计 root_share_id && video_id",
- function="process",
- trace_id=self.trace_id,
- data={
- "rootShareId": root_share_id,
- "videoId": video_id,
- "sourceId": source_id,
- },
- )
- return result
- async def generateCards(self, video_list, kimi_title, gh_id):
- """
- 生成一组卡片
- :param video_list:
- :param kimi_title:
- :param gh_id:
- :return:
- """
- L = []
- if self.mini_type == 1:
- mini_id_list = [25, 29, 31]
- video_count = len(video_list)
- mini_choice_index = random.sample(range(3), video_count)
- mini_choice_item = [mini_id_list[i] for i in mini_choice_index]
- for index, video_id in enumerate(video_list, 1):
- result = await self.generateSingleCard(
- video_id=video_id,
- title=kimi_title,
- index=index,
- gh_id=gh_id,
- mini_id=mini_choice_item[index - 1],
- )
- L.append(result)
- elif self.mini_type == 2:
- for index, video_id in enumerate(video_list, 1):
- result = await self.generateSingleCard(
- video_id=video_id,
- title=kimi_title,
- index=index,
- gh_id=gh_id,
- mini_id=33,
- )
- L.append(result)
- elif self.mini_type == 3:
- for index, video_id in enumerate(video_list, 1):
- result = await self.generateSingleCard(
- video_id=video_id,
- title=kimi_title,
- index=index,
- gh_id=gh_id,
- mini_id=27,
- )
- L.append(result)
- return L
- async def getVideoIdList(self):
- """
- 获取匹配文章的id_list
- :return:
- """
- vid_list = []
- for video_obj in self.video_obj_list:
- video_publish_info = await publishToPQ(video_obj=video_obj)
- video_id = video_publish_info['data']['id']
- vid_list.append(video_id)
- return vid_list
- async def deal(self):
- """
- deal function
- :return:
- """
- params_error = self.checkParams()
- if params_error:
- return params_error
- else:
- video_list = await self.getVideoIdList()
- card_list = await self.generateCards(
- video_list, self.kimi_title, self.gh_id
- )
- response = {
- "trace_id": self.trace_id,
- "miniprogramList": card_list
- }
- return response
|