当我们做爬虫或其他的一些应用的时候,如果需要一些短信验证,但是又没有那么多手机号,又不能放人在那里一直输入的时候?怎么办?
这个问题肯定很多人碰到了,配合手机和app将短信提交到服务器,然后开放出来供各位使用,那么说起来肯定是收费的,也肯定会有无私的同学免费贡献出来。
前段时间,抓数据的时候就用到了短信验证码,找到一个还算可以的免费站点。
网站上大约一百多个短信接收号码,如果你还需要大量的,那么这里肯定不适合你了,建议找个收费的测试下。
说道这里应该就完了,不过后边是使用,一般都是代码啥的,没啥实际意义,简单记录,仅供参考。
抓取短信号码和地址
- 依赖
async
axios
cheerio
sqlquery-tool
//自动抓取网站上的可用手机号码并进行存储 更新
let startPage = 1;
let url = `https://www.pdflibr.com/?page=`
let host = `https://www.pdflibr.com`;
let axios = require('axios');
let cheerio = require('cheerio');
let async = require('async');
let query = require('sqlquery-tool');
let log = require('../util/log');
//抓取单页手机号码
function fetch(url){
return axios.get(url)
.then(rs=>{
let html = rs.data;
let $ = cheerio.load(html);
//查找是否存在手机列表信息
let $sms = $('.sms_content');
if($sms.find('.sms-number-list.row.show-grid').length == 0){//没有数据
return null;
}else{
//找到符合条件的手机号码和地址信息
let phoneList = [];
let $list = $sms.find('.sms-number-list.row.show-grid');
$list.each((i,item)=>{
const isChina = $(item).find('picture img').attr('src').indexOf('china') > -1;
const phoneNo = $(item).find('.number-list-phone_number h3').text().replace('+86','');
const isUse = $(item).find('.number-list-info').html().trim() == '' || $(item).find('.number-list-info p:nth-child(2)').text().indexOf('小时') > -1 ? false : true;
const phoneUrl = host + $(item).find('.sms-number-read a').attr('href');
if(isChina && isUse){
phoneList.push({
phoneNo : phoneNo,
phoneUrl : phoneUrl
});
}
})
return phoneList;
}
})
}
async function start(){
//执行获取,从第一个开始,一直增加
try{
let startGo = true;
let allArr = [];
while(startGo){
let phoneList = await fetch(url+startPage);
console.log(phoneList);
if(phoneList == null){
startGo = false;
}else{
//添加
startPage ++ ;
allArr = allArr.concat(phoneList);
}
}
//直到所有的页面全部抓完
//开始进行更新/或插入/等等
for(let info of allArr){
let hasList = await query.search('phonelist').where({phoneNo : info.phoneNo}).list();
if(hasList == null || hasList.length == 0){
let rs = await query.search('phonelist').insert(info);
}
}
}catch(e){
console.log(e);
log('手机号码',`抓取失败:${e||'无'}`)
}
}
module.exports = start;
根据手机号查找验证码
- 依赖
sqlquery-tool
axios
cheerio
//获取短信验证码
let query = require('sqlquery-tool');
let axios = require('axios');
let cheerio = require('cheerio');
let log = require('../util/log');
module.exports = function(phone,datetime){
return query.search('phonelist').where({
phoneNo : phone
}).list()
.then(rs=>{
let pageUrl = rs[0].phoneUrl;
return axios.get(pageUrl);
})
.then(rs=>{
let html = rs.data;
let $ = cheerio.load(html);
let txtArr = [];
$('.sms_content:nth-child(4) table tr').each(function(i,item){
var itemText = $(item).find('td:nth-child(3)').text();
var timestr = $(item).find('td:nth-child(4)').text();
let d = new Date(timestr.trim());
let time = d.getTime();
if(datetime < time){
txtArr.push({
txt : itemText,
time : d.getTime()
});
}
})
//查找是否存在
var phoneCode = '',getRs = false;
for(let i=0;i<txtArr.length;i++){
let txt = txtArr[i].txt;
let time = txtArr[i].time;
if(txt != '' && txt.indexOf('关键词A') > -1 && txt.indexOf('关键词B') > -1 ){
phoneCode = txt.trim().substring(txt.trim().length - 6);
getRs = true;
log('短信验证码',`获得短信验证码:${phoneCode}`)
break;
}
}
return {
success : getRs,
result : phoneCode
}
})
}
最近的文章确实是有点水了,不过一直在忙项目,还没时间写..望见谅!不过首页图还是不错的,凑活凑活看看图吧 。