app.py 16 KB

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