用Python模擬識別圖片驗證碼併發送手機驗證碼

来源:https://www.cnblogs.com/123456feng/archive/2022/03/28/16067659.html
-Advertisement-
Play Games

1、導語 大家好,好久不見。又到每日分享Python小技能的時候了。最近因為疫情影響,所以更新內容比較慢…今天周一,就來更新一波,心血來潮,是時候上線經營了。其實也沒想到有啥好分享的,不如分享一些乾貨給大家,今天就分享一下如何識別圖片驗證碼併發送手機驗證碼的思路和代碼(基於python,對於過程中的 ...


1、導語

大家好,好久不見。又到每日分享Python小技能的時候了。最近因為疫情影響,所以更新內容比較慢…今天周一,就來更新一波,心血來潮,是時候上線經營了。其實也沒想到有啥好分享的,不如分享一些乾貨給大家,今天就分享一下如何識別圖片驗證碼併發送手機驗證碼的思路和代碼(基於python,對於過程中的涉及的瀏覽器技術原理我不過多贅述,不懂且想瞭解的小伙伴請自行搜索學習)。

在這裡插入圖片描述

2、目錄

首先,我們的程式分為三部分:

1、代理部分(防止頻繁請求被封,非必須)

2、識別部分(主要是某些驗證碼識別網站的demo,自己下載後進行相應改進)

3、執行部分

在這裡插入圖片描述

3、選擇例子

選取一個網站作為例子,例如這個網站,它的驗證形式為圖片驗證碼驗證,且圖片比較複雜,對打碼平臺的要求較高:

我們打開開發者模式,切換到network視窗,手動輸入手機號碼,並輸入圖片驗證碼的內容,點擊發送,進行抓包分析(框出或者標識部分都是重要部分,由於部分欄位涉及個人及網站隱私安全,已做馬賽克處理):

上面就是我們模擬發送簡訊驗證碼抓到的包,這個表單數據(form data)還是相對簡單,除了phone(輸入的手機號)和Verify(輸入的圖片驗證碼)是變化的,其他都是固定格式。有些相對複雜的,會有其他的加密方式,如md5對手機號加某些信息加密後傳輸,這些往往需要我們進行js解析(此處不過多贅述,請自行瞭解)。現在我們要做的就是識別驗證碼後將數據傳入並模擬發送,話不多說,我們開始。

4、代理部分

什麼代理:

 代理伺服器(Proxy Server)的功能是代理網路用戶去取得網路信息。形象地說,它是網路信息的中轉站,是個人網路和Internet服務商之間的中間代理機構,負責轉發合法的網路信息,對轉發進行控制和登記。



代理伺服器作為連接Internet與Intranet的橋梁,在實際應用中發揮著極其重要的作用,它可用於多個目的,最基本的功能是連接,此外還包括安全性、緩存、內容過濾、訪問控制管理等功能。更重要的是,代理伺服器是Internet鏈路級網關所提供的一種重要的安全功能,它的工作主要在開放系統互聯(OSI)模型的對話層。

(更多詳情,如專享ip、隧道ip這些請自行瞭解)

   我們這裡做代理ip,主要是為了安全起見,由於我們的頻繁訪問,網站管理者發現異常後極有可能將我們的ip封禁,所以我們需要使用代理ip,通過代理ip作為橋梁去訪問。


  市面上有很多的代理ip提供,有免費的、收費的,當然,免費的代理ip體驗上是很差的,很多都不能用。我們自己可以去購買一些網站的套餐使用會流暢很多。至於哪家網站的代理ip好用,可以自行查找相關信息。我這裡使用的是 芝麻HTTP。

  為了使代碼看起來更簡單,我使用單個ip進行演示,代碼如下:
#proxy.pyproxy = '113.128.28.102:4231'proxies = {    'http':'http://'+proxy}

 

在這裡插入圖片描述

5、識別部分

識別驗證碼我們仍然使用的是第三方的網站的代碼,python有Tesseract-OCR模塊供識別圖片,但識別率低。

市面上很多打碼平臺,識別率最好的是超級鷹,但收費較貴。其他的還有 圖鑒、斐斐打碼 之類的平臺,收費較為親民,但識別率不是很高。

對於我們這個例子,驗證碼較為複雜,一般的打碼平臺識別不出,所以我們選擇使用超級鷹。

對於這類的打碼平臺,我們一般是註冊充值後,複製他們提供的demo代碼,將賬號信息填入使用。每次使用需要下載圖片驗證碼到本地,由於驗證碼具有時效性,每次訪問都會變化,我們為了保證兩次訪問一致,主要保證兩次訪問的cookies一致。

在這裡插入圖片描述

代碼如下:

####Python學習交流群:906715085####
!/usr/bin/env python# coding:utf-8
#這個代碼是超級鷹提供的demo的基礎上,本人為了方便調用自行改造後的代碼
import osfrom proxy
 import proxiesimport requestsfrom hashlib
  import md5headers={    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}class Chaojiying_Client(object):
    def __init__(self, username, password, soft_id):       
     self.username = username        
     password =  password.encode('utf8')        
     self.password = md5(password).hexdigest()        
     self.soft_id = soft_id        
     self.base_params = {            'user': self.username,            'pass2': self.password,            'softid': self.soft_id,        }        self.headers = {            'Connection': 'Keep-Alive',            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',        }
    def PostPic(self, im, codetype):        """       
     im: 圖片位元組      
       codetype: 題目類型 參考 http://www.chaojiying.com/price.html        """       
        params = {            'codetype': codetype,        }       
         params.update(self.base_params)       
          files = {'userfile': ('ccc.jpg', im)}      
            r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)        return r.json()
    def ReportError(self, im_id):        """        im_id:報錯題目的圖片ID        """        params = {            'id': im_id,        }        params.update(self.base_params)       
     r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)      
       return r.json()
