matchArticle_deal.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. # encoding: utf-8
  2. """
  3. @author: luojunhui
  4. """
  5. import json
  6. import time
  7. import requests
  8. from uuid import uuid4
  9. from spider.baidu_imgs import get_img_list
  10. from applications.config import db_config
  11. from applications.functions import whisper
  12. from applications.pipeline import question_fission, search_materials, summary_articles, generate_text
  13. class MatchArticlesTask(object):
  14. """
  15. 视频匹配文章流程
  16. 流程
  17. 1. 拿视频id,标题等信息匹配账号
  18. 2. 账号匹配成功后,使用 AI Search 获取文章的生产资料
  19. 3. 通过GPT4, 腾讯元宝等AI 优化文章
  20. 4. 生成一篇文章,包含标题,文本,封面, 插图, 以及匹配到到小程序
  21. """
  22. def __init__(self, mysql_client):
  23. """
  24. :param mysql_client mysql服务池
  25. """
  26. self.mysql_client = mysql_client
  27. async def whisper_task(self):
  28. """
  29. 执行定时任务,把库里面的视频转文本
  30. :return:
  31. """
  32. select_sql = f"""SELECT video_id FROM {db_config} WHERE status_code = 0 ORDER BY id ASC limit 1;"""
  33. video_list = await self.mysql_client.select(select_sql)
  34. async def whisper_and_update(video_id, mysql_client):
  35. """
  36. whisper处理视频并且把信息更新到mysql表中
  37. :param video_id:
  38. :param mysql_client:
  39. :return:
  40. """
  41. w_response = whisper(video_id)
  42. print(w_response)
  43. text = w_response['text']
  44. update_sql = f"""
  45. UPDATE {db_config}
  46. SET
  47. video_text = '{text}',
  48. status_code = 1
  49. WHERE video_id = {video_id};
  50. """
  51. await mysql_client.async_insert(sql=update_sql)
  52. for vid in video_list:
  53. await whisper_and_update(video_id=vid[0], mysql_client=self.mysql_client)
  54. async def materials_task(self):
  55. """
  56. 获取task的材料
  57. :return:
  58. """
  59. select_sql = f"""SELECT task_id, video_title, video_text FROM {db_config} WHERE status_code = 1 ORDER BY id ASC limit 1;"""
  60. task_list = await self.mysql_client.select(select_sql)
  61. async def find_material(task_tuple, mysql_client):
  62. task_id, title, text = task_tuple
  63. # 先用视频标题作为query, 后续可逐步优化
  64. question_dict = question_fission(title)
  65. material_dict = {}
  66. for question_key in question_dict:
  67. question = question_dict[question_key]
  68. material = generate_text(question)
  69. material_dict[question] = material
  70. material_result = json.dumps(material_dict, ensure_ascii=False)
  71. update_sql = f"""
  72. UPDATE {db_config}
  73. SET materials = '{material_result}', status_code = 2
  74. WHERE task_id = '{task_id}'
  75. """
  76. print(update_sql)
  77. await mysql_client.async_insert(sql=update_sql)
  78. for task in task_list:
  79. await find_material(task, self.mysql_client)
  80. async def ai_task(self):
  81. """
  82. 通过ai工具和材料来生成文章
  83. :return:
  84. """
  85. select_sql = f"""SELECT task_id, video_title, materials FROM {db_config} WHERE status_code = 2 ORDER BY id ASC limit 1;"""
  86. task_list = await self.mysql_client.select(sql=select_sql)
  87. async def ai_generate_text(task_tuple, mysql_client):
  88. task_id, video_title, materials = task_tuple
  89. ai_title, ai_text = summary_articles(materials)
  90. imgs = get_img_list(video_title)
  91. update_sql = f"""
  92. UPDATE {db_config}
  93. SET ai_text = '{ai_text}', ai_title = '{ai_title}', cover = '{imgs[0]}',img_list = '{json.dumps(imgs, ensure_ascii=False)}',status_code = 3
  94. WHERE task_id = '{task_id}';
  95. """
  96. print(update_sql)
  97. await mysql_client.async_insert(sql=update_sql)
  98. for task in task_list:
  99. await ai_generate_text(task, self.mysql_client)
  100. class MatchArticlesV1(object):
  101. """
  102. 接受请求,并且把数据存储到MySQL服务器中
  103. """
  104. def __init__(self, params, mysql_client):
  105. self.title = None
  106. self.video_id = None
  107. self.params = params
  108. self.mysql_client = mysql_client
  109. def check_params(self):
  110. """
  111. params check
  112. """
  113. try:
  114. self.video_id = self.params['videoId']
  115. self.title = self.params['title']
  116. return None
  117. except AttributeError as e:
  118. response = {
  119. "code": 0,
  120. "error": "Params Error",
  121. "msg": "Params: {} is not correct".format(e)
  122. }
  123. return response
  124. async def record(self):
  125. """
  126. 将数据存储到服务中
  127. :return:
  128. """
  129. request_id = "Article_{}_{}".format(uuid4(), int(time.time()))
  130. request_time = int(time.time())
  131. insert_sql = f"""
  132. INSERT INTO {db_config}
  133. (video_id, task_id, video_title, request_time)
  134. VALUES
  135. ({self.video_id}, '{request_id}', '{self.title}', {request_time})
  136. """
  137. await self.mysql_client.async_insert(sql=insert_sql)
  138. return request_id
  139. async def deal(self):
  140. """
  141. deal function
  142. :return:
  143. """
  144. params_error = self.check_params()
  145. if params_error:
  146. return params_error
  147. else:
  148. task_id = await self.record()
  149. res = {
  150. "status": "success",
  151. "task_id": task_id
  152. }
  153. return res
  154. class MatchArticlesV2(object):
  155. """
  156. 获取视频信息
  157. """
  158. def __init__(self, params, mysql_client):
  159. self.task_id = None
  160. self.params = params
  161. self.mysql_client = mysql_client
  162. def check_params(self):
  163. """
  164. params check
  165. """
  166. try:
  167. self.task_id = self.params['taskId']
  168. return None
  169. except AttributeError as e:
  170. response = {
  171. "code": 0,
  172. "error": "Params Error",
  173. "msg": "Params: {} is not correct".format(e)
  174. }
  175. return response
  176. @classmethod
  177. def get_basic_video_info(cls, video_id):
  178. """
  179. 获取视频信息
  180. :return:
  181. """
  182. url = "http://localhost:8888/singleVideo"
  183. body = {
  184. "videoId": video_id
  185. }
  186. headers = {
  187. "Content-Type": "application/json"
  188. }
  189. response = requests.post(url=url, json=body, headers=headers)
  190. return response.json()
  191. async def recall_articles(self):
  192. """
  193. 从表中召回视频
  194. :return:
  195. """
  196. select_sql = f"""
  197. SELECT video_id, cover, img_list, ai_text, ai_title, status_code
  198. FROM {db_config}
  199. WHERE task_id = '{self.task_id}';
  200. """
  201. result = await self.mysql_client.select(select_sql)
  202. video_id, cover, images, ai_text, ai_title, status_code = result[0]
  203. match status_code:
  204. case 0:
  205. return {
  206. "task_id": self.task_id,
  207. "code": 0,
  208. "msg": "未处理"
  209. }
  210. case 1:
  211. return {
  212. "task_id": self.task_id,
  213. "code": 1,
  214. "msg": "处理中, 已经用whisper生成视频文本"
  215. }
  216. case 2:
  217. return {
  218. "task_id": self.task_id,
  219. "code": 2,
  220. "msg": "处理中, 已经用AI搜索生成资料"
  221. }
  222. case 3:
  223. result = {
  224. "title": ai_title,
  225. "cover": cover,
  226. "content": ai_text,
  227. "images": json.loads(images),
  228. "videos": [
  229. self.get_basic_video_info(video_id)
  230. ]
  231. }
  232. response = {
  233. "status": "success",
  234. "article": result
  235. }
  236. return response
  237. async def deal(self):
  238. params_error = self.check_params()
  239. if params_error:
  240. return params_error
  241. else:
  242. return await self.recall_articles()