xigua_author_test.py 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. import json
  2. import os
  3. import random
  4. import sys
  5. import string
  6. import time
  7. import uuid
  8. import base64
  9. import requests
  10. from fake_useragent import FakeUserAgent
  11. from common.userAgent import get_random_user_agent
  12. from common.mq import MQ
  13. sys.path.append(os.getcwd())
  14. from common.pipeline import PiaoQuanPipelineTest
  15. def tunnel_proxies():
  16. # 隧道域名:端口号
  17. tunnel = "q796.kdltps.com:15818"
  18. # 用户名密码方式
  19. username = "t17772369458618"
  20. password = "5zqcjkmy"
  21. tunnel_proxies = {
  22. "http": "http://%(user)s:%(pwd)s@%(proxy)s/"
  23. % {"user": username, "pwd": password, "proxy": tunnel},
  24. "https": "http://%(user)s:%(pwd)s@%(proxy)s/"
  25. % {"user": username, "pwd": password, "proxy": tunnel},
  26. }
  27. return tunnel_proxies
  28. def random_signature():
  29. src_digits = string.digits # string_数字
  30. src_uppercase = string.ascii_uppercase # string_大写字母
  31. src_lowercase = string.ascii_lowercase # string_小写字母
  32. digits_num = random.randint(1, 6)
  33. uppercase_num = random.randint(1, 26 - digits_num - 1)
  34. lowercase_num = 26 - (digits_num + uppercase_num)
  35. password = (
  36. random.sample(src_digits, digits_num)
  37. + random.sample(src_uppercase, uppercase_num)
  38. + random.sample(src_lowercase, lowercase_num)
  39. )
  40. random.shuffle(password)
  41. new_password = "AAAAAAAAAA" + "".join(password)[10:-4] + "AAAB"
  42. new_password_start = new_password[0:18]
  43. new_password_end = new_password[-7:]
  44. if new_password[18] == "8":
  45. new_password = new_password_start + "w" + new_password_end
  46. elif new_password[18] == "9":
  47. new_password = new_password_start + "x" + new_password_end
  48. elif new_password[18] == "-":
  49. new_password = new_password_start + "y" + new_password_end
  50. elif new_password[18] == ".":
  51. new_password = new_password_start + "z" + new_password_end
  52. else:
  53. new_password = new_password_start + "y" + new_password_end
  54. return new_password
  55. def get_video_url(video_info):
  56. video_url_dict = {}
  57. # video_url
  58. if "videoResource" not in video_info:
  59. video_url_dict["video_url"] = ""
  60. video_url_dict["audio_url"] = ""
  61. video_url_dict["video_width"] = 0
  62. video_url_dict["video_height"] = 0
  63. elif "dash_120fps" in video_info["videoResource"]:
  64. if (
  65. "video_list" in video_info["videoResource"]["dash_120fps"]
  66. and "video_4" in video_info["videoResource"]["dash_120fps"]["video_list"]
  67. ):
  68. video_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  69. "video_4"
  70. ]["backup_url_1"]
  71. audio_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  72. "video_4"
  73. ]["backup_url_1"]
  74. if len(video_url) % 3 == 1:
  75. video_url += "=="
  76. elif len(video_url) % 3 == 2:
  77. video_url += "="
  78. elif len(audio_url) % 3 == 1:
  79. audio_url += "=="
  80. elif len(audio_url) % 3 == 2:
  81. audio_url += "="
  82. video_url = base64.b64decode(video_url).decode("utf8")
  83. audio_url = base64.b64decode(audio_url).decode("utf8")
  84. video_width = video_info["videoResource"]["dash_120fps"]["video_list"][
  85. "video_4"
  86. ]["vwidth"]
  87. video_height = video_info["videoResource"]["dash_120fps"]["video_list"][
  88. "video_4"
  89. ]["vheight"]
  90. video_url_dict["video_url"] = video_url
  91. video_url_dict["audio_url"] = audio_url
  92. video_url_dict["video_width"] = video_width
  93. video_url_dict["video_height"] = video_height
  94. elif (
  95. "video_list" in video_info["videoResource"]["dash_120fps"]
  96. and "video_3" in video_info["videoResource"]["dash_120fps"]["video_list"]
  97. ):
  98. video_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  99. "video_3"
  100. ]["backup_url_1"]
  101. audio_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  102. "video_3"
  103. ]["backup_url_1"]
  104. if len(video_url) % 3 == 1:
  105. video_url += "=="
  106. elif len(video_url) % 3 == 2:
  107. video_url += "="
  108. elif len(audio_url) % 3 == 1:
  109. audio_url += "=="
  110. elif len(audio_url) % 3 == 2:
  111. audio_url += "="
  112. video_url = base64.b64decode(video_url).decode("utf8")
  113. audio_url = base64.b64decode(audio_url).decode("utf8")
  114. video_width = video_info["videoResource"]["dash_120fps"]["video_list"][
  115. "video_3"
  116. ]["vwidth"]
  117. video_height = video_info["videoResource"]["dash_120fps"]["video_list"][
  118. "video_3"
  119. ]["vheight"]
  120. video_url_dict["video_url"] = video_url
  121. video_url_dict["audio_url"] = audio_url
  122. video_url_dict["video_width"] = video_width
  123. video_url_dict["video_height"] = video_height
  124. elif (
  125. "video_list" in video_info["videoResource"]["dash_120fps"]
  126. and "video_2" in video_info["videoResource"]["dash_120fps"]["video_list"]
  127. ):
  128. video_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  129. "video_2"
  130. ]["backup_url_1"]
  131. audio_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  132. "video_2"
  133. ]["backup_url_1"]
  134. if len(video_url) % 3 == 1:
  135. video_url += "=="
  136. elif len(video_url) % 3 == 2:
  137. video_url += "="
  138. elif len(audio_url) % 3 == 1:
  139. audio_url += "=="
  140. elif len(audio_url) % 3 == 2:
  141. audio_url += "="
  142. video_url = base64.b64decode(video_url).decode("utf8")
  143. audio_url = base64.b64decode(audio_url).decode("utf8")
  144. video_width = video_info["videoResource"]["dash_120fps"]["video_list"][
  145. "video_2"
  146. ]["vwidth"]
  147. video_height = video_info["videoResource"]["dash_120fps"]["video_list"][
  148. "video_2"
  149. ]["vheight"]
  150. video_url_dict["video_url"] = video_url
  151. video_url_dict["audio_url"] = audio_url
  152. video_url_dict["video_width"] = video_width
  153. video_url_dict["video_height"] = video_height
  154. elif (
  155. "video_list" in video_info["videoResource"]["dash_120fps"]
  156. and "video_1" in video_info["videoResource"]["dash_120fps"]["video_list"]
  157. ):
  158. video_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  159. "video_1"
  160. ]["backup_url_1"]
  161. audio_url = video_info["videoResource"]["dash_120fps"]["video_list"][
  162. "video_1"
  163. ]["backup_url_1"]
  164. if len(video_url) % 3 == 1:
  165. video_url += "=="
  166. elif len(video_url) % 3 == 2:
  167. video_url += "="
  168. elif len(audio_url) % 3 == 1:
  169. audio_url += "=="
  170. elif len(audio_url) % 3 == 2:
  171. audio_url += "="
  172. video_url = base64.b64decode(video_url).decode("utf8")
  173. audio_url = base64.b64decode(audio_url).decode("utf8")
  174. video_width = video_info["videoResource"]["dash_120fps"]["video_list"][
  175. "video_1"
  176. ]["vwidth"]
  177. video_height = video_info["videoResource"]["dash_120fps"]["video_list"][
  178. "video_1"
  179. ]["vheight"]
  180. video_url_dict["video_url"] = video_url
  181. video_url_dict["audio_url"] = audio_url
  182. video_url_dict["video_width"] = video_width
  183. video_url_dict["video_height"] = video_height
  184. elif (
  185. "dynamic_video" in video_info["videoResource"]["dash_120fps"]
  186. and "dynamic_video_list"
  187. in video_info["videoResource"]["dash_120fps"]["dynamic_video"]
  188. and "dynamic_audio_list"
  189. in video_info["videoResource"]["dash_120fps"]["dynamic_video"]
  190. and len(
  191. video_info["videoResource"]["dash_120fps"]["dynamic_video"][
  192. "dynamic_video_list"
  193. ]
  194. )
  195. != 0
  196. and len(
  197. video_info["videoResource"]["dash_120fps"]["dynamic_video"][
  198. "dynamic_audio_list"
  199. ]
  200. )
  201. != 0
  202. ):
  203. video_url = video_info["videoResource"]["dash_120fps"]["dynamic_video"][
  204. "dynamic_video_list"
  205. ][-1]["backup_url_1"]
  206. audio_url = video_info["videoResource"]["dash_120fps"]["dynamic_video"][
  207. "dynamic_audio_list"
  208. ][-1]["backup_url_1"]
  209. if len(video_url) % 3 == 1:
  210. video_url += "=="
  211. elif len(video_url) % 3 == 2:
  212. video_url += "="
  213. elif len(audio_url) % 3 == 1:
  214. audio_url += "=="
  215. elif len(audio_url) % 3 == 2:
  216. audio_url += "="
  217. video_url = base64.b64decode(video_url).decode("utf8")
  218. audio_url = base64.b64decode(audio_url).decode("utf8")
  219. video_width = video_info["videoResource"]["dash_120fps"]["dynamic_video"][
  220. "dynamic_video_list"
  221. ][-1]["vwidth"]
  222. video_height = video_info["videoResource"]["dash_120fps"]["dynamic_video"][
  223. "dynamic_video_list"
  224. ][-1]["vheight"]
  225. video_url_dict["video_url"] = video_url
  226. video_url_dict["audio_url"] = audio_url
  227. video_url_dict["video_width"] = video_width
  228. video_url_dict["video_height"] = video_height
  229. else:
  230. video_url_dict["video_url"] = ""
  231. video_url_dict["audio_url"] = ""
  232. video_url_dict["video_width"] = 0
  233. video_url_dict["video_height"] = 0
  234. elif "dash" in video_info["videoResource"]:
  235. if (
  236. "video_list" in video_info["videoResource"]["dash"]
  237. and "video_4" in video_info["videoResource"]["dash"]["video_list"]
  238. ):
  239. video_url = video_info["videoResource"]["dash"]["video_list"]["video_4"][
  240. "backup_url_1"
  241. ]
  242. audio_url = video_info["videoResource"]["dash"]["video_list"]["video_4"][
  243. "backup_url_1"
  244. ]
  245. if len(video_url) % 3 == 1:
  246. video_url += "=="
  247. elif len(video_url) % 3 == 2:
  248. video_url += "="
  249. elif len(audio_url) % 3 == 1:
  250. audio_url += "=="
  251. elif len(audio_url) % 3 == 2:
  252. audio_url += "="
  253. video_url = base64.b64decode(video_url).decode("utf8")
  254. audio_url = base64.b64decode(audio_url).decode("utf8")
  255. video_width = video_info["videoResource"]["dash"]["video_list"]["video_4"][
  256. "vwidth"
  257. ]
  258. video_height = video_info["videoResource"]["dash"]["video_list"]["video_4"][
  259. "vheight"
  260. ]
  261. video_url_dict["video_url"] = video_url
  262. video_url_dict["audio_url"] = audio_url
  263. video_url_dict["video_width"] = video_width
  264. video_url_dict["video_height"] = video_height
  265. elif (
  266. "video_list" in video_info["videoResource"]["dash"]
  267. and "video_3" in video_info["videoResource"]["dash"]["video_list"]
  268. ):
  269. video_url = video_info["videoResource"]["dash"]["video_list"]["video_3"][
  270. "backup_url_1"
  271. ]
  272. audio_url = video_info["videoResource"]["dash"]["video_list"]["video_3"][
  273. "backup_url_1"
  274. ]
  275. if len(video_url) % 3 == 1:
  276. video_url += "=="
  277. elif len(video_url) % 3 == 2:
  278. video_url += "="
  279. elif len(audio_url) % 3 == 1:
  280. audio_url += "=="
  281. elif len(audio_url) % 3 == 2:
  282. audio_url += "="
  283. video_url = base64.b64decode(video_url).decode("utf8")
  284. audio_url = base64.b64decode(audio_url).decode("utf8")
  285. video_width = video_info["videoResource"]["dash"]["video_list"]["video_3"][
  286. "vwidth"
  287. ]
  288. video_height = video_info["videoResource"]["dash"]["video_list"]["video_3"][
  289. "vheight"
  290. ]
  291. video_url_dict["video_url"] = video_url
  292. video_url_dict["audio_url"] = audio_url
  293. video_url_dict["video_width"] = video_width
  294. video_url_dict["video_height"] = video_height
  295. elif (
  296. "video_list" in video_info["videoResource"]["dash"]
  297. and "video_2" in video_info["videoResource"]["dash"]["video_list"]
  298. ):
  299. video_url = video_info["videoResource"]["dash"]["video_list"]["video_2"][
  300. "backup_url_1"
  301. ]
  302. audio_url = video_info["videoResource"]["dash"]["video_list"]["video_2"][
  303. "backup_url_1"
  304. ]
  305. if len(video_url) % 3 == 1:
  306. video_url += "=="
  307. elif len(video_url) % 3 == 2:
  308. video_url += "="
  309. elif len(audio_url) % 3 == 1:
  310. audio_url += "=="
  311. elif len(audio_url) % 3 == 2:
  312. audio_url += "="
  313. video_url = base64.b64decode(video_url).decode("utf8")
  314. audio_url = base64.b64decode(audio_url).decode("utf8")
  315. video_width = video_info["videoResource"]["dash"]["video_list"]["video_2"][
  316. "vwidth"
  317. ]
  318. video_height = video_info["videoResource"]["dash"]["video_list"]["video_2"][
  319. "vheight"
  320. ]
  321. video_url_dict["video_url"] = video_url
  322. video_url_dict["audio_url"] = audio_url
  323. video_url_dict["video_width"] = video_width
  324. video_url_dict["video_height"] = video_height
  325. elif (
  326. "video_list" in video_info["videoResource"]["dash"]
  327. and "video_1" in video_info["videoResource"]["dash"]["video_list"]
  328. ):
  329. video_url = video_info["videoResource"]["dash"]["video_list"]["video_1"][
  330. "backup_url_1"
  331. ]
  332. audio_url = video_info["videoResource"]["dash"]["video_list"]["video_1"][
  333. "backup_url_1"
  334. ]
  335. if len(video_url) % 3 == 1:
  336. video_url += "=="
  337. elif len(video_url) % 3 == 2:
  338. video_url += "="
  339. elif len(audio_url) % 3 == 1:
  340. audio_url += "=="
  341. elif len(audio_url) % 3 == 2:
  342. audio_url += "="
  343. video_url = base64.b64decode(video_url).decode("utf8")
  344. audio_url = base64.b64decode(audio_url).decode("utf8")
  345. video_width = video_info["videoResource"]["dash"]["video_list"]["video_1"][
  346. "vwidth"
  347. ]
  348. video_height = video_info["videoResource"]["dash"]["video_list"]["video_1"][
  349. "vheight"
  350. ]
  351. video_url_dict["video_url"] = video_url
  352. video_url_dict["audio_url"] = audio_url
  353. video_url_dict["video_width"] = video_width
  354. video_url_dict["video_height"] = video_height
  355. elif (
  356. "dynamic_video" in video_info["videoResource"]["dash"]
  357. and "dynamic_video_list"
  358. in video_info["videoResource"]["dash"]["dynamic_video"]
  359. and "dynamic_audio_list"
  360. in video_info["videoResource"]["dash"]["dynamic_video"]
  361. and len(
  362. video_info["videoResource"]["dash"]["dynamic_video"][
  363. "dynamic_video_list"
  364. ]
  365. )
  366. != 0
  367. and len(
  368. video_info["videoResource"]["dash"]["dynamic_video"][
  369. "dynamic_audio_list"
  370. ]
  371. )
  372. != 0
  373. ):
  374. video_url = video_info["videoResource"]["dash"]["dynamic_video"][
  375. "dynamic_video_list"
  376. ][-1]["backup_url_1"]
  377. audio_url = video_info["videoResource"]["dash"]["dynamic_video"][
  378. "dynamic_audio_list"
  379. ][-1]["backup_url_1"]
  380. if len(video_url) % 3 == 1:
  381. video_url += "=="
  382. elif len(video_url) % 3 == 2:
  383. video_url += "="
  384. elif len(audio_url) % 3 == 1:
  385. audio_url += "=="
  386. elif len(audio_url) % 3 == 2:
  387. audio_url += "="
  388. video_url = base64.b64decode(video_url).decode("utf8")
  389. audio_url = base64.b64decode(audio_url).decode("utf8")
  390. video_width = video_info["videoResource"]["dash"]["dynamic_video"][
  391. "dynamic_video_list"
  392. ][-1]["vwidth"]
  393. video_height = video_info["videoResource"]["dash"]["dynamic_video"][
  394. "dynamic_video_list"
  395. ][-1]["vheight"]
  396. video_url_dict["video_url"] = video_url
  397. video_url_dict["audio_url"] = audio_url
  398. video_url_dict["video_width"] = video_width
  399. video_url_dict["video_height"] = video_height
  400. else:
  401. video_url_dict["video_url"] = ""
  402. video_url_dict["audio_url"] = ""
  403. video_url_dict["video_width"] = 0
  404. video_url_dict["video_height"] = 0
  405. elif "normal" in video_info["videoResource"]:
  406. if (
  407. "video_list" in video_info["videoResource"]["normal"]
  408. and "video_4" in video_info["videoResource"]["normal"]["video_list"]
  409. ):
  410. video_url = video_info["videoResource"]["normal"]["video_list"]["video_4"][
  411. "backup_url_1"
  412. ]
  413. audio_url = video_info["videoResource"]["normal"]["video_list"]["video_4"][
  414. "backup_url_1"
  415. ]
  416. if len(video_url) % 3 == 1:
  417. video_url += "=="
  418. elif len(video_url) % 3 == 2:
  419. video_url += "="
  420. elif len(audio_url) % 3 == 1:
  421. audio_url += "=="
  422. elif len(audio_url) % 3 == 2:
  423. audio_url += "="
  424. video_url = base64.b64decode(video_url).decode("utf8")
  425. audio_url = base64.b64decode(audio_url).decode("utf8")
  426. video_width = video_info["videoResource"]["normal"]["video_list"][
  427. "video_4"
  428. ]["vwidth"]
  429. video_height = video_info["videoResource"]["normal"]["video_list"][
  430. "video_4"
  431. ]["vheight"]
  432. video_url_dict["video_url"] = video_url
  433. video_url_dict["audio_url"] = audio_url
  434. video_url_dict["video_width"] = video_width
  435. video_url_dict["video_height"] = video_height
  436. elif (
  437. "video_list" in video_info["videoResource"]["normal"]
  438. and "video_3" in video_info["videoResource"]["normal"]["video_list"]
  439. ):
  440. video_url = video_info["videoResource"]["normal"]["video_list"]["video_3"][
  441. "backup_url_1"
  442. ]
  443. audio_url = video_info["videoResource"]["normal"]["video_list"]["video_3"][
  444. "backup_url_1"
  445. ]
  446. if len(video_url) % 3 == 1:
  447. video_url += "=="
  448. elif len(video_url) % 3 == 2:
  449. video_url += "="
  450. elif len(audio_url) % 3 == 1:
  451. audio_url += "=="
  452. elif len(audio_url) % 3 == 2:
  453. audio_url += "="
  454. video_url = base64.b64decode(video_url).decode("utf8")
  455. audio_url = base64.b64decode(audio_url).decode("utf8")
  456. video_width = video_info["videoResource"]["normal"]["video_list"][
  457. "video_3"
  458. ]["vwidth"]
  459. video_height = video_info["videoResource"]["normal"]["video_list"][
  460. "video_3"
  461. ]["vheight"]
  462. video_url_dict["video_url"] = video_url
  463. video_url_dict["audio_url"] = audio_url
  464. video_url_dict["video_width"] = video_width
  465. video_url_dict["video_height"] = video_height
  466. elif (
  467. "video_list" in video_info["videoResource"]["normal"]
  468. and "video_2" in video_info["videoResource"]["normal"]["video_list"]
  469. ):
  470. video_url = video_info["videoResource"]["normal"]["video_list"]["video_2"][
  471. "backup_url_1"
  472. ]
  473. audio_url = video_info["videoResource"]["normal"]["video_list"]["video_2"][
  474. "backup_url_1"
  475. ]
  476. if len(video_url) % 3 == 1:
  477. video_url += "=="
  478. elif len(video_url) % 3 == 2:
  479. video_url += "="
  480. elif len(audio_url) % 3 == 1:
  481. audio_url += "=="
  482. elif len(audio_url) % 3 == 2:
  483. audio_url += "="
  484. video_url = base64.b64decode(video_url).decode("utf8")
  485. audio_url = base64.b64decode(audio_url).decode("utf8")
  486. video_width = video_info["videoResource"]["normal"]["video_list"][
  487. "video_2"
  488. ]["vwidth"]
  489. video_height = video_info["videoResource"]["normal"]["video_list"][
  490. "video_2"
  491. ]["vheight"]
  492. video_url_dict["video_url"] = video_url
  493. video_url_dict["audio_url"] = audio_url
  494. video_url_dict["video_width"] = video_width
  495. video_url_dict["video_height"] = video_height
  496. elif (
  497. "video_list" in video_info["videoResource"]["normal"]
  498. and "video_1" in video_info["videoResource"]["normal"]["video_list"]
  499. ):
  500. video_url = video_info["videoResource"]["normal"]["video_list"]["video_1"][
  501. "backup_url_1"
  502. ]
  503. audio_url = video_info["videoResource"]["normal"]["video_list"]["video_1"][
  504. "backup_url_1"
  505. ]
  506. if len(video_url) % 3 == 1:
  507. video_url += "=="
  508. elif len(video_url) % 3 == 2:
  509. video_url += "="
  510. elif len(audio_url) % 3 == 1:
  511. audio_url += "=="
  512. elif len(audio_url) % 3 == 2:
  513. audio_url += "="
  514. video_url = base64.b64decode(video_url).decode("utf8")
  515. audio_url = base64.b64decode(audio_url).decode("utf8")
  516. video_width = video_info["videoResource"]["normal"]["video_list"][
  517. "video_1"
  518. ]["vwidth"]
  519. video_height = video_info["videoResource"]["normal"]["video_list"][
  520. "video_1"
  521. ]["vheight"]
  522. video_url_dict["video_url"] = video_url
  523. video_url_dict["audio_url"] = audio_url
  524. video_url_dict["video_width"] = video_width
  525. video_url_dict["video_height"] = video_height
  526. elif (
  527. "dynamic_video" in video_info["videoResource"]["normal"]
  528. and "dynamic_video_list"
  529. in video_info["videoResource"]["normal"]["dynamic_video"]
  530. and "dynamic_audio_list"
  531. in video_info["videoResource"]["normal"]["dynamic_video"]
  532. and len(
  533. video_info["videoResource"]["normal"]["dynamic_video"][
  534. "dynamic_video_list"
  535. ]
  536. )
  537. != 0
  538. and len(
  539. video_info["videoResource"]["normal"]["dynamic_video"][
  540. "dynamic_audio_list"
  541. ]
  542. )
  543. != 0
  544. ):
  545. video_url = video_info["videoResource"]["normal"]["dynamic_video"][
  546. "dynamic_video_list"
  547. ][-1]["backup_url_1"]
  548. audio_url = video_info["videoResource"]["normal"]["dynamic_video"][
  549. "dynamic_audio_list"
  550. ][-1]["backup_url_1"]
  551. if len(video_url) % 3 == 1:
  552. video_url += "=="
  553. elif len(video_url) % 3 == 2:
  554. video_url += "="
  555. elif len(audio_url) % 3 == 1:
  556. audio_url += "=="
  557. elif len(audio_url) % 3 == 2:
  558. audio_url += "="
  559. video_url = base64.b64decode(video_url).decode("utf8")
  560. audio_url = base64.b64decode(audio_url).decode("utf8")
  561. video_width = video_info["videoResource"]["normal"]["dynamic_video"][
  562. "dynamic_video_list"
  563. ][-1]["vwidth"]
  564. video_height = video_info["videoResource"]["normal"]["dynamic_video"][
  565. "dynamic_video_list"
  566. ][-1]["vheight"]
  567. video_url_dict["video_url"] = video_url
  568. video_url_dict["audio_url"] = audio_url
  569. video_url_dict["video_width"] = video_width
  570. video_url_dict["video_height"] = video_height
  571. else:
  572. video_url_dict["video_url"] = ""
  573. video_url_dict["audio_url"] = ""
  574. video_url_dict["video_width"] = 0
  575. video_url_dict["video_height"] = 0
  576. else:
  577. video_url_dict["video_url"] = ""
  578. video_url_dict["audio_url"] = ""
  579. video_url_dict["video_width"] = 0
  580. video_url_dict["video_height"] = 0
  581. return video_url_dict
  582. def get_comment_cnt(item_id):
  583. url = "https://www.ixigua.com/tlb/comment/article/v5/tab_comments/?"
  584. params = {
  585. "tab_index": "0",
  586. "count": "10",
  587. "offset": "10",
  588. "group_id": str(item_id),
  589. "item_id": str(item_id),
  590. "aid": "1768",
  591. "msToken": "50-JJObWB07HfHs-BMJWT1eIDX3G-6lPSF_i-QwxBIXE9VVa-iN0jbEXR5pG2DKjXBmP299n6ZTuXzY-GAy968CCvouSAYIS4GzvGQT3pNlKNejr5G4-1g==",
  592. "X-Bogus": "DFSzswVOyGtANVeWtCLMqR/F6q9U",
  593. "_signature":get_random_user_agent('pc'),
  594. }
  595. headers = {
  596. "authority": "www.ixigua.com",
  597. "accept": "application/json, text/plain, */*",
  598. "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
  599. "cache-control": "no-cache",
  600. "cookie": "MONITOR_WEB_ID=67cb5099-a022-4ec3-bb8e-c4de6ba51dd0; passport_csrf_token=72b2574f3c99f8ba670e42df430218fd; passport_csrf_token_default=72b2574f3c99f8ba670e42df430218fd; sid_guard=c7472b508ea631823ba765a60cf8757f%7C1680867422%7C3024002%7CFri%2C+12-May-2023+11%3A37%3A04+GMT; uid_tt=c13f47d51767f616befe32fb3e9f485a; uid_tt_ss=c13f47d51767f616befe32fb3e9f485a; sid_tt=c7472b508ea631823ba765a60cf8757f; sessionid=c7472b508ea631823ba765a60cf8757f; sessionid_ss=c7472b508ea631823ba765a60cf8757f; sid_ucp_v1=1.0.0-KGUzNWYxNmRkZGJiZjgxY2MzZWNkMTEzMTkwYjY1Yjg5OTY5NzVlNmMKFQiu3d-eqQIQ3oDAoQYYGCAMOAhACxoCaGwiIGM3NDcyYjUwOGVhNjMxODIzYmE3NjVhNjBjZjg3NTdm; ssid_ucp_v1=1.0.0-KGUzNWYxNmRkZGJiZjgxY2MzZWNkMTEzMTkwYjY1Yjg5OTY5NzVlNmMKFQiu3d-eqQIQ3oDAoQYYGCAMOAhACxoCaGwiIGM3NDcyYjUwOGVhNjMxODIzYmE3NjVhNjBjZjg3NTdm; odin_tt=b893608d4dde2e1e8df8cd5d97a0e2fbeafc4ca762ac72ebef6e6c97e2ed19859bb01d46b4190ddd6dd17d7f9678e1de; SEARCH_CARD_MODE=7168304743566296612_0; support_webp=true; support_avif=false; csrf_session_id=a5355d954d3c63ed1ba35faada452b4d; tt_scid=7Pux7s634-z8DYvCM20y7KigwH5u7Rh6D9C-RROpnT.aGMEcz6Vsxp.oai47wJqa4f86; ttwid=1%7CHHtv2QqpSGuSu8r-zXF1QoWsvjmNi1SJrqOrZzg-UCY%7C1683858689%7Ca5223fe1500578e01e138a0d71d6444692018296c4c24f5885af174a65873c95; ixigua-a-s=3; msToken=50-JJObWB07HfHs-BMJWT1eIDX3G-6lPSF_i-QwxBIXE9VVa-iN0jbEXR5pG2DKjXBmP299n6ZTuXzY-GAy968CCvouSAYIS4GzvGQT3pNlKNejr5G4-1g==; __ac_nonce=0645dcbf0005064517440; __ac_signature=_02B4Z6wo00f01FEGmAwAAIDBKchzCGqn-MBRJpyAAHAjieFC5GEg6gGiwz.I4PRrJl7f0GcixFrExKmgt6QI1i1S-dQyofPEj2ugWTCnmKUdJQv-wYuDofeKNe8VtMtZq2aKewyUGeKU-5Ud21; ixigua-a-s=3",
  601. "pragma": "no-cache",
  602. "referer": f"https://www.ixigua.com/{item_id}?logTag=3c5aa86a8600b9ab8540",
  603. "sec-ch-ua": '"Microsoft Edge";v="113", "Chromium";v="113", "Not-A.Brand";v="24"',
  604. "sec-ch-ua-mobile": "?0",
  605. "sec-ch-ua-platform": '"macOS"',
  606. "sec-fetch-dest": "empty",
  607. "sec-fetch-mode": "cors",
  608. "sec-fetch-site": "same-origin",
  609. "tt-anti-token": "cBITBHvmYjEygzv-f9c78c1297722cf1f559c74b084e4525ce4900bdcf9e8588f20cc7c2e3234422",
  610. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35",
  611. "x-secsdk-csrf-token": "000100000001f8e733cf37f0cd255a51aea9a81ff7bc0c09490cfe41ad827c3c5c18ec809279175e4d9f5553d8a5",
  612. }
  613. response = requests.get(
  614. url=url, headers=headers, params=params, proxies=tunnel_proxies(), timeout=5
  615. )
  616. response.close()
  617. if (
  618. response.status_code != 200
  619. or "total_number" not in response.json()
  620. or response.json() == {}
  621. ):
  622. return 0
  623. return response.json().get("total_number", 0)
  624. def get_video_info(item_id, trace_id):
  625. url = "https://www.ixigua.com/api/mixVideo/information?"
  626. headers = {
  627. "accept-encoding": "gzip, deflate",
  628. "accept-language": "zh-CN,zh-Hans;q=0.9",
  629. "user-agent": FakeUserAgent().random,
  630. "referer": "https://www.ixigua.com/7102614741050196520?logTag=0531c88ac04f38ab2c62",
  631. }
  632. params = {
  633. "mixId": str(item_id),
  634. "msToken": "IlG0wd0Pylyw9ghcYiB2YseUmTwrsrqqhXrbIcsSaTcLTJyVlbYJzk20zw3UO-CfrfC"
  635. "NVVIOBNjIl7vfBoxnVUwO9ZyzAI3umSKsT5-pef_RRfQCJwmA",
  636. "X-Bogus": "DFSzswVupYTANCJOSBk0P53WxM-r",
  637. "_signature": "_02B4Z6wo0000119LvEwAAIDCuktNZ0y5wkdfS7jAALThuOR8D9yWNZ.EmWHKV0WSn6Px"
  638. "fPsH9-BldyxVje0f49ryXgmn7Tzk-swEHNb15TiGqa6YF.cX0jW8Eds1TtJOIZyfc9s5emH7gdWN94",
  639. }
  640. cookies = {
  641. "ixigua-a-s": "1",
  642. "msToken": "IlG0wd0Pylyw9ghcYiB2YseUmTwrsrqqhXrbIcsSaTcLTJyVlbYJzk20zw3UO-CfrfCNVVIOB"
  643. "NjIl7vfBoxnVUwO9ZyzAI3umSKsT5-pef_RRfQCJwmA",
  644. "ttwid": "1%7C_yXQeHWwLZgCsgHClOwTCdYSOt_MjdOkgnPIkpi-Sr8%7C1661241238%7Cf57d0c5ef3f1d7"
  645. "6e049fccdca1ac54887c34d1f8731c8e51a49780ff0ceab9f8",
  646. "tt_scid": "QZ4l8KXDG0YAEaMCSbADdcybdKbUfG4BC6S4OBv9lpRS5VyqYLX2bIR8CTeZeGHR9ee3",
  647. "MONITOR_WEB_ID": "0a49204a-7af5-4e96-95f0-f4bafb7450ad",
  648. "__ac_nonce": "06304878000964fdad287",
  649. "__ac_signature": "_02B4Z6wo00f017Rcr3AAAIDCUVxeW1tOKEu0fKvAAI4cvoYzV-wBhq7B6D8k0no7lb"
  650. "FlvYoinmtK6UXjRIYPXnahUlFTvmWVtb77jsMkKAXzAEsLE56m36RlvL7ky.M3Xn52r9t1IEb7IR3ke8",
  651. "ttcid": "e56fabf6e85d4adf9e4d91902496a0e882",
  652. "_tea_utm_cache_1300": "undefined",
  653. "support_avif": "false",
  654. "support_webp": "false",
  655. "xiguavideopcwebid": "7134967546256016900",
  656. "xiguavideopcwebid.sig": "xxRww5R1VEMJN_dQepHorEu_eAc",
  657. }
  658. response = requests.get(
  659. url=url,
  660. headers=headers,
  661. params=params,
  662. cookies=cookies,
  663. proxies=tunnel_proxies(),
  664. timeout=5,
  665. )
  666. if (
  667. response.status_code != 200
  668. or "data" not in response.json()
  669. or response.json()["data"] == {}
  670. ):
  671. print("获取视频信息失败")
  672. return None
  673. else:
  674. video_info = (
  675. response.json()["data"]
  676. .get("gidInformation", {})
  677. .get("packerData", {})
  678. .get("video", {})
  679. )
  680. if video_info == {}:
  681. return None
  682. video_detail = get_video_url(video_info)
  683. video_dict = {
  684. "video_title": video_info.get("title", ""),
  685. "video_id": video_info.get("videoResource", {}).get("vid", ""),
  686. "gid": str(item_id),
  687. "play_cnt": int(video_info.get("video_watch_count", 0)),
  688. "like_cnt": int(video_info.get("video_like_count", 0)),
  689. "comment_cnt": int(get_comment_cnt(item_id)),
  690. "share_cnt": 0,
  691. "favorite_cnt": 0,
  692. "duration": int(video_info.get("video_duration", 0)),
  693. "video_width": int(video_detail["video_width"]),
  694. "video_height": int(video_detail["video_height"]),
  695. "publish_time_stamp": int(video_info.get("video_publish_time", 0)),
  696. "publish_time_str": time.strftime(
  697. "%Y-%m-%d %H:%M:%S",
  698. time.localtime(int(video_info.get("video_publish_time", 0))),
  699. ),
  700. "user_name": video_info.get("user_info", {}).get("name", ""),
  701. "user_id": str(video_info.get("user_info", {}).get("user_id", "")),
  702. "avatar_url": str(
  703. video_info.get("user_info", {}).get("avatar_url", "")
  704. ),
  705. "cover_url": video_info.get("poster_url", ""),
  706. "audio_url": video_detail["audio_url"],
  707. "video_url": video_detail["video_url"],
  708. "session": f"xigua-search-{int(time.time())}",
  709. }
  710. return video_dict
  711. class XiGuaAuthor:
  712. def __init__(self, platform, mode, rule_dict, env, user_list):
  713. self.platform = platform
  714. self.mode = mode
  715. self.rule_dict = rule_dict
  716. self.env = env
  717. self.user_list = user_list
  718. self.mq = MQ(topic_name="topic_crawler_etl_" + self.env)
  719. self.download_count = 0
  720. def get_author_list(self):
  721. # 每轮只抓取定量的数据,到达数量后自己退出
  722. max_count = int(self.rule_dict.get("videos_cnt", {}).get("min", 300))
  723. for user_dict in self.user_list[2: 3]:
  724. self.get_video_list(user_dict)
  725. if self.download_count <= max_count:
  726. self.get_video_list(user_dict)
  727. time.sleep(random.randint(1, 15))
  728. else:
  729. print("本轮已经抓取足够数量的视频,已经自动退出")
  730. return
  731. def get_video_list(self, user_dict):
  732. offset = 0
  733. signature = random_signature()
  734. url = "https://www.ixigua.com/api/videov2/author/new_video_list?"
  735. while True:
  736. params = {
  737. "to_user_id": str(
  738. user_dict["link"].replace("https://www.ixigua.com/home/", "")
  739. ),
  740. "offset": str(offset),
  741. "limit": "30",
  742. "maxBehotTime": "0",
  743. "order": "new",
  744. "isHome": "0",
  745. # 'msToken': 'G0eRzNkw189a8TLaXjc6nTHVMQwh9XcxVAqTbGKi7iPJdQcLwS3-XRrJ3MZ7QBfqErpxp3EX1WtvWOIcZ3NIgr41hgcd-v64so_RRj3YCRw1UsKW8mIssNLlIMspsg==',
  746. # 'X-Bogus': 'DFSzswVuEkUANjW9ShFTgR/F6qHt',
  747. "_signature": signature,
  748. }
  749. headers = {
  750. "referer": f'https://www.ixigua.com/home/{user_dict["link"].replace("https://www.ixigua.com/home/", "")}/video/?preActiveKey=hotsoon&list_entrance=userdetail',
  751. "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.41",
  752. }
  753. response = requests.get(
  754. url=url,
  755. headers=headers,
  756. params=params,
  757. proxies=tunnel_proxies(),
  758. timeout=5,
  759. )
  760. offset += 30
  761. if "data" not in response.text or response.status_code != 200:
  762. print(f"get_videoList:{response.text}\n")
  763. return
  764. elif not response.json()["data"]["videoList"]:
  765. print(f"没有更多数据啦~\n")
  766. return
  767. else:
  768. feeds = response.json()["data"]["videoList"]
  769. for video_obj in feeds:
  770. self.process_video_obj(video_obj, user_dict)
  771. # try:
  772. # print("扫描到一条视频")
  773. # self.process_video_obj(video_obj, user_dict)
  774. # except Exception as e:
  775. # print("抓取单条视频异常, 报错原因是: {}".format(e))
  776. def process_video_obj(self, video_obj, user_dict):
  777. trace_id = self.platform + str(uuid.uuid1())
  778. item_id = video_obj.get("item_id", "")
  779. if not item_id:
  780. print("无效视频")
  781. return
  782. # 获取视频信息
  783. video_dict = get_video_info(item_id=item_id, trace_id=trace_id)
  784. video_dict["out_user_id"] = video_dict["user_id"]
  785. video_dict["platform"] = self.platform
  786. video_dict["strategy"] = self.mode
  787. video_dict["out_video_id"] = video_dict["video_id"]
  788. video_dict["width"] = video_dict["video_width"]
  789. video_dict["height"] = video_dict["video_height"]
  790. video_dict["crawler_rule"] = json.dumps(self.rule_dict)
  791. video_dict["user_id"] = user_dict["uid"]
  792. video_dict["publish_time"] = video_dict["publish_time_str"]
  793. video_dict["strategy_type"] = self.mode
  794. video_dict["update_time_stamp"] = int(time.time())
  795. pipeline = PiaoQuanPipelineTest(
  796. platform=self.platform,
  797. mode=self.mode,
  798. rule_dict=self.rule_dict,
  799. env=self.env,
  800. item=video_dict,
  801. trace_id=trace_id,
  802. )
  803. flag = pipeline.process_item()
  804. if flag:
  805. print(json.dumps(video_dict, ensure_ascii=False, indent=4))
  806. # self.mq.send_msg(video_dict)
  807. self.download_count += 1
  808. print("成功发送 MQ 至 ETL")
  809. if __name__ == "__main__":
  810. user_list = [
  811. {
  812. "uid": 6267140,
  813. "source": "xigua",
  814. "link": "https://www.ixigua.com/home/2779177225827568",
  815. "nick_name": "秋晴爱音乐",
  816. "avatar_url": "",
  817. "mode": "author",
  818. },
  819. {
  820. "uid": 6267140,
  821. "source": "xigua",
  822. "link": "https://www.ixigua.com/home/2885546124776780",
  823. "nick_name": "朗诵放歌的老山羊",
  824. "avatar_url": "",
  825. "mode": "author",
  826. },
  827. {
  828. "uid": 6267140,
  829. "source": "xigua",
  830. "link": "https://www.ixigua.com/home/5880938217",
  831. "nick_name": "天原声疗",
  832. "avatar_url": "",
  833. "mode": "author",
  834. },
  835. ]
  836. rule = {'period': {'min': 30, 'max': 30}, 'duration': {'min': 20, 'max': 0}, 'play_cnt': {'min': 100, 'max': 0}}
  837. XGA = XiGuaAuthor(
  838. platform="xigua",
  839. mode="author",
  840. rule_dict=rule,
  841. env="prod",
  842. user_list=user_list
  843. )
  844. XGA.get_author_list()
  845. # item_id = "v0201ag10000cl4d7djc77u73eftvrcg"
  846. # get_video_info(item_id=item_id, trace_id="ljh")