python网络爬虫实现发送短信验证码的方法


Posted in Python onFebruary 25, 2021

前言:今天要总结的是如何用程序来实现短信发送功能。但是呢,可能需要我们调用一些api接口,我会详细介绍。都是自己学到的,害怕忘记,所以要总结一下,让写博客成为一种坚持的信仰。废话不多说,我们开始吧!

网络爬虫实现发送短信验证码

在实现我们目标的功能之前,我们要有自己的思路,否则你没有方向,又如何实现自己的代码功能呢?

我们要发送短信,那么我们其实是需要分析的。我们可以去分析一个可以发送短信的网站页面。

我们来到这里如下:

python网络爬虫实现发送短信验证码的方法

可以看到这是一个注册界面,我们在注册时会被要求需要填写手机号码的·,其实还有一栏验证码识别,像这里打开没有,那你就填写几个号码,发送,多刷新几次,就可以了。

不为别人添麻烦,我填写自己的号码。
多次刷新会出现,不过要填写不同的手机号码。你们懂的,我们要看到这个有验证码的界面。

python网络爬虫实现发送短信验证码的方法

我们打开chrome谷歌抓包工具,也就是邮件检查即可。我们点击network直接进行抓包,记得在抓包前最好清除下面出现的一切包。我们要点击验证码,让网页做出反应,然后同步一下,进行抓包。

python网络爬虫实现发送短信验证码的方法

当我们填写手机号以后,我们只要点击那个验证码,然后进行抓包如下

python网络爬虫实现发送短信验证码的方法

看到没有,其实点击同步瞬间只有一个数据包的,在你做其他的动作时,可能会出现其他的数据包,但是与此无关。

我们直接点进去看

python网络爬虫实现发送短信验证码的方法

我们看这个url

https://uc.creditcard.ecitic.com/citiccard/ucweb/newvalicode.do?time=1613969346256

我们打开这个url看看庐山真面目

留意观察这个time参数,很明显是一个时间戳参数

时间戳参数又是什么概念呢?这里有必要介绍一下

时间戳 : 格林威治时间1970年1月0点0分0秒到目前为止
秒级时间戳:10数字
毫秒级时间戳 :13位数字
微秒级时间戳:16位数字

可以看到这个time参数属于毫秒级别的时间戳的。

我们访问这个见面,每次刷新都会有不同的验证码,返回当前的时间。如果我们要获取当前的验证码,我们需要url,前面的参数都一样,只有time,我们需要获取time时间。如何获取呢。

python中有一个time库,我们导入,来看如何使用。

下面展示一些 内联代码片

import time
def get_time() :
  " 获取当前的时间戳"
  now_time =str(int(time.time()*1000))#获取毫秒级的时间戳
  print('当前的时间戳',now_time)
  return now_time
get_time()

来看运行结果

我们目前可以这样去做

python网络爬虫实现发送短信验证码的方法

我们把这个获取到的时间戳参数加入到url中,我们可以实现动态的获取,每次要要获取这个二维码时就需要指定当前的时间time参数,那我们完全可以这样来构造这个url。我们用一个变量来接收获取的时间戳,然后以字符串的形式加入到time后面。
下面展示一些 内联代码片

import time
def get_time() :
  " 获取当前的时间戳"
  now_time =str(int(time.time()*1000))#获取毫秒级的时间戳
  print('当前的时间戳',now_time)
  return now_time
time_one = get_time()
img_url = 'https://uc.creditcard.ecitic.com/citiccard/ucweb/newvalicode.do?time='+time_one
print(img_url)

我们来看是否可以获取到相应正确的url

python网络爬虫实现发送短信验证码的方法

我们点入那个蓝色的链接,来看有没有获取到这个验证码图片。
python网络爬虫实现发送短信验证码的方法
测试证明我们完全是对的。

下一步我们要做的是实现代码的访问,获取并保存这个验证码。为什么保存,我们应该知道这点知识。

python网络爬虫实现发送短信验证码的方法

看这三个提交栏,很明显是一个要提交表单的。提交那就需要post,而post请求呢,就是要提交我们的数据,及手机号码和图形验证码。

当我们把数据提交上去以后,我们在手机上就会收到短信验证码。我们以此来实现发送短信验证码的功能。

我们来保存图片验证码
下面展示一些 内联代码片

import time
import requests 
def get_time() :
  " 获取当前的时间戳"
  now_time =str(int(time.time()*1000))#获取毫秒级的时间戳
  print('当前的时间戳',now_time)
  return now_time
