欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Flutter實現(xiàn)短信驗證碼監(jiān)控與轉發(fā)

 更新時間:2025年03月08日 10:35:28   作者:代碼軌跡  
這篇文章主要為大家詳細介紹了如何基于Flutter實現(xiàn)短信驗證碼監(jiān)控與轉發(fā)功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

1. 前言

前段時間,我基于deepseek制作了一個基于小紅書的自動推文生成發(fā)送工作流。然而,先前制作的windows端的工作流到小紅書發(fā)布時顯得異常繁瑣,原先的思路是在手機接收到驗證碼后進入系統(tǒng)進行人為輸入,這顯然太麻煩了。同時,這一問題當部署到linux服務器上時顯得尤為突出,這與自動化的理念顯然有些背道而馳。因此,我決定基于flutter制作一個驗證碼提取轉發(fā)應用,將手機短信驗證碼提取出來,通過http接口轉發(fā)給工作流,從而實現(xiàn)自動化的工作流。

2.開發(fā)環(huán)境

  • IDE:VSCode
  • 語言:Dart 3.7.0
  • 框架:Flutter 3.29.0

3. 實現(xiàn)思路

3.1 驗證碼提取

flutter中存在大量不錯的第三方短信處理庫,例如flutter_sms_inbox, sms_v2, sms_receiver等,但經(jīng)過測試,許多庫在當前開發(fā)環(huán)境下存在許多問題,因此我最終選擇了sms_advanced庫進行短信處理。

sms_advanced提供了querySms()這樣一個方法,這個方法可以根據(jù)條件進行短信查詢。以下是方法源碼:

/// Query a list of SMS
Future<List<SmsMessage>> querySms({
    int? start,
    int? count,
    String? address,
    int? threadId,
    List<SmsQueryKind> kinds = const [SmsQueryKind.Inbox],
    bool sort = true}) async {
    List<SmsMessage> result = [];
    for (var kind in kinds) {
        result.addAll(await _querySmsWrapper(
        start: start,
        count: count,
        address: address,
        threadId: threadId,
        kind: kind,
    ));
}
if (sort == true) {
    result.sort((a, b) => a.compareTo(b));
}
return (result);
}

可以看到,querySms()方法可以接受多個參數(shù),其中address參數(shù)可以指定短信發(fā)送者的手機號,kinds參數(shù)默認為SmsQueryKind.Inbox,即從收件箱獲取短信,從而實現(xiàn)短信提取。然后使用正則表達式對短信內容進行匹配,提取出驗證碼。

if (messages.isNotEmpty) {
    // 獲取第一條短信
    SmsMessage firstMessage = messages.first;
    String? messageBody = firstMessage.body;

    // 使用正則表達式匹配驗證碼,假設驗證碼是 6 位數(shù)字
    RegExp regex = RegExp(r'\d{6}');
    Match? match = regex.firstMatch(messageBody!);

    if (match != null) {
        String smsCode = match.group(0)!;
        // 發(fā)送驗證碼到 API
        result = await _sendCodeToAPI(smsCode);
    } else {
        result = '未在短信中找到驗證碼';
    }
} else {
    result = '未找到短信';
}

但后面我發(fā)現(xiàn)小紅書的驗證碼發(fā)送者手機號并非固定,因此我選擇制作一個多條件篩選器。在條件篩選中,我選擇先根據(jù)手機號做一次短信篩選,如果沒有找到,則根據(jù)短信內容做一次篩選,如果還是沒有找到,則返回未找到短信。這樣用戶就可以在僅知道驗證碼發(fā)送應用名稱的情況下,不填寫發(fā)送者手機號,獲取到短信并提取到驗證碼。實現(xiàn)代碼如下:

SmsQuery query = SmsQuery();
List<SmsMessage>? messages = await query.querySms(
    address: _phoneNumber,
    kinds: [SmsQueryKind.Inbox],
); // 獲取收件箱中的短信
if (messages.isEmpty) {
    List<SmsMessage>? messages = await query.querySms(
    kinds: [SmsQueryKind.Inbox],
    ); // 根據(jù)條件二進行查詢
    for (SmsMessage message in messages) {
        if (message.body?.contains(_targetApp) ?? false) {
            final code = _extractCode(message.body);
            if (code != null) {
                return await _sendCodeToAPI(code);
            }
        }
    }
}

3.2 驗證碼轉發(fā)

驗證碼轉發(fā)是將提取到的驗證碼通過http接口轉發(fā)給工作流。這里我選擇使用http庫進行http請求,實現(xiàn)代碼如下:

Future<String?> _sendCodeToAPI(String code) async {
    try {
        final response = await http.post(
            Uri.parse(_apiEndpoint),
            headers: {'Content-Type': 'application/json'},
            body: jsonEncode({'code': code}),
        );
        if (response.statusCode != 200) {
            return ('Failed to send code: ${response.statusCode}');
        } else {
            return 'Successfully Code sent ';
        }
    } catch (e) {
        return ('Error sending code: $e');
    }
}

3.3 線程通信

由于驗證碼提取是一個耗時操作,因此我選擇將其放在一個子線程中執(zhí)行,以避免阻塞主線程。這里我選擇使用flutter的Isolate進行線程通信。同時,為了更新監(jiān)控狀態(tài)并控制監(jiān)控開始和停止,設計了兩個Port,分別是mainpPort和isolatePort。mainpPort用于向接收子線程的監(jiān)控狀態(tài)消息,實現(xiàn)監(jiān)控狀態(tài)的實時更新;isolatePort用于接收主線程發(fā)來的啟停信息,當點擊停止監(jiān)控后,由父線程告知子線程停止作業(yè)。實現(xiàn)代碼如下:

MainPort:

