自动充值脚本 - 多API支持 - 重构版本
{ "title": "import\u0020queue\u0020import\u0020concurrent.futures\u0020import\u0020time\u0020import\u0020datetime\u0020import\u0020os\u0020import\u0020winsound\u0020from\u0020retry\u0020import\u0020retry\u0020from\u0020selenium.webdriver.common.by\u0020import\u0020By\u0020import\u0020requests\u0020from\u0020selenium\u0020import\u0020webdriver\u0020""\u0020v1.0\u0020bate\u0020--重构项目\u0020--增加多api支持\u0020""\u0020def\u0020beep():\u0020frequency_beep\u0020=\u00202500\u0020duration\u0020=\u00201000\u0020winsound.Beep(frequency_beep,\u0020duration)\u0020def\u0020start_driver(url):\u0020options\u0020=\u0020webdriver.ChromeOptions()\u0020options.add_argument('start-maximized')\u0020options.add_argument('--headless')\u0020options.add_experimental_option('excludeSwitches',\u0020['enable-automation'])\u0020options.add_experimental_option('useAutomationExtension',\u0020False)\u0020driver_tmp\u0020=\u0020webdriver.Chrome(options=options)\u0020with\u0020open('./stealth.min.js')\u0020as\u0020f:\u0020js\u0020=\u0020f.read()\u0020driver_tmp.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',\u0020{'source':\u0020js})\u0020driver_tmp.implicitly_wait(5)\u0020driver_tmp.set_window_size(700,\u0020900)\u0020driver_tmp.set_window_position(0,\u00200)\u0020#\u0020driver_tmp.set_page_load_timeout(2)\u0020driver_tmp.get(url)\u0020return\u0020driver_tmp\u0020@retry(tries=5,\u0020delay=1)\u0020def\u0020keep_alive(driver):\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div[4]/div[1]/div[1]').click()\u0020time.sleep(0.1)\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div[4]/div[1]/div[2]').click()\u0020#\u0020print('[调试]:\u0020keep_alive\u0020done')\u0020return\u0020True\u0020def\u0020info_output(printf):\u0020while\u0020True:\u0020line\u0020=\u0020printf.get()\u0020print(line)\u0020def\u0020log(status,\u0020order_number,\u0020phone_number,\u0020message):\u0020today\u0020=\u0020datetime.date.today()\u0020log_dir\u0020=\u0020'./logs'\u0020if\u0020not\u0020os.path.exists(log_dir):\u0020os.makedirs(log_dir)\u0020log_file\u0020=\u0020os.path.join(log_dir,\u0020today.strftime('%Y-%m-%d')\u0020+\u0020'.txt')\u0020#\u0020将日志写入文件\u0020with\u0020open(log_file,\u0020'a',\u0020encoding='utf-8')\u0020as\u0020f:\u0020date_now\u0020=\u0020datetime.datetime.now().strftime("%Y-%m-%d\u0020%H:%M:%S")\u0020log_line\u0020=\u0020f'{status}:\u0020Date:\u0020{date_now}\u0020-\u0020Order:\u0020{order_number},\u0020Phone:\u0020{phone_number},\u0020Message:\u0020{message}\n'\u0020f.write(log_line)\u0020#\u0020print('[调试]:\u0020log\u0020done')\u0020@retry(tries=5,\u0020delay=3)\u0020def\u0020get_orders():\u0020url\u0020=\u0020f'http://{api_domain}/clientsupplier/orderlist/selectorderlist.html'\u0020params\u0020=\u0020{\u0020'token':\u0020api_token,\u0020'status':\u002098\u0020}\u0020response\u0020=\u0020requests.get(url=url,\u0020params=params).json()\u0020orders\u0020=\u0020[[order['attach'],\u0020order['orderno']]\u0020for\u0020order\u0020in\u0020response['data']]\u0020#\u0020print('[调试]:\u0020get_orders\u0020done')\u0020return\u0020orders\u0020def\u0020complete_order(order_number):\u0020url\u0020=\u0020f'http://{api_domain}/clientsupplier/orderlist/delivergoods'\u0020params\u0020=\u0020{\u0020'token':\u0020api_token,\u0020'orderno':\u0020order_number,\u0020'status':\u0020'5',\u0020'receipt':\u0020receipt,\u0020}\u0020response\u0020=\u0020requests.get(url=url,\u0020params=params).json()\u0020if\u0020response['code']\u0020==\u00201:\u0020return\u0020True\u0020#\u0020print('[调试]:\u0020complete\u0020done')\u0020return\u0020response['msg']\u0020def\u0020using_code(driver,\u0020phone,\u0020order_num):\u0020#\u0020刷新兑换码\u0020try:\u0020#\u0020进入主页\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div[4]/div[1]/div[1]').click()\u0020time.sleep(0.1)\u0020#\u0020进入我的权益\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div[4]/div[1]/div[2]').click()\u0020time.sleep(0.1)\u0020except\u0020Exception\u0020as\u0020e:\u0020return\u0020False,\u00201,\u0020'错误:切换标签卡出错。',\u0020e\u0020#\u0020检测兑换码是否存在\u0020try:\u0020#\u0020进入第一个权益\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div[2]/div[2]/div/div[1]/div[1]/div[1]/div[1]/div[3]').click()\u0020time.sleep(0.1)\u0020except\u0020Exception\u0020as\u0020e:\u0020driver.quit()\u0020return\u0020False,\u00202,\u0020'错误:兑换卡券用完,请及时补充。',\u0020e\u0020#\u0020使用兑换码\u0020try:\u0020#\u0020立即使用\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div/div/div[3]/div[1]/div/div').click()\u0020time.sleep(0.1)\u0020#\u0020定位输入框\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div/div/div[2]/div[1]/div[2]/input').send_keys(phone)\u0020time.sleep(0.1)\u0020#\u0020同意使用协议\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div/div/div[2]/div[2]/div[1]/img').click()\u0020time.sleep(0.5)\u0020#\u0020确认无误\u0020driver.find_element(By.XPATH,\u0020'//[@id="root"]/div/div/div/div[2]/div[2]/div[2]/div[2]').click()\u0020time.sleep(0.3)\u0020#\u0020确认使用\u0020driver.find_element(By.XPATH,\u0020'/html/body/div[3]/div[1]/div[3]/span[2]').click()\u0020time.sleep(0.1)\u0020except\u0020Exception\u0020as\u0020e:\u0020return\u0020False,\u00203,\u0020'错误:订单使用过程出错。',\u0020e\u0020#\u0020获取订单信息\u0020driver.find_element(By.XPATH,\u0020'//[@id="wrapper-root"]/div[1]/div[8]/div[2]')\u0020file_name\u0020=\u0020os.path.join(path_screen_shoot,\u0020f'{order_num}.png')\u0020time.sleep(0.1)\u0020driver.save_screenshot(file_name)\u0020#\u0020返回我的权益\u0020driver.back()\u0020#\u0020print('[调试]:\u0020using_code\u0020done')\u0020return\u0020True,\u00200,\u0020'成功:订单已完成。',\u0020''\u0020def\u0020orders_detection(stack,\u0020printf):\u0020orders_is_in_stack\u0020=\u0020[]\u0020while\u0020True:\u0020try:\u0020orders\u0020=\u0020get_orders()\u0020printf.put(f'【信息】:当前订单总数量\u0020{len(orders)}\u0020当前核内数量\u0020{stack.qsize()}')\u0020if\u0020stack.qsize()\u0020>=\u002050:\u0020beep()\u0020#\u0020print(f'[调试]:\u0020当前栈数量\u0020{stack.qsize()}')\u0020except\u0020Exception\u0020as\u0020e:\u0020printf.put(f'【错误】:订单API出错')\u0020time.sleep(0.1)\u0020continue\u0020if\u0020not\u0020orders:\u0020print('【信息】:无订单等待中')\u0020for\u0020order\u0020in\u0020orders:\u0020if\u0020order\u0020in\u0020orders_is_in_stack:\u0020continue\u0020orders_is_in_stack.append(order)\u0020stack.put(order)\u0020time.sleep(0.1)\u0020def\u0020orders_processed(index,\u0020driver,\u0020stack,\u0020printf):\u0020start_time\u0020=\u0020time.time()\u0020while\u0020True:\u0020try:\u0020order\u0020=\u0020stack.get(block=False)\u0020except\u0020queue.Empty:\u0020keep_alive(driver=driver)\u0020time.sleep(0.1)\u0020continue\u0020checked,\u0020status,\u0020message,\u0020exception\u0020=\u0020using_code(driver=driver,\u0020phone=order[0],\u0020order_num=order[1])\u0020elapsed_time\u0020=\u0020time.time()\u0020-\u0020start_time\u0020if\u0020elapsed_time\u0020>=\u0020300:\u0020driver.quit()\u0020driver\u0020=\u0020start_driver(url=using_code_urls[index])\u0020start_time\u0020=\u0020time.time()\u0020if\u0020checked\u0020is\u0020True:\u0020printf.put(f'【充值成功】:\u0020订单编号[{order[1]}]\u0020号码[{order[0]}]')\u0020complete_order(order_number=order[1])\u0020log(status='Finish',\u0020order_number=order[1],\u0020phone_number=order[0],\u0020message='')\u0020continue\u0020if\u0020status\u0020==\u00200:\u0020printf.put(f'【充值成功】:\u0020订单编号[{order[1]}]\u0020号码[{order[0]}]')\u0020complete_order(order_number=order[1])\u0020log(status='Finish',\u0020order_number=order[1],\u0020phone_number=order[0],\u0020message='')\u0020continue\u0020if\u0020status\u0020==\u00201:\u0020driver.get(using_code_urls[index])\u0020stack.put(order)\u0020continue\u0020if\u0020status\u0020==\u00202:\u0020printf.put(f'【订单提交错误】: 编号[{index}]链接,卡券已耗尽')\u0020remove_empty_link(index=index)\u0020stack.put(order)\u0020return\u0020False,\u0020'错误:卡券已耗尽。'\u0020if\u0020status\u0020==\u00203:\u0020printf.put(f'【订单提交错误】: 订单编号[{order[1]}\u0020号码[{order[0]}]]')\u0020stack.put(order)\u0020continue\u0020def\u0020remove_empty_link(index):\u0020global\u0020using_code_urls\u0020del\u0020using_code_urls[index]\u0020def\u0020main():\u0020#\u0020with\u0020multiprocessing.Pool(processes=process_count)\u0020as\u0020pool:\u0020#\u0020drivers\u0020=\u0020pool.starmap(start_driver,\u0020using_code_urls)\u0020drivers\u0020=\u0020[start_driver(url=url)\u0020for\u0020url\u0020in\u0020using_code_urls]\u0020with\u0020concurrent.futures.ThreadPoolExecutor()\u0020as\u0020executor:\u0020order_detection_thread\u0020=\u0020executor.submit(orders_detection,\u0020queue_order,\u0020queue_output)\u0020processed_threads\u0020=\u0020[executor.submit(orders_processed,\u0020index,\u0020driver,\u0020queue_order,\u0020queue_output)\u0020for\u0020index,\u0020driver\u0020in\u0020enumerate(drivers)]\u0020output_thread\u0020=\u0020executor.submit(info_output,\u0020queue_output)\u0020wait([order_detection_thread,\u0020*processed_threads,\u0020output_thread],\u0020timeout=300)\u0020if\u0020__name__\u0020==\u0020'main':\u0020#\u0020创建队列\u0020queue_order\u0020=\u0020queue.Queue()\u0020queue_output\u0020=\u0020queue.Queue()\u0020#\u0020域名\u0020api_domain\u0020=\u0020'longteng.xinyavip.com'\u0020#\u0020令牌\u0020api_token\u0020=\u0020'f96017ab9f62b7d9ffa4c73a8de431d8'\u0020#\u0020填写兑换链接\u0020using_code_urls\u0020=\u0020[\u0020'https://m.yqb.com/interestplatform/#/home?mzoneToken=8154fb7ae7566cd17185c9a36c82bc1eee74fa19478dd53483b16c2369877692&zoneMno=600002224016&channel=YQB',\u0020'https://m.yqb.com/interestplatform/#/home?mzoneToken=6ffc2c12c972a5432475a08c54bbf9a3ddeb5691bdec1ca34662f0a5db0ed069&zoneMno=600002224016&channel=YQB',\u0020'https://m.yqb.com/interestplatform/#/home?mzoneToken=7a148d1f0cf7ed872b8fb870ef1587078e84421af211551de23b289d0244b8ad&zoneMno=600002224016&channel=YQB',\u0020'https://m.yqb.com/interestplatform/#/home?mzoneToken=d21e29382f0398abc839463cc806c254c721f65d7a3225aa06cd6f5ef9926e61&zoneMno=600002224016&channel=YQB',\u0020'https://m.yqb.com/interestplatform/#/home?mzoneToken=ca89d6d2529e30aceb38ce15f3e0c9d9d67a50451ff836ba1bd1d5b9edaf07c6&zoneMno=600002224016&channel=YQB',\u0020#'https://m.yqb.com/interestplatform/#/home?mzoneToken=645989c608ece0d889f18af4e543371a7850c8bfb7ed28e92d9edbfc888e71ae&zoneMno=600002224016&channel=YQB',\u0020#'https://m.yqb.com/interestplatform/#/home?mzoneToken=64b7cecd0586130a27e03523710a57a123993db07d376a5cb24810d6c934c1d9&zoneMno=600002224016&channel=YQB',\u0020#'https://m.yqb.com/interestplatform/#/home?mzoneToken=003e650bbe64d13e75b7cd79eb0b6a2f3d9310d41c737ddd7b7d9dc5e56297c8&zoneMno=600002224016&channel=YQB',\u0020#'https://m.yqb.com/interestplatform/#/home?mzoneToken=b38e74152f7f92b52213818d8024b45d53ad43131d3c9ed94e5231b3b109f76f&zoneMno=600002224016&channel=YQB',\u0020#'https://m.yqb.com/interestplatform/#/home?mzoneToken=3b0b51ebb3578344413aab23c65fc7d41aea2eb7872ed85bbb1f58ec333549f3&zoneMno=600002224016&channel=YQB',\u0020#'https://m.yqb.com/interestplatform/#/home?mzoneToken=8907feb0bb9a0d2f762dec55801dc0406cbe5b23e43b678f0193ace55afd9f38&zoneMno=600002224016&channel=YQB',\u0020]\u0020#\u0020客户回执\u0020receipt\u0020=\u0020'充值成功'\u0020#\u0020线程进程数量计算\u0020process_count\u0020=\u0020len(using_code_urls)\u0020#\u0020截图保存文件夹\u0020path_screen_shoot\u0020=\u0020'./logs'\u0020#\u0020程序启动\u0020main()\u0020
原文地址: https://www.cveoy.top/t/topic/pBJy 著作权归作者所有。请勿转载和采集!