新型冠状病毒 2019-nCoV实时数据提取方法及实时播报实现方案

为了方便大家能及时跟进本次 新型冠状病毒2019-nCoV疫情的进展情况,计划在小程序上上线一个基于丁香园疫情页面的推送服务,服务调取函数如下,供大家参考!

<?php

function get_nCoV_news()
{
    $reg = '/<script id="getTimelineService">.+?window.getTimelineService\s=\s({.+?)}catch\(e\){}<\/script>/im';
    if( preg_match( $reg , file_get_contents( 'https://3g.dxy.cn/newh5/view/pneumonia' ) , $out ) )
    {
        return @json_decode( $out[1] , 1); 
    }
    return false;
}

function get_nCoV_province()
{
    $reg = '/<script id="getListByCountryTypeService1">.+?window.getListByCountryTypeService1\s=\s(\[.+?])}catch\(e\){}<\/script>/im';
    if( preg_match( $reg , file_get_contents( 'https://3g.dxy.cn/newh5/view/pneumonia' ) , $out ) )
    {
        return @json_decode( $out[1] , 1); 
    }
    return false;
}

?>

此外可以尝试使用datav等工具联动数据库和api取出数据予以可视化呈现:每个组件都有一个render方法,会接收 data 数据,如果对组件进行绘制,可以作为数据更新使用 。其中代码所放位置必须在 module.exports = (stage) => {}方法里面,varCtrName.render = (data) => {}//data为对应组件配置的API里返回的json数据, varCtrName(获取的组件).emit('global_var', 'bm_name', val);通过hook.js给回调参数赋值,这样在screenIDE组件的数据–数据源类型里面就可以使用 :bm_name作为参数,从而在hook.js给回调参数赋值。

控制屏与展示屏之间由Socket通信。 所有屏打开时会向Socket服务器注册。 控制屏发消息给Socket服务器,然后Socket服务器会广播给所有向自己注册的屏。

//动态插入JS文件
function getJs(url){
    var dom = document.createElement('script');//建立一个script元素
    dom.type = 'text/javascript';//写入属性
    dom.async = 'true';
    dom.src = url;
    document.getElementsByTagName('head')[0].appendChild(dom);
}
// 如果是公网DataV,就引用公网JS文件,如果是部署版DataV,就引用内网JS文件
const jsDomain="ip";
// 导入socket.js
getJs(`http://${jsDomain}/public/socket.js`) // socket方法
getJs(`http://${jsDomain}/public/common.js`) // 通用方法
 
// 控屏
function screenControl(stage) {
// 把当前屏注册向socket服务器注册
    var screenIdMatches = location.href.match(/(screen|share)\/([a-z\d]+)/);
    var screenId = screenIdMatches && screenIdMatches.length ? screenIdMatches[2] : '';
    var groupMatches = location.search.match(/group=([a-z0-9]+)/i);
    var group = groupMatches && groupMatches.length ? groupMatches[1] : 'public';
    var broadcast = new Socket(screenId, "mytest", group);
 
    broadcast.ready(function () {
        broadcast.on(sceneName, function (data) {
            //data.Show为按钮的对应属性的值
            //代码
        })
    })
}
//-----入口-------
module.exports = (stage) => {
  let interval = setInterval(function () {
    if (Socket) {//用来确保Socke存在
      screenControl(stage);//运行上面的“控屏”方法
      clearInterval(interval);//
    }
  }, 1000)
}
发布了75 篇原创文章 · 获赞 505 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/deng_xj/article/details/104075398