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)
- 短信處理庫(如py-android-sms)
- Web框架(如Flask)
- 驗(yàn)證碼識(shí)別庫(如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依賴庫
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庫識(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庫
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工具、短信處理庫和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)文章
Python將CSV文件轉(zhuǎn)化為HTML文件的操作方法
很多朋友問小編Python如何將CSV文件轉(zhuǎn)化為HTML文件,csv文件讀取怎么操作呢?帶著這些問題一起通過本文學(xué)習(xí)吧2021-06-06
python3.0 模擬用戶登錄,三次錯(cuò)誤鎖定的實(shí)例
下面小編就為大家?guī)硪黄猵ython3.0 模擬用戶登錄,三次錯(cuò)誤鎖定的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
Python機(jī)器學(xué)習(xí)NLP自然語言處理基本操作之命名實(shí)例提取
自然語言處理(?Natural?Language?Processing,?NLP)是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。它研究能實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法2021-11-11
Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析
這篇文章主要介紹了Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Python實(shí)現(xiàn)簡(jiǎn)單飛機(jī)大戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡(jiǎn)單飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

