亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在python中使用selenium登錄QQ郵箱

發布時間:2021-03-25 16:32:48 來源:億速云 閱讀:290 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關怎么在python中使用selenium登錄QQ郵箱,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1.1 登錄

# coding = utf-8
from selenium import webdriver
import time
import random
from utils import DbUtil
import uuid
from selenium.webdriver import ActionChains
from PIL import Image as Im
import os
import cv2
import numpy as np
import requests
from pymongo import MongoClient

# 代碼1.1 目前只用到webdriver和time庫 其他的會在下面用到
# u 帳號,p 密碼
def Email(u, p):
 # 定義QQ郵箱的登錄頁
 start_url = "https://mail.qq.com"

 # 這里我用的是火狐瀏覽器。很多人喜歡定義成driver 我喜歡定義成browser
 browser = webdriver.Firefox()

 # 休息2s
 time.sleep(2)

 # 使用火狐瀏覽器打開QQ郵箱的登錄頁
 browser.get(start_url)

 # 休息2s(這個sleep時間因網速而異,部分的錯誤就是因為網站還沒打開你就開始獲取網頁的標簽進行操作,當然就獲取不到然后報錯了~)
 time.sleep(2)

 # 切換frame。login_frame是該登錄窗口iframe的id
 browser.switch_to.frame("login_frame")

 # 點擊選擇帳號密碼登錄
 browser.find_element_by_id("switcher_plogin").click()

 # 休息1s
 time.sleep(1)

 # 輸入帳號 將u填入id是u的輸入框
 browser.find_element_by_id("u").send_keys(u)
 time.sleep(1)

 # 輸入密碼 將p填入id是p的輸入框
 browser.find_element_by_id("p").send_keys(p)
 time.sleep(1)

 # 點擊登錄 登錄按鈕的id是login_button
 browser.find_element_by_id("login_button").click()

# main方法
if __name__ == '__main__':
 # 為了實現異地登錄 隨意定義一個QQ號(反正我們的目的是滑動解鎖0.0),如果直接提示帳號密碼錯誤沒有驗證碼的話就再隨意編一個QQ號
 Email(u="123456789", p="abcdefg")

運行一下 應該就能看到我們要的滑動驗證碼了

1.2 獲取驗證碼圖片

我們在運行完上面的代碼之后驗證碼應該出來了,首先我們需要將其中的拼圖和完整圖片下載下來用于后面的距離計算。
我們先F12 然后
點擊左側的小拼圖查看元素↓

怎么在python中使用selenium登錄QQ郵箱

點擊大拼圖查看元素↓

怎么在python中使用selenium登錄QQ郵箱

以上選中的這兩張圖片就是我們后面要用來計算滑動距離的圖片

要獲取到圖片需要兩步:

1、獲取到圖片的鏈接(上面已經能看到了)
2、根據鏈接將圖片下載到本地處理

回到剛才的代碼 我們需要先加個判斷來識別是否出現了滑動驗證碼(有的時候會直接提示帳號密碼錯誤)
只要判斷這個"安全驗證"的提示就可以說明是有滑動驗證碼的,反之沒有。

怎么在python中使用selenium登錄QQ郵箱

# 代碼1.1省略....↑
# 代碼1.2.1
# 判斷是否出現了滑動驗證碼
try:
 # 先切換frame回到默認
 browser.switch_to.default_content()
 
 # 將frame切換到 login_frame(也就是之前的登錄frame)
 browser.switch_to.frame("login_frame")
 
 # 根據xpath獲取到含有安全提示的標簽然后將其中文本獲取到打印出來 如果異常就進except塊 說明沒有驗證碼
 code = browser.find_element_by_xpath('//*[@id="newVcodeArea"]/div[1]/div/div[2]').text
 print(code)
except :
 print('無安全驗證碼!')

這塊代碼寫完我們基本上實現了登錄判斷是否出現滑動驗證碼的功能,不多BB我們繼續↓

出現滑動驗證碼的時候我們先點擊刷新

怎么在python中使用selenium登錄QQ郵箱

此處要加入兩個方法用來解決: 下載圖片的問題計算拼圖還原的問題

我們先下載圖片到本地 然后通過處理圖片來計算拼圖還原的距離

