京東搶購失敗?試試用 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python模組(module)
- python常識系列07-->python利用xlwt寫入excel檔案
- 阿里、京東、百度“激戰”網際網路醫療
- Python語言初學者?風變程式設計更適合
- 功德+N!Python敲擊木魚積累功德程式碼
- 6道常見的python面試題,你答對了嗎?
- 舊酒換新瓶,新版M1/M2晶片Macos(Ventura)安裝古早版本Python2.7(Python2.x)
- SICP:符號求導、集合表示和Huffman樹(Python實現)
- Python Kconfiglib初次學習
- 簡單介紹python中使用正規表示式的方法
- Python 大作業 網易雲歌單資料分析及視覺化(參考多位博主文章)
- python如何求最大值?常用方法有哪些?
- acw_sc__v2引數生成分析並python實現演算法
- 我在京東做研發 | 京東雲演算法科學家解析爆火的ChatGPT
- 簡單介紹python中的mock介面開發
- Python 6種列印99乘法表的方法詳解!
- python與nodejs寫爬蟲你更傾向於哪個一個?