Python爬虫验证码识别——手机验证码的自动化处理

手机验证码的自动化处理

有一种验证码就是手机验证码,如果在PC上出现了一个手机验证码,需要先在PC上输入手机号,然后把短信验证码发到手机上,再在PC上输入收到的验证码,才能通过验证。

遇到这样的情况,如何才能将识别流程自动化呢?

  1. 短信验证码的收发

    通常,我们的自动化脚本运行在PC上,例如打开一个网页,然后模拟输入手机号,点击获取验证码,接下来就需要输入验证码了。前三个流程自动化很容易,但验证码发送到手机上了,怎么把它转给PC呢?

    自动化验证码的整个收发流程,可以这么实现——当手机接收到一条短信时,自动将这条短信转发至某处,例如转发至一台远程服务器或者直接发给PC,在PC上我们可以通过一些方法获取短信内容并提取验证码,再自动化填充到输入的地方即可。

    关键步骤是如下两步:

    • 监听手机收到短信的事件
    • 将短信内容转发至指定的位置

    这两步缺一不可,而且都需要再手机上完成。思路其实简单,以Android手机为例,如果有Android开发经验,这两个功能实现起来很简单的。

    首先如何监听手机接收到的短信呢?在Android开发中,分为三个必要环节。

    • 注册读取短信的权限:在一个Android App中,读取短信需要具备特定的权限,所以需要在Android App的AndroidManifest.xml文件中将读取短信的权限配置好,例如:
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
    
    • 注册广播事件:Android有一个基本组件叫BroadcastReceiver,是广播接收者的意思,可以用它来监听来自系统的各种事件广播,例如系统电量不足的广播、系统来电的广播,那系统接收到短信的广播自然也不在话下。这类似于注册一个监听器来监听系统接收到短信的事件。这里我们在AndroidManifest.xml文件中注册一个BroadcastReceiver,叫做SmsReceiver:
    <receiver android:name=".receive.SmsReceive">
    	<intent-filter android:priority="999">
    		<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    	</intent-filter>
    </receiver>
    
    • 实现短信广播的接收:这里就需要真正实现短信接收的逻辑了,只需要实现一个SmsReceiver类,它继承了BroadcastReceiver类,然后实现其onReceive方法即可,其中intent参数里就包含了我们想要的短信内容,实现如下:
    public class SmsReceiver extents BroadcastReceiver{
    	@Override
    	public void onReceive(Context context, Intent intent){
    		Bundle bundle = intent.getExtras();
    		SmsMessage msg = null;
    		if (null !=bundle){
    			Object[] smsObj = (Object[]) bundle.get("pdus");
    				msg = SmsMessage.createFromPdu((bytep[]) object);
    				Log.e("短信号码","" + msg.getOriginationAddress());
    				Log.e("短信内容","" + msg.getDisplayMessageBody());
    				Log.e("短信时间","" + msg.getTimestampMillis());
    				}
    			}
    		}
    

    如此一来,我们便实现了短信的接收。

    收到短信之后,发送自然也很简单了,例如服务器提供一个API, 请求该API即可实现数据的发送,Android的一些HTTP请求库就可以实现这个逻辑,例如利用OkHttp构造一个HTTP请求。

    有没有现成的解决方案呢?当然,完全可以借助一些开源实现。一个开源软件SmsForwarder,中文叫做短信转发器,其GitHub地址为https://github.com/pppscn/SmsForwarder。它的基本框架如图所示:

    working_principle

    SmsForwarder的架构非常清晰,可以监听收到短信的事件,获取短信的来源号码、接收卡槽、短信内容、接收时间等,然后将这些内容通过一定的规则转发出去,支持转发到邮箱、企业微信群机器人、企业微信应用、Telegram机器人和Webhook等。

    1. 实战演示

    使用Flask写一个API, 代码如下:

    from flask import Flask, request, jsonify
    from loguru import logger
    
    app = Flask(__name__)
    
    @app.route('/sms', methods=['POST'])
    def receive():
        sms_content = request.form.get('content')
        logger.debug(f'received {sms_content}')
        return jsonify(status='success')
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    设置一个路由,接收POST请求,然后读取了Request表单的内容,其中content就是短信内容的详情,之后将其打印出来。运行结果如下:

    * Serving Flask app 'server'
     * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on <http://127.0.0.1:5000>
    Press CTRL+C to quit
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 134-109-800
    

    为了方便测试,可以用Ngrok工具将该服务器暴露到公网:

    ngrok http 5000
    

    运行之后,可以看到如下结果:

    Session Status                online                                            
    Account                       lxw1973 (Plan: Free)                              
    Version                       3.8.0                                             
    Region                        Japan (jp)                                        
    Latency                       109ms                                             
    Web Interface                 <http://127.0.0.1:4040>                             
    Forwarding                    <https://ecb6-122-143-163-242.ngrok-free.app> -> htt
                                                                                    
    Connections                   ttl     opn     rt1     rt5     p50     p90       
                                  0       0       0.00    0.00    0.00    0.00      
    

    可以看到Ngrok为我们配置了一个公网地址,例如访问https://ecb6-122-143-163-242.ngrok-free.app就相当于访问我们本地的http://localhost:5000服务,这样只需在手机上配置这个地址就可以将数据发送到PC端了。

    接下来我们手机上打开SmsForder,添加一个Webhook类型的发送方,设置详情如图所示:

    2

    其中,我们把WebServer的URL直接设置成刚才Ngrok提供的公网地址,注意要在URL的后面加上sms。接着我们添加一个转发规则。如下图所示:

    1

    这里我们设置了内容匹配规则,将短信转发到Webhook这个发送方,即发送到我们刚刚搭建的Flask服务器上。添加完成后,可以尝试用另一台手机给当前运行次App的手机发送一个验证码信息,内容如下:

    测试验证码65272752,一分钟有效
    

    这时可以发现刚才的Flask服务器接收到了这样的结果,如图所示:

    Screenshot 2024-03-31 at 16.09.33

    可以看到,发送给手机的验证码信息已经成功由手机发送到PC了,接着便可以对此信息进行解析和处理,然后存入数据库或消息队列。

    1. 批量收发

    如果有大量手机和手机卡,则可以实现手机的群控处理,例如统一安装短信接收软件、统一配置相同的转发规则,从而接收和处理大量手机号的验证码。如图所示就是一个群控系统:

    群控

    1. 卡池、猫池

    除了上面的方法,当然还有更专业的解决方案,例如用专业的手机卡池、猫池,配以专业的软件设备实现短信监听。如下图所示的设备支持插128张SIM卡,可以同时监听128个手机号的验证码。

    卡池

    1. 接码平台

    卡池、猫池的解决方案成本还是比较高的,而且这些方案其实已经不限于简单接收短信验证码了,就像手机群控系统一般会做手机群控爬虫,卡池也可以用来做4G/5G蜂窝代理,仅仅走短信收发当然也可以,未免有些浪费了。如果不想耗费过多成本,想实现短信验证码的自动化,还有一种方案就是接码平台,其基本思路如下:

    • 平台会维护大量手机号,并可能开放一些API或提供网页供我们调用来获取手机号和查看短信的内容。
    • 我们调用API或者爬取网页获取手机号,然后在对应的网站输入该手机号来获取验证码。
    • 通过调用API或者爬取网页获取对应手机号的短信内容,并交由爬虫处理。

    更多的体验可以在小蜜蜂AI网站获取,网址:https://zglg.work。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux在程序运行时打印调用栈信息(函数名,文件行号等)】

