app.py 35 KB

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