302_full.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. import datetime
  2. import hashlib
  3. import json
  4. import multiprocessing
  5. import random
  6. import re
  7. import sched
  8. import sys
  9. import threading
  10. import time
  11. import traceback
  12. from hashlib import md5
  13. from urllib import parse
  14. import requests
  15. from tools import loggerKit, redis_client
  16. from tools.utils import get_random_browser, FileWriter, get_random_proxy_at_redis, get_external_ip, save_all_proxy_ip
  17. def poc_2(account, passwd, target_url, log_name, single_proxy, random_index):
  18. """
  19. # 生成 5 到 10 秒之间的随机等待时间
  20. wait_time = random.uniform(5, 10)
  21. # 打印等待时间并等待
  22. loggerKit.info(f"等待 {wait_time:.2f} 秒...")
  23. time.sleep(wait_time)
  24. """
  25. if single_proxy is not None:
  26. # 开始业务逻辑
  27. lock = threading.Lock()
  28. with lock:
  29. # event_cname
  30. # url = 'https://t.livepocket.jp/e/lxyyc'
  31. sub_str = target_url.replace("https://t.livepocket.jp/", "")
  32. strs = sub_str.split('/')
  33. cname = strs[len(strs) - 1]
  34. # print(cname)
  35. loggerKit.info(f'account: {account}, passwd: {passwd}')
  36. # writer = FileWriter(log_name)
  37. # writer.write_to_file(f'------{account}, {passwd}------ \n')
  38. user_agent = get_random_browser()
  39. # single_proxy = 'rrehqcjf:33f90umk8x32@185.199.228.220:7300'
  40. proxies = {
  41. 'http': f'http://{single_proxy}',
  42. # 'https': f'https://{single_proxy}'
  43. }
  44. loggerKit.info(f'proxies: {proxies}')
  45. # writer.write_to_file(f'account: {account}, passwd: {passwd}, proxies:{proxies} \n')
  46. # session
  47. if redis_client.get(f'token_{account}') is None:
  48. """
  49. 模拟登录
  50. """
  51. # 定义请求地址
  52. stamp = str(int(time.time()))
  53. login_url = f"https://t.livepocket.jp/api/sessions/create?mytimestamp={stamp}"
  54. # 定义请求header
  55. headers = {'Content-Type': 'application/x-www-form-urlencoded;',
  56. 'Referer': 'https://t.livepocket.jp/login?acroot=header-new_p_u_nl',
  57. 'Sec-Ch-Ua': 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
  58. 'User-Agent': user_agent,
  59. 'path': f'/api/sessions/create?mytimestamp={stamp}',
  60. 'Origin': 'https://t.livepocket.jp',
  61. 'Sec-Ch-Ua-Mobile': '?0',
  62. 'Sec-Fetch-Mode': 'cors',
  63. 'Sec-Fetch-Site': 'same-origin',
  64. 'Priority': 'u=1, i'
  65. }
  66. # 通过字典方式定义请求body
  67. form_data = {"login": account,
  68. "password": passwd,
  69. "auto_login": "on",
  70. "login_password": f"{account}&{passwd}"
  71. }
  72. data = parse.urlencode(form_data)
  73. session = requests.session()
  74. content = session.post(url=login_url, headers=headers, data=data, proxies=proxies).text
  75. # loggerKit.info(f'login info: {content}')
  76. if 'token' not in content:
  77. loggerKit.info(f'login account:{account}, 本机出口IP:{get_external_ip()}、代理IP:{single_proxy} 被封!!!')
  78. # 将被封的IP数据从redis中去掉
  79. # key = f'proxy_{str(random_index)}'
  80. # loggerKit.info(f'key:{key}')
  81. # redis_client.delete(key=key)
  82. # 生成 2 到 6 分之间的随机等待时间
  83. wait_time = random.uniform(120, 180)
  84. # 打印等待时间并等待
  85. loggerKit.info(f"等待 {wait_time:.2f} 秒...")
  86. time.sleep(wait_time)
  87. return
  88. cookie = session.cookies
  89. response_cookie = cookie.get_dict()
  90. login_resp = json.loads(content)
  91. token = login_resp['result']['token']
  92. login_session = response_cookie['ci_session']
  93. php_session = response_cookie['PHPSESSID']
  94. loggerKit.info(f'login account:{account}, 代理IP:{single_proxy}, token: {token} 登录成功!!!')
  95. redis_client.set(f'token_{account}', token)
  96. redis_client.set(f'php_session_{account}', php_session)
  97. redis_client.set(f'ci_session_{account}', login_session)
  98. else:
  99. token = redis_client.get(f'token_{account}')
  100. login_session = redis_client.get(f'ci_session_{account}')
  101. php_session = redis_client.get(f'php_session_{account}')
  102. # event_id
  103. # 从redis中查询,查询不到再去请求
  104. event_id = redis_client.get(f'event_id_{cname}')
  105. if event_id == 0 or event_id is None:
  106. response = requests.get(target_url, proxies=proxies)
  107. if response.status_code == 200:
  108. html_string = response.content.decode('utf8')
  109. start_index = html_string.find('https://t.livepocket.jp/purchase/verify?event_id=')
  110. if start_index != -1:
  111. end_index = html_string.find("'", start_index)
  112. if end_index != -1:
  113. event_id = html_string[
  114. start_index + len('https://t.livepocket.jp/purchase/verify?event_id='):end_index]
  115. redis_client.set(f'event_id_{cname}', event_id)
  116. loggerKit.info(f'event_id: {event_id}')
  117. else:
  118. loggerKit.warning('End index not found.')
  119. else:
  120. loggerKit.warning('Substring not found.')
  121. else:
  122. loggerKit.error('Failed to fetch the page. Status code: {0}', response.status_code)
  123. # ticket_id
  124. # 从redis中查询,不存在则请求
  125. ticket_id = redis_client.get(f'ticket_id_{cname}')
  126. if ticket_id == 0 or ticket_id is None:
  127. response = requests.get(target_url, proxies=proxies)
  128. if response.status_code == 200:
  129. html_string = response.text
  130. match = re.search(r'id="js_order_limited_(\d+)"', html_string)
  131. if match:
  132. ticket_id = match.group(1)
  133. redis_client.set(f'ticket_id_{cname}', ticket_id)
  134. loggerKit.info(f'ticket_id: {ticket_id}')
  135. else:
  136. loggerKit.warning("未找到匹配的数值")
  137. # redirect_url1
  138. net_url = 'https://t.livepocket.jp/purchase?type=new'
  139. result = requests.Session()
  140. header = {
  141. 'Host': 't.livepocket.jp',
  142. 'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  143. "Chrome/69.0.3947.100 Safari/537.36",
  144. 'Content-Type': 'application/x-www-form-urlencoded',
  145. 'Referer': f'{target_url}',
  146. }
  147. # my_session = 'IN7u3uuP5WcizQkmRzF%2F3OsLuNNQePnxNBvnlPgqT6FPz2BgyKT2KCJaMvdj8ZSa6wNp2xZIL6VoA7Mj0R2zECMZkOKJOLbsNwUdXwvcsROxjfCzibxEaj4nG%2Bq29dCEUdiWI2TgUsKSFGRZaOP0p37ktl%2B1wSMqMAk918Nkt7APIxpQtZ%2BoLwId4PMOkN3oOIwT3CvsuDbgPQHIuokZXcnNe8uOAUuZBLW4nKOdYimLcSw6oTMt85UXkwm4OyTdxYR3%2B8crA0OfQCyfHXqY%2Bj0t9R0mmNSusRXRDuDBmOCFR58vHVuuwZ0AXNHYoYB0sdm28VL9xgHHrzkvm2M9cpLEIVWUWBWGaZgtO3xp2d8L70%2BfAKwyv6JPGcGmGf9wUQzBltssBpMmYqSfkws1%2Bp8BOhmXOqfljSYbWcxxVVSw%2B2dtoxBXsTf793mD9sVYRsrr8YPGz4JPVGWGU0outg%3D%3D'
  148. cookies = {
  149. 'ci_session': f'{login_session}',
  150. 'PHPSESSID': f'{php_session}',
  151. 'list_count': '{"success":true,"result":{"myticket_count":{"count":"0"},"today_event":{"total_count":0,"data_list":[]},"unread_count":5},"submit":true}',
  152. 'sns_status': '{"success":true,"result":{"facebook":0,"twitter":0,"mixi":0,"line":0,"yahoo":0,"plusid":1,"google":0},"submit":true}',
  153. 'display_init': '{"success":true,"result":{"purchased_tickets":{"total_count":0,"data_list":{"ticket_info":[]}},"lottery_tickets":{"total_count":0,"data_list":{"ticket_info":[]}},"order_limited_event_tickets":{"data_list":{"ticket_info":[]},"total_count":0},"event_order_limit":true},"submit":true}',
  154. }
  155. ticket_key = f'ticket_id_{ticket_id}'
  156. form_data = {
  157. 'redirect_url': 'https://t.livepocket.jp/purchase/',
  158. 'event_id': event_id,
  159. 'event_cname': f'{cname}',
  160. 'ticket_type': 'lottery',
  161. 'facebook_ticket_count': 0,
  162. 'twitter_ticket_count': 0,
  163. 'plusid_linkage_invalidation_flg': 0,
  164. ticket_key: 1
  165. }
  166. loggerKit.info('form_data: {0}', form_data)
  167. response = result.post(net_url, headers=header, cookies=cookies, data=form_data, allow_redirects=False,
  168. proxies=proxies)
  169. loggerKit.info('response.headers: {0}', response.headers)
  170. if 'Location' in response.headers:
  171. redirect_url1 = response.headers['Location']
  172. loggerKit.info('redirect_url1: {0}', redirect_url1)
  173. else:
  174. return
  175. # https://t.livepocket.jp/purchase/security?id=309887&type=new
  176. # redirect_url2
  177. response2 = result.get(redirect_url1, headers=header, cookies=cookies, allow_redirects=False, proxies=proxies)
  178. loggerKit.info('response2.headers: {0}', response2.headers)
  179. if 'Location' in response2.headers:
  180. redirect_url2 = response2.headers['Location']
  181. loggerKit.info('redirect_url2: {0}', redirect_url2)
  182. else:
  183. return
  184. # https://t.livepocket.jp/purchase/confirm?id=309887&reserved_session_id=423272
  185. # redirect_url3
  186. response3 = result.get(redirect_url2, headers=header, cookies=cookies, allow_redirects=False, proxies=proxies)
  187. print('response3.headers: ', response3.headers)
  188. if 'Location' in response3.headers:
  189. redirect_url3 = response3.headers['Location']
  190. loggerKit.info('redirect_url3: {0}', redirect_url3)
  191. else:
  192. loggerKit.warning('redirect_url3 is None')
  193. return
  194. # https://t.livepocket.jp/purchase/confirm?id=309887&reserved_session_id=794986&otoken=mMyZTgzMmQ4OWQ5ZjY5NWFlNGE2ZmJlMWM5Mm
  195. # drawing_tickets
  196. # drawing_url = 'https://t.livepocket.jp/api/drawing_tickets/entry?mytimestamp=' + str(int(time.time()))
  197. region_string = redirect_url3.split('?')[1]
  198. params = region_string.split('&')
  199. reserve_session_id = params[1].split("=")[1]
  200. drawing_headers = {
  201. 'Host': 't.livepocket.jp',
  202. 'User-Agent': user_agent,
  203. 'Content-Type': 'application/x-www-form-urlencoded',
  204. 'Referer': f'{redirect_url3}',
  205. }
  206. drawing_cookies = {
  207. 'ci_session': f'{login_session}',
  208. 'PHPSESSID': f'{php_session}',
  209. }
  210. drawing_form_data = {
  211. 'utoken': f'{token}',
  212. 'onetime_token_name': 'buy_ticket',
  213. 'onetime_token_value': params[2].split('=')[1],
  214. 'url': f'https://t.livepocket.jp/purchase/confirm?id={event_id}&reserved_session_id={reserve_session_id}',
  215. 'payment_method': 0,
  216. 'reserve_session_id': reserve_session_id,
  217. 'event_id': event_id,
  218. 'reserve_ticket[0][ticket_id]': ticket_id,
  219. 'reserve_ticket[0][amount]': 1,
  220. 'payment_type': 'credit'
  221. }
  222. drawing_response = result.post(f'https://t.livepocket.jp/api/drawing_tickets/entry?mytimestamp={str(int(time.time()))}', headers=drawing_headers, cookies=drawing_cookies,
  223. data=drawing_form_data, allow_redirects=False, proxies=proxies)
  224. loggerKit.info('drawing_response.text: {0}', drawing_response.text)
  225. drawing_data = json.loads(drawing_response.text)
  226. if drawing_data['success']:
  227. order_id = drawing_data['result']['order_id']
  228. onetime_token_name = drawing_data['result']['onetime_token_name']
  229. onetime_token_value = drawing_data['result']['onetime_token_value']
  230. loggerKit.info('account: {0}, order_id: {1}, onetime_token_name: {2}, onetime_token_value: {3}, 抢到!!!',
  231. account, order_id, onetime_token_name, onetime_token_value)
  232. # writer.write_to_file(f'account:{account}, order_id:{order_id}, onetime_token_name:{onetime_token_name}, onetime_token_value:{onetime_token_value} \n')
  233. def process_account(pocket_url, account, log_name, single_proxy, random_index):
  234. try:
  235. run_poc(account.strip(), 'panyue666', 'https://t.livepocket.jp/e/z230-', log_name, single_proxy, random_index)
  236. except Exception as ex:
  237. loggerKit.error(f'error: {traceback.format_exc()}, account:{account}')
  238. def process_running(max_threads, pocket_url):
  239. log_name = f"data_{datetime.datetime.now().strftime('%Y%m%d%H%M')}.txt"
  240. with open('account.txt', 'r') as accounts:
  241. account_list = accounts.readlines()
  242. threads = []
  243. for account in account_list:
  244. # 直接从redis中获取
  245. single_proxy, random_index = get_random_proxy_at_redis(600)
  246. thread = threading.Thread(target=process_account, args=(pocket_url, account, log_name, single_proxy, random_index))
  247. threads.append(thread)
  248. thread.start()
  249. # 如果当前线程数达到上限,等待有线程结束后再创建新线程
  250. if len(threads) >= max_threads:
  251. for t in threads:
  252. t.join()
  253. threads.clear()
  254. # 等待所有线程执行完毕
  255. for thread in threads:
  256. thread.join()
  257. def run_poc(account, password, url, log_name, single_proxy, random_index):
  258. try:
  259. poc_2(account, password, url, log_name, single_proxy, random_index)
  260. except Exception as ex:
  261. loggerKit.error(f'error: {traceback.format_exc()}, account:{account}')
  262. def run_daily_job(hour, minute):
  263. # 获取当前日期和时间
  264. now = datetime.datetime.now()
  265. # 计算下次运行时间
  266. run_time = datetime.datetime(now.year, now.month, now.day, hour, minute)
  267. if run_time < now:
  268. # 如果运行时间小于当前时间,则在明天的相应时间运行任务
  269. run_time = run_time + datetime.timedelta(days=1)
  270. # 计算等待时间
  271. wait_time = (run_time - now).total_seconds()
  272. # 创建定时器对象
  273. scheduler = sched.scheduler(time.time, time.sleep)
  274. # 添加定时任务
  275. scheduler.enter(wait_time, 1, looper_job, ())
  276. # 启动定时器
  277. scheduler.run()
  278. def looper_job():
  279. while 1:
  280. process_running(max_threads=8, pocket_url='https://t.livepocket.jp/e/7ubn_')
  281. if __name__ == '__main__':
  282. # 新增下面一行代码即可打包多进程
  283. multiprocessing.freeze_support()
  284. save_all_proxy_ip(100, 9)
  285. # run_daily_job(8, 52)
  286. looper_job()