time_one = get_time()
img_url = 'https://uc.creditcard.ecitic.com/citiccard/ucweb/newvalicode.do?time='+time_one
print(img_url)
headers = {
  'User-Agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'

}
response = requests.get(url=img_url,headers = headers)
img_data = response.content
with open('yzm.jpg',mode = 'wb') as file :
  file.write(img_data)

python网络爬虫实现发送短信验证码的方法

可以看到在代码编辑器右边已经出现了保存的图片。

下一步我们继续来分析这个手机号码的数据和图片验证码的数据在哪里传入,又是如何实现。

我们输入一个手机号码,然后输入图片验证码,然后点击免费获取。此时再次进行抓包,抓包的方法与上文的第一次抓包方法相同。

我们来看会出现什么样的包。

python网络爬虫实现发送短信验证码的方法

蓝色部分的就是我们寻找的目标包。然后我们如何去做?点击打开查看相应的代码。

python网络爬虫实现发送短信验证码的方法

看到没有post请求,是因该提交表单数据的。我们看看下面的表单数据

这里你会发现有一点不同电话号码是直接的数字,图片验证码就需要你来处理了,因为我们上文保存的验证码是图片,你如何识别到这图片验证码里面额数据,来进行传入呢?这里我们还需要一个网站。

超级鹰,是用来识别验证码的,其实我们还是调用这个接口。

python网络爬虫实现发送短信验证码的方法

我们点击开发文档,我们是用Python写的代码。所以我们点击python的图标,来这里来查看我们需要的。

python网络爬虫实现发送短信验证码的方法

在下面找到超级鹰图像识别,然后点击下载。把里面的api接口的py文件导入到你的python编辑器。我这里是用Pycharm写的。所以直接将解压出来的Python文件拖入pycharm。

python网络爬虫实现发送短信验证码的方法

下面是里面的部分代码。

python网络爬虫实现发送短信验证码的方法

这里面做了小小的修改。我们直接来看这段代码写了什么。
我来告诉大家原始的代码有问题,很低级的问题。

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

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()