# 代碼2
# 圖片下載到本地,返回一個本地鏈接。url 是圖片的鏈接,type區分左側小拼圖和大圖,大圖傳big,小圖傳small
def pic_download(url,type):
 url = url
 root = "D:/emils_python/pic_test/"
 # path = root + str(time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()))+'.png'
 path = root + type + '.png'
 try:
 if not os.path.exists(root):
 os.mkdir(root)
 if os.path.exists(path):
 os.remove(path)
 r = requests.get(url)
 r.raise_for_status()
 # 使用with語句可以不用自己手動關閉已經打開的文件流
 with open(path, "wb") as f: # 開始寫文件,wb代表寫二進制文件
 f.write(r.content)
 print(f.name)
 print("下載完成")
 return f.name

 except Exception as e:
 print("獲取失敗!" + str(e))

到這里圖片下載的方法就ok了↑ 然后繼續寫計算拼圖還原的方法↓

# 代碼3
# 獲取缺口位置 small_url是小圖的路徑(本地),big_url是大圖的路徑(本地) 最后return一個計算出的距離
def get_distance(small_url,big_url):
 # 引用上面的圖片下載
 otemp = pic_download(small_url,'small')
 
 time.sleep(2)
 
 # 引用上面的圖片下載
 oblk = pic_download(big_url,'big')

 # 計算拼圖還原距離
 target = cv2.imread(otemp, 0)
 template = cv2.imread(oblk, 0)
 w, h = target.shape[::-1]
 temp = 'temp.jpg'
 targ = 'targ.jpg'
 cv2.imwrite(temp, template)
 cv2.imwrite(targ, target)
 target = cv2.imread(targ)
 target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY)
 target = abs(255 - target)
 cv2.imwrite(targ, target)
 target = cv2.imread(targ)
 template = cv2.imread(temp)
 result = cv2.matchTemplate(target, template, cv2.TM_CCOEFF_NORMED)
 x, y = np.unravel_index(result.argmax(), result.shape)
 # 缺口位置
 print((y, x, y + w, x + h))

 # 調用PIL Image 做測試
 image = Im.open(oblk)

 xy = (y + 20, x + 20, y + w - 20, x + h - 20)
 # 切割
 imagecrop = image.crop(xy)
 # 保存切割的缺口
 imagecrop.save("D:/emils_python/pic_test/new_image.jpg")
 return y

到這里計算拼圖還原的距離的方法基本上就完成了↑

有了下載圖片計算拼圖還原的方法 我們就可以直接調用get_distance方法計算拼圖還原的距離

# 代碼1.1省略....↑
# 還是代碼1.2
# 判斷是否出現了滑動驗證碼
try:
 # 先切換frame回到默認
 browser.switch_to.default_content()
 
 # 將frame切換到 login_frame(也就是之前的登錄frame)
 browser.switch_to.frame("login_frame")
 
 # 根據xpath獲取到含有安全提示的標簽然后將其中文本獲取到打印出來 如果異常就進except塊 說明沒有驗證碼
 code = browser.find_element_by_xpath('//*[@id="newVcodeArea"]/div[1]/div/div[2]').text
 print(code)
 
 # 如果后面拖動失敗 我們就再次循環 所以用while
 while True:
 # 切換frame
 browser.switch_to.default_content()
 
 # 切換frame
 browser.switch_to.frame('login_frame')
 
 # 切換帶有刷新按鈕的frame
 browser.switch_to.frame(browser.find_element_by_xpath('//*[@id="newVcodeIframe"]/iframe'))
 
 # 點擊刷新 id為e_reload
 browser.find_element_by_id('e_reload').click()

 # 獲取圖片鏈接
 big_url = browser.find_element_by_id('slideBkg').get_attribute('src')
 small_url = browser.find_element_by_id('slideBlock').get_attribute('src')
 
 # 下載圖片并計算拼圖還原的距離
 y = get_distance(small_url, big_url)
 
 # 獲取當前網頁鏈接,用于判斷拖動驗證碼后是否成功,如果拖動后地址沒變則為失敗
 url1 = browser.current_url
 
 # 獲取藍色拖動按鈕對象
 element = browser.find_element_by_id('tcaptcha_drag_button')
 
 # 計算distance
 distance = y * (280 / 680) - 21
 print('distance:', distance)
except :
 print('無安全驗證碼!')

