本文作者:IMWeb yisbug 原文出处:IMWeb社区 未经同意,禁止转载
最近淘了一个支持4G的iPad Pro,考虑买一个什么类型的流量卡比较划算。对比了一下,发现还是用腾讯系的应用比较多,例如王者荣耀、腾讯视频、微信QQ等,那就选个腾讯的大王卡吧。打开微信,王卡助手,进入申请王卡的页面,发现可以自选号码,那就必须要选一个自己喜欢的号码了 。
个人偏爱0这个数字,虚无没有意义又简单好记,于是使用页面提供的搜索功能,搜索000,发现什么也没有。再尝试搜索186,也什么都没有。原来这个系统不支持搜索3位数字。好吧,继续搜索00,出来了一批没什么意义的号码,花了些时间一直点击“换一批”按钮,也没找到什么中意的号码。
突然发现,这个页面点击换一批的速度还挺快的嘛,打开chrome控制台,看了下请求。原来是有一个jsonp的请求一次性拉回来100个号码,然后随机换着显示,这不耍猴呢。我倒想看看联通的号码库到底有多少个号码可以让我选,随手写了段脚本,打开控制台执行。
var nums = []; // 存储所有的号码
var isStop = false; // 是否停止采集
function load(url, callback) {
const xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) { // 4 = "loaded"
if (xmlhttp.status == 200) { // 200 = OK
callback(xmlhttp.responseText);
} else {
callback('');
}
}
};
xmlhttp.open('GET', url, true);
xmlhttp.send(null);
}
var run = () => {
load(`https://m.10010.com/NumApp/NumberCenter/qryNum?callback=jsonp_queryMoreNums&provinceCode=51&cityCode=540&monthFeeLimit=0&groupKey=21236872&searchCategory=3&net=01&amounts=200&codeTypeCode=&searchValue=&qryType=02&goodsNet=4&_=${new Date().getTime()}`, (data) => {
var arr = data.match(/\d{11}/g);
if (arr && arr.length) {
arr.forEach((item) => {
// 去重
if (nums.indexOf(item) === -1) {
nums.push(item);
}
});
}
if (nums.length < 200000 || !isStop) {
setTimeout(() => run, 100)
}
});
};
run();
跑了半天,广东深圳号码库的数量大约19000个左右,再继续跑也没有增加多少。个人不喜欢带4的号码,简单剔除后,只有不到1000个号码。
nums.sort().filter((item) => item.indexOf('4') === -1).join('","')
这1000个号码里也没有选到比较喜欢的。随便选了一个号码,修改dom,把号码换成自己想要的,居然提示号码已经被占用。
原来选择号码时,还会发出一个POST请求,判断号码是否被占用。
OK,那我直接选定号段,轮询一下有哪些号码可用,不就解决问题了。打开ip138.com,找到广东深圳的号码段,选择18603000000-18603009999这个区域,再写了段脚本:
function post(num) {
return new Promise((resolve, reject) => {
const xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) { // 4 = "loaded"
if (xmlhttp.status == 200) { // 200 = OK
resolve(xmlhttp.responseText);
} else {
resolve('');
}
}
};
xmlhttp.open('POST', "https://m.10010.com/king/kingNumBuy/occupy", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send('provinceCode=51&cityCode=540&numID=' + num + '&goodsId=511610241535');
})
}
for (var i = 0; i < 9999; i++) {
var str = String(i);
if (str.length < 4) {
str = new Array(5 - str.length).join('0') + str
}
var res = await post('1860300' + str)
if (res === '"SUCCESS"') {
console.log(res, i);
}
}
当然,这只是初步的脚本,为了加快速度,可以多打开几个页面,并发请求。最终拿到一部分没有被占用的号码,如图:
最终,在没有被使用的号码里挑选了一个还算满意的号码。
当然,这个行为其实相当于作弊,而服务提供方也没有做好相应的防范措施,导致我能够用较低的成本就可以拉取号码信息。如果对应的接口做了IP频率限制,那这种简单的轮询方式的成本就会比较高了,可能需要着堆大量的代理服务器来跑接口。
这让我想起几年前的一个case,当时联通宽带的账号和默认密码是固定格式的,带宽只有2M和4M可选。当时新换了个房子,宽带还没有开通,于是简单写了个自动拨号的程序,跑出来几千个宽带账号密码,可以随意免费使用,并且还可以选4M的账号使用。 这个也属于运营商的漏洞,频率限制+mac绑定即可解决,但可惜他们并没有这么多。
OK,写了这么多,虽然技术含量不高,但确实有效快捷。 最后郑重声明,不鼓励大家这么做哈,所造成的一切后果和本人无关。