import\x20queue\nimport\x20concurrent\x2efutures\nimport\x20time\nimport\x20datetime\nimport\x20os\nimport\x20winsound\nfrom\x20retry\x20import\x20retry\nfrom\x20selenium\x2ewebdriver\x2ecommon\x2eby\x20import\x20By\nimport\x20requests\nfrom\x20selenium\x20import\x20webdriver\x20"""\x20v1\x2e0\x20bate\x20--重构项目\x20--增加多api支持\x20"""\ndef\x20beep():\n\x20frequency_beep\x20=\x202500\nduration\x20=\x201000\nwinsound\x2eBeep(frequency_beep, duration)\ndef\x20start_driver(url):\n\x20options\x20=\x20webdriver\x2eChromeOptions()\noptions\x2eAdd_argument('start-maximized')\noptions\x2eAdd_argument('--headless')\noptions\x2eAdd_experimental_option('excludeSwitches', ['enable-automation'])\noptions\x2eAdd_experimental_option('useAutomationExtension', False)\ndriver_tmp\x20=\x20webdriver\x2eChrome(options=options)\nwith\x20open('./stealth.min.js')\x20as\x20f:\n\x20js\x20=\x20f.read()\ndriver_tmp\x2eexecute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': js})\ndriver_tmp\x2eimplicitly_wait(5)\ndriver_tmp\x2eSet_window_size(700, 900)\ndriver_tmp\x2eSet_window_position(0, 0)\n#\x20driver_tmp.set_page_load_timeout(2)\ndriver_tmp.get(url)\nreturn\x20driver_tmp\n@retry(tries=5, delay=1)\ndef\x20keep_alive(driver):\n\x20driver.find_element(By.XPATH, '//[@id="root"]/div/div[4]/div[1]/div[1]').click()\ntime.sleep(0.1)\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div[4]/div[1]/div[2]').click()\n#\x20print('[调试]: keep_alive done')\nreturn\x20True\ndef\x20info_output(printf):\n\x20while\x20True:\n\x20line\x20=\x20printf.get()\nprint(line)\ndef\x20log(status, order_number, phone_number, message):\n\x20today\x20=\x20datetime.date.today()\nlog_dir\x20=\x20'./logs'\nif\x20not\x20os.path.exists(log_dir):\n\x20os.makedirs(log_dir)\nlog_file\x20=\x20os.path.join(log_dir, today.strftime('%Y-%m-%d') + '.txt')\n#\x20将日志写入文件\nwith\x20open(log_file, 'a', encoding='utf-8')\x20as\x20f:\n\x20date_now\x20=\x20datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")\nlog_line\x20=\x20f'{status}: Date: {date_now} - Order: {order_number}, Phone: {phone_number}, Message: {message}\n'\nf.write(log_line)\n#\x20print('[调试]: log done')\n@retry(tries=5, delay=3)\ndef\x20get_orders():\n\x20url\x20=\x20f'http://{api_domain}/clientsupplier/orderlist/selectorderlist.html'\nparams\x20=\x20{\n\x20'token': api_token, 'status': 98\n}\nresponse\x20=\x20requests.get(url=url, params=params).json()\norders\x20=\x20[[order['attach'], order['orderno']] for order in response['data']]\n#\x20print('[调试]: get_orders done')\nreturn\x20orders\ndef\x20complete_order(order_number):\n\x20url\x20=\x20f'http://{api_domain}/clientsupplier/orderlist/delivergoods'\nparams\x20=\x20{\n\x20'token': api_token, 'orderno': order_number, 'status': '5', 'receipt': receipt,\n}\nresponse\x20=\x20requests.get(url=url, params=params).json()\nif\x20response['code'] == 1:\n\x20return\x20True\n#\x20print('[调试]: complete done')\nreturn\x20response['msg']\ndef\x20using_code(driver, phone, order_num):\n\x20#\x20刷新兑换码\ntry:\n\x20#\x20进入主页\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div[4]/div[1]/div[1]').click()\ntime.sleep(0.1)\n#\x20进入我的权益\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div[4]/div[1]/div[2]').click()\ntime.sleep(0.1)\nexcept\x20Exception\x20as\x20e:\n\x20return\x20False, 1, '错误:切换标签卡出错。', e\n#\x20检测兑换码是否存在\ntry:\n\x20#\x20进入第一个权益\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div[2]/div[2]/div/div[1]/div[1]/div[1]/div[1]/div[3]').click()\ntime.sleep(0.1)\nexcept\x20Exception\x20as\x20e:\n\x20driver.quit()\nreturn\x20False, 2, '错误:兑换卡券用完,请及时补充。', e\n#\x20使用兑换码\ntry:\n\x20#\x20立即使用\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div/div/div[3]/div[1]/div/div').click()\ntime.sleep(0.1)\n#\x20定位输入框\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div/div/div[2]/div[1]/div[2]/input').send_keys(phone)\ntime.sleep(0.1)\n#\x20同意使用协议\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div/div/div[2]/div[2]/div[1]/img').click()\ntime.sleep(0.5)\n#\x20确认无误\ndriver.find_element(By.XPATH, '//[@id="root"]/div/div/div/div[2]/div[2]/div[2]/div[2]').click()\ntime.sleep(0.3)\n#\x20确认使用\ndriver.find_element(By.XPATH, '/html/body/div[3]/div[1]/div[3]/span[2]').click()\ntime.sleep(0.1)\nexcept\x20Exception\x20as\x20e:\n\x20return\x20False, 3, '错误:订单使用过程出错。', e\n#\x20获取订单信息\ndriver.find_element(By.XPATH, '//[@id="wrapper-root"]/div[1]/div[8]/div[2]')\nfile_name\x20=\x20os.path.join(path_screen_shoot, f'{order_num}.png')\ntime.sleep(0.1)\ndriver.save_screenshot(file_name)\n#\x20返回我的权益\ndriver.back()\n#\x20print('[调试]: using_code done')\nreturn\x20True, 0, '成功:订单已完成。', ''\ndef\x20orders_detection(stack, printf):\n\x20orders_is_in_stack\x20=\x20[]\nwhile\x20True:\n\x20try:\n\x20orders\x20=\x20get_orders()\nprintf.put(f'【信息】:当前订单总数量 {len(orders)} 当前核内数量 {stack.qsize()}')\nif\x20stack.qsize() >= 50:\n\x20beep()\n#\x20print(f'[调试]: 当前栈数量 {stack.qsize()}')\nexcept\x20Exception\x20as\x20e:\n\x20printf.put(f'【错误】:订单API出错')\ntime.sleep(0.1)\ncontinue\nif\x20not\x20orders:\n\x20print('【信息】:无订单等待中')\nfor\x20order\x20in\x20orders:\n\x20if\x20order\x20in\x20orders_is_in_stack:\n\x20continue\norders_is_in_stack.append(order)\nstack.put(order)\ntime.sleep(0.1)\ndef\x20orders_processed(index, driver, stack, printf):\n\x20start_time\x20=\x20time.time()\x20#\x20记录订单开始处理的时间\nwhile\x20True:\n\x20try:\n\x20order\x20=\x20stack.get(block=False)\nexcept\x20queue.Empty:\n\x20keep_alive(driver=driver)\ntime.sleep(0.1)\ncontinue\n\nchecked, status, message, exception\x20=\x20using_code(driver=driver, phone=order[0], order_num=order[1])\n\n\x20if\x20checked\x20is\x20True:\n\x20printf.put(f'【充值成功】: 订单编号[{order[1]}] 号码[{order[0]}]')\ncomplete_order(order_number=order[1])\nlog(status='Finish', order_number=order[1], phone_number=order[0], message='')\nstart_time\x20=\x20time.time()\x20#\x20重置订单开始处理的时间\ncontinue\n\n\x20if\x20status\x20==\x200:\n\x20printf.put(f'【充值成功】: 订单编号[{order[1]}] 号码[{order[0]}]')\ncomplete_order(order_number=order[1])\nlog(status='Finish', order_number=order[1], phone_number=order[0], message='')\nstart_time\x20=\x20time.time()\x20#\x20重置订单开始处理的时间\ncontinue\n\n\x20if\x20status\x20==\x201:\n\x20driver.get(using_code_urls[index])\nstack.put(order)\ncontinue\n\n\x20if\x20status\x20==\x202:\n\x20printf.put(f'【订单提交错误】: 编号[{index}]链接,卡券已耗尽')\nremove_empty_link(index=index)\nstack.put(order)\nreturn\x20False, '错误:卡券已耗尽。'\n\x20if\x20status\x20==\x203:\n\x20printf.put(f'【订单提交错误】: 订单编号[{order[1]} 号码[{order[0]}]]')\nstack.put(order)\ncontinue\n\n\x20if\x20time.time() - start_time > 300: # 订单处理时间超过5分钟\n\x20driver.quit() # 关闭浏览器\n\x20driver = start_driver(url=using_code_urls[index]) # 重新启动一个新的浏览器\n\x20start_time = time.time() # 重置订单开始处理的时间\n\ndef\x20remove_empty_link(index):\n\x20global\x20using_code_urls\ndel\x20using_code_urls[index]\ndef\x20main():\n\x20#\x20with multiprocessing.Pool(processes=process_count) as pool:\n\x20# drivers = pool.starmap(start_driver, using_code_urls)\ndrivers\x20=\x20[start_driver(url=url) for url in using_code_urls]\nwith\x20concurrent.futures.ThreadPoolExecutor()\x20as\x20executor:\n\x20executor.submit(orders_detection, queue_order, queue_output)\nfor\x20index, driver\x20in\x20enumerate(drivers):\n\x20executor.submit(orders_processed, index, driver, queue_order, queue_output)\nexecutor.submit(info_output, queue_output)\nif\x20__name__ == 'main':\n\x20#\x20创建队列\nqueue_order\x20=\x20queue.Queue()\nqueue_output\x20=\x20queue.Queue()\n\x20#\x20域名\napi_domain\x20=\x20'longteng.xinyavip.com'\n#\x20令牌\napi_token\x20=\x20'f96017ab9f62b7d9ffa4c73a8de431d8'\n#\x20填写兑换链接\nusing_code_urls\x20=\x20[\n\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=8154fb7ae7566cd17185c9a36c82bc1eee74fa19478dd53483b16c2369877692&zoneMno=600002224016&channel=YQB',\n\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=6ffc2c12c972a5432475a08c54bbf9a3ddeb5691bdec1ca34662f0a5db0ed069&zoneMno=600002224016&channel=YQB',\n\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=7a148d1f0cf7ed872b8fb870ef1587078e84421af211551de23b289d0244b8ad&zoneMno=600002224016&channel=YQB',\n\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=d21e29382f0398abc839463cc806c254c721f65d7a3225aa06cd6f5ef9926e61&zoneMno=600002224016&channel=YQB',\n\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=ca89d6d2529e30aceb38ce15f3e0c9d9d67a50451ff836ba1bd1d5b9edaf07c6&zoneMno=600002224016&channel=YQB',\n\x20#\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=645989c608ece0d889f18af4e543371a7850c8bfb7ed28e92d9edbfc888e71ae&zoneMno=600002224016&channel=YQB',\n\x20#\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=64b7cecd0586130a27e03523710a57a123993db07d376a5cb24810d6c934c1d9&zoneMno=600002224016&channel=YQB',\n\x20#\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=003e650bbe64d13e75b7cd79eb0b6a2f3d9310d41c737ddd7b7d9dc5e56297c8&zoneMno=600002224016&channel=YQB',\n\x20#\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=b38e74152f7f92b52213818d8024b45d53ad43131d3c9ed94e5231b3b109f76f&zoneMno=600002224016&channel=YQB',\n\x20#\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=3b0b51ebb3578344413aab23c65fc7d41aea2eb7872ed85bbb1f58ec333549f3&zoneMno=600002224016&channel=YQB',\n\x20#\x20'https://m.yqb.com/interestplatform/#/home?mzoneToken=8907feb0bb9a0d2f762dec55801dc0406cbe5b23e43b678f0193ace55afd9f38&zoneMno=600002224016&channel=YQB',\n\x20]\n#\x20客户回执\nreceipt\x20=\x20'充值成功'\n#\x20线程进程数量计算\nprocess_count\x20=\x20len(using_code_urls)\n#\x20截图保存文件夹\npath_screen_shoot\x20=\x20'./logs'\n#\x20程序启动\nmain()


原文地址: https://www.cveoy.top/t/topic/pBJE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录