Python實(shí)現(xiàn)自動(dòng)化接收與處理手機(jī)驗(yàn)證碼
引言
在移動(dòng)互聯(lián)網(wǎng)時(shí)代,短信驗(yàn)證碼已成為身份驗(yàn)證、賬號(hào)注冊(cè)、登錄保護(hù)等環(huán)節(jié)的重要安全手段。然而,手動(dòng)輸入驗(yàn)證碼不僅效率低下,還容易出錯(cuò)。本文將介紹如何利用Python搭建一個(gè)短信轉(zhuǎn)發(fā)器,實(shí)現(xiàn)驗(yàn)證碼的自動(dòng)接收、識(shí)別與轉(zhuǎn)發(fā),讓你的工作生活更加便捷。
一、準(zhǔn)備工作
1.1 硬件與軟件需求
硬件:Android手機(jī)(需開啟開發(fā)者模式)、電腦
軟件:
- Python環(huán)境(推薦Python 3.6+)
- ADB工具(Android Debug Bridge)
- 短信處理庫(kù)(如py-android-sms)
- Web框架(如Flask)
- 驗(yàn)證碼識(shí)別庫(kù)(如ddddocr)
1.2 環(huán)境配置
安裝ADB工具
ADB是Android開發(fā)者工具包的一部分,可通過以下方式安裝:
Windows:從developer.android.com/studio/releases/platform-tools
Mac/Linux:通過終端命令安裝:
# Mac brew install android-platform-tools # Ubuntu sudo apt install android-tools-adb
安裝完成后,運(yùn)行adb version驗(yàn)證安裝是否成功。
- 啟用手機(jī)開發(fā)者模式
- 打開手機(jī)“設(shè)置”。
- 進(jìn)入“關(guān)于手機(jī)”,連續(xù)點(diǎn)擊“版本號(hào)”7次,直到提示“開發(fā)者模式已啟用”。
- 返回設(shè)置,進(jìn)入“開發(fā)者選項(xiàng)”,打開“USB調(diào)試”。
- 連接手機(jī)與電腦
- 將手機(jī)通過USB線連接電腦,運(yùn)行adb devices,若顯示設(shè)備ID則說明連接成功。
安裝Python依賴庫(kù)
pip install adb-shell flask ddddocr
二、核心功能實(shí)現(xiàn)
2.1 短信監(jiān)聽與獲取
使用ADB工具監(jiān)聽手機(jī)短信,提取短信內(nèi)容和發(fā)送者信息。
import subprocess import re def get_sms(): try: # 執(zhí)行ADB命令獲取短信 result = subprocess.run( ["adb", "shell", "content", "query", "--uri", "content://sms/inbox", "--projection", "address,body,date"], capture_output=True, text=True ) return result.stdout except Exception as e: print(f"獲取短信失敗: {e}") return None def parse_sms(sms_data): messages = sms_data.split("\n") for message in messages: if "body=" in message: # 提取短信內(nèi)容 body_start = message.index("body=") + len("body=") body_end = message.index(",", body_start) body = message[body_start:body_end] # 提取發(fā)送者號(hào)碼 address_start = message.index("address=") + len("address=") address_end = message.index(",", address_start) address = message[address_start:address_end] yield address, body # 示例:獲取并解析短信 sms_data = get_sms() if sms_data: for address, body in parse_sms(sms_data): print(f"發(fā)送者: {address}, 內(nèi)容: {body}")
2.2 驗(yàn)證碼識(shí)別
利用正則表達(dá)式或ddddocr庫(kù)識(shí)別短信中的驗(yàn)證碼。
方法一:正則表達(dá)式
def extract_verification_code(sms_body): # 假設(shè)驗(yàn)證碼為6位數(shù)字 code = re.search(r'\b\d{6}\b', sms_body) return code.group(0) if code else None
方法二:ddddocr庫(kù)
import ddddocr def ocr_verification_code(image_path): ocr = ddddocr.DdddOcr() with open(image_path, 'rb') as f: image = f.read() return ocr.classification(image)
2.3 數(shù)據(jù)轉(zhuǎn)發(fā)
通過HTTP請(qǐng)求或WebSocket將識(shí)別出的驗(yàn)證碼轉(zhuǎn)發(fā)到指定的接收端(如Web應(yīng)用、API接口等)。
from flask import Flask, request app = Flask(__name__) @app.route('/forward', methods=['POST']) def forward(): data = request.json code = data.get('code') # 轉(zhuǎn)發(fā)驗(yàn)證碼到目標(biāo)地址 # 例如:requests.post(url, json={'code': code}) return {'status': 'success', 'message': f'驗(yàn)證碼 [code] 已轉(zhuǎn)發(fā)'} if __name__ == '__main__': app.run(port=5000)
三、高級(jí)功能擴(kuò)展
3.1 多設(shè)備支持
通過多線程或異步編程,擴(kuò)展程序以支持多個(gè)Android設(shè)備同時(shí)工作。
import threading def monitor_device(device_id): while True: sms_data = get_sms(device_id) if sms_data: for address, body in parse_sms(sms_data): code = extract_verification_code(body) if code: forward(code) # 啟動(dòng)多個(gè)設(shè)備監(jiān)控線程 devices = ['device1', 'device2', 'device3'] for device in devices: thread = threading.Thread(target=monitor_device, args=(device,)) thread.start()
3.2 安全增強(qiáng)
- 身份驗(yàn)證:在轉(zhuǎn)發(fā)接口中添加Token驗(yàn)證,防止未授權(quán)訪問。
- 數(shù)據(jù)加密:使用HTTPS協(xié)議傳輸數(shù)據(jù),確保通信安全。
3.3 性能優(yōu)化
- 緩存機(jī)制:緩存已處理的短信ID,避免重復(fù)處理。
- 異步處理:使用異步框架(如FastAPI)提高并發(fā)處理能力。
四、實(shí)戰(zhàn)案例:搭建完整的短信轉(zhuǎn)發(fā)系統(tǒng)
4.1 系統(tǒng)架構(gòu)
手機(jī)(短信接收) -> ADB工具(短信監(jiān)聽) -> Python腳本(解析與識(shí)別) -> Web接口(數(shù)據(jù)轉(zhuǎn)發(fā)) -> 目標(biāo)應(yīng)用
4.2 完整代碼示例
import subprocess import re from flask import Flask, request import threading app = Flask(__name__) def get_sms(device_id=None): # 根據(jù)設(shè)備ID獲取短信(多設(shè)備支持) command = ["adb", "shell", "content", "query", "--uri", "content://sms/inbox", "--projection", "address,body,date"] if device_id: command.insert(1, f"-s {device_id}") result = subprocess.run(command, capture_output=True, text=True) return result.stdout def parse_sms(sms_data): messages = sms_data.split("\n") for message in messages: if "body=" in message: body_start = message.index("body=") + len("body=") body_end = message.index(",", body_start) body = message[body_start:body_end] address_start = message.index("address=") + len("address=") address_end = message.index(",", address_start) address = message[address_start:address_end] yield address, body def extract_verification_code(sms_body): code = re.search(r'\b\d{6}\b', sms_body) return code.group(0) if code else None @app.route('/forward', methods=['POST']) def forward(): data = request.json code = data.get('code') # 實(shí)現(xiàn)轉(zhuǎn)發(fā)邏輯 print(f"驗(yàn)證碼 [code] 已轉(zhuǎn)發(fā)") return {'status': 'success'} def monitor_device(device_id): while True: sms_data = get_sms(device_id) if sms_data: for address, body in parse_sms(sms_data): code = extract_verification_code(body) if code: # 調(diào)用轉(zhuǎn)發(fā)接口 app.config['DEBUG'] = False app.config['TESTING'] = False with app.app_context(): forward_result = forward(json={'code': code}) print(forward_result) if __name__ == '__main__': # 啟動(dòng)多個(gè)設(shè)備監(jiān)控線程 devices = ['device1', 'device2'] # 替換為實(shí)際設(shè)備ID for device in devices: thread = threading.Thread(target=monitor_device, args=(device,)) thread.start() app.run(port=5000)
4.3 運(yùn)行與測(cè)試
- 將代碼保存為sms_forwarder.py。
- 連接Android設(shè)備,確保ADB可識(shí)別。
- 運(yùn)行腳本:python sms_forwarder.py。
- 發(fā)送測(cè)試短信到手機(jī),觀察控制臺(tái)輸出和轉(zhuǎn)發(fā)結(jié)果。
五、總結(jié)與展望
本文介紹了如何使用Python搭建短信轉(zhuǎn)發(fā)器,實(shí)現(xiàn)驗(yàn)證碼的自動(dòng)接收、識(shí)別與轉(zhuǎn)發(fā)。通過結(jié)合ADB工具、短信處理庫(kù)和Web框架,我們構(gòu)建了一個(gè)高效、穩(wěn)定的系統(tǒng)。未來,可以進(jìn)一步擴(kuò)展功能,如支持更多類型的驗(yàn)證碼識(shí)別、添加圖形界面、實(shí)現(xiàn)云端部署等,讓短信轉(zhuǎn)發(fā)器更加智能、易用。
到此這篇關(guān)于Python實(shí)現(xiàn)自動(dòng)化接收與處理手機(jī)驗(yàn)證碼的文章就介紹到這了,更多相關(guān)Python驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3爬取英雄聯(lián)盟英雄皮膚大圖實(shí)例代碼
這篇文章主要介紹了Python3爬取英雄聯(lián)盟英雄皮膚大圖的實(shí)例代碼,文中較詳細(xì)的給大家介紹了爬蟲思路及完整代碼,需要的朋友可以參考下2018-11-11Python??處理?Pandas?DataFrame?中的行和列
這篇文章主要介紹了Python處理Pandas?DataFrame中的行和列,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Pandas使用query()優(yōu)雅的查詢實(shí)例
本文主要介紹了Pandas使用query()優(yōu)雅的查詢實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Python+OpenCV實(shí)現(xiàn)基本的圖像處理操作
說到圖像處理,那必然要提到opencv模塊了。本文將從最基本的opencv模塊在圖像的基本操作上說起,利用Python+OpenCV實(shí)現(xiàn)圖像的讀取保存等,感興趣的可以了解一下2022-07-07Numpy中矩陣matrix讀取一列的方法及數(shù)組和矩陣的相互轉(zhuǎn)換實(shí)例
今天小編就為大家分享一篇Numpy中矩陣matrix讀取一列的方法及數(shù)組和矩陣的相互轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python中的map()、apply()、applymap()的區(qū)別小結(jié)
map()、apply()和applymap()方法是Python中常用的轉(zhuǎn)換方法,,輸出的結(jié)果及類型完全取決于作為給定方法的參數(shù)的函數(shù),本文就來介紹一下這三種方法的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Python實(shí)現(xiàn)Excel數(shù)據(jù)同步到飛書文檔
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)自動(dòng)將Excel數(shù)據(jù)同步到飛書文檔的末尾,并添加時(shí)間戳,感興趣的小伙伴可以參考一下2025-02-02