|
@@ -1,338 +0,0 @@
|
|
|
-"""
|
|
|
-@author: luojunhui
|
|
|
-"""
|
|
|
-
|
|
|
-import json
|
|
|
-import uuid
|
|
|
-import time
|
|
|
-import random
|
|
|
-import hashlib
|
|
|
-import urllib.parse
|
|
|
-
|
|
|
-from applications.functions.log import logging
|
|
|
-from static.config import db_article
|
|
|
-from applications.functions.common import request_for_info
|
|
|
-
|
|
|
-
|
|
|
-class Response(object):
|
|
|
- """
|
|
|
- 召回逻辑
|
|
|
- """
|
|
|
-
|
|
|
- def __init__(self, trace_id, mysql_client, mini_program_type):
|
|
|
- """
|
|
|
- 长文: 25, 29, 31
|
|
|
- 投流: 33
|
|
|
- 企微: 27
|
|
|
- :param trace_id:
|
|
|
- :param mysql_client:
|
|
|
- :param mini_program_type:
|
|
|
- """
|
|
|
- self.trace_id = trace_id
|
|
|
- self.mysql_client = mysql_client
|
|
|
- self.mini_program_type = mini_program_type
|
|
|
- self.mini_map = {
|
|
|
- # 25: {
|
|
|
- # "avatar": "https://rescdn.yishihui.com/0temp/ttmhzfsh.png",
|
|
|
- # "id": "wx0b7d95eb293b783b",
|
|
|
- # "name": "天天美好祝福生活",
|
|
|
- # "index": 25,
|
|
|
- # },
|
|
|
- 25: {
|
|
|
- "avatar": "https://rescdn.yishihui.com/0temp/pqsp.png",
|
|
|
- "id": "wxbdd2a2e93d9a6e25",
|
|
|
- "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,
|
|
|
- # },
|
|
|
- 33: {
|
|
|
- "avatar": "https://rescdn.yishihui.com/0temp/pqsp.png",
|
|
|
- "id": "wxbdd2a2e93d9a6e25",
|
|
|
- "name": "票圈视频",
|
|
|
- "index": 33
|
|
|
- }
|
|
|
- }
|
|
|
- # self.test_id_set = {'gh_080bb43aa0dc', 'gh_e0eb490115f5', 'gh_6d9f36e3a7be', 'gh_29074b51f2b7', 'gh_6d205db62f04',
|
|
|
- # 'gh_d49df5e974ca', 'gh_d4dffc34ac39', 'gh_89ef4798d3ea', 'gh_b15de7c99912', 'gh_9eef14ad6c16',
|
|
|
- # 'gh_0c89e11f8bf3', 'gh_f902cea89e48', 'gh_6b7c2a257263', 'gh_183d80deffb8', 'gh_9f8dc5b0c74e',
|
|
|
- # 'gh_1b27dd1beeca', 'gh_e24da99dc899', 'gh_dd4c857bbb36', 'gh_7e5818b2dd83'}
|
|
|
-
|
|
|
- async def get_result(self):
|
|
|
- """
|
|
|
- 获取结果
|
|
|
- :return:
|
|
|
- """
|
|
|
- select_sql = f"""
|
|
|
- SELECT gh_id, recall_video_id1, recall_video_id2, recall_video_id3, kimi_title, content_status, process_times
|
|
|
- FROM {db_article}
|
|
|
- WHERE trace_id = '{self.trace_id}';
|
|
|
- """
|
|
|
- info_tuple = await self.mysql_client.async_select(select_sql)
|
|
|
- gh_id, vid1, vid2, vid3, kimi_title, content_status, process_times = info_tuple[
|
|
|
- 0
|
|
|
- ]
|
|
|
- response = {
|
|
|
- "gh_id": gh_id,
|
|
|
- "vid_list": [vid1, vid2, vid3],
|
|
|
- "kimi_title": kimi_title,
|
|
|
- "content_status": content_status,
|
|
|
- "process_times": process_times,
|
|
|
- }
|
|
|
- print(response)
|
|
|
- return response
|
|
|
-
|
|
|
- def create_gzh_path(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_program_type == 2:
|
|
|
- source_id = (
|
|
|
- "touliu_tencentGzhArticle_{}_".format(gh_id) + generate_source_id()
|
|
|
- )
|
|
|
- elif self.mini_program_type == 1:
|
|
|
- source_id = "longArticles_" + generate_source_id()
|
|
|
- elif self.mini_program_type == 3:
|
|
|
- source_id = "WeCom_" + generate_source_id()
|
|
|
- else:
|
|
|
- source_id = "Error mini_program_type {}".format(self.mini_program_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 choose_mini_program(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 generate_card(self, video_id, kimi_title, index, gh_id, mini_id):
|
|
|
- """
|
|
|
- 生成分享卡片
|
|
|
- :return:
|
|
|
- """
|
|
|
- response = request_for_info(video_id)
|
|
|
- productionCover = response["data"][0]["shareImgPath"]
|
|
|
- productionName = kimi_title
|
|
|
- videoUrl = response["data"][0]["videoPath"]
|
|
|
- user_id = response["data"][0]["user"]["uid"]
|
|
|
- programAvatar, programId, programName, pqMiniId = self.choose_mini_program(
|
|
|
- mini_id
|
|
|
- )
|
|
|
- root_share_id, source_id, productionPath = self.create_gzh_path(
|
|
|
- video_id, user_id, gh_id
|
|
|
- )
|
|
|
- source = "Web"
|
|
|
- logging(
|
|
|
- code="1002",
|
|
|
- info="root_share_id --{}, productionPath -- {}".format(
|
|
|
- root_share_id, productionPath
|
|
|
- ),
|
|
|
- function="process",
|
|
|
- trace_id=self.trace_id,
|
|
|
- )
|
|
|
- result = {
|
|
|
- "productionCover": productionCover,
|
|
|
- "productionName": productionName,
|
|
|
- "programAvatar": programAvatar,
|
|
|
- "programId": programId,
|
|
|
- "programName": programName,
|
|
|
- "source": source,
|
|
|
- "rootShareId": root_share_id,
|
|
|
- "productionPath": productionPath,
|
|
|
- "videoUrl": videoUrl,
|
|
|
- "mini_id": mini_id,
|
|
|
- "paragraphPosition": index * 0.25,
|
|
|
- }
|
|
|
- # if gh_id in self.test_id_set and index == 1:
|
|
|
- # 只针对插入的第一个小程序位置做改变
|
|
|
- if index == 1:
|
|
|
- result['paragraphPosition'] = 0.01
|
|
|
-
|
|
|
- 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 generate_cards(self, video_list, kimi_title, gh_id):
|
|
|
- """
|
|
|
- 生成一组卡片
|
|
|
- :param video_list:
|
|
|
- :param kimi_title:
|
|
|
- :param gh_id:
|
|
|
- :return:
|
|
|
- """
|
|
|
- L = []
|
|
|
- if self.mini_program_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):
|
|
|
- random_num = random.randint(1, 10)
|
|
|
- if random_num in [1, 2, 3, 4, 5, 6]:
|
|
|
- mini_id = 25
|
|
|
- elif random_num in [7, 8]:
|
|
|
- mini_id = 29
|
|
|
- else:
|
|
|
- mini_id = 31
|
|
|
- result = await self.generate_card(
|
|
|
- video_id=video_id,
|
|
|
- kimi_title=kimi_title,
|
|
|
- index=index,
|
|
|
- gh_id=gh_id,
|
|
|
- mini_id=mini_id,
|
|
|
- )
|
|
|
- L.append(result)
|
|
|
- elif self.mini_program_type == 2:
|
|
|
- for index, video_id in enumerate(video_list, 1):
|
|
|
- result = await self.generate_card(
|
|
|
- video_id=video_id,
|
|
|
- kimi_title=kimi_title,
|
|
|
- index=index,
|
|
|
- gh_id=gh_id,
|
|
|
- mini_id=33,
|
|
|
- )
|
|
|
- L.append(result)
|
|
|
- elif self.mini_program_type == 3:
|
|
|
- for index, video_id in enumerate(video_list, 1):
|
|
|
- result = await self.generate_card(
|
|
|
- video_id=video_id,
|
|
|
- kimi_title=kimi_title,
|
|
|
- index=index,
|
|
|
- gh_id=gh_id,
|
|
|
- mini_id=27,
|
|
|
- )
|
|
|
- L.append(result)
|
|
|
- return L
|
|
|
-
|
|
|
- async def deal(self):
|
|
|
- """
|
|
|
- Recall Deal
|
|
|
- :return:
|
|
|
- """
|
|
|
- response = await self.get_result()
|
|
|
- status_code = response.get("content_status")
|
|
|
- process_times = response.get("process_times")
|
|
|
- if status_code == 0:
|
|
|
- if process_times > 3:
|
|
|
- result = {
|
|
|
- "traceId": self.trace_id,
|
|
|
- "code": 0,
|
|
|
- "error": "匹配失败,处理超过五次,文章敏感",
|
|
|
- }
|
|
|
- else:
|
|
|
- result = {
|
|
|
- "traceId": self.trace_id,
|
|
|
- "code": 0,
|
|
|
- "Message": "该请求还没处理",
|
|
|
- }
|
|
|
- elif status_code == 1:
|
|
|
- result = {
|
|
|
- "traceId": self.trace_id,
|
|
|
- "code": 1,
|
|
|
- "Message": "该请求正在处理中",
|
|
|
- }
|
|
|
- elif status_code == 2:
|
|
|
- unEmptyList = [i for i in response["vid_list"] if i]
|
|
|
- cards = await self.generate_cards(
|
|
|
- unEmptyList, response.get("kimi_title"), response["gh_id"]
|
|
|
- )
|
|
|
- if cards:
|
|
|
- result = {"traceId": self.trace_id, "miniprogramList": cards}
|
|
|
- else:
|
|
|
- result = {
|
|
|
- "traceId": self.trace_id,
|
|
|
- "code": 0,
|
|
|
- "error": "匹配失败,视频下载失败返回vid为0",
|
|
|
- }
|
|
|
- elif status_code == 3:
|
|
|
- result = {
|
|
|
- "traceId": self.trace_id,
|
|
|
- "code": 0,
|
|
|
- "error": "匹配失败,处理超过五次,文章敏感",
|
|
|
- }
|
|
|
- else:
|
|
|
- result = {"traceId": self.trace_id, "Message": "UnKnow Error"}
|
|
|
- logging(
|
|
|
- code="1002",
|
|
|
- info="返回结果",
|
|
|
- function="process",
|
|
|
- data=result,
|
|
|
- trace_id=self.trace_id,
|
|
|
- )
|
|
|
- return result
|