302_poc_2.py 13 KB

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