生成随机号码
2017-04-25 本文已影响76人
一吻江山
公司要求每月发彩漫,发的条数还要达到一定数量。但你知道做为程序员,没有那么多的可以发送对象,所以只能生成随机号码。
生成的号码有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.txt
,sorted_migu.txt
-
no_migu_phone.txt
我们需要的最终通信录 -
20170422070548.xls
为部门通信录 -
文件夹为子公司
-
sorted_all.txt
由执行excel2json.js
脚本后生成,为子公司通信录 -
sorted_migu.txt
为包含所有子公司的通信录 -
no_migu_phone-2月.txt
由no_migu_phone.txt
更名而来,已发送过的号码
数据准备和脚本运行步骤:
- 先从公司网站导出各部门的通信录文件,比如
20170422070548.xls
-
node excel2json.js
生成sorted_all.txt
- 重命名
no_migu_phone.txt
为no_migu_phone-2月.txt
- 运行
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]