2核1G3M服务器88一季度

腾讯云,阿里云百度云等 折扣价→点我←

为抗击新肺炎贡献一份技术力量 个人分享

更好站,更好资源网 三级用户组

写在开头

我不擅长写一些有意思的话,技术也如我的博客名字一样很普通,但是在这个春节,新肺炎肆虐武汉,更不停有扩散在全国的案例消息。

我不是什么专业人士,也无法贡献医疗力量,只能尽我所能看是否能为这件事做一点点的贡献。

这次的新肺炎专家组说了可防可控,但前提是所有人都有防护意识。经常接触互联网的同学们可能防护意识都已经提升起来了,但我相信有不少同学一定听说过或者正在面临着老人防护意识不强,抵制戴口罩,说破嘴皮子,也说服不了平时最爱养生的爸爸妈妈们,不要走亲戚,不要串门,即使有事要出门一定记得戴口罩等等。

我在想这些老人听不进去,讲不通道理,归根结底是信息获取不到位,无法感知到形式有多么的严峻。几乎每隔几分钟、十几分钟全国各地都会不停有新的应急措施启动,新的案例产生,全国都处于高度绷紧的状态,这种态势却并没有被老人们清晰的感知到。

如果他们能意识到这些问题的严重性,相信每个人都知道生命是珍贵的,应该重视注意。

获取实时动态

现在网上谣言漫天飞,可靠的官方信息来源是很重要的。人民日报和丁香医生做了一个实时动态的页面,发布的都是经过可靠验证的实时最新信息-实时播报。

但是,这是一个web页面,想要给长辈讲解问题的严重性,及事态的发展,做到有理有据,需要不停地查看这个页面,变得非常的不方便。

我的想法很简单,把这个页面的信息做成接口,这样就可以很方便的作出很多拓展方案。例如,我想通过微信机器人实时通知到群里(由于没有闲置微信老号做机器人未完成),后来又想通过邮件实时发送新动态(这个做了,后面会说),甚至我还想做一个app,将新动态推送的手机上,用语音播放自动朗读出来,成为一个行走的态势宣传喇叭 o(╥﹏╥)o等等,都是需要一个方便的接口才能完成。

所以,就有了下面的内容。

网页转接口

我第一想法是用 Puppeteer 简单粗暴抓取一下,通常情况下是简单快捷。打开页面分析了一下,发现数据其实都直接放在页面的 <script> 里了,就是 JavaScript 对象。

这种情况下,其实直接取对象是更快捷的方式。所以采取了 axios + cheerio + node vm 的方案。

网页数据提取

代码很简单直接贴了:

app.js  

const url = `https://3g.dxy.cn/newh5/view/pneumonia_peopleapp?from=timeline&isappinstalled=0`; async function getData(){     let response = await Axios.get(url);     let html = await response.data;     let $ = Cheerio.load(html);     let script = $('body > script');     console.log(script.length);     var global = {         window:{}     };     for(let i = 0; i < script.length; i++){         if(script[i] && script[i].children.length>0){             let scriptContent = script[i].firstChild.data;             vm.createContext(global);             vm.runInContext(scriptContent, global);         }     }     return global.window; } async function main(){     let data = await getData();     await fs.writeJSON('data/data.json',data)//保存数据 } main().catch((error) => {     console.log(error);     process.exit(); }); 复制代码

为了防止对数据源造成压力,这里直接将数据保存到了本地 json 存储,通过 pm2 控制2分钟刷新一次。开放接口直接访问本地的 json 数据,这样对数据源完全没有任何影响。

在我们通过技术手段去采集一些信息时,尽可能避免对数据源产生影响是一种基本的技术道德。

提供接口

使用 koa 对外提供接口。

api.js  

//获取所有信息 router.get('/data/all', async (ctx, next) => {     let data = await fs.readJSON('data/data.json');     ctx.response.body = data; }); //获取指定省份的信息 router.get('/data/getAreaStat/:provice', async (ctx, next) =>{     var provice = ctx.params.provice;     console.log(ctx.params)     let data = await fs.readJSON('data/data.json');     let areaStat = data.getAreaStat;     if(provice){         let body = [];         for(let i = 0; i<areaStat.length; i++){             let area = areaStat[i];             if(area.provinceName == provice || area.provinceShortName == provice){                 body.push(area);                 break;             }         }         ctx.response.body = body;     }else{         ctx.response.body = areaStat;     } }); //获取信息时间线 router.get('/data/getTimelineService', async (ctx,next) => {     let data = await fs.readJSON('data/data.json');     let timeline = data.getTimelineService;     ctx.response.body = timeline; }); //获取整体统计信息 router.get('/data/getStatisticsService', async (ctx,next) => {     let data = await fs.readJSON('data/data.json');     let statistics = data.getStatisticsService;     ctx.response.body = statistics; }); // add router middleware: app.use(router.routes()); app.listen(3001); 复制代码

接口说明    接口名 请求方式 接口描述     data/getTimelineService GET 按时间线获取事件   data/getStatisticsService GET 获取整体统计信息   data/getAreaStat/:provice GET 获取指定省份信息,例如:/data/getAreaStat/山东   data/getNewest/:lastid GET 获取最新事件   data/getIndexRumorList GET 最新辟谣   data/getIndexRecommendList GET 最新防护知识   data/getWikiList GET 最新知识百科   data/getEntries GET 诊疗信息   data/getListByCountryTypeService1 GET 全国省份级患者分布数据   data/getListByCountryTypeService2 GET 全球海外其他地区患者分布数据   data/getStatisticsService GET 获取整体统计信息

详细文档看这里

项目代码在这里

线上服务

我在服务器上跑了一份,方便有需要的同学使用:

地址:http://49.232.173.220:3001

测试:http://49.232.173.220:3001/data/getTimelineService

带参数例子:

http://49.232.173.220:3001/data/getAreaStat/山东

http://49.232.173.220:3001/data/getNewest/281

衍生项目

我们做技术的同学都非常具有社会责任感,很多同学积极展开了很多行动,这也是我的初衷,在此非常感谢。

如果有同学使用这套API开发相关项目,需要我提供什么支持,都可以联系我,我会尽可能提供协助与支持。

有相关衍生项目,可以告诉我,我后续会贴在这里。

APP

非常感谢 CrazyQ1 在第一时间就展开了APP的研发,现已发布第一个版本,有需要的同学可以下载使用。

APP截图:

项目地址  https://github.com/ahyangnb/ncov_2019

APP下载  http://www.flutterj.com/nCoV-2019.apk


TAGS 分享

站长窝论坛版权声明 1、本帖标题:为抗击新肺炎贡献一份技术力量
2、论坛网址:站长窝论坛
3、站长窝论坛的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
4、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
5、站长窝论坛一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本帖由更好站,更好资源网在站长窝论坛《交流综合区》版块原创发布, 转载请注明出处!
评论
最新回复 (1)
返回
发新帖
相关贴子