寫到這里 基本上我們可以計算出拼圖還原的距離了。
是不是開始看著覺得很有道理…突然看到最后兩行…WTF??? distance = y * (280 / 680) - 21 是什么意思?
別著急慢慢解釋…通過上面的代碼已經知道了 y 就是圖片還原的距離,但是我們還少考慮了2點:

1.圖片的起始位置其實不是最左側,而是向右偏移了一點
2.我們從下載到本地的圖片尺寸是否跟網頁上的圖片尺寸一致 ? 答案當然是否定的。

我們先看一下拼圖起始的位置

怎么在python中使用selenium登錄QQ郵箱

很清晰的能看到拼圖到左邊的有一段距離 那到底是多少呢 ? 我已經找人用專業的工具測過了:21左右
為了好理解 我特地用手機拍了張照片又截圖下來,自己體會一下… 就是個大概的意思 為了好理解…

怎么在python中使用selenium登錄QQ郵箱

以上是拼圖到左側的距離 然后我們再看一下我們在本地處理并計算的圖片尺寸網頁上的圖片有什么區別

先看本地處理過后的圖片

怎么在python中使用selenium登錄QQ郵箱

很明顯能夠看到長是680

我們再看一下網頁上的…沒錯還是我找的人用專業工具給測的…280,笨笨的老方法幫你們理解一下

怎么在python中使用selenium登錄QQ郵箱

所以我們講了這么多 會發現 :

按鈕需要滑動的距離(網頁) = 拼圖的還原距離(本地圖片) * (網頁上的長度 / 本地圖片的長度) -21(多出來的起始位置)

也就是前面會讓人疑惑的 distance = y * (280 / 680) - 21 當然 這些都因實際情況而定

到了這一步 可以說我們最難的部分已經解決了

有了滑動距離 我們就只剩拖動按鈕這一步了,先看代碼

 # 省略上面的代碼 1.1 和1.2
 # 代碼1.3
 # 接著上面的 distance = y * (280 / 680) - 21 繼續
 # 模擬人為拖動按鈕
 has_gone_dist = 0
 remaining_dist = distance
 # distance += randint(-10, 10)
 # 按下鼠標左鍵
 ActionChains(browser).click_and_hold(element).perform()
 time.sleep(0.5)
 while remaining_dist > 0:
  ratio = remaining_dist / distance
  if ratio < 0.2:
  # 開始階段移動較慢
  span = random.randint(5, 8)
  elif ratio > 0.8:
  # 結束階段移動較慢
  span = random.randint(5, 8)
  else:
  # 中間部分移動快
  span = random.randint(10, 16)
  ActionChains(browser).move_by_offset(span, random.randint(-5, 5)).perform()
  remaining_dist -= span
  has_gone_dist += span
  time.sleep(random.randint(5, 20) / 100)

 ActionChains(browser).move_by_offset(remaining_dist, random.randint(-5, 5)).perform()
 ActionChains(browser).release(on_element=element).perform()

到這里按鈕拖動就已經完成了,但圖片分析不是人在操作畢竟有誤差,所以我們需要判斷滑動按鈕是否已經成功,如果失敗了我們得讓程序繼續循環去刷新驗證碼然后拖動直到成功為止

 # 省略代碼 1.1, 1.2, 1.3 在1.3下繼續寫
 # 獲取當前的網頁地址
 url2 = browser.current_url
 
 # frame切回到上一層
 browser.switch_to.parent_frame()
 
 # 判斷拖動按鈕后網頁地址是否有改變,如果變了則說明登錄成功(失敗則停留在該頁面)
 if url1 == url2:
 try :
 print(browser.find_element_by_class_name('tcaptcha-title').text)
 print('滑動失敗!')
 except : 
 print('帳號密碼有誤!')
 else :
 print('登錄成功!')

以上就是怎么在python中使用selenium登錄QQ郵箱,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

介休市| 焉耆| 盈江县| 绥滨县| 乐安县| 平舆县| 寿光市| 沈丘县| 二连浩特市| 砀山县| 肃北| 五峰| 仁化县| 汉沽区| 云霄县| 裕民县| 资溪县| 开平市| 昭觉县| 体育| 饶阳县| 靖江市| 筠连县| 岳普湖县| 肇东市| 缙云县| 固镇县| 永修县| 锦州市| 澜沧| 南投县| 泸溪县| 全南县| 航空| 清新县| 保德县| 筠连县| 新巴尔虎左旗| 濉溪县| 盐津县| 康保县|