if __name__ == '__main__':
	chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
	im = open('a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
	print chaojiying.PostPic(im, 1902)												#1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()

上面这个是他的原始接口代码。就很离谱。分块来分析。

def __init__(self, username, password, soft_id):
    self.username = username
	  password = password.encode('utf8')#没有缩进
    self.password = md5(password).hexdigest()
    self.soft_id = soft_id
    .......
    .......

这块的错误在哪呢?我这里特意表明突出,上面的原始代码直接沾到这里并不突出,但是你用编辑器打开会有问题的。

if __name__ == '__main__':
	chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
	im = open('a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
	print chaojiying.PostPic(im, 1902)	#print没有加	()										#1902 验证码类型 官方网站>>价格体系 3.#4+版 print 后要加()

还有一处,在这里,代码格式都没有写对,我这里指出,读者应该可以发现。这里介意读者可以去平台下载这个接口,自己去修改。

好,且不在谈这些,我们继续。我们还是修改部分代码。

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()


if __name__ == '__main__':
  chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
  im = open('a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  print chaojiying.PostPic(im, 1902)		#这是原始的代码										#1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()

我们可以在这内部写一个方法,我们待会要调用这个代码接口时,直接调用这个方法。

注意我们在类里面添加这样一部分代码,就是写一个方法

def run(self):
    chaojiying = Chaojiying_Client(constant.USER_NAME, constant.PASSWORD,
                    913137) # 用户中心>>软件ID 生成一个替换 96001
    im = open('yzm.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    result = chaojiying.PostPic(im, 1004) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
    return result['pic_str']

注意分析这个接口代码,里面 chaojiying = Chaojiying_Client(constant.USER_NAME, constant.PASSWORD,913137)

在注释里面其实说的已经很清楚了,这里的constant代表我们要导入的py文件,里面包含你的用户名,密码,以及软件id。

im = open(‘yzm.jpg', ‘rb').read() 打开你保存的验证码文件,上面我们已经保存过。
result = chaojiying.PostPic(im, 1004) 1004代表你的验证码类型。

用户名和密码你需要注册一下。那么软件id和验证码类型你该如何确定呢?
这是主页,请点击价格体系

python网络爬虫实现发送短信验证码的方法

在下面你可以来判断你的验证码类型了

python网络爬虫实现发送短信验证码的方法

我们这里需要登录进入用户中心

python网络爬虫实现发送短信验证码的方法

进入如下界面

python网络爬虫实现发送短信验证码的方法

往下拉进入软件id

python网络爬虫实现发送短信验证码的方法

进入后点击生成一个软件id,软件名称和软件说明可以随便填写

python网络爬虫实现发送短信验证码的方法

这样我们就可以获得一个软件id 。

这个constant如何编写,很简单,建立一个py文件,里面写入

USER_NAME=' …'
PASSWORD='… '

然后保存即可。导入py文件到当前路劲,然后import即可。

现在我们来看完整的代码
接口完整修改后的代码

import requests
from hashlib import md5
import constant

import constant


class Chaojiying_Client(object):

  def __init__(self, username, password, soft_id):
    self.username = username
    self.password = md5(password.encode('utf8')).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 run(self):
    chaojiying = Chaojiying_Client(constant.USER_NAME, constant.PASSWORD,
                    913137) # 用户中心>>软件ID 生成一个替换 96001
    im = open('yzm.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    result = chaojiying.PostPic(im, 1004) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
    return result['pic_str']


if __name__ == '__main__':
  chaojiying = Chaojiying_Client(constant.USER_NAME, constant.PASSWORD, 913137) # 用户中心>>软件ID 生成一个替换 96001
  im = open('yzm.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
  result = chaojiying.PostPic(im, 1004)
  print(chaojiying.PostPic(im,1004))# 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()

主文件代码,从这里执行

import time
import requests
from chaojiying import Chaojiying_Client
import constant
def get_time() :
  " 获取当前的时间戳"
  now_time =str(int(time.time()*1000))#获取毫秒级的时间戳
  print('当前的时间戳',now_time)
  return now_time
time_one = get_time()
img_url = 'https://uc.creditcard.ecitic.com/citiccard/ucweb/newvalicode.do?time='+time_one
print(img_url)
headers = {
  'User-Agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'

}
response = requests.get(url=img_url,headers = headers)
img_data = response.content
with open('yzm.jpg',mode = 'wb') as file :
  file.write(img_data)
print(response)

#验证码识别
code = Chaojiying_Client(constant.USER_NAME,constant.PASSWORD,913137).run()
print('识别出来的验证码为',code)

#请求保证同一个用户
cookiejar = response.cookies
cookies = cookiejar.get_dict()
print(cookies)
data = {
  'phone' :19745678397,
  'imgValidCode' : code,

}
time_two = get_time()
code_url = 'https://uc.creditcard.ecitic.com/citiccard/ucweb/getsms.do?×tamp'+time_two
requests_two = requests.post(url=code_url,data= data,headers=headers,cookies=cookies)
print(requests_two.json())

我们来看运行结果

python网络爬虫实现发送短信验证码的方法

ok,短信发送成功
需要注意的是,如果你发送多次的话,那么会出现提醒你短信发送频率过高的提示。这是服务器的响应。

我们总结一下该程序实现了发送验证码的功能,如果你需要实现发送你想要的文本,那么你需要调用其它的接口。别的就不多说了,毕竟爬虫也需要讲武德。

到此这篇关于python网络爬虫实现发送短信验证码的方法的文章就介绍到这了,更多相关python爬虫发送短信验证码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python计时相关操作详解【time,datetime】
May 26 Python
详解python里使用正则表达式的全匹配功能
Oct 19 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
python实现简单的文字识别
Nov 27 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
Python3列表List入门知识附实例
Feb 09 Python
Python中如何添加自定义模块
Jun 09 Python
Python如何操作docker redis过程解析
Aug 10 Python
python 基于opencv去除图片阴影
Jan 26 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 Python
python openpyxl模块的使用详解
Feb 25 #Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 #Python
python如何实现递归转非递归
Feb 25 #Python
Python如何使用神经网络进行简单文本分类
Feb 25 #Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 #Python
如何用 Python 制作一个迷宫游戏
Feb 25 #Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 #Python
You might like
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
javascript 短路法代码精简
2009/08/20 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
Python标准库之Sys模块使用详解
2015/05/23 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
Python整数对象实现原理详解
2019/07/01 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
解决python replace函数替换无效问题
2020/01/18 Python
Python解析微信dat文件的方法
2020/11/30 Python
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
高中生家长会演讲稿
2014/01/14 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
事业单位竞聘上岗实施方案
2014/03/28 职场文书
出生证明公证书
2014/04/09 职场文书
人事任命书范文
2014/06/04 职场文书
承诺书怎么写 ?
2019/04/16 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
JS函数式编程实现XDM一
2022/06/16 Javascript
uniapp引入支付宝原生扫码插件步骤详解
2022/07/23 Javascript