京東搶購失敗?試試用 python 準時自動搶購 (註釋詳盡)

專注的阿熊 發表於 2023-01-06
Python

import cv2

import time

import random

import datetime

import numpy as np

from urllib import request

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

# 移動滑動驗證碼中的滑塊

def checkMove(button_slide, distance):

     dist_finished = 0  # 已經移動的距離

     dist_remaining = distance  # 剩餘的距離

     dist_move = 5  # 每次移動的距離

     element = driver.find_element_by_xpath(button_slide)  # 選取滑動驗證碼滑塊

     ActionChains(driver).click_and_hold(element).perform()  # 模擬滑鼠在滑塊上點選並保持

     # 模擬不斷加速移動滑塊

     while dist_remaining > 0:

         dist_move += dist_move  # 不斷 加速移動滑塊

         # 每次移動滑塊都帶有正負偏差來模擬手動移動時的滑動不穩定

         ActionChains(driver).move_by_offset(dist_move, random.randint(-3, 3)).perform()  # 模擬滑鼠水平向右拖動滑塊

         dist_remaining -= dist_move  # 剩餘距離減去已移動的距離

         dist_finished += dist_move  # 已完成距離加上已移動的距離

     ActionChains(driver).move_by_offset(dist_remaining, random.randint(-3, 3)).perform()  # 模擬滑鼠水平回移拖動滑塊修正

     ActionChains(driver).release( # 模擬鬆開滑鼠

# 獲取滑動驗證碼構成的兩張圖片並計算應移動的距離

def getCheckImage():

     image_big_path = r'//div/div[@class="JDJRV-bigimg"]/img'  # 滑動驗證碼大圖(大背景)

     image_small_path = r'//div/div[@class="JDJRV-smallimg"]/img'  # 滑動驗證碼小圖(小滑塊)

     button_slide = '//div[@class="JDJRV-slide-inner JDJRV-slide-btn"]'  # 滑動驗證碼滑塊按鈕

     image_big = driver.find_element_by_xpath(image_big_path).get_attribute("src")  # 驗證碼背景圖的完整路徑

     image_small = driver.find_element_by_xpath(image_small_path).get_attribute("src")  # 驗證碼滑塊圖的完整路徑

     request.urlretrieve(image_big, 'background.jpg')  # 下載驗證碼背景圖到本地

     request.urlretrieve(image_small, 'slideblock.jpg')  # 下載驗證碼滑塊圖到本地

     cv2.imwrite('background.jpg', cv2.imread('background.jpg', 0))  # 將驗證碼背景圖讀取為灰度圖並覆蓋原圖

     slideblock = cv2.imread('slideblock.jpg', 0)  # 將驗證碼滑塊圖讀取為灰度圖

     slideblock = abs(255 - slideblock)  # 對驗證碼滑塊圖反灰化處理

     cv2.imwrite('slideblock.jpg', slideblock)  # 儲存處理後的驗證碼滑塊圖

     background = cv2.imread('background.jpg')  # 讀取驗證碼背景圖(灰度)

     slideblock = cv2.imread('slideblock.jpg')  # 讀取驗證碼滑塊圖(灰度)

     result = cv2.matchTemplate(background, slideblock, cv2.TM_CCOEFF_NORMED)  # 模板匹配,獲得滑塊在背景上的相似度矩陣

     _, distance = np.unravel_index(result.argmax(), result.shape)  # 獲得要移動的距離

     return button_slide, distance

# 滑動驗證

def slideIdentify():

     slideButton, distance = getCheckImage()  # 獲取滑塊和滑塊需要移動的距離

     print(f' 本次滑塊需要移動的距離為: {distance}')  # 列印滑塊需要移動的距離

     checkMove(slideButton, distance / 1.3)  # 移動滑塊, 1.3 是一個實驗修正值

# 登入京東網頁版

def login(username, password):

     driver.get(')  # 京東登入介面連結

     driver.implicitly_wait(2)  # 隱式等待 2

     driver.find_element_by_link_text(" 賬戶登入 ").click()  # 找到賬戶登入並點選

     driver.implicitly_wait(2)  # 隱式等待 2

     driver.find_element_by_id("loginname").send_keys(username)  # 找到使用者名稱輸入框並輸入使用者名稱

     driver.implicitly_wait(2)  # 隱式等待 2

     driver.find_element_by_id("nloginpwd").send_keys(password)  # 找到密碼輸入框輸入密碼

     driver.implicitly_wait(2)  # 隱式等待 2

     driver.find_element_by_id("loginsubmit").click()  # 找到登入並點選

     while True:

         try:

             slideIdentify()  # 進行滑動驗證

             time.sleep(2)  # 等待 3

         except:

             print(" 登入成功 ")

             break

# 定時購買東西

def buy(buy_time):

     driver.implicitly_wait(2)  # 隱式等待 2

     driver.find_element_by_link_text(" 我的購物車 ").click()  # 找到我的購物車並點選

     total_windows =跟單網gendan5.com driver.window_handles  # 所有開啟的視窗

     driver.switch_to.window(total_windows[1])  # 控制程式碼遷移到第二個視窗

     while True:

         current_time = datetime.datetime.now()  # 獲取當前日期時間

         if current_time.strftime('%Y-%m-%d %H:%M:%S') == buy_time:  # 如果當前時間等於指定購買時間

             driver.implicitly_wait(2)  # 隱式等待 2

             driver.find_element_by_name('select-all').click()  # 購物車全選

             time.sleep(0.5)  # 等待 0.5

             driver.find_element_by_link_text(" 去結算 ").click()  # 找到去結算並點選

             driver.implicitly_wait(2)  # 隱式等待 2

             driver.find_element_by_id("order-submit").click()  # 找到提交訂單並點選

             driver.implicitly_wait(2)  # 隱式等待 2

             print('current time : ' + current_time.strftime('%Y-%m-%d %H:%M:%S'))  # 列印當前時間

             print(' 購買成功 !')  # 購買成功

if __name__ == '__main__':

     driver = webdriver.Edge(executable_path='./msedgedriver.exe')  # 開啟 Edge 瀏覽器

     driver.maximize_window()  # 最大化 Edge 瀏覽器視窗

     login(' 你的使用者名稱 ', ' 你的密碼 ')  # 登入京東

     buy('2021-08-14 12:00:00')  # 定時購買

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2931188/,如需轉載,請註明出處,否則將追究法律責任。