piaoquan_vlog.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. """
  2. Created on Mon Feb 19 2024
  3. """
  4. import os
  5. import sys
  6. import json
  7. import random
  8. import time
  9. import requests
  10. sys.path.append(os.getcwd())
  11. from application.common.proxies import tunnel_proxies
  12. from application.common.log import AliyunLogger
  13. class PiaoQuanVlog(object):
  14. """
  15. 票圈 vlog 推荐监测
  16. 会影响推荐的参数
  17. 算法: app_type, mid, timestamp, machine_Info, abtest, extParam, pageSource, IP
  18. """
  19. def __init__(self):
  20. self.url = "https://vlogapi.piaoquantv.com/longvideoapi/video/distribute/category/videoList/v2"
  21. self.headers = {
  22. 'Host': 'vlogapi.piaoquantv.com',
  23. 'xweb_xhr': '1',
  24. 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/6.8.0(0x16080000) NetType/WIFI MiniProgramEnv/Mac MacWechat/WMPF MacWechat/3.8.6(0x13080610) XWEB/1156',
  25. 'content-type': 'application/x-www-form-urlencoded',
  26. 'accept': '*/*',
  27. 'sec-fetch-site': 'cross-site',
  28. 'sec-fetch-mode': 'cors',
  29. 'sec-fetch-dest': 'empty',
  30. 'referer': 'https://servicewechat.com/wx89e7eb06478361d7/735/page-frame.html',
  31. 'accept-language': 'en-US,en;q=0.9'
  32. }
  33. self.aliyun_log = AliyunLogger(platform="piaoquanVlog", mode="recommend")
  34. def send_request(self, page_num):
  35. """
  36. :param page_num: 第几页
  37. """
  38. payload = {
  39. "categoryJson": '{"categoryId":55}',
  40. "pageNo": page_num,
  41. "pageSize": 4,
  42. "sortField": 0,
  43. "pageSource": "vlog-pages/category",
  44. "sharePageVideoId": None,
  45. "shareId": "",
  46. "careModelStatus": 1,
  47. "token": "eacc679e9719307517de3d945479a545add3d48a",
  48. "loginUid": 64168088,
  49. "platform": "mac",
  50. "versionCode": 760,
  51. "machineCode": "weixin_openid_o0w175U16THwQmviRDIdGFmFgc6U",
  52. "appType": 0,
  53. "realAppType": 0,
  54. "system": "Mac OS X 14.2.1",
  55. "pageCategoryId": 55,
  56. "rootPageSource": "",
  57. "shareDepth": "",
  58. "rootPageCategoryId": "",
  59. "appId": "wx89e7eb06478361d7",
  60. "clientTimestamp": int(time.time() * 1000),
  61. "machineInfo": '{"sdkVersion":"3.3.4","brand":"apple","language":"zh_CN","model":"Mac14,2","platform":"mac","system":"Mac OS X 14.2.1","weChatVersion":"3.8.6","screenHeight":736,"screenWidth":414,"pixelRatio":2,"windowHeight":736,"windowWidth":414,"softVersion":"4.1.760"}',
  62. "networkType": "wifi",
  63. "network": "wifi",
  64. "sessionId": "1708320545204-7cfd21f2-2762-a2a8-3331-7fa04e844ab0",
  65. "subSessionId": "1708320545204-7cfd21f2-2762-a2a8-3331-7fa04e844ab0",
  66. "returnId": "",
  67. "jumpHomeVideoId": "",
  68. "senceType": 1089,
  69. "hotSenceType": 1089,
  70. "abExpInfo": '{"ab_test004":[{"abExpCode":"126","configValue":""},{"abExpCode":"211","configValue":""}],"ab_test005":[],"ab_test006":[{"abExpCode":"310","configValue":""},{"abExpCode":"321","configValue":""},{"abExpCode":"331","configValue":""},{"abExpCode":"356","configValue":"{\\"playProgress\\": 10, \\"delayHide\\": 8}"},{"abExpCode":"371","configValue":"{\\"playIcon\\": \\"http://weapppiccdn.yishihui.com/wxicon/common/icon_play_btn_font.png?v=2\\", \\"width\\": 125}"}],"ab_test001":[{"abExpCode":"223","configValue":""},{"abExpCode":"201","configValue":""},{"abExpCode":"410","configValue":"{\\"layerStyle\\": 1, \\"oneDayShowCount\\": 3, \\"everyRecommendVideo\\": 5, \\"playProgress\\": 90, \\"closePosition\\": \\"top\\", \\"guideDialogText\\": [\\"您可以点击‘关注票圈公众号’\\", \\"每日最新资讯不错过\\"], \\"guideButtonText\\": \\"关注票圈公众号\\", \\"topImage\\": \\"https://weapppiccdn.yishihui.com/wxicon/common/img_cgi_image3.png\\", \\"jumpUrl\\": \\"https://mp.weixin.qq.com/s?__biz=MzIxMjg2MzE2Mg==&mid=2247483675&idx=1&sn=0338228015ba7a5b0a1937b14e610efc&chksm=97bed0cea0c959d81d90a5d9ce82502ca24fa418df70d6e619a88d4e007a8b14b2b3b3e62386#rd\\", \\"gzhId\\": 105}"}]}',
  71. "extParams": '{"eventIds":"22040202,ab100,ab100,ab100,ab100,ab100,ab100,ab100,ab100,ab100,ab100","eventInfos":{"ab_test001":"ab100","ab_test002":"ab100","ab_test003":"ab100","ab_test004":"ab100","ab_test005":"ab100","ab_test006":"ab100","ab_test007":"ab100","ab_test008":"ab100","ab_test009":"ab100","ab_test010":"ab100"}}'
  72. }
  73. basic_response = requests.request("POST", self.url, headers=self.headers, data=payload, proxies=tunnel_proxies()).json()
  74. self.process_video_list(basic_response['data'])
  75. def process_video_list(self, video_list):
  76. """
  77. 处理返回的视频列表
  78. :param video_list: 请求到的 video_list
  79. :return: None
  80. """
  81. for video_obj in video_list:
  82. video_item = {
  83. "id": video_obj['id'],
  84. "status": video_obj['status'],
  85. "uid": video_obj['uid'],
  86. "playCount": video_obj['playCount'],
  87. "title": video_obj['title'],
  88. "titleId": video_obj['titleId'],
  89. "shareCount": video_obj['shareCountFriend'],
  90. "favorCount": video_obj['favoriteds']
  91. }
  92. # print(json.dumps(video_item, ensure_ascii=False, indent=4))
  93. self.aliyun_log.logging(
  94. code="7001",
  95. message="监控到一条视频",
  96. data=video_item
  97. )
  98. def run(self):
  99. """
  100. 执行函数
  101. :return: None
  102. """
  103. while True:
  104. for index in range(1, 51):
  105. try:
  106. self.send_request(index)
  107. # 随机休息 1 - 50 秒
  108. time.sleep(random.randint(1, 50))
  109. except Exception as e:
  110. self.aliyun_log.logging(
  111. code="3000",
  112. message="扫描第{}页失败, 原因是{}".format(index, e)
  113. )
  114. # 抓完 50 页后休息 10 分钟
  115. time.sleep(60 * 10)
  116. if __name__ == '__main__':
  117. P = PiaoQuanVlog()
  118. P.run()