app.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. import datetime
  2. import json
  3. import multiprocessing
  4. import os
  5. import random
  6. import re
  7. import sched
  8. import sys
  9. import threading
  10. import time
  11. import traceback
  12. from urllib import parse
  13. import requests
  14. from tools import loggerKit, redis_client, file_writer
  15. from tools.utils import get_random_browser, get_external_ip, get_random_proxy_at_redis, save_all_proxy_ip, \
  16. save_all_proxy_ip_v2, get_proxy_from_file
  17. from concurrent.futures import ThreadPoolExecutor
  18. # 创建定时器对象
  19. scheduler = sched.scheduler(time.time, time.sleep)
  20. # 保存事件对象
  21. event = None
  22. """
  23. 保留登陆账号的信息
  24. """
  25. def save_account_info(account, passwd, target_url, single_proxy):
  26. lock = threading.Lock()
  27. with lock:
  28. if single_proxy is not None:
  29. # event_cname
  30. sub_str = target_url.replace("https://t.livepocket.jp/", "")
  31. strs = sub_str.split('/')
  32. cname = strs[len(strs) - 1]
  33. loggerKit.info(f'target_url: {target_url}, account: {account}, passwd: {passwd}')
  34. user_agent = get_random_browser()
  35. # single_proxy = 'rrehqcjf:33f90umk8x32@185.199.228.220:7300'
  36. proxies = {
  37. 'http': f'http://{single_proxy}',
  38. # 'https': f'https://{single_proxy}'
  39. }
  40. loggerKit.info(f'proxies: {proxies}')
  41. # session
  42. if redis_client.get(f'token_{account}') is None:
  43. """
  44. 模拟登录
  45. """
  46. # 定义请求地址
  47. stamp = str(int(time.time()))
  48. login_url = f"https://t.livepocket.jp/api/sessions/create?mytimestamp={stamp}"
  49. # 定义请求header
  50. headers = {'Content-Type': 'application/x-www-form-urlencoded;',
  51. 'Referer': 'https://t.livepocket.jp/login?acroot=header-new_p_u_nl',
  52. 'Sec-Ch-Ua': 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
  53. 'User-Agent': user_agent,
  54. 'path': f'/api/sessions/create?mytimestamp={stamp}',
  55. 'Origin': 'https://t.livepocket.jp',
  56. 'Sec-Ch-Ua-Mobile': '?0',
  57. 'Sec-Fetch-Mode': 'cors',
  58. 'Sec-Fetch-Site': 'same-origin',
  59. 'Priority': 'u=1, i'
  60. }
  61. # 通过字典方式定义请求body
  62. form_data = {"login": account,
  63. "password": passwd,
  64. "auto_login": "on",
  65. "login_password": f"{account}&{passwd}"
  66. }
  67. data = parse.urlencode(form_data)
  68. session = requests.session()
  69. content = session.post(url=login_url, headers=headers, data=data, proxies=proxies).text
  70. # loggerKit.info(f'login info: {content}')
  71. if 'token' not in content:
  72. loggerKit.info(
  73. f'login account:{account}, 登录失败,正在重试!!!')
  74. # # 生成 2 到 6 分之间的随机等待时间
  75. # wait_time = random.uniform(120, 180)
  76. # # 打印等待时间并等待
  77. # loggerKit.info(f"等待 {wait_time:.2f} 秒...")
  78. # time.sleep(wait_time)
  79. return
  80. cookie = session.cookies
  81. response_cookie = cookie.get_dict()
  82. login_resp = json.loads(content)
  83. token = login_resp['result']['token']
  84. login_session = response_cookie['ci_session']
  85. php_session = response_cookie['PHPSESSID']
  86. loggerKit.info(f'login account:{account}, 代理IP:{single_proxy}, token: {token} login success!!!')
  87. redis_client.set(f'token_{account}', token)
  88. redis_client.set(f'php_session_{account}', php_session)
  89. redis_client.set(f'ci_session_{account}', login_session)
  90. # 存储 account 、token 与 proxy_ip 对应关系
  91. redis_client.set(f'proxy_ip_{account}', single_proxy)
  92. file_writer.write_to_file(f'login account:{account}, 代理IP:{single_proxy}, token: {token} 登录成功!!!')
  93. print(f"login account:{account}, 代理IP:{single_proxy}, token: {token} 登录成功!!!")
  94. else:
  95. token = redis_client.get(f'token_{account}')
  96. login_session = redis_client.get(f'ci_session_{account}')
  97. php_session = redis_client.get(f'php_session_{account}')
  98. print(f"login account:{account}, login_session:{login_session}, token: {token} 已经登录!!!")
  99. def get_ticket(account, passwd, target_url, single_proxy):
  100. if single_proxy is not None:
  101. # 开始业务逻辑
  102. lock = threading.Lock()
  103. with lock:
  104. # event_cname
  105. sub_str = target_url.replace("https://t.livepocket.jp/", "")
  106. strs = sub_str.split('/')
  107. cname = strs[len(strs) - 1]
  108. loggerKit.info(f'target_url: {target_url}, account: {account}, passwd: {passwd}')
  109. user_agent = get_random_browser()
  110. # single_proxy = 'rrehqcjf:33f90umk8x32@185.199.228.220:7300'
  111. proxies = {
  112. 'http': f'http://{single_proxy}',
  113. # 'https': f'https://{single_proxy}'
  114. }
  115. loggerKit.info(f'proxies: {proxies}')
  116. # session
  117. if redis_client.get(f'token_{account}') is None:
  118. """
  119. 模拟登录
  120. """
  121. # 定义请求地址
  122. stamp = str(int(time.time()))
  123. login_url = f"https://t.livepocket.jp/api/sessions/create?mytimestamp={stamp}"
  124. # 定义请求header
  125. headers = {'Content-Type': 'application/x-www-form-urlencoded;',
  126. 'Referer': 'https://t.livepocket.jp/login?acroot=header-new_p_u_nl',
  127. 'Sec-Ch-Ua': 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
  128. 'User-Agent': user_agent,
  129. 'path': f'/api/sessions/create?mytimestamp={stamp}',
  130. 'Origin': 'https://t.livepocket.jp',
  131. 'Sec-Ch-Ua-Mobile': '?0',
  132. 'Sec-Fetch-Mode': 'cors',
  133. 'Sec-Fetch-Site': 'same-origin',
  134. 'Priority': 'u=1, i'
  135. }
  136. # 通过字典方式定义请求body
  137. form_data = {"login": account,
  138. "password": passwd,
  139. "auto_login": "on",
  140. "login_password": f"{account}&{passwd}"
  141. }
  142. data = parse.urlencode(form_data)
  143. session = requests.session()
  144. content = session.post(url=login_url, headers=headers, data=data, proxies=proxies).text
  145. # loggerKit.info(f'login info: {content}')
  146. if 'token' not in content:
  147. loggerKit.info(
  148. f'login account:{account}, token失效,重新登录!!!')
  149. # # 生成 2 到 6 分之间的随机等待时间
  150. # wait_time = random.uniform(120, 180)
  151. # # 打印等待时间并等待
  152. # loggerKit.info(f"等待 {wait_time:.2f} 秒...")
  153. # time.sleep(wait_time)
  154. return
  155. cookie = session.cookies
  156. response_cookie = cookie.get_dict()
  157. login_resp = json.loads(content)
  158. token = login_resp['result']['token']
  159. login_session = response_cookie['ci_session']
  160. php_session = response_cookie['PHPSESSID']
  161. loggerKit.info(f'login account:{account}, 代理IP:{single_proxy}, token: {token} login success!!!')
  162. redis_client.set(f'token_{account}', token)
  163. redis_client.set(f'php_session_{account}', php_session)
  164. redis_client.set(f'ci_session_{account}', login_session)
  165. file_writer.write_to_file(f'login account:{account}, 代理IP:{single_proxy}, token: {token} 登录成功!!!')
  166. else:
  167. token = redis_client.get(f'token_{account}')
  168. login_session = redis_client.get(f'ci_session_{account}')
  169. php_session = redis_client.get(f'php_session_{account}')
  170. # event_id
  171. # 从redis中查询,查询不到再去请求
  172. event_id = redis_client.get(f'event_id_{cname}')
  173. if event_id == 0 or event_id is None:
  174. response = requests.get(target_url, proxies=proxies)
  175. if response.status_code == 200:
  176. html_string = response.content.decode('utf8')
  177. start_index = html_string.find('https://t.livepocket.jp/purchase/verify?event_id=')
  178. if start_index != -1:
  179. end_index = html_string.find("'", start_index)
  180. if end_index != -1:
  181. event_id = html_string[
  182. start_index + len('https://t.livepocket.jp/purchase/verify?event_id='):end_index]
  183. redis_client.set(f'event_id_{cname}', event_id)
  184. loggerKit.info(f'event_id: {event_id}')
  185. else:
  186. loggerKit.warning('End index not found.')
  187. else:
  188. loggerKit.warning('Substring not found.')
  189. else:
  190. loggerKit.error('Failed to fetch the page. Status code: {0}', response.status_code)
  191. # ticket_id
  192. # 从redis中查询,不存在则请求
  193. ticket_id = redis_client.get(f'ticket_id_{cname}')
  194. if ticket_id == 0 or ticket_id is None:
  195. response = requests.get(target_url, proxies=proxies)
  196. if response.status_code == 200:
  197. html_string = response.text
  198. match = re.search(r'id="js_order_limited_(\d+)"', html_string)
  199. if match:
  200. ticket_id = match.group(1)
  201. redis_client.set(f'ticket_id_{cname}', ticket_id)
  202. loggerKit.info(f'ticket_id: {ticket_id}')
  203. else:
  204. loggerKit.warning("未找到匹配的数值")
  205. # redirect_url1
  206. net_url = 'https://t.livepocket.jp/purchase?type=new'
  207. result = requests.Session()
  208. header = {
  209. 'Host': 't.livepocket.jp',
  210. 'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  211. "Chrome/69.0.3947.100 Safari/537.36",
  212. 'Content-Type': 'application/x-www-form-urlencoded',
  213. 'Referer': f'{target_url}',
  214. }
  215. # my_session = 'IN7u3uuP5WcizQkmRzF%2F3OsLuNNQePnxNBvnlPgqT6FPz2BgyKT2KCJaMvdj8ZSa6wNp2xZIL6VoA7Mj0R2zECMZkOKJOLbsNwUdXwvcsROxjfCzibxEaj4nG%2Bq29dCEUdiWI2TgUsKSFGRZaOP0p37ktl%2B1wSMqMAk918Nkt7APIxpQtZ%2BoLwId4PMOkN3oOIwT3CvsuDbgPQHIuokZXcnNe8uOAUuZBLW4nKOdYimLcSw6oTMt85UXkwm4OyTdxYR3%2B8crA0OfQCyfHXqY%2Bj0t9R0mmNSusRXRDuDBmOCFR58vHVuuwZ0AXNHYoYB0sdm28VL9xgHHrzkvm2M9cpLEIVWUWBWGaZgtO3xp2d8L70%2BfAKwyv6JPGcGmGf9wUQzBltssBpMmYqSfkws1%2Bp8BOhmXOqfljSYbWcxxVVSw%2B2dtoxBXsTf793mD9sVYRsrr8YPGz4JPVGWGU0outg%3D%3D'
  216. cookies = {
  217. 'ci_session': f'{login_session}',
  218. 'PHPSESSID': f'{php_session}',
  219. 'list_count': '{"success":true,"result":{"myticket_count":{"count":"0"},"today_event":{"total_count":0,"data_list":[]},"unread_count":5},"submit":true}',
  220. 'sns_status': '{"success":true,"result":{"facebook":0,"twitter":0,"mixi":0,"line":0,"yahoo":0,"plusid":1,"google":0},"submit":true}',
  221. '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}',
  222. }
  223. ticket_key = f'ticket_id_{ticket_id}'
  224. form_data = {
  225. 'redirect_url': 'https://t.livepocket.jp/purchase/',
  226. 'event_id': event_id,
  227. 'event_cname': f'{cname}',
  228. 'ticket_type': 'lottery',
  229. 'facebook_ticket_count': 0,
  230. 'twitter_ticket_count': 0,
  231. 'plusid_linkage_invalidation_flg': 0,
  232. ticket_key: 1
  233. }
  234. loggerKit.info('form_data: {0}', form_data)
  235. response = result.post(net_url, headers=header, cookies=cookies, data=form_data, allow_redirects=False,
  236. proxies=proxies)
  237. loggerKit.info('response.headers: {0}', response.headers)
  238. if 'Location' in response.headers:
  239. redirect_url1 = response.headers['Location']
  240. loggerKit.info('redirect_url1: {0}', redirect_url1)
  241. else:
  242. return
  243. # https://t.livepocket.jp/purchase/security?id=309887&type=new
  244. # redirect_url2
  245. response2 = result.get(redirect_url1, headers=header, cookies=cookies, allow_redirects=False,
  246. proxies=proxies)
  247. loggerKit.info('response2.headers: {0}', response2.headers)
  248. if 'Location' in response2.headers:
  249. redirect_url2 = response2.headers['Location']
  250. loggerKit.info('redirect_url2: {0}', redirect_url2)
  251. else:
  252. return
  253. # https://t.livepocket.jp/purchase/confirm?id=309887&reserved_session_id=423272
  254. # redirect_url3
  255. response3 = result.get(redirect_url2, headers=header, cookies=cookies, allow_redirects=False,
  256. proxies=proxies)
  257. print('response3.headers: ', response3.headers)
  258. if 'Location' in response3.headers:
  259. redirect_url3 = response3.headers['Location']
  260. loggerKit.info('redirect_url3: {0}', redirect_url3)
  261. else:
  262. loggerKit.warning('redirect_url3 is None')
  263. return
  264. # https://t.livepocket.jp/purchase/confirm?id=309887&reserved_session_id=794986&otoken=mMyZTgzMmQ4OWQ5ZjY5NWFlNGE2ZmJlMWM5Mm
  265. # drawing_tickets
  266. # drawing_url = 'https://t.livepocket.jp/api/drawing_tickets/entry?mytimestamp=' + str(int(time.time()))
  267. region_string = redirect_url3.split('?')[1]
  268. params = region_string.split('&')
  269. reserve_session_id = params[1].split("=")[1]
  270. drawing_headers = {
  271. 'Host': 't.livepocket.jp',
  272. 'User-Agent': user_agent,
  273. 'Content-Type': 'application/x-www-form-urlencoded',
  274. 'Referer': f'{redirect_url3}',
  275. }
  276. drawing_cookies = {
  277. 'ci_session': f'{login_session}',
  278. 'PHPSESSID': f'{php_session}',
  279. }
  280. drawing_form_data = {
  281. 'utoken': f'{token}',
  282. 'onetime_token_name': 'buy_ticket',
  283. 'onetime_token_value': params[2].split('=')[1],
  284. 'url': f'https://t.livepocket.jp/purchase/confirm?id={event_id}&reserved_session_id={reserve_session_id}',
  285. 'payment_method': 0,
  286. 'reserve_session_id': reserve_session_id,
  287. 'event_id': event_id,
  288. 'reserve_ticket[0][ticket_id]': ticket_id,
  289. 'reserve_ticket[0][amount]': 1,
  290. 'payment_type': 'credit'
  291. }
  292. drawing_response = result.post(
  293. f'https://t.livepocket.jp/api/drawing_tickets/entry?mytimestamp={str(int(time.time()))}',
  294. headers=drawing_headers, cookies=drawing_cookies,
  295. data=drawing_form_data, allow_redirects=False, proxies=proxies)
  296. loggerKit.info('drawing_response.text: {0}', drawing_response.text)
  297. drawing_data = json.loads(drawing_response.text)
  298. if drawing_data['success']:
  299. order_id = drawing_data['result']['order_id']
  300. onetime_token_name = drawing_data['result']['onetime_token_name']
  301. onetime_token_value = drawing_data['result']['onetime_token_value']
  302. loggerKit.info(
  303. 'account: {0}, order_id: {1}, onetime_token_name: {2}, onetime_token_value: {3}, Get Ticket!!!',
  304. account, order_id, onetime_token_name, onetime_token_value)
  305. file_writer.write_to_file(f'account: {account}, order_id: {order_id}, Order Ticket!!!')
  306. # 写入票券信息到文件
  307. write_ticket_info(account, order_id)
  308. # 写入票券信息到文件
  309. def write_ticket_info(account, order_id):
  310. # 获取当前日期和时间
  311. now = datetime.datetime.now()
  312. # 创建文件夹
  313. result_dir = 'results'
  314. if not os.path.exists(result_dir):
  315. os.makedirs(result_dir)
  316. # 创建文件
  317. file_name = now.strftime('抢券结果_%Y-%m-%d_%H_%M') + '.txt'
  318. file_path = os.path.join(result_dir, file_name)
  319. with open(file_path, 'a+', encoding='utf-8') as f:
  320. f.write(f'account: {account}, order_id: {order_id}\n')
  321. """
  322. 下单
  323. """
  324. # 创建全局锁对象
  325. global_lock = threading.Lock()
  326. def get_ticket_order(account, passwd, target_url, single_proxy):
  327. if single_proxy is not None:
  328. # 开始业务逻辑
  329. with global_lock:
  330. # event_cname
  331. sub_str = target_url.replace("https://t.livepocket.jp/", "")
  332. strs = sub_str.split('/')
  333. cname = strs[len(strs) - 1]
  334. loggerKit.info(f'target_url: {target_url}, account: {account}, passwd: {passwd}')
  335. user_agent = get_random_browser()
  336. # single_proxy = 'rrehqcjf:33f90umk8x32@185.199.228.220:7300'
  337. proxies = {
  338. 'http': f'http://{single_proxy}',
  339. # 'https': f'https://{single_proxy}'
  340. }
  341. loggerKit.info(f'proxies: {proxies}')
  342. # session
  343. if redis_client.get(f'token_{account}') is None:
  344. """
  345. 模拟登录
  346. """
  347. # 定义请求地址
  348. stamp = str(int(time.time()))
  349. login_url = f"https://t.livepocket.jp/api/sessions/create?mytimestamp={stamp}"
  350. # 定义请求header
  351. headers = {'Content-Type': 'application/x-www-form-urlencoded;',
  352. 'Referer': 'https://t.livepocket.jp/login?acroot=header-new_p_u_nl',
  353. 'Sec-Ch-Ua': 'Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99',
  354. 'User-Agent': user_agent,
  355. 'path': f'/api/sessions/create?mytimestamp={stamp}',
  356. 'Origin': 'https://t.livepocket.jp',
  357. 'Sec-Ch-Ua-Mobile': '?0',
  358. 'Sec-Fetch-Mode': 'cors',
  359. 'Sec-Fetch-Site': 'same-origin',
  360. 'Priority': 'u=1, i'
  361. }
  362. # 通过字典方式定义请求body
  363. form_data = {"login": account,
  364. "password": passwd,
  365. "auto_login": "on",
  366. "login_password": f"{account}&{passwd}"
  367. }
  368. data = parse.urlencode(form_data)
  369. session = requests.session()
  370. content = session.post(url=login_url, headers=headers, data=data, proxies=proxies).text
  371. # loggerKit.info(f'login info: {content}')
  372. if 'token' not in content:
  373. # loggerKit.info(f'login account:{account}, 登录失效,重新登录!!!')
  374. # # 生成 2 到 6 分之间的随机等待时间
  375. # wait_time = random.uniform(120, 180)
  376. # # 打印等待时间并等待
  377. # loggerKit.info(f"等待 {wait_time:.2f} 秒...")
  378. # time.sleep(wait_time)
  379. return
  380. cookie = session.cookies
  381. response_cookie = cookie.get_dict()
  382. login_resp = json.loads(content)
  383. token = login_resp['result']['token']
  384. login_session = response_cookie['ci_session']
  385. php_session = response_cookie['PHPSESSID']
  386. loggerKit.info(f'login account:{account}, 代理IP:{single_proxy}, token: {token} login success!!!')
  387. redis_client.set(f'token_{account}', token)
  388. redis_client.set(f'php_session_{account}', php_session)
  389. redis_client.set(f'ci_session_{account}', login_session)
  390. file_writer.write_to_file(f'login account:{account}, 代理IP:{single_proxy}, token: {token} 登录成功!!!')
  391. else:
  392. token = redis_client.get(f'token_{account}')
  393. login_session = redis_client.get(f'ci_session_{account}')
  394. php_session = redis_client.get(f'php_session_{account}')
  395. # event_id
  396. # 从redis中查询,查询不到再去请求
  397. event_id = redis_client.get(f'event_id_{cname}')
  398. if event_id == 0 or event_id is None:
  399. response = requests.get(target_url, proxies=proxies)
  400. if response.status_code == 200:
  401. html_string = response.content.decode('utf8')
  402. start_index = html_string.find('https://t.livepocket.jp/purchase/verify?event_id=')
  403. if start_index != -1:
  404. end_index = html_string.find("'", start_index)
  405. if end_index != -1:
  406. event_id = html_string[
  407. start_index + len('https://t.livepocket.jp/purchase/verify?event_id='):end_index]
  408. redis_client.set(f'event_id_{cname}', event_id)
  409. loggerKit.info(f'event_id: {event_id}')
  410. else:
  411. loggerKit.warning('End index not found.')
  412. else:
  413. loggerKit.warning('Substring not found.')
  414. else:
  415. loggerKit.error('Failed to fetch the page. Status code: {0}', response.status_code)
  416. # ticket_id
  417. # 从redis中查询,不存在则请求
  418. ticket_id = redis_client.get(f'ticket_id_{cname}')
  419. if ticket_id == 0 or ticket_id is None:
  420. response = requests.get(target_url, proxies=proxies)
  421. if response.status_code == 200:
  422. html_string = response.text
  423. match = re.search(r'id="js_order_limited_(\d+)"', html_string)
  424. if match:
  425. ticket_id = match.group(1)
  426. redis_client.set(f'ticket_id_{cname}', ticket_id)
  427. loggerKit.info(f'ticket_id: {ticket_id}')
  428. else:
  429. loggerKit.warning("未找到匹配的数值")
  430. # redirect_url1
  431. net_url = 'https://t.livepocket.jp/purchase?type=new'
  432. result = requests.Session()
  433. header = {
  434. 'Host': 't.livepocket.jp',
  435. 'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
  436. "Chrome/69.0.3947.100 Safari/537.36",
  437. 'Content-Type': 'application/x-www-form-urlencoded',
  438. 'Referer': f'{target_url}',
  439. }
  440. # my_session = 'IN7u3uuP5WcizQkmRzF%2F3OsLuNNQePnxNBvnlPgqT6FPz2BgyKT2KCJaMvdj8ZSa6wNp2xZIL6VoA7Mj0R2zECMZkOKJOLbsNwUdXwvcsROxjfCzibxEaj4nG%2Bq29dCEUdiWI2TgUsKSFGRZaOP0p37ktl%2B1wSMqMAk918Nkt7APIxpQtZ%2BoLwId4PMOkN3oOIwT3CvsuDbgPQHIuokZXcnNe8uOAUuZBLW4nKOdYimLcSw6oTMt85UXkwm4OyTdxYR3%2B8crA0OfQCyfHXqY%2Bj0t9R0mmNSusRXRDuDBmOCFR58vHVuuwZ0AXNHYoYB0sdm28VL9xgHHrzkvm2M9cpLEIVWUWBWGaZgtO3xp2d8L70%2BfAKwyv6JPGcGmGf9wUQzBltssBpMmYqSfkws1%2Bp8BOhmXOqfljSYbWcxxVVSw%2B2dtoxBXsTf793mD9sVYRsrr8YPGz4JPVGWGU0outg%3D%3D'
  441. cookies = {
  442. 'ci_session': f'{login_session}',
  443. 'PHPSESSID': f'{php_session}',
  444. 'list_count': '{"success":true,"result":{"myticket_count":{"count":"0"},"today_event":{"total_count":0,"data_list":[]},"unread_count":5},"submit":true}',
  445. 'sns_status': '{"success":true,"result":{"facebook":0,"twitter":0,"mixi":0,"line":0,"yahoo":0,"plusid":1,"google":0},"submit":true}',
  446. '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}',
  447. }
  448. ticket_key = f'ticket_id_{ticket_id}'
  449. form_data = {
  450. 'redirect_url': 'https://t.livepocket.jp/purchase/',
  451. 'event_id': event_id,
  452. 'event_cname': f'{cname}',
  453. 'ticket_type': 'lottery',
  454. 'facebook_ticket_count': 0,
  455. 'twitter_ticket_count': 0,
  456. 'plusid_linkage_invalidation_flg': 0,
  457. ticket_key: 1
  458. }
  459. loggerKit.info('form_data: {0}', form_data)
  460. response = result.post(net_url, headers=header, cookies=cookies, data=form_data, allow_redirects=False,
  461. proxies=proxies)
  462. loggerKit.info('response.headers: {0}', response.headers)
  463. if 'Location' in response.headers:
  464. redirect_url1 = response.headers['Location']
  465. loggerKit.info('redirect_url1: {0}', redirect_url1)
  466. else:
  467. return
  468. # https://t.livepocket.jp/purchase/security?id=309887&type=new
  469. # redirect_url2
  470. response2 = result.get(redirect_url1, headers=header, cookies=cookies, allow_redirects=False,
  471. proxies=proxies)
  472. loggerKit.info('response2.headers: {0}', response2.headers)
  473. if 'Location' in response2.headers:
  474. redirect_url2 = response2.headers['Location']
  475. loggerKit.info('redirect_url2: {0}', redirect_url2)
  476. else:
  477. return
  478. # https://t.livepocket.jp/purchase/confirm?id=309887&reserved_session_id=423272
  479. # redirect_url3
  480. response3 = result.get(redirect_url2, headers=header, cookies=cookies, allow_redirects=False,
  481. proxies=proxies)
  482. print('response3.headers: ', response3.headers)
  483. if 'Location' in response3.headers:
  484. redirect_url3 = response3.headers['Location']
  485. loggerKit.info('redirect_url3: {0}', redirect_url3)
  486. else:
  487. loggerKit.warning('redirect_url3 is None')
  488. return
  489. # https://t.livepocket.jp/purchase/confirm?id=309887&reserved_session_id=794986&otoken=mMyZTgzMmQ4OWQ5ZjY5NWFlNGE2ZmJlMWM5Mm
  490. # drawing_tickets
  491. # drawing_url = 'https://t.livepocket.jp/api/drawing_tickets/entry?mytimestamp=' + str(int(time.time()))
  492. region_string = redirect_url3.split('?')[1]
  493. params = region_string.split('&')
  494. reserve_session_id = params[1].split("=")[1]
  495. drawing_headers = {
  496. 'Host': 't.livepocket.jp',
  497. 'User-Agent': user_agent,
  498. 'Content-Type': 'application/x-www-form-urlencoded',
  499. 'Referer': f'{redirect_url3}',
  500. }
  501. drawing_cookies = {
  502. 'ci_session': f'{login_session}',
  503. 'PHPSESSID': f'{php_session}',
  504. }
  505. drawing_form_data = {
  506. 'utoken': f'{token}',
  507. 'onetime_token_name': 'buy_ticket',
  508. 'onetime_token_value': params[2].split('=')[1],
  509. 'url': f'https://t.livepocket.jp/purchase/confirm?id={event_id}&reserved_session_id={reserve_session_id}',
  510. 'payment_method': 0,
  511. 'reserve_session_id': reserve_session_id,
  512. 'event_id': event_id,
  513. 'reserve_ticket[0][ticket_id]': ticket_id,
  514. 'reserve_ticket[0][amount]': 1,
  515. 'payment_type': 'credit'
  516. }
  517. drawing_response = result.post(
  518. f'https://t.livepocket.jp/api/drawing_tickets/entry?mytimestamp={str(int(time.time()))}',
  519. headers=drawing_headers, cookies=drawing_cookies,
  520. data=drawing_form_data, allow_redirects=False, proxies=proxies)
  521. loggerKit.info('drawing_response.text: {0}', drawing_response.text)
  522. drawing_data = json.loads(drawing_response.text)
  523. if drawing_data['success']:
  524. order_id = drawing_data['result']['order_id']
  525. onetime_token_name = drawing_data['result']['onetime_token_name']
  526. onetime_token_value = drawing_data['result']['onetime_token_value']
  527. loggerKit.info(
  528. 'account: {0}, order_id: {1}, onetime_token_name: {2}, onetime_token_value: {3}, Get Ticket!!!',
  529. account, order_id, onetime_token_name, onetime_token_value)
  530. # 写入文件
  531. file_writer.write_to_file(f'account: {account}, order_id: {order_id}, Order Ticket!!!')
  532. def process_account(pocket_url, account, single_proxy):
  533. try:
  534. run_threading(account, 'panyue666', pocket_url, single_proxy)
  535. except Exception as ex:
  536. loggerKit.error(f'error: {traceback.format_exc()}, account:{account}')
  537. """
  538. 登陆
  539. """
  540. def process_account_login(pocket_url, account, single_proxy):
  541. try:
  542. run_threading_login(account, 'panyue666', pocket_url, single_proxy)
  543. except Exception as ex:
  544. loggerKit.error(f'error: {traceback.format_exc()}, account:{account}')
  545. def process_running(max_threads, pocket_url):
  546. # log_name = f"data_{datetime.datetime.now().strftime('%Y%m%d%H%M')}.txt"
  547. while True:
  548. with open('accounts.txt', 'r') as accounts:
  549. account_list = accounts.readlines()
  550. threads = []
  551. for account in account_list:
  552. single_proxy, random_index = get_random_proxy_at_redis(600)
  553. thread = threading.Thread(target=process_account,
  554. args=(pocket_url, account.strip(), single_proxy))
  555. threads.append(thread)
  556. thread.start()
  557. # 如果当前线程数达到上限,等待有线程结束后再创建新线程
  558. if len(threads) == max_threads:
  559. for t in threads:
  560. t.join()
  561. threads.clear()
  562. # 等待所有线程执行完毕
  563. for thread in threads:
  564. thread.join()
  565. """
  566. 手动定时
  567. """
  568. def process_running_manual(max_threads, pocket_url):
  569. # log_name = f"data_{datetime.datetime.now().strftime('%Y%m%d%H%M')}.txt"
  570. while True:
  571. with open('accounts.txt', 'r') as accounts:
  572. account_list = accounts.readlines()
  573. threads = []
  574. for account in account_list:
  575. single_proxy = get_proxy_from_file("proxy_list.txt")
  576. # 从redis 中获取 proxy_ip
  577. # key = f'proxy_ip_{account}'
  578. # single_proxy = redis_client.get(key)
  579. print(f"当前账号: {account}, 当前代理:{single_proxy}")
  580. loggerKit.info(f"当前账号: {account}, 当前代理:{single_proxy}")
  581. thread = threading.Thread(target=process_account,
  582. args=(pocket_url, account.strip(), single_proxy))
  583. threads.append(thread)
  584. thread.start()
  585. # 如果当前线程数达到上限,等待有线程结束后再创建新线程
  586. if len(threads) == max_threads:
  587. for t in threads:
  588. t.join()
  589. threads.clear()
  590. # 等待所有线程执行完毕
  591. for thread in threads:
  592. thread.join()
  593. """
  594. 账号批量登陆
  595. """
  596. def login_account(max_threads, accounts_path, pocket_url):
  597. with open(accounts_path, 'r') as accounts:
  598. account_list = accounts.readlines()
  599. threads = []
  600. for account in account_list:
  601. single_proxy = get_proxy_from_file("proxy_list.txt")
  602. print(f"当前账号: {account}, 当前代理:{single_proxy}")
  603. loggerKit.info(f"当前账号: {account}, 当前代理:{single_proxy}")
  604. thread = threading.Thread(target=save_account_info,
  605. args=(account.strip(), "panyue666", pocket_url, single_proxy))
  606. threads.append(thread)
  607. thread.start()
  608. # 如果当前线程数达到上限,等待有线程结束后再创建新线程
  609. if len(threads) == max_threads:
  610. for t in threads:
  611. t.join()
  612. threads.clear()
  613. # 等待所有线程执行完毕
  614. for thread in threads:
  615. thread.join()
  616. def run_threading(account, password, url, single_proxy):
  617. try:
  618. get_ticket(account, password, url, single_proxy)
  619. except Exception as ex:
  620. loggerKit.error(f'error: {traceback.format_exc()}, account:{account}')
  621. """
  622. 登陆
  623. """
  624. def run_threading_login(account, password, url, single_proxy):
  625. try:
  626. save_account_info(account, password, url, single_proxy)
  627. except Exception as ex:
  628. loggerKit.error(f'error: {traceback.format_exc()}, account:{account}')
  629. """
  630. 下单
  631. """
  632. def run_threading_order(max_threads, account_path, url):
  633. try:
  634. while True:
  635. with open('accounts.txt', 'r') as accounts:
  636. account_list = accounts.readlines()
  637. threads = []
  638. for account in account_list:
  639. single_proxy = get_proxy_from_file("proxy_list.txt")
  640. # 从redis 中获取 proxy_ip
  641. # single_proxy = redis_client.get(f'proxy_ip_{account}')
  642. loggerKit.info(f"当前账号: {account}, 当前代理:{single_proxy}")
  643. thread = threading.Thread(target=get_ticket_order,
  644. args=(account, "panyue666", url, single_proxy))
  645. threads.append(thread)
  646. thread.start()
  647. # 如果当前线程数达到上限,等待有线程结束后再创建新线程
  648. if len(threads) == max_threads:
  649. for t in threads:
  650. t.join()
  651. threads.clear()
  652. # 等待所有线程执行完毕
  653. for thread in threads:
  654. thread.join()
  655. except Exception as ex:
  656. loggerKit.error(f'error: {traceback.format_exc()}, account:{account_path}')
  657. def run_daily_job(hour, minute):
  658. # 获取当前日期和时间
  659. now = datetime.datetime.now()
  660. # 计算下次运行时间
  661. run_time = datetime.datetime(now.year, now.month, now.day, hour, minute)
  662. if run_time < now:
  663. # 如果运行时间小于当前时间,则在明天的相应时间运行任务
  664. run_time = run_time + datetime.timedelta(days=1)
  665. # 计算等待时间
  666. wait_time = (run_time - now).total_seconds()
  667. # 创建定时器对象
  668. scheduler = sched.scheduler(time.time, time.sleep)
  669. # 添加定时任务
  670. scheduler.enter(wait_time, 1, looper_job, ())
  671. # 启动定时器
  672. scheduler.run()
  673. """
  674. 手动定时任务
  675. """
  676. def run_manual_job(hour, minute, thread_num, pocket_url):
  677. global event
  678. # 获取当前日期和时间
  679. now = datetime.datetime.now()
  680. # 计算下次运行时间
  681. run_time = datetime.datetime(now.year, now.month, now.day, hour, minute)
  682. if run_time < now:
  683. # 如果运行时间小于当前时间,则在明天的相应时间运行任务
  684. run_time = run_time + datetime.timedelta(days=1)
  685. # 计算等待时间
  686. wait_time = (run_time - now).total_seconds()
  687. # 添加定时任务,并保存事件对象
  688. event = scheduler.enter(wait_time, 1, manual_job, argument=(thread_num, pocket_url,))
  689. # 启动定时器
  690. scheduler.run()
  691. """
  692. 取消定时任务
  693. """
  694. def cancel_manual_job():
  695. sys.exit()
  696. """
  697. 停止下单
  698. """
  699. def stop_order_job():
  700. sys.exit()
  701. def looper_job():
  702. while 1:
  703. process_running(max_threads=1, pocket_url='https://t.livepocket.jp/e/l3im7')
  704. """
  705. 手动定时
  706. """
  707. def manual_job(thread_num, pocket_url):
  708. process_running_manual(max_threads=thread_num, pocket_url=pocket_url)
  709. if __name__ == '__main__':
  710. # 下面一行代码即可打包多进程
  711. multiprocessing.freeze_support()
  712. # 代理IP存储
  713. save_all_proxy_ip_v2()
  714. # 定时抢劵
  715. run_daily_job(13, 20)
  716. # get_ticket_order('zhnggg@huatcn.com', 'panyue666', 'https://t.livepocket.jp/e/l3im7', 'spnelh8q2c:panyue6411802~@gate.dc.visitxiangtan.com:20002')
  717. # run_threading_order(1, 'accounts.txt', 'https://t.livepocket.jp/e/l3im7')