finalResponse.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. """
  2. @author: luojunhui
  3. """
  4. import json
  5. import time
  6. import random
  7. import hashlib
  8. import uuid
  9. import urllib.parse
  10. from applications.functions.common import async_post
  11. from applications.functions.log import logging
  12. from static.config import db_article
  13. async def publishToPQ(video_obj):
  14. """
  15. publish video to pq
  16. :return:
  17. """
  18. oss_path = video_obj['videoPath']
  19. uid = video_obj['uid']
  20. title = video_obj['title']
  21. cover = video_obj['coverPath']
  22. url = "https://vlogapi.piaoquantv.com/longvideoapi/crawler/video/send"
  23. headers = {
  24. "User-Agent": "PQSpeed/486 CFNetwork/1410.1 Darwin/22.6.0",
  25. "cookie": "JSESSIONID=4DEA2B5173BB9A9E82DB772C0ACDBC9F; JSESSIONID=D02C334150025222A0B824A98B539B78",
  26. "referer": "http://appspeed.piaoquantv.com",
  27. "token": "524a8bc871dbb0f4d4717895083172ab37c02d2f",
  28. "accept-language": "zh-CN,zh-Hans;q=0.9",
  29. "Content-Type": "application/x-www-form-urlencoded",
  30. }
  31. payload = {
  32. "coverImgPath": cover,
  33. "deviceToken": "9ef064f2f7869b3fd67d6141f8a899175dddc91240971172f1f2a662ef891408",
  34. "fileExtensions": "MP4",
  35. "loginUid": uid,
  36. "networkType": "Wi-Fi",
  37. "platform": "iOS",
  38. "requestId": "fb972cbd4f390afcfd3da1869cd7d001",
  39. "sessionId": "362290597725ce1fa870d7be4f46dcc2",
  40. "subSessionId": "362290597725ce1fa870d7be4f46dcc2",
  41. "title": title,
  42. "token": "524a8bc871dbb0f4d4717895083172ab37c02d2f",
  43. "uid": uid,
  44. "versionCode": "486",
  45. "versionName": "3.4.12",
  46. "videoFromScene": "1",
  47. "videoPath": oss_path,
  48. "viewStatus": "1",
  49. }
  50. response = await async_post(url, headers, payload)
  51. print(response)
  52. return response
  53. async def getPQVideoDetail(video_id):
  54. """
  55. 获取票圈视频详情信息
  56. :return:
  57. """
  58. url = "https://longvideoapi.piaoquantv.com/longvideoapi/openapi/video/batchSelectVideoInfo"
  59. data = {
  60. "videoIdList": [video_id]
  61. }
  62. header = {
  63. "Content-Type": "application/json",
  64. }
  65. response = await async_post(url, header, json.dumps(data))
  66. print(response)
  67. return response
  68. class FinalResponse(object):
  69. """
  70. 视频发布至pq并且获取video_id
  71. """
  72. def __init__(self, params, mysql_client):
  73. """
  74. :param params:
  75. :param mysql_client:
  76. :return:
  77. """
  78. self.kimi_title = None
  79. self.video_obj_list = None
  80. self.mini_type = None
  81. self.gh_id = None
  82. self.trace_id = None
  83. self.params = params
  84. self.mysql_client = mysql_client
  85. self.mini_map = {
  86. 25: {
  87. "avatar": "https://rescdn.yishihui.com/0temp/ttmhzfsh.png",
  88. "id": "wx0b7d95eb293b783b",
  89. "name": "天天美好祝福生活",
  90. "index": 25,
  91. },
  92. 29: {
  93. "avatar": "https://rescdn.yishihui.com/0temp/cyfyld.png",
  94. "id": "wx65c76bb4c67934db",
  95. "name": "财运福运来到",
  96. "index": 29,
  97. },
  98. 31: {
  99. "avatar": "https://rescdn.yishihui.com/0temp/mhzfshxf2.png",
  100. "id": "wx2e4478b1641b3b15",
  101. "name": "美好祝福生活幸福",
  102. "index": 31,
  103. },
  104. 36: {
  105. "avatar": "https://rescdn.yishihui.com/0temp/zfyfyc.jpeg",
  106. "id": "wxcddf231abd0dabdc",
  107. "name": "祝福有福有财",
  108. "index": 36,
  109. },
  110. 27: {
  111. "avatar": "https://rescdn.yishihui.com/0temp/xymhfqdd.png",
  112. "id": "wx7187c217efef24a7",
  113. "name": "幸运美好福气多多",
  114. "index": 27,
  115. },
  116. 33: {
  117. "avatar": "https://rescdn.yishihui.com/0temp/ssnnfqd.jpeg",
  118. "id": "wx5e67713277549b6f",
  119. "name": "年年岁岁福气多",
  120. "index": 33,
  121. },
  122. }
  123. def checkParams(self):
  124. """
  125. 校验参数
  126. :return:
  127. """
  128. try:
  129. self.trace_id = self.params['traceId']
  130. self.kimi_title = self.params['kimiTitle']
  131. self.gh_id = self.params['ghId']
  132. self.mini_type = self.params['miniType']
  133. self.video_obj_list = self.params['videoObjList']
  134. return None
  135. except Exception as e:
  136. response = {
  137. "traceId": self.trace_id,
  138. "error": str(e),
  139. "info": "参数校验失败"
  140. }
  141. return response
  142. def createGzhPath(self, video_id, shared_uid, gh_id):
  143. """
  144. :param gh_id: 公众号账号的gh_id
  145. :param video_id: 视频 id
  146. :param shared_uid: 分享 id
  147. """
  148. def generate_source_id():
  149. """
  150. generate_source_id
  151. :return:
  152. """
  153. timestamp = str(int(time.time() * 1000))
  154. random_str = str(random.randint(1000, 9999))
  155. hash_input = f"{timestamp}-{random_str}"
  156. return hashlib.md5(hash_input.encode()).hexdigest()
  157. root_share_id = str(uuid.uuid4())
  158. if self.mini_type == 2:
  159. source_id = (
  160. "touliu_tencentGzhArticle_{}_".format(gh_id) + generate_source_id()
  161. )
  162. elif self.mini_type == 1:
  163. source_id = "longArticles_" + generate_source_id()
  164. elif self.mini_type == 3:
  165. source_id = "WeCom_" + generate_source_id()
  166. else:
  167. source_id = "Error mini_program_type {}".format(self.mini_type)
  168. url = f"pages/user-videos?id={video_id}&su={shared_uid}&fromGzh=1&rootShareId={root_share_id}&shareId={root_share_id}&rootSourceId={source_id}"
  169. # 自动把 root_share_id 加入到白名单
  170. # auto_white(root_share_id)
  171. return (
  172. root_share_id,
  173. source_id,
  174. f"pages/category?jumpPage={urllib.parse.quote(url, safe='')}",
  175. )
  176. def chooseMiniProgram(self, mini_id):
  177. """
  178. 获取小程序分享卡片
  179. :return:
  180. """
  181. mini_info = self.mini_map[mini_id]
  182. return (
  183. mini_info["avatar"],
  184. mini_info["id"],
  185. mini_info["name"],
  186. mini_info["index"],
  187. )
  188. async def generateSingleCard(self, video_id, title, index, gh_id, mini_id):
  189. """
  190. 生成单个分享卡片
  191. :return:
  192. """
  193. response = await getPQVideoDetail(video_id)
  194. print(response)
  195. productionCover = response["data"][0]["shareImgPath"]
  196. videoUrl = response["data"][0]["videoPath"]
  197. user_id = response["data"][0]["user"]["uid"]
  198. programAvatar, programId, programName, pqMiniId = self.chooseMiniProgram(mini_id)
  199. root_share_id, source_id, productionPath = self.createGzhPath(video_id, user_id, gh_id)
  200. logging(
  201. code="1002",
  202. info="root_share_id --{}, productionPath -- {}".format(
  203. root_share_id, productionPath
  204. ),
  205. function="process",
  206. trace_id=self.trace_id,
  207. )
  208. result = {
  209. "productionCover": productionCover,
  210. "productionName": title,
  211. "programAvatar": programAvatar,
  212. "programId": programId,
  213. "programName": programName,
  214. "source": "web",
  215. "rootShareId": root_share_id,
  216. "productionPath": productionPath,
  217. "videoUrl": videoUrl,
  218. "mini_id": mini_id,
  219. "paragraphPosition": index * 0.25,
  220. }
  221. update_result_sql = f"""
  222. UPDATE {db_article}
  223. SET
  224. result{index} = %s,
  225. success = %s
  226. WHERE
  227. trace_id = %s;
  228. """
  229. await self.mysql_client.async_insert(
  230. sql=update_result_sql,
  231. params=(json.dumps(result, ensure_ascii=False), 1, self.trace_id),
  232. )
  233. logging(
  234. code="2000",
  235. info="统计 root_share_id && video_id",
  236. function="process",
  237. trace_id=self.trace_id,
  238. data={
  239. "rootShareId": root_share_id,
  240. "videoId": video_id,
  241. "sourceId": source_id,
  242. },
  243. )
  244. return result
  245. async def generateCards(self, video_list, kimi_title, gh_id):
  246. """
  247. 生成一组卡片
  248. :param video_list:
  249. :param kimi_title:
  250. :param gh_id:
  251. :return:
  252. """
  253. L = []
  254. if self.mini_type == 1:
  255. mini_id_list = [25, 29, 31]
  256. video_count = len(video_list)
  257. mini_choice_index = random.sample(range(3), video_count)
  258. mini_choice_item = [mini_id_list[i] for i in mini_choice_index]
  259. for index, video_id in enumerate(video_list, 1):
  260. result = await self.generateSingleCard(
  261. video_id=video_id,
  262. title=kimi_title,
  263. index=index,
  264. gh_id=gh_id,
  265. mini_id=mini_choice_item[index - 1],
  266. )
  267. L.append(result)
  268. elif self.mini_type == 2:
  269. for index, video_id in enumerate(video_list, 1):
  270. result = await self.generateSingleCard(
  271. video_id=video_id,
  272. title=kimi_title,
  273. index=index,
  274. gh_id=gh_id,
  275. mini_id=33,
  276. )
  277. L.append(result)
  278. elif self.mini_type == 3:
  279. for index, video_id in enumerate(video_list, 1):
  280. result = await self.generateSingleCard(
  281. video_id=video_id,
  282. title=kimi_title,
  283. index=index,
  284. gh_id=gh_id,
  285. mini_id=27,
  286. )
  287. L.append(result)
  288. return L
  289. async def getVideoIdList(self):
  290. """
  291. 获取匹配文章的id_list
  292. :return:
  293. """
  294. vid_list = []
  295. for video_obj in self.video_obj_list:
  296. video_publish_info = await publishToPQ(video_obj=video_obj)
  297. video_id = video_publish_info['data']['id']
  298. vid_list.append(video_id)
  299. return vid_list
  300. async def deal(self):
  301. """
  302. deal function
  303. :return:
  304. """
  305. params_error = self.checkParams()
  306. if params_error:
  307. return params_error
  308. else:
  309. video_list = await self.getVideoIdList()
  310. card_list = await self.generateCards(
  311. video_list, self.kimi_title, self.gh_id
  312. )
  313. response = {
  314. "trace_id": self.trace_id,
  315. "miniprogramList": card_list
  316. }
  317. return response