在程序运行时打印相关调用栈信息&#xff08;函数名&#xff0c;文件行号等&#xff09;,便于梳理调用逻辑等 //stack.c #include <stdio.h> #include <execinfo.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>#define MAX_…

vue cesium heatmap 热力图

实现效果 引入 heatmap index.html 中引入 heatmap <script src"./heatmap.min.js"></script>使用 <script lang"ts" setup> import * as Cesium from cesium import cesium/Build/Cesium/Widgets/widgets.cssdefineOptions({ name: …

MySQL count函数的使用

count&#xff08;&#xff09;函数在使用时参数好像不能设置为表达式&#xff0c;只能设置成指定字段或* 比如在查询性别为男的成员数目时不能写&#xff1a; select count(gendermale) from user_profile ; 否则直接得到6&#xff0c;也就是等价于select count(gender) fro…

Docker镜像的(Dive)分析和(Grype)漏洞扫描

Dive dive能够分析docker镜像分层内容以及发现缩小docker/OCI镜像大小的方法。 提高部署效率&#xff1a;能够秒级快速启动一个应用&#xff0c;而传统的方式分钟级别以上&#xff1b; 提高运行效率&#xff1a;相对物理机和虚拟化&#xff0c;容器具有更高的资源利用率&…

【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)

合并两个有序链表 题目描述思路及实现方式一&#xff1a;迭代&#xff08;推荐&#xff09;思路代码实现Java版本C语言版本Python3版本 复杂度分析 方式二&#xff1a;递归&#xff08;不推荐&#xff09;思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相似题目 标…

LLM大语言模型(八):ChatGLM3-6B使用的tokenizer模型BAAI/bge-large-zh-v1.5

背景 BGE embedding系列模型是由智源研究院研发的中文版文本表示模型。 可将任意文本映射为低维稠密向量&#xff0c;以用于检索、分类、聚类或语义匹配等任务&#xff0c;并可支持为大模型调用外部知识。 BAAI/BGE embedding系列模型 模型列表 ModelLanguageDescriptionq…

《QT实用小工具·五》串口助手

1、概述 源码放在文章末尾 该项目实现了串口助手的功能&#xff0c;可在界面上通过串口配置和网络配置进行串口调试。 基本功能 支持16进制数据发送与接收。支持windows下COM9以上的串口通信。实时显示收发数据字节大小以及串口状态。支持任意qt版本&#xff0c;亲测4.7.0 到…

[leetcode] 100. 相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&a…

微信小程序【从入门到精通】——服务器的数据交互

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

【设计】6种ID生成策略描述,优点 ,缺点 ,适用场景

1.数据库自增ID 描述 自增Id是在设计表时将id字段的值设置为自增的形式&#xff0c;这样当插入一行数据时无 需指定id会自动根据前一字段的Id值1进行填充 优点 主键自动增长&#xff0c;不用手工设值、数字型&#xff0c;占用空间小、检索非常有利、有顺序&#xff0c;不会…

08、JS实现:数组两数之和算法的两种解决方案(一步一步剖析,很详细)

数组两数之和的算法 Ⅰ、数组两数之和算法的方案一&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅱ、数组两数之和算法的方案二&#xff1a;1、实现代码&#xff1a; Ⅲ、小结&#xff1a; Ⅰ、数组两数之和算法的方案一&#xff1a; …

51单片机学习笔记11 使用DS18B20温度传感器

51单片机学习笔记11 使用DS18B20温度传感器 一、DS18B20简介1. 主要特点2. 工作原理3. 引脚说明4. ROM 二、1-wire协议简介1. 总线结构&#xff1a;2. 通信方式&#xff1a;3. 数据传输&#xff1a;4. 设备识别&#xff1a;5. 供电方式&#xff1a;6. 应用场景&#xff1a;7. 优…

vue页面实现旋转饼图

一、示例图片 二、参考 3D饼图-半透明 - ECharts图表集,echarts gallery社区,Make A Pie,分享你的可视化作品isqqw.com 三、实现 1、自定义组件RotatingPieChart.vue <template><div>【旋转饼图】</div><div ref"chart" class"chart-c…

C语言单链表的窗口化操作

#include <stdio.h> #include <stdlib.h>// 定义链表的节点结构 struct Node {int data;struct Node* next; };// 初始化链表 void initialize(struct Node** head) {*head NULL; }// 在链表末尾插入节点 void insert(struct Node** head, int value) {// 创建新节…

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗

基于BEV的自动驾驶会颠覆现有的自动驾驶架构吗 引言 很多人都有这样的疑问–基于BEV(Birds Eye View)的自动驾驶方案是什么&#xff1f;这个问题&#xff0c;目前学术界还没有统一的定义&#xff0c;但从我的开发经验上&#xff0c;尝试做一个解释&#xff1a;以鸟瞰视角为基础…

Web框架开发-Form组件和ajax实现注册

一、注册相关的知识点 1、Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2、局部钩子函数 1 2 3 4 5 6 7 # 局部钩子函数 def clean_username(self): userna…

《QT实用小工具·六》代码行数统计工具

1、概述 源码放在文章末尾 该项目实现了对不同编程语言文件的代码行数的统计 统计的内容包含&#xff1a; 1、代码行数 2、注释行数 3、空白行数 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #pragma execution_character_set("utf-8")#inclu…

区块链食品溯源案例实现(一)

引言&#xff1a; 食品安全问题一直是社会关注的热点&#xff0c;而食品溯源作为解决食品安全问题的重要手段&#xff0c;其重要性不言而喻。传统的食品溯源系统往往存在数据易被篡改、信息不透明等问题&#xff0c;而区块链技术的引入&#xff0c;为食品溯源带来了革命性的变革…

【ProComponents】解决 ProTable 中 params 参数改变,request 函数未触发问题

文章目录 先建议自查下官方文档&#xff0c;了解params和request直接的关系 确定params绑定的参数是否改变&#xff0c;例如 user_name 参数 import { ProTable, WxIcon } from /components; import { getSearchParams } from ice; import { useEffect, useMemo, useRef, useS…

智慧公厕是什么?智慧公厕的主要功能、特点?

智慧公厕&#xff0c;顾名思义&#xff0c;是指应用了智能科技的公共厕所&#xff0c;旨在提供更加便捷、舒适、智能化的卫生服务。相比传统的公厕&#xff0c;智慧公厕不仅拥有更加智能化的设备&#xff0c;还配备了远程监控与管理系统&#xff0c;以及节能环保技术&#xff0…