def do_after_place_order_success(self, confirm_pay_filename): logger.info('确认订单已成功支付,正在获取订单的相关信息,更新刷单状态...') order_no = self.driver.find_element_by_xpath( '//*[@id="buyer-ordertable"]//tr[1]/td[2]/p[1]/span[2]').text logger.info("订单号为:%s" % order_no) price_text = self.driver.find_element_by_xpath( '//*[@id="buyer-ordertable"]/tbody[1]/tr[1]/td[4]/div/p[2]' ).text.strip() actual_order_amount = re.sub(r'\$ ', '', price_text) logger.info('订单总价:%s' % actual_order_amount) payment_date = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') logger.info('下单时间:%s' % payment_date) brushing_data = { str(self.task_id): { "task_id": self.task_id, "status": 2, "order_no": order_no, "payment_date": payment_date, "actual_order_amount": float(actual_order_amount) } } self.update_brushing_status(json.dumps(brushing_data)) # 新增刷单操作日志 data = { "task_id": self.task_id, "info": "下单成功!", 'ip': self.get_ip_info(proxies={'https': self.proxy}) } self.create_task_order_log(json.dumps(data)) os.remove(confirm_pay_filename) logger.info('删除了一个文件:%s' % confirm_pay_filename)
def do_after_set_user_info_success(self): self.driver.get(self.index_url) time.sleep(10) logger.info('%s用户注册成功!' % self.user_info['data']['email']["login_aliexpress_email"]) data = { 'data': { "aliexpress_password": self.password, "email_id": self.user_info['data']['email']['id'], "credit_id": self.user_info['data']["credit"]['id'], "address_id": self.user_info['data']["address"]['id'], "ip_id": self.user_info['data']["ip"]['id'], "register_city": self.register_city, "header": json.dumps(self.headers), "cookies": json.dumps(self.driver.get_cookies()), "status_code": "200" } } # print(json.dumps(data)) self.save_success_register_info(json.dumps(data)) self.driver.quit() dir = os.path.join(os.path.dirname(__file__), 'data') last_domain_json_file = dir + '/' + 'last_email_domain.json' with open(last_domain_json_file, 'w', encoding='utf-8') as f: domain_index_data = {'last_index': self.index} f.write(json.dumps(domain_index_data))
def fill_in_payment_information2(self): logger.info('正在进入支付信息的填写流程...') WebDriverWait(driver=self.driver, timeout=60).until( EC.element_to_be_clickable((By.XPATH, '//input[@name="cardNum"]')) ) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('cardNum').send_keys( self.task_infos[str(self.task_id)]["payment"]["CreditCardNumber"]) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('dateM').send_keys(self.task_infos[str(self.task_id)]["payment"]["ccMonth"]) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('dateY').send_keys(self.task_infos[str(self.task_id)]["payment"]["ccYear"]) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('cvv2').send_keys(self.task_infos[str(self.task_id)]["payment"]["cvv"]) # 切割全名并判断长度 FullName_text = self.task_infos[str(self.task_id)]["address"]["FullName"].split() if len(FullName_text) == 1: time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('cardHolderF').send_keys(FullName_text[0]) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('cardHolderL').send_keys(FullName_text[0]) else: time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('cardHolderF').send_keys(FullName_text[0]) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('cardHolderL').send_keys(FullName_text[1]) time.sleep(random.uniform(3, 5)) try: self.driver.find_element_by_xpath('//div[@class="checkout-button"]/button[2]').send_keys(Keys.ENTER) logger.info('完成支付信息的填写!') except Exception as e: print(e)
def modify_one_address_invalid(self, address_id): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressModifyOneAddress&address_id=%s' % address_id resp = requests.get(url) if resp.json().get('code') == 200: logger.info('成功让地址失效!') else: logger.info('未能让地址失效')
def create_task_order_log(self, data): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressCreateTaskOrderLog' resp = post(requests.session(), url=url, post_data=data) if resp.json()['status'] == 0: logger.info('[taskid: %s]新增刷单操作日志成功!' % self.task_id) else: logger.info('[taskid: %s]新增刷单操作日志失败!' % self.task_id)
def fill_in_pament_information(self): logger.info('正在创建支付信息...') # WebDriverWait(self.driver, 40).until( # EC.element_to_be_clickable((By.XPATH, '//div[@class="payment-info mini"]/div[@class="mini-title"]')) # ) # self.driver.find_element_by_xpath('//div[@class="payment-info mini"]/div[@class="mini-title"]').click() WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable((By.ID, 'cardNo')) ) self.driver.find_element_by_id('cardNo').send_keys(self.task_infos[str(self.task_id)]["payment"]["CreditCardNumber"]) time.sleep(random.uniform(2, 4)) #卡持有者强制用空格隔开firstname 与 lastname # 切割全名并判断长度 FullName_text = self.task_infos[str(self.task_id)]["address"]["FullName"].split() print(FullName_text[0] + ' ' + FullName_text[0]) if len(FullName_text) == 1: self.driver.find_element_by_id('cardHolder').send_keys(FullName_text[0] + ' ' + FullName_text[0]) time.sleep(random.uniform(2, 4)) else: self.driver.find_element_by_id('cardHolder').send_keys(self.task_infos[str(self.task_id)]["address"]["FullName"]) time.sleep(random.uniform(2, 4)) expireDate = self.task_infos[str(self.task_id)]["payment"]["ccMonth"] + self.task_infos[str(self.task_id)]["payment"]["ccYear"] self.driver.find_element_by_id('expire').send_keys(expireDate) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_id('cvc').send_keys(self.task_infos[str(self.task_id)]["payment"]["cvv"]) time.sleep(2) #//*[@id="main"]/div[2]/div/div/div[2]/div[2]/div[2]/button self.driver.find_element_by_xpath('//div[@class="save"]/button[@type="button"]').click() logger.info('完成支付信息的创建!')
def run(self): for i in range(1, 5): url = self.base_search_url + self.key_words + "&page=" + str(i) logger.info('[%s] [%s] 正在搜索第 [%d] 页中的广告...' % (self.id, self.key_words, i)) html = self.get_search_list_page(url) if html: num = self.parse_search_list_page(html, i) # print('第%d页中广告个数为%d' % (i, num)) logger.info('[%s] [%s] 第 [%d] 页中广告个数为 [%d]' % (self.id, self.key_words, i, num)) if num == 0: logger.info('[%s] [%s] 第 [%d] 页未搜索到广告,停止搜索!' % (self.id, self.key_words, i)) break else: logger.info('[%s] [%s] 跳转到登录页,停止搜索!' % (self.id, self.key_words)) break logger.info('[%s] [%s] 总共搜索到的广告个数:[%d]' % (self.id, self.key_words, len(self.AD_data))) print(json.dumps(self.AD_data)) ad_data = { 'data': { "id": self.id, "status": "1", "attack_result": json.dumps(self.AD_data) } } self.update_ad_data(json.dumps(ad_data))
def create_task_order_log(data): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressCreateTaskOrderLog' resp = requests.post(url, data) if resp.json()['status'] == 0: logger.info('新增刷单操作日志成功!') else: logger.info('新增刷单操作日志失败!')
def update_brushing_status(self, data): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressModifyTaskOrderStatus' resp = post(requests.session(), url=url, post_data=data) # print(resp.text) if resp.json()['msg'] == 'ok': logger.info('[taskid: %s]刷单状态更新成功!' % self.task_id) else: logger.info('[taskid: %s]刷单状态更新失败!' % self.task_id)
def save_success_register_info(data): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressAutoCreateAccountPost' resp = tools.post(requests.session(), url=url, post_data=data) if resp: if resp.text.strip() == "success" and resp.status_code == 200: # print(resp.text) logger.info('注册信息已成功入库!') else: logger.info('注册信息入库失败!')
def update_brushing_status(data): # 测试机 # url = 'http://testthird.gets.com:8383/api/index.php?sec=20171212getscn&act=aliexpressModifyTaskOrderStatus' # 线上 url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressModifyTaskOrderStatus' resp = post(requests.session(), url=url, post_data=data) if resp.json()['msg'] == 'ok': logger.info('刷单状态更新成功!') else: logger.info('刷单状态更新失败!')
def do_after_place_order_failed(self, confirm_pay_filename): logger.info('支付失败!') self.driver.save_screenshot('PayFailed.png') # logger.info('支付失败的url:%s' % self.driver.current_url) # 新增刷单操作日志 data = { "task_id": self.task_id, "info": "支付失败!导致下单失败!", 'ip': self.get_ip_info(proxies={'https': self.proxy}) } self.create_task_order_log(json.dumps(data))
def update_ad_data(self, data): # url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=modifyAliexpressAdvertisingAttack' url = 'http://testthird.gets.com:8383/api/index.php?sec=20171212getscn&act=modifyAliexpressAdvertisingAttack' resp = post(requests.session(), url=url, post_data=data) print("result", resp.text) if resp: if resp.json().get('msg') == "OK": logger.info('[%s] [%s] 搜索到的广告数据入库成功!' % (self.id, self.key_words)) else: logger.info('[%s] [%s] 搜索到的广告数据入库失败!' % (self.id, self.key_words))
def update_kill_data(self, data): # url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=modifyAliexpressAdvertisingAttackURL' url = 'http://testthird.gets.com:8383/api/index.php?sec=20171212getscn&act=modifyAliexpressAdvertisingAttackURL' resp = post(requests.session(), url=url, post_data=data) print("result", resp.text) if resp: if resp.json().get('msg') == "OK": logger.info('[master_id: %s] [id: %s] 广告点击的数据入库成功!' % (self.task.get("master_id"), self.task.get('id'))) else: logger.info('[%s] [%s] 广告点击的数据入库失败!' % (self.task.get("master_id"), self.task.get('id')))
def fill_in_address_infomation(self): # self.driver.refresh() WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable((By.ID, 'contactPerson'))) self.driver.find_element_by_id('contactPerson').send_keys( self.task_infos[str(self.task_id)]["address"]["FullName"]) time.sleep(random.uniform(2, 4)) # 电话号码需要处理,若有"+1"前缀,则去掉"+1"前缀 PhoneNumber = self.task_infos[str( self.task_id)]["address"]["PhoneNumber"] if re.search(r'\+1|\s|\(|\)|-', PhoneNumber): PhoneNumber = re.sub(r'\+1|\s|\(|\)|-', '', PhoneNumber) self.driver.find_element_by_id('mobileNo').send_keys(PhoneNumber) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('address').send_keys( self.task_infos[str(self.task_id)]["address"]["AddressLine1"]) time.sleep(random.uniform(2, 4)) if self.task_infos[str(self.task_id)]["address"]["AddressLine2"]: self.driver.find_element_by_name('address2').send_keys( self.task_infos[str(self.task_id)]["address"]["AddressLine2"]) # else: # self.driver.find_element_by_name('address2').send_keys("Al Bada'a Park 1") time.sleep(random.uniform(2, 4)) self.driver.find_element_by_xpath( '//*[@id="main"]/div[1]/div/div/div[2]/div/div[2]/div[3]/div/div/div[1]/span/span/span/span[1]/span/input' ).click() time.sleep(5) #显示7个 # self.driver.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[2]/div/div[2]/div[3]/div/div/div[1]/span/div/div/div/ul/li[5]').click() self.driver.find_element_by_xpath('//li[text()="California"]').click() time.sleep(4) self.driver.find_element_by_xpath( '//*[@id="main"]/div[1]/div/div/div[2]/div/div[2]/div[3]/div/div/div[2]/span/span/span/span[1]/span/input' ).click() # self.driver.find_element_by_xpath('//li[text()="3 points"]').click() time.sleep(5) # self.driver.find_element_by_xpath( # '//*[@id="main"]/div[1]/div/div/div[2]/div/div[2]/div[3]/div/div/div[2]/span/div/div/div/ul/li[5]').click() # self.driver.find_element_by_xpath('//li[text()="3 points"]').click() self.driver.find_element_by_xpath('//li[text()="%s"]' % random.choice(City_List)).click() time.sleep(random.uniform(2, 4)) self.driver.find_element_by_name('zip').send_keys(self.task_infos[str( self.task_id)]["address"]["PostalCode"].strip()) time.sleep(random.uniform(2, 4)) self.driver.find_element_by_xpath('//input[@type="checkbox"]').click() time.sleep(random.uniform(2, 4)) self.driver.find_element_by_xpath( '//div[@class="save"]/button[@type="button"]').click() logger.info('完成收货地址信息的填写!')
def parse_list_page(self,html): parseHtml = etree.HTML(html) good_detail_urls = parseHtml.xpath('//ul[@id="hs-below-list-items"]/li/div[1]/div[1]/div/a/@href') #绑定当前页的所有商品详情链接 self.good_detail_urls = good_detail_urls for detail_url in good_detail_urls: if re.search(self.target_id,detail_url): detail_url = "https:" + detail_url self.target_good_detail_url = detail_url logger.info('目标商品的详情链接是:%s' % self.target_good_detail_url) # logger.info('搜索页中找到了目标商品!') self.good_detail_urls = good_detail_urls # logger.info('目标商品所在列表页的所有商品的详情链接是:%s' % self.good_detail_urls) return True return False
def do_after_order_close(self): logger.info('[taskid: %s] 订单已关闭,无法留评!!' % self.task_id) review_data = { str(self.task_id): { "task_id": self.task_id, "status": 61, } } # 更新刷单状态 self.update_brushing_status(json.dumps(review_data)) # 新增刷单操作日志 log_data = { "task_id": self.task_id, "info": "留评失败!", 'ip': self.get_ip_info(proxies={'https': self.proxy}) } self.create_task_order_log(json.dumps(log_data))
def do_after_review_success(self): logger.info('[taskid: %s]留评成功!' % self.task_id) # 更新刷单状态 review_data = { str(self.task_id): { "task_id": self.task_id, "status": 6, } } self.update_brushing_status(json.dumps(review_data)) # 新增刷单操作日志 log_data = { "task_id": self.task_id, "info": "留评成功!", 'ip': self.get_ip_info(proxies={'https': self.proxy}) } self.create_task_order_log(json.dumps(log_data))
def delete_other_goods_from_cart(self): try: WebDriverWait(driver=self.driver, timeout=20).until( EC.element_to_be_clickable((By.XPATH, '//div[contains(@class,"nav-cart nav-cart-box")]/a[1]')) ) self.driver.find_element_by_xpath('//div[contains(@class,"nav-cart nav-cart-box")]/a[1]').send_keys(Keys.ENTER) except TimeoutException: logger.info('进入购物车等待超时,程序退出!') sys.exit(0) time.sleep(10) items = self.driver.find_elements_by_xpath('//div[@class="store-list single"]') # print(len(items)) try: for item in items: good_detail_url = item.find_element_by_xpath('.//div[@class="product-title"]/a').get_attribute('href') if not re.search(self.target_id,good_detail_url): #非目标商品,直接从购物车删除 item.find_element_by_xpath('.//div[@class="opt-group"]/button[2]').click() time.sleep(2) print('点击删除!') #点击ok WebDriverWait(driver=self.driver, timeout=20).until( EC.element_to_be_clickable((By.XPATH, '//div[@class="next-dialog-footer next-align-left"]/button[1]')) ) self.driver.find_element_by_xpath('//div[@class="next-dialog-footer next-align-left"]/button[1]').send_keys( Keys.ENTER) logger.info('点击OK,确认删除非目标商品!') logger.info('非目标商品已从购物车中删除!') time.sleep(2) # 点击删除后,网页会刷新,元素已发生改变,需捕获异常并处理 except StaleElementReferenceException: self.delete_other_goods_from_cart()
def do_after_review_failed(self, confirm_receive_filename, confirm_leavefeedback_filename): logger.info('[taskid: %s]留评失败!' % self.task_id) review_data = { str(self.task_id): { "task_id": self.task_id, "status": 61, } } # 更新刷单状态 self.update_brushing_status(json.dumps(review_data)) # 新增刷单操作日志 log_data = { "task_id": self.task_id, "info": "留评失败!", 'ip': self.get_ip_info(proxies={'https': self.proxy}) } self.create_task_order_log(json.dumps(log_data)) self.driver.save_screenshot('LeaveFeedbackFailed.png') os.remove(confirm_receive_filename) logger.info('[taskid: %s]删除了一个文件:%s' % (self.task_id, confirm_receive_filename)) os.remove(confirm_leavefeedback_filename) logger.info('[taskid: %s]删除了一个文件:%s' % (self.task_id, confirm_leavefeedback_filename))
def run(self): #先请求主页,点击注册链接进行注册,需要判断是否有弹窗 try: self.driver.get(self.index_url) try: WebDriverWait(self.driver, 15).until( EC.element_to_be_clickable((By.CLASS_NAME, 'close-layer'))) self.driver.find_element_by_class_name('close-layer').click() except TimeoutException: pass self.driver.execute_script( 'window.scrollTo(document.body.scrollWidth,0 );') time.sleep(3) element = self.driver.find_element_by_xpath( '//div[@id="nav-user-account"]/div[1]') actions = ActionChains(self.driver) actions.move_to_element(element) actions.perform() # time.sleep(1) # self.driver.save_screenshot('before.png') WebDriverWait(self.driver, 60).until( EC.element_to_be_clickable( (By.XPATH, '//div[@id="nav-user-account"]/div[2]/dl/dd/a'))) self.driver.find_element_by_xpath( '//div[@id="nav-user-account"]/div[2]/dl/dd/a').click() # time.sleep(1) # self.driver.save_screenshot('after.png') logger.info( '当前正在注册的用户是%s' % self.user_info['data']['email']["login_aliexpress_email"]) self.register(self.driver.current_url) except (TimeoutException, NoSuchElementException): #注册链接不可点击导致超时,设置回调,重新请求主页并进行相关操作 logger.info('元素未加载,或者网络延迟导致超时,关闭当前浏览器,杀死当前线程,准备创建新的线程继续执行任务!') self.driver.quit() sys.exit(0)
def run(self): s = requests.session() for key in self.cookies: s.cookies.set(key, self.cookies[key]) url = self.task.get('attack_url') res = get(s, url=url, headers=self.headers, proxies=self.proxies) if res and 'Add to Cart' in res.text: logger.info('成功点击广告 [1] 次!') attack_info = { "id": self.task.get("id"), "click_number": "1", "brand_name": self.task.get("attack_brand_name"), "asin": self.task.get("attack_asin"), "log": '成功点击广告1次!', "ip": self.get_ip_info(proxies=self.proxies) } kill_data = { 'data': { "master_id": self.task.get("master_id"), "attack_info": json.dumps(attack_info) } } self.update_kill_data(json.dumps(kill_data))
def run(self): try: self.driver.get('http://www.aliexpress.com/') #过滤弹窗 try: WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable((By.CLASS_NAME, 'close-layer'))) self.driver.find_element_by_class_name('close-layer').click() except TimeoutException: pass WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable( (By.XPATH, '//span[@class="register-btn"]/a'))) #点击登录 self.driver.find_element_by_xpath( '//span[@class="register-btn"]/a').click() time.sleep(10) #切换到子iframe self.driver.switch_to.frame('alibaba-login-box') #输入登录信息 WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable( (By.XPATH, '//input[@id="fm-login-id"]'))) time.sleep(random.uniform(4, 8)) self.driver.find_element_by_id('fm-login-id').send_keys( self.task_infos[str( self.task_id)]["account"]["login_aliexpress_email"]) time.sleep(random.uniform(4, 8)) self.driver.find_element_by_id('fm-login-password').send_keys( self.task_infos[str( self.task_id)]["account"]["login_aliexpress_password"]) time.sleep(random.uniform(4, 8)) self.driver.find_element_by_id('fm-login-submit').click() #此处判断登录过程中是否有滑块验证码,有则终止程序 if 'display: block' in self.driver.find_element_by_id( 'fm-login-checkcode-title').get_attribute('style'): logger.info('登录时发现滑块验证码,程序退出!') self.driver.quit() sys.exit(0) #弹窗处理 try: WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable((By.CLASS_NAME, 'close-layer'))) self.driver.find_element_by_class_name('close-layer').click() except TimeoutException: pass if self.driver.current_url == 'https://www.aliexpress.com/': #插入账号登录日志 login_log_data = { 'data': { "account_id": self.task_infos[str( self.task_id)]["account"]["account_id"], "header": self.task_infos[str( self.task_id)]['account']['header'], "cookies": json.dumps(self.driver.get_cookies()), "login_status": "1", "note": "登录成功" } } self.insert_account_login_log(json.dumps(login_log_data)) #当账户成功登录时, 把登录的header和cookie修改对应账户表的字段 login_success_info_data = { 'data': { "account_id": self.task_infos[str( self.task_id)]["account"]["account_id"], "header": self.task_infos[str( self.task_id)]['account']['header'], "cookies": json.dumps(self.driver.get_cookies()) } } self.update_account_login_success_info( json.dumps(login_success_info_data)) elif 'passport.aliexpress.com' in self.driver.current_url: logger.info('登录后发现验证码,账户已被封!') #账户被封,也更新刷单状态 brushing_data = { str(self.task_id): { "task_id": self.task_id, "status": 10, # "order_no": '', # "payment_date": '', # "actual_order_amount": 0.00 } } self.update_brushing_status(json.dumps(brushing_data)) self.driver.quit() logger.info('程序退出!') sys.exit(0) self.refund() logger.info('当前账户操作完毕,关闭当前浏览器!') self.driver.quit() except NoSuchFrameException: logger.info('切换到登录的frame超时,正在重新请求主页,继续执行登录操作') self.run() except TimeoutException: # 在操作过程中等待超时,先退出当前登录状态,再重新执行run方法回调,重新走流程。也可直接结束程序,但更适合在多线程的情况下操作。 logger.info('等待超时,正在检查登录状态,若已登录,则退出登录状态,重新走流程!') self.driver.execute_script( 'window.scrollTo(document.body.scrollWidth,0 );') time.sleep(3) try: element = self.driver.find_element_by_xpath( '//div[@id="nav-user-account"]/div[1]') actions = ActionChains(self.driver) actions.move_to_element(element) actions.perform() WebDriverWait(self.driver, 60).until( EC.element_to_be_clickable( (By.XPATH, '//div[@id="nav-user-account"]/div[2]/div[1]/a'))) self.driver.find_element_by_xpath( '//div[@id="nav-user-account"]/div[2]/div[1]/a').click() time.sleep(4) # 此处必须有关闭浏览器的操作,否则登录状态退出不彻底,不能正常run回调 self.driver.close() except NoSuchElementException: pass self.run()
def update_account_login_success_info(data): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressUpdateAccountLoginSuccessInfo' requests.post(url, data) logger.info('对应账户的header和cookies字段已成功修改!')
index = json.loads(json_data)['last_index'] + 1 if index == len(Email_Domains): index = 0 else: index = 0 # Email = random.choice(Upper_Letter_List) + ''.join(random.sample(Lower_Letter_List,7)) + ''.join(random.sample(Digit_List,3)) + '@' + Email_Domains[index] Email = random.choice(names) + random.choice(names) + ''.join( random.sample(Digit_List, 3)) + '@' + Email_Domains[index] print(Email) url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressAutoCreateAccountGet&country_code={country_code}&validate_email={validateEmail}&dynamic_ip={dynamicIp}'.format( country_code='DE', validateEmail=Email, dynamicIp=ip) resp = tools.get(s, url=url) if resp: if resp.json().get('code') == 200: user_infos = resp.json() #由于接口一次只返回一个待注册用户的数据,默认只创建一个子线程去执行注册流程 for i in range(0, 1): t = threading.Thread(target=main, args=(user_infos, proxies['https'], index, register_city)) t.start() t.join() else: # logger.info('未获取到待注册账户的数据,程序结束!') # sys.exit(0) logger.info('当前无注册任务,程序[sleep 10m]...') time.sleep(60 * 10) else: logger.info('任务系统出错,程序[sleep 10m]...') time.sleep(60 * 10)
def insert_account_login_log(data): url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressInsertAccountLoginLog' requests.post(url, data) logger.info('账户登录日志已成功插入!')
def refund(self): # 点击首页中的"My Orders",进入个人订单页面 WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable( (By.XPATH, '//div[@id="user-benefits"]//ul/li[2]/a'))) self.driver.find_element_by_xpath( '//div[@id="user-benefits"]//ul/li[2]/a').click() #搜索按钮可点击 WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable((By.ID, 'id="search-btn"'))) #先找到所有的订单items,再根据订单号或者商品asin,定位到目标订单所在的item items = self.driver.find_elements_by_xpath( '//*[@id="buyer-ordertable"]/tbody') for item in items: if item.find_element_by_xpath( './tr[1]/td[2]/p[1]/span[2]').text == orderno: logger.info('找到目标订单所在的tbody!') #根据当前订单的状态做判断 if item.find_element_by_xpath('./tr[2]/td[3]/span').text.strip( ) == 'Fund Processing': #点击'Open Dispute',此时会打开一个新的页面,需要进行窗口的切换 item.find_element_by_xpath('./tr[2]/td[2]/span/a').click() self.driver.switch_to.window(self.driver.window_handles[1]) time.sleep(5) #在新页面中执行下拉滚动条,再次点击'Open Dispute' self.driver.execute_script( 'window.scrollTo(0,document.body.scrollHeight)') WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable( (By.XPATH, '//*[@id="TP_ProductTable"]/tbody/tr/td[5]/a'))) self.driver.find_element_by_xpath( '//*[@id="TP_ProductTable"]/tbody/tr/td[5]/a').click() #页面跳转,点击'Refund Only'按钮 WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable((By.ID, 'submit-ro'))) self.driver.find_element_by_id('submit-ro').click() #页面跳转,进入refund页面 #url: https://trade.aliexpress.com/issue/fastissue/createIssueStep2.htm?orderId=99723247396644&issueId=400930414496644&solutionType=ro #i want to apply for: 下拉列表选择默认即可,不操作 #Did you receive the item? 选择是 WebDriverWait(self.driver, 40).until( EC.element_to_be_clickable(( By.XPATH, '//div[@id="is_received_c"]/div[2]/div[1]/input'))) self.driver.find_element_by_xpath( '//div[@id="is_received_c"]/div[2]/div[1]/input' ).click() #选择否 # self.driver.find_element_by_xpath('//div[@id="is_received_c"]/div[2]/div[2]/input').click() #做出选择后,下方会插入一个下拉选择,Reason for refund request time.sleep(5) self.driver.find_element_by_id('problem_type2').click() time.sleep(3) #点击'Product not as described' self.driver.find_element_by_xpath( '/html/body/div[9]/ul/li[2]').click() time.sleep(5) #点击'Please specify the reason' time.sleep(3) #点击'Style not as described' self.driver.find_element_by_xpath( '/html/body/div[10]/ul/li[2]').click() time.sleep(random.randint(2, 5)) #Refund Amount self.driver.find_element_by_id('refund-amount').send_keys( actual_order_amount) time.sleep(random.randint(2, 5)) self.driver.find_element_by_id( 'request-detail-txt').send_keys( 'very bad qualiy,and the style is not as described' ) #上传图片 time.sleep(random.randint(2, 5)) self.driver.find_element_by_xpath( '//*[@id="imageUploader"]/button').send_keys('图片路径') time.sleep(10) self.driver.find_element_by_id('videoUploader').send_keys( '视频路径') time.sleep(30) #点击提交 self.driver.find_element_by_id('submit').submit() #提交后的url:https://trade.aliexpress.com/issue/fastissue/Detail.htm?issueId=400930414496644&buyerAliid=1959146644 time.sleep(15) if 'fastissue/Detail' in self.driver.current_url: logger.info('已成功提交退款申请!') break self.driver.quit() logger.info('当前账户操作完毕,关闭当前浏览器!')
def main(task_infos, task_id): spider = AliexpressRefundSpider(task_infos, task_id) spider.run() if __name__ == '__main__': # 多线程循环模式:默认一次最多获取5个待评论任务,自动根据获取到的任务数量创建相应数量的线程数,去执行各自分配到的刷单任务;当获取不到任务时,程序退出。 #修改limit参数即可设置获取的任务数量,现在是1 # while True: url = 'http://third.gets.com/api/index.php?sec=20171212getscn&act=aliexpressGetTaskOrdersList2&get_type=3&limit=1&debug_list=0&debug_allot=0' resp = requests.get(url) try: if resp.json() == []: logger.info('未获取到待刷单列表的数据,程序结束!') sys.exit(0) else: task_infos = resp.json() task_id_str_list = [] for task_id_str in task_infos: task_id_str_list.append(task_id_str) logger.info('成功获取到%d条待评论的数据!' % len(task_id_str_list)) logger.info('将创建%d个线程来分别执行评论任务!' % len(task_id_str_list)) threads = [] for i in range(len(task_id_str_list)): task_id = int(task_id_str_list[i]) t = threading.Thread(target=main, args=(task_infos, task_id)) threads.append(t) t.start()
def register(self): try: self.driver.get( 'https://login.aliexpress.com/join/buyer/expressJoin.htm') WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable( (By.XPATH, '//input[@placeholder="Email address"]'))) self.driver.find_element_by_xpath( '//input[@placeholder="Email address"]').send_keys( self.user_info['data']['email']["login_aliexpress_email"]) time.sleep(random.uniform(4, 6)) self.driver.find_element_by_xpath( '//input[@placeholder="Password"]').send_keys(self.password) time.sleep(random.uniform(4, 6)) js = 'document.getElementById("ws-xman-register-submit").click();' self.driver.execute_script(js) time.sleep(10) self.driver.get(self.index_url) try: WebDriverWait(self.driver, 20).until( EC.element_to_be_clickable((By.CLASS_NAME, 'close-layer'))) self.driver.find_element_by_class_name('close-layer').click() except TimeoutException: pass # time.sleep(5) # self.driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # time.sleep(3) # if 'Hi, US' in self.driver.page_source: # time.sleep(10) try: WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable( (By.XPATH, '//div[@class="username"]/a[1]'))) text = self.driver.find_element_by_xpath( '//div[@class="username"]/a[1]/span').text.strip() if 'DE' in text: self.set_user_info() time.sleep(10) if 'successfully submitted' in self.driver.page_source: logger.info('个人信息设置成功!success!') self.do_after_set_user_info_success() self.driver.quit() sys.exit(0) else: logger.info('个人信息设置失败!failed,Quit!') self.driver.quit() sys.exit(0) else: logger.info('注册出错,程序结束!') self.driver.quit() sys.exit(0) except TimeoutException: pass if re.search(r', DE!', self.driver.page_source): self.set_user_info() time.sleep(10) if 'successfully submitted' in self.driver.page_source: logger.info('个人信息设置成功!success!') self.do_after_set_user_info_success() self.driver.quit() sys.exit(0) else: logger.info('个人信息设置失败!failed,Quit!') self.driver.quit() sys.exit(0) else: logger.info('注册出错,程序结束!') self.driver.quit() sys.exit(0) except TimeoutException: logger.info('等待超时,程序终止!') self.driver.quit() sys.exit(0)
def set_user_info(self): logger.info('正在设置用户的基本信息...') WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable( (By.XPATH, '//div[@class="fast-entry"]/ul/li[1]/a'))) self.driver.find_element_by_xpath( '//div[@class="fast-entry"]/ul/li[1]/a').click( ) #'My Aliexpress/Accout' WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable((By.ID, 'headMenu_account'))) self.driver.find_element_by_id('headMenu_account').click() #'Account' WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable( (By.XPATH, '//div[@class="me-menu-body"]/p[@class="me-menu-title"]/a'))) self.driver.find_element_by_xpath( '//div[@class="me-menu-body"]/p[@class="me-menu-title"]/a').click( ) #'Edit Settings' WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable( (By.XPATH, '//div[@id="settings-panel"]/div[1]/ul/li[2]/a'))) self.driver.find_element_by_xpath( '//div[@id="settings-panel"]/div[1]/ul/li[2]/a').click( ) #'Edit Member Profile' time.sleep(5) # 此处切换选项卡 self.driver.switch_to.window(self.driver.window_handles[1]) #点击"edit" WebDriverWait(driver=self.driver, timeout=30).until( EC.element_to_be_clickable( (By.XPATH, '//a[@class="dpl-btn to-edit-btn"]'))) self.driver.find_element_by_xpath( '//a[@class="dpl-btn to-edit-btn"]').click() #开始编辑 WebDriverWait(driver=self.driver, timeout=30).until( EC.presence_of_element_located( (By.XPATH, '//table[@class="tables V"]/tbody/tr[1]/td/div[1]/input'))) time.sleep(10) truename = self.user_info['data']['address']['truename'] if re.search(r"[^A-Za-z\s]", truename): truename = re.sub(r"[^A-Za-z\s]", '', truename) print(truename) # time.sleep(60) if len(truename.split()) == 1: self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[1]/input' ).clear() self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[1]/input' ).send_keys(truename.split()[0]) time.sleep(random.uniform(0.5, 1.0)) # time.sleep(60) self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[2]/input' ).clear() self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[2]/input' ).send_keys(truename.split()[0]) else: self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[1]/input' ).clear() self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[1]/input' ).send_keys(truename.split()[0]) time.sleep(random.uniform(0.5, 1.0)) self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[2]/input' ).clear() self.driver.find_element_by_xpath( '//table[@class="tables V"]/tbody/tr[1]/td/div[2]/input' ).send_keys(truename.split()[1]) time.sleep(random.uniform(0.5, 1.0)) # sys.exit(0) self.driver.find_element_by_id('mr').click() #性别,选女 time.sleep(random.uniform(0.5, 1.0)) street = self.user_info['data']['address']["address_line1"] if re.search(r"[^A-Za-z\s]", street): street = re.sub(r"[^A-Za-z\s]", '', street) self.driver.find_element_by_xpath( '//table[@class="contact-address"]/tbody/tr[1]/td/input' ).send_keys(street) #街道 time.sleep(random.uniform(0.5, 1.0)) city = self.user_info['data']['address']["city"] if re.search(r"[^A-Za-z\s]", city): city = re.sub(r"[^A-Za-z\s]", '', city) self.driver.find_element_by_xpath( '//table[@class="contact-address"]/tbody/tr[2]/td/input' ).send_keys(city) #城市 time.sleep(random.uniform(0.5, 1.0)) state_region = self.user_info['data']['address']["state_region"] if re.search(r"[^A-Za-z\s]", state_region): state_region = re.sub(r"[^A-Za-z\s]", '', state_region) self.driver.find_element_by_xpath('//input[@id="province"]').send_keys( state_region) # 省或州,非select # state_selectBtn = Select(self.driver.find_element_by_id('usProvinceList'))#州或者省 # try: # state_selectBtn.select_by_visible_text(self.user_info['data']['address']["state_region"]) # except Exception: # logger.info('从接口获取的StateOrRegion信息对应不上,默认为下拉列表的第一个州或地区!') # StateOrRegion = self.driver.find_element_by_xpath('//select[@id="usProvinceList"]/option[2]').text # print(StateOrRegion) # state_selectBtn.select_by_visible_text(StateOrRegion) time.sleep(random.uniform(0.5, 1.0)) self.driver.find_element_by_xpath( '//table[@class="contact-address"]/tbody/tr[5]/td/input' ).send_keys(self.user_info['data']['address']["postal_code"]) #邮编 # 电话号码需要处理,若有"+4"前缀,则去掉"+4"前缀 PhoneNumber = self.user_info['data']['address']["mobile"] if re.search(r'\+4|\s|\(|\)|Â|\+', PhoneNumber): PhoneNumber = re.sub(r'\+4|\s|\(|\)|Â|\+', '', PhoneNumber) time.sleep(random.uniform(0.5, 1.0)) self.driver.find_element_by_xpath( '//*[@id="GroupListForm"]/table/tbody/tr[6]/td/table/tbody/tr/td[3]/input' ).send_keys(PhoneNumber) time.sleep(random.uniform(0.5, 1.0)) self.driver.find_element_by_id('formSubmit').submit() logger.info('点击提交个人信息的设置!')