def main(imgPath,CodeType):
#這一行填寫自己在超級鷹官網的賬號信息,記得把我在代碼標的中文替換  
  chaojiying = Chaojiying_Client('賬號', '密碼', '校驗碼')   
   im = open(imgPath, 'rb').read()    
   res=chaojiying.PostPic(im, CodeType)   
    code=res['pic_str']   
     return code
     #imgDispose這一函數是執行代碼和識別代碼之間調用的橋梁,不使用代理請將  ,proxies=proxies 刪除def imgDispose(img_url,val):   
      response=requests.get(url=img_url,headers=headers,proxies=proxies)   
       img_data=response.content   
        cookies=response.cookies.get_dict()    
        #每次識別先將圖片保存到本地,識別完刪除   
         with open('img\CJYcodeImg.png',mode='wb') as f:        
         f.write(img_data)    code = main('img\CJYcodeImg.png', val)    
         os.remove('img\CJYcodeImg.png')   
          return code,cookies

 

在這裡插入圖片描述

6、執行部分

執行部分會用到我們抓包的信息,並相關信息填對就行,請自行舉一反三。

mport reimport time
import chaojiyingDemofrom proxy 
import proxiesimport requests
phoneNumber='手機號'
headers2={    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}userAgent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'def identify(code_url,typeId,sendCode_url,headers,data,dataCode,funcName):    try:        
result=chaojiyingDemo.imgDispose(code_url,typeId)       
 imgCode=result[0]       
 cookies=result[1]       
  data[dataCode]=imgCode       
   response = requests.post(url=sendCode_url,headers=headers,cookies=cookies,data=data, proxies=proxies, timeout=10)        return '函數'+funcName+' 執行返回的結果為>>>>>>'+response.content.decode('utf-8')  
     except Exception as e:        
     return '函數' + funcName + ' 發生錯誤!' + str(e.args)def cjy2():#上學吧    
     headers = {        'Accept': 'text/plain, */*; q=0.01',        'Accept-Encoding': 'gzip, deflate, br',        'Accept-Language': 'zh-CN,zh;q=0.9',       
      'Connection': 'keep-alive',       
       'Content-Length': '60',       
        'Content-Type': 'application/x-www-form-urlencoded',       
         'Host': '',        
         'Origin': '',       
          'Referer': '',        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',        'sec-ch-ua-mobile': '?0',        'Sec-Fetch-Dest': 'empty',        'Sec-Fetch-Mode': 'cors',        'Sec-Fetch-Site': 'same-origin',       
           'User-Agent': userAgent,        'X-Requested-With': 'XMLHttpRequest'    }    
          data={        'phone': phoneNumber,        'dataid': '0',        'action': 'SMSSend',        'typeid': '0',    }   
           #6601是打碼平臺識別的驗證碼類型碼    
           identify('圖片驗證碼的url',6001,'發送的url(抓包得到的)',headers,data,'Verify','cjy2')
cjy2()

 

7、最後
最近各地疫情爆發,大家一定要保護好自己。這一篇的小技巧還是比較簡單的,學會了就可以開始練練手了。碼代碼還是有點辛苦(點贊),到這裡就跟大家說再見了,不會的可以告訴我,我一般看見都會回覆。
在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • FizzBu​​zz 是一道很有意思的題目。我們來看看題目: 如果遇見了 3 的倍數要說 Fizz,5 的倍數就說 Buzz,如果即是 3 的倍數又是 5 的倍數就說 FizzBuzz。 如果是在一些編程語言中,這是一道比較初級的題目,當然,稍微轉換一下,我們就可以把它轉換成一道有關 CSS 選擇器 ...
  • 總有那麼一些時候,我們希望Spring容器能夠根據我們提供的條件決定哪些Bean需要創建,哪些Bean不需要創建。提供的條件不同,Spring容器創建的Bean也不同。創建的Bean不同,軟體實現的功能自然也有所差別。也就是說,我們希望在某些應用場景下無需修改代碼或重新構建項目,只需簡單修改一下條件 ...
  • 本文所解決的問題場景是這樣的:如果給定一個字典,比如一般從json文件或者npz文件中載入出來的數據都是字典的數據結構,如果我們希望把這個字典賦值給一個類,且使得字典的key和value分別作為類的成員變數名和成員變數值,那麼該如何實現呢?對於一個展平的字典而言(沒有嵌套字典),我們直接使用upda... ...
  • 首先將源碼逐級找出來1.HashSet<String> hs=new HashSet<String>(); hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("world");//因為是Set集合所以不帶重覆元素因為調用的是HashSe ...
  • 日常分享Python小技巧,說說你們都是怎麼區分語句控制結構,我分為三種:賦值語句、分支語句、迴圈語句,有沒有人跟我是一樣的?點名提問。 一、賦值語句 變數(大小寫敏感,首字元非數字,非保留字)=命名過程, 變數和函數挺雷同的,但變數是一行代碼,主要用來保存和表示數據,而函數是一段特定功能的代碼,更 ...
  • 併發性和並行性通常用於與多線程程式相關的,最早併發性和並行性似乎指的是相同的概念,但其實併發和並行實際上有不同的含義。在這個併發與並行教程中,我將解釋這些概念的含義。 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 來源:blog.csdn.net/u011291072/article/details/81813662 前言 目前開發的SpringBoot項目在啟動的時候需要預載入一些資源。而如何實現啟動過程中執行代碼,或啟動成功後執行,是有很多種方式可以選擇,我們可以在static代碼塊中實現,也可以在構造方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...