网络日志

如何批量生成快递地址

成果展示

批量生成快递地址的网址:http://poi.moyutime.cn/

我们公司经常需要生成快递地址,我把这个功能单独提取了出来,做成了一个网站(查询免费,下载收费,介意勿点)。

这样我们以后再需要生成快递地址,只需要下载就可以了,再也不用跑命令行了。

有同样需要小伙伴,可以看看。不差钱的小伙伴,可以找我,价格从优,秒发货。 跟我一样,囊肿羞涩的,就接着往下看,我说下我的思路。看看对你有没有帮助。

前提

在有些公司,尤其是像我们这样电商类公司,经常需要生成假的快递地址,进行系统测试。

这不前几天,我们组就开发了一个派件系统,就需要用到假的快递地址。

而且不是1个,是几千个,而且还要求精确到小区。

刚开始听到这需求我是一脸懵逼的。

不过作为一名8年的研发老狗,转眼间我就想到了解决办法。

折腾了一天,终于完美交差。

思路

其实这个思路很简单,要想生成快递地址,我们首先要知道全国各地小区的地址。有了小区地址,我们再随机生成户号、姓名和手机号,就能组成一个快递地址了。

而小区地址也很容易获取,高德地图、腾讯地图和百度地图都有提供相应的接口。我这里以高德地图为例,说下我的方法。

开发

1.获取全国所有小区的地址

首先在高德地图开放平台 注册个账号,并且创建一个应用。

创建应用

添加key我开发的是web端的,所以这里我选择的是【Web端(JS API)】,你们可以根据自己的需要选择不同的类型。

添加完可以之后,我们就获取了一个,高德地图给我们生成的key。拿到这个key,我们就可以调用高德地图提供的api了。因为我们选的的是web服务。所以我们api文档是【Web服务 API】

查看文档

搜索小区,我们需要调用的api是【搜索POI】

查看接口

我们要调用的接口是这个:

//restapi.amap.com/v3/place/text?key=您的key&keywords=小区&types=120000&city=110101&children=1&offset=20&page=1&extensions=base&citylimit=true

其中参数如下

  • key: 刚刚生成的key。
  • keywords: 搜索的关键字,我们搜的是小区,所以填小区
  • types:poi类型,小区的poi类型是120000. 想查看其他类型,可以点击POI分类编码
  • city:这里可以填城市名也可以填citycode或者adcode,为了结果更准确,我们选择填adcode。110101为北京市东城区的adcode,其他各个地方的adcode请查看下方的城市编码表
  • offset:每页记录数,默认是20,最多是25。我使用了默认值20
  • page:为当前页数,默认是1
  • citylimit:仅返回指定城市数据

请求结果

返回的结果中,count为总条数,pois数组里就是各个小区的详细信息。因为我们的offset设置的是20,所以一次请求只能返回20条小区数据。我们先把这些数据存入我们的数据库里,方便以后调用。

如果要遍历所有小区,就需要使用循环,通过改变page参数,多次请求接口。

这个挺简单的,我就不展开讲了。

拿到了该地区所有的小区数据后。我们可以通过遍历城市编码表中的所有地区,拿到全国所有小区的数据。

高德地图一天一个账号可以免费请求5000次,我借了很多账号,总算是搞定了。我使用的数据库是mongodb,存储到数据库中结构如下,一共大约有38万条数据.

生成随机楼号、单元号和户号

一个完成的快递地址通常还需要包含用户的楼号,单元号和户号。这个我们使用Math.random()随机生成就可以了。为了数据看起来不太离谱,楼的话我们在1-16楼随机生成,单元在1-4之间随机生成。

代码如下:

// 生成随机单元号
function randomUnitNum() {
  // 楼号 1-16 随机生成
  // 单元 1-4 之间随机生成
  // 户号 [1-6]0[1-6]
  return randomNum(1, 16) + '楼' + randomNum(1, 4) + '单元' + randomNum(1, 6) + '0' + randomNum(1, 6) + '号';
}

生成随机手机号

代码如下:

/**
 * 生成随机手机号
 * @return
 */
function randomPhoneNum() {
  const preNumList = [131, 135, 137, 139, 151, 150, 189, 136, 186, 187, 152, 138, 180];
  const rNum = randomNum(0, 12);
  const afNum = randomNum(13221010, 98241249);
  return String(preNumList[rNum]) + String(afNum);
}

生成随机姓名

代码如下:

/**
 * 随机生成用户姓名
 * @return 返回随机生成的用户姓名
 */
function randomUserName() {
  const xStr = '陈林黃张李王吴刘蔡杨许郑谢洪郭邱曾廖赖徐周叶苏庄吕江何萧罗高周叶苏庄吕江何萧罗高潘简朱锺彭游詹胡施沈余卢梁赵颜柯翁魏孙戴范方宋邓杜傅侯曹薛丁卓马阮董唐温蓝蒋石古纪姚连冯欧程汤黄田康姜汪白邹尤巫钟黎涂龚严韩袁金童陆夏柳凃邵';
  const femaleStr = '嘉琼桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇菁梦岚苑婕馨瑗琰韵融园艺咏卿聪澜纯毓悦昭冰爽琬茗羽希宁欣飘育滢馥筠柔竹霭凝晓欢霄枫芸菲寒伊亚宜可姬舒影荔枝思丽秀娟英华慧巧美娜静淑惠珠翠雅芝玉萍红娥玲芬芳燕彩春菊勤珍贞莉兰凤洁梅琳素云莲真环雪荣爱妹霞香月莺媛艳瑞凡佳';
  const maleStr = '涛昌进林有坚和彪博诚先敬震振壮会群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾伟刚勇毅俊峰强军平保东文辉力明永健世广志义兴良海山仁波宁贵福生龙元全国胜学祥才发成康星光天达安岩中茂武新利清飞彬富顺信子杰楠榕风航弘';
  const allNameStr = femaleStr + maleStr;
  const ran = randomNum(0, 10);
  let mingStr = '';
  if (ran < 1) {
    // 姓名为2个字
    mingStr = allNameStr[randomNum(0, allNameStr.length)];
  } else {
    mingStr = allNameStr[randomNum(0, allNameStr.length)] + allNameStr[randomNum(0, allNameStr.length)];
  }
  return xStr[randomNum(0, xStr.length - 1)] + mingStr;
}

生成快递地址

通过以上步骤,我们就拿到了所有我们想要的数据。通过这些数据,我们想要生成一个快递地址,简直就不要太容易了。至此,这个需求我们开发完毕。

一份完整的数据结构如下所示: