生成随机号码

2017-04-25  本文已影响76人  一吻江山

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

生成的号码有4点要求:

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

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

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

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

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

环境

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

  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]

上一篇下一篇

猜你喜欢

热点阅读