美文网首页
生成随机号码

生成随机号码

作者: 一吻江山 | 来源:发表于2017-04-25 21:11 被阅读76次

    公司要求每月发彩漫,发的条数还要达到一定数量。但你知道做为程序员,没有那么多的可以发送对象,所以只能生成随机号码。

    生成的号码有4点要求:

    1. 不能发给公司人员
    2. 不能发给用户
    3. 每个号码只会收到一次
    4. 移动号码

    公司人员是有通信录的,其中包含号码信息,但导出的是xls格式的通信录文件。
    自己不会网页自动化,导出xls文件只能手动完成,而且只能一个部门一个部门的导出,部门又多,真是体力活啊。
    每个月都有新人入职或离职,为了保持最新,每个月都重新导出一次,真是体力活啊!

    咪咕的用户太多了,又不会向我们公开,所以第2点是做不到的。只能努力做到第1点

    为了不打扰陌生人,每次发过的号码都记下来,下个月不再发送,以后也不再发送,也就说只会收到一次。

    移动号码段:1340-1348,135-139,150-152,157-159,182-184,187-188

    环境

    • create_no_migu_phone.sh运行会生成no_migu_phone.txtsorted_migu.txt

    • no_migu_phone.txt我们需要的最终通信录

    • 20170422070548.xls为部门通信录

    • 文件夹为子公司

    • sorted_all.txt由执行excel2json.js脚本后生成,为子公司通信录

    • sorted_migu.txt为包含所有子公司的通信录

    • no_migu_phone-2月.txtno_migu_phone.txt更名而来,已发送过的号码

    数据准备和脚本运行步骤:

    1. 先从公司网站导出各部门的通信录文件,比如20170422070548.xls
    2. node excel2json.js生成sorted_all.txt
    3. 重命名no_migu_phone.txtno_migu_phone-2月.txt
    4. 运行create_no_migu_phone.sh

    代码

    create_no_migu_phone.sh

    #!/usr/bin/env bash
    ##author: zhoujie<13456774460@139.com>
    ##这个脚本的作用是:生成咪咕彩漫的xxxxxxxx|xxxxxxxx格式的通信录文件,并排除咪咕号码
    
    ##调试开关
    #set -eux
    
    readonly randSortedFile=sorted_rand.txt
    readonly miguSortedFile=sorted_migu.txt
    
    ##生成一定范围内的随机数
    ##$1:最小的数
    ##$2:最大的数
    function rand() {  
        local min=$1  
        local max=$(($2-min+1))  
        local num
        num=$(head -n 11 < /dev/urandom | cksum | awk -F ' ' '{print $1}') 
        echo $((num%max+min)) 
    }
    
    ##生成咪咕通信录
    function create_migu_phones () {
        echo "生成咪咕通信录:${miguSortedFile}......."
    
        ##找出所有子公司目录下的sorted_all.txt文件   
        local company
        company=$(find . -mindepth 1 -name sorted_all.txt)
    
        ##读取所有sorted_all.txt文件内容,并排序和剔除重复号码,最后写入${miguSortedFile}文件
        cat $company | sort -u > ${miguSortedFile} 
    } 
    
    ##生成随机号码
    function create_random_phones () {
        echo "生成随机号码:${randSortedFile}......"
    
        local randFile=rand.txt
    
        true > ${randFile}
    
        ##生成randFile(rand.txt)文件
        for (( i = 0; i < 3000; i = $((i + 1)) )); do
            rnd=$(rand 13400000000 13999999999)
            printf "%d|%d\n" "$rnd" "$rnd" >>${randFile}
        done
    
        #排序随机号码
        sort -u ${randFile} > ${randSortedFile}
    
        #删除随机号码文件
        rm ${randFile}
    } 
    
    
    create_migu_phones
    
    create_random_phones
    
    #生成最终结果
    ##排除已在前面月份中发过的号码
    function comm_months_and_migu_phones () {
    
        local noMiguFile=no_migu_phone.txt
    
        echo "生成排除咪咕的通信录:${noMiguFile}......."
    
        local months_and_migu_phones=months_and_migu_phones.txt
    
        ##清空temp.txt
        true >temp.txt
    
        ##把前面月份中的号码写入temp.txt
        find . -maxdepth 1 -name "no_migu_phone-*" -exec cat {} >>temp.txt \;
    
        ##把咪咕中的号码写入temp.txt
        cat ${miguSortedFile} >>temp.txt
    
        ##排序并排除重复的号码
        sort -u temp.txt >$months_and_migu_phones
        rm temp.txt
    
        ##生成最终结果
        comm -23 ${randSortedFile} ${months_and_migu_phones} >${noMiguFile}
    
        ##清除生成的中间文件
        rm $months_and_migu_phones   
    }
    
    comm_months_and_migu_phones
    
    rm ${randSortedFile}
    
    echo Done!!!
     
    

    代码

    excel2json.js

    #!/usr/bin/env node
    //需要安装node_xj:  npm install xls-to-json
    
    node_xj = require("xls-to-json");
    
    var fs = require('fs');
    var path = require('path');
    
    fs.readdir(process.cwd(), function (err, files) {
        var allPhones = [];
        files.forEach(function (file) {
            var basename = path.basename(file);
            var ext = path.extname(file);
            var jsonname = basename + '.json';
            if (ext === '.xls') {
    
                node_xj({
                    input: basename,  // input xls 
                    output: null, // output json 
                    sheet: "数据"  // specific sheetname 
                }, function (err, result) {
                    if (err) {
                        console.error(err);
                    } else {
                        var obj = result;
                        obj.forEach(function (person) {
                            allPhones.push(person["手机"]);
                        });
                    }
                });
            }
        });
    
        var sorted_all_file = 'sorted_all.txt'; 
        if( fs.existsSync(sorted_all_file) ) {
            fs.unlinkSync(sorted_all_file);
        }
        
        setTimeout(function () {        
            function onlyUnique(value, index, self) {
                return self.indexOf(value) === index;
            }
            var sorted = allPhones.sort();
            var unique = sorted.filter(onlyUnique);
            unique.forEach(function (item) {
                fs.appendFileSync(sorted_all_file, item + '|' + item + '\n');
            });
    
        }, 5 * 1000);
    });
    
    

    js代码生成随机号码

    #!/usr/bin/env node
    
    var fs = require('fs');
    
    const createRandomPhones = (min, max, count) => {
        let phones = [];
        const d = max - min + 1;
        while (phones.length < count) {
            const randonNum = Math.floor(Math.random() * d + min);
            if (phones.includes(randonNum) === false) {
                phones.push(randonNum);
            }
        }
        return phones;    
    } 
    
    //移动号码段
    ///////////////////////////////////////////////////
    function RangePhone(min, max, ratio) {
        this.min = min;
        this.max = max;
        this.ratio = ratio;
    }
    
    const r1340_1348 = new RangePhone(13400000000, 13489999999, 1);
    
    const r135_139 = new RangePhone(13500000000, 13999999999, 5);
    
    const r150_152 = new RangePhone(15000000000, 15299999999, 3);
    
    const r157_159 = new RangePhone(15700000000, 15999999999, 3);
    
    const r182_184 = new RangePhone(18200000000, 18499999999, 3);
    
    const r187_188 = new RangePhone(18700000000, 18899999999, 3);
    
    ///////////////////////////////////////////////////
    
    const mobileRanges = [r1340_1348, r135_139, r150_152, r157_159, r182_184, r187_188];
    
    const totalCount = 3000;
    const totalRatio = mobileRanges.reduce( (accumulator, currentValue) => {return accumulator + currentValue.ratio },0);
    
    //按各个手机号码段所占比例,生成总共totalCount个随机号码
    let phones = [];
    
    mobileRanges.forEach( (item) => {
        const {min, max} = item;//对象的解构赋值
        let count = Math.floor(item.ratio / totalRatio * totalCount); 
        let sorted = createRandomPhones(min, max, count);
        phones = phones.concat(sorted);
    });
    
    let file = 'sorted_rand.txt';
    
    if( fs.existsSync(file) ) {
        fs.unlinkSync(file);
    } 
    
    //把随机号码排序并写入文件
    let sorted = phones.sort(); 
    sorted.forEach(function (item) {
        fs.appendFileSync(file, `${item}|${item}\n`);//``//模板字符串 
    });
    

    最新代码

    如有代码有更新,请参考https://github.com/zhoujie903/Shell

    [TOC]

    相关文章

      网友评论

          本文标题:生成随机号码

          本文链接:https://www.haomeiwen.com/subject/lzlbzttx.html