生成随机号码

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

生成的号码有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]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,884评论 25 707
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,561评论 1 118
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 今天姨妈来了,在家趴着,看完了胡歌的书《幸福的拾荒者》,突然开始喜欢上了这个演员,欣赏他的生活态度,待人的大方温和...
    舒馨颀阅读 274评论 0 0
  • 读完整本《嫌疑人X的献身》,整个人都沉在一股悲伤的氛围中。原谅我的见 识短浅,只在这本书中读到了爱情。你本是...
    心向天涯阅读 196评论 1 1