yisbug

2017-11-19 03:21

如何选一个心仪的腾讯大王卡手机号

本文作者: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,写了这么多,虽然技术含量不高,但确实有效快捷。 最后郑重声明,不鼓励大家这么做哈,所造成的一切后果和本人无关。

4条评论

    您需要 注册 一个IMWeb账号或者 才能进行评论。