// 在主isolate的接收端口監(jiān)聽中添加狀態(tài)更新
void _initReceivePort() {
_receivePort = ReceivePort();
_receivePort.listen((message) {
    if (message is String) {
    if (message == 'isolate_stopped') {
        // 處理isolate退出通知
        if (mounted) {
        setState(() {
            _isolate = null;
            isMonitoring = false;
            buttonText = '開始監(jiān)控';
        });
        }
    } else {
        setState(() => response = message);
        if(message == 'Successfully Code sent') {
        _stopIsolate();
        }
    }
    } else if (message is SendPort) {
    _isolateSendPort = message;
    }
});
}

IsolatePort:

static void _monitorSmsInBackground(List<dynamic> args) async {
    final rootIsolateToken = args[4] as RootIsolateToken;
    BackgroundIsolateBinaryMessenger.ensureInitialized(rootIsolateToken);

    final apiEndpoint = args[0] as String;
    final targetApp = args[1] as String;
    final phoneNumber = args[2] as String;
    final mainSendPort = args[3] as SendPort;
    final smsHandler = SMSHandler(apiEndpoint, targetApp, phoneNumber);
    final controlPort = ReceivePort();
    mainSendPort.send(controlPort.sendPort);

    final stopCompleter = Completer<void>();
    controlPort.listen((message) {
      if (message == 'stop') {
        stopCompleter.complete();
      }
    });

    try {
      while (!stopCompleter.isCompleted) {
        final value = await smsHandler.initSMSListener().timeout(
          const Duration(seconds: 1),
          onTimeout: () => null,
        );
        print(value);
        mainSendPort.send(value);

        if (stopCompleter.isCompleted) break;
      }
    } finally {
      controlPort.close();
      mainSendPort.send('isolate_stopped'); // 添加退出通知
    }
}

StopIsolate:

// 修改 _stopIsolate 方法,僅發(fā)送停止信號,不強制終止Isolate
void _stopIsolate() {
    if (_isolate != null) {
        _isolateSendPort?.send('stop');
    }
}

4. 總結

總體來說,整體項目還是挺簡單的。主要就是利用flutter的插件進行短信的監(jiān)聽,然后通過正則表達式提取驗證碼,最后通過http接口將驗證碼發(fā)送給工作流。但因為初次學習flutter,許多地方?jīng)]有做詳細的優(yōu)化,僅僅實現(xiàn)了整體功能。工程代碼放在github上,有興趣的可以看看:verify_code_app

到此這篇關于基于Flutter實現(xiàn)短信驗證碼監(jiān)控與轉發(fā)的文章就介紹到這了,更多相關Flutter短信驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Android自定義SeekBar實現(xiàn)滑動驗證且不可點擊

    Android自定義SeekBar實現(xiàn)滑動驗證且不可點擊

    這篇文章主要為大家詳細介紹了Android自定義SeekBar實現(xiàn)滑動驗證且不可點擊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 詳解Android使用Socket對大文件進行加密傳輸

    詳解Android使用Socket對大文件進行加密傳輸

    這篇文章主要介紹了詳解Android使用Socket對大文件進行加密傳輸,使用Socket進行文件傳輸過程時,需要先進行加密,有興趣的可以了解一下。
    2017-01-01
  • Flutter自定義搜索框效果

    Flutter自定義搜索框效果

    這篇文章主要為大家詳細介紹了Flutter自定義搜索框效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Android生成條形碼和二維碼功能

    Android生成條形碼和二維碼功能

    隨著移動互聯(lián)網(wǎng)的普及以及智能終端設備的廣泛應用,移動支付變得越來越便捷,通過掃描二維碼代替?zhèn)鹘y(tǒng)的刷卡行為。這篇文章給大家介紹Android生成條形碼和二維碼功能,需要的朋友參考下吧
    2019-10-10
  • 關于Android的 DiskLruCache磁盤緩存機制原理

    關于Android的 DiskLruCache磁盤緩存機制原理

    DiskLruCache是一種管理數(shù)據(jù)存儲的技術,單從Cache的字面意思也可以理解到,"Cache","高速緩存";今天我們來從源碼上分析下DiskLruCache;關于Android LruCache的緩存機制原理,需要的朋友可以參考下面文章的具體內容
    2021-09-09
  • ListView實現(xiàn)下拉動態(tài)渲染數(shù)據(jù)

    ListView實現(xiàn)下拉動態(tài)渲染數(shù)據(jù)

    這篇文章主要為大家詳細介紹了ListView實現(xiàn)下拉動態(tài)渲染數(shù)據(jù)的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android AES加密工具類分享

    Android AES加密工具類分享

    這篇文章主要介紹了Android AES加密工具類分享,本文給出了實現(xiàn)代碼和使用例子,本文使用PKCS5Padding加密方式實現(xiàn),需要的朋友可以參考下
    2014-10-10
  • 深入理解Android Bitmap

    深入理解Android Bitmap

    Bitmap是Android系統(tǒng)中的圖像處理的最重要類之一。這篇文章主要介紹了理解Android Bitmap,需要的朋友可以參考下
    2017-11-11
  • Android布局之絕對布局AbsoluteLayout詳解

    Android布局之絕對布局AbsoluteLayout詳解

    這篇文章主要為大家詳細介紹了Android布局之絕對布局AbsoluteLayout的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Android實現(xiàn)界面的自動跳轉功能

    Android實現(xiàn)界面的自動跳轉功能

    界面自動跳轉是指在應用啟動或某個特定界面顯示后,經(jīng)過預定的時間或者滿足某些條件后,自動跳轉到另一個目標界面,本文小編給大家講解了Android實現(xiàn)界面的自動跳轉功能,感興趣的小伙伴跟著小編一起來看看吧
    2025-04-04

最新評論