TypechoJoeTheme

Dcr163的博客

统计

微信小程序房间列表直播状态获取

2020-05-03
/
0 评论
/
957 阅读
/
正在检测是否收录...
05/03

微信小程序房间列表怎么查询直播状态,这里我直接上小程序js代码

var e = getApp(), t = e.requirejs("core"), i = e.requirejs("foxui"),livePlayer = requirePlugin('live-player-plugin');
Page({

  /**
   * 页面的初始数据
   */
  data: {
	navbar:1,
	roomlist:[],
	isLogin:1,
  },
  liveStatuObj:{
  	'101':'直播中',
  	'102':'未开始',
  	'103':'已结束',
  	'104':'禁播',
  	'105':'暂停中',
  	'106':'异常',
  	'107':'已过期'
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
	this.getRooms();
  },
  /**
   * 获取直播房间
   */
getRooms: function(){
  var _this = this;
  //这个接口是请求后台获取直播的房间列表,g.get 网络请求函数,请换上自己的网络请求函数或用小程序官方的
  t.get("live/index",'',function(rr){
    if( !rr.error ){

      let roomList = rr.list;
      _this.setData({
        roomlist:roomList,
      isLogin:rr.is_login
      });
      //遍历房间列表,查询每个房间的直播状态
      for(var ii in roomList) {
        var roomId = roomList[ii].roomid;
        //获取直播状态
        liveStatus(roomId,ii);
      }
      //获取直播状态
      function liveStatus(roomId,listKey){
        livePlayer.getLiveStatus({ room_id: roomId})
          .then(res=>{
            var roomStatus = res.liveStatus;
            console.log( _this.liveStatuObj[roomStatus],roomStatus,'DCR163')
            roomList[listKey].status_str =  _this.liveStatuObj[roomStatus];
            _this.setData({
              roomlist:roomList 
            });
            //更新状态,这里是获取到的房间状态后,再更新给后台,这样下次请求列表时就是正确的房间状态了
            t.get('live/upDateStatus',{roomid:roomId,status:roomStatus},function(e){
              console.log(e);
              console.log('12132')
            })
          })
          .catch(err => {
            console.log('get live status', err)
          });
      }
    }
  })
},
  nav: function() {
      this.setData({
          nav_mask: !this.data.nav_mask
      });
  },
  nav2: function() {
      this.setData({
          nav_mask2: !this.data.nav_mask2
      });
  },
  redirectUrl: function(res){
  	var datas = res.currentTarget.dataset;
  	e.redirectUrl(datas.url);
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
	this.getRooms();
	wx.stopPullDownRefresh();//停止当前页面下拉刷新
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function (res) {
	console.log(res)
	return {'title':'您的好友喊你来看直播啦!'}
  }
})


php后台房间列表接口

/**
 * dcr163 小程序获取直播房间接口缓存
 * @param int $start    起始的房间 start = 0 表示从第 1 个房间开始拉取
 * @param int $limit    每次拉取的个数上限
 * @return array|void
 */
public function getRoomList($start=0,$limit=20){
    global $_W;
    $uniacid = $_W['uniacid'];

    $time = time();
    //首先查询是否已过缓存 毕竟坑爹的腾讯 一天的接口调用次数只有 500次
    $sql = 'SELECT id,expire_time FROM '.tablename('vcshop_wxapp_live_cache').' WHERE start=:start AND `limit`=:limit AND uniacid=:uniacid';
    $info = pdo_fetch($sql,array(':start'=>$start,':limit'=>$limit,':uniacid'=>$uniacid));
    $upData = array();
    $inData = array();

    if( !empty($info) ) {
        if( $time > $info['expire_time'] ) {
            $upData = ['expire_time'=>$time+300,'update_time'=>$time];
        }else {
            return $this->getLiveList($start,$limit);
        }
    } else {
        $inData = array(
            'start' => $start,
            'uniacid'   => $uniacid,
            'limit' => $limit,
            'create_time'   => $time,
            'expire_time'   => $time+300,   //5分钟后可以更新缓存获取数据
        );
    }

    $accessToken = $this->getAccessToken();
    if (is_error($accessToken))
    {
        return error(-1, 'accessToken获取失败');
    }

    //获取直播房间列表接口
    $apiUrl = 'http://api.weixin.qq.com/wxa/business/getliveinfo?access_token='.$this->getAccessToken();
    $params = array();
    $params['start'] = $start;
    $params['limit'] = $limit;
    load()->func('communication');
    $res = ihttp_post($apiUrl,json_encode($params));

    //更新缓存的时间
    if( !empty($upData) ) {
        pdo_update('vcshop_wxapp_live_cache',$upData,['start'=>$start,'limit'=>$limit,'uniacid'=>$uniacid]);
    }
    //插入缓存
    if( !empty($inData) ) {
        pdo_insert('vcshop_wxapp_live_cache',$inData);
    }
    if (is_error($res))
    {
        return error(-2, $res['message']);
    }
    $content = json_decode($res['content'],true);
    if( $content['errcode'] ) return error(-2,$content['errmsg']);
    //获取微信接口的列表
    $roomList = $content['room_info'];
    $roomList = array_reverse($roomList);
    $roomIdArr = [];
    foreach ( $roomList as &$v ) {
        $roomIdArr[] = $v['roomid'];
        if( $v['goods'] ) {
            $v['goods'] = json_encode($v['goods']);
        }
    }
    unset($v);
    //获取数据库中和接口一样的条件数据
    $lists = $this->getLiveList($start,$limit);
    if( !empty($lists) ) {
        $listKeys = [];
        foreach ( $lists as $v ){
            $listKeys[] = $v['roomid'];
        }
        //这里拿数据库中的数据和接口查询的数据对比,如果数据中存在,但是接口不存在,则更新数据库为已删除 s
        $deleteRooms = array_diff($listKeys,$roomIdArr);
        if( !empty($deleteRooms) ){
            $sql = 'UPDATE '.tablename('vcshop_wxapp_live').' SET `is_delete`=1 WHERE uniacid=:uniacid AND `is_delete`=0 AND roomid IN ('.implode(',',$deleteRooms).')';
            pdo_query($sql,array(':uniacid'=>$uniacid));

        }
    }
    //查询是否已经有保存过在数据库中
    $roomIdStr = implode(',',$roomIdArr);
    $sql = 'SELECT id,roomid FROM '.tablename('vcshop_wxapp_live').' WHERE roomid IN ('.$roomIdStr.') AND uniacid=:uniacid';
    $existsLists = pdo_fetchall($sql,array(':uniacid'=>$_W['uniacid']),'roomid');
    $existsRooms = array_keys($existsLists);

    //已经存在的房间更新房间信息
    $upDataRooms = array_intersect($existsRooms,$roomIdArr);
    if( !empty($upDataRooms) ) {
        foreach($roomList as $k=>$v){
            if( in_array($v['roomid'],$upDataRooms) ) continue;
            //这里不更新房间状态,因为第一次之后api提供的状态不准确
            $srcData = [
                'name'=>$roomList[$k]['name'],
                'anchor_name'=>$roomList[$k]['anchor_name'],
                'cover_img'=>$roomList[$k]['cover_img'],
                'start_time'=>$roomList[$k]['start_time'],
                'end_time'=>$roomList[$k]['end_time'],
                'share_img'=>$roomList[$k]['share_img'],
                'goods'=>$roomList[$k]['goods'],
            ];
            pdo_update('vcshop_wxapp_live',$srcData,['uniacid'=>$_W['uniacid'],'roomid'=>$v['roomid']]);
        }
    }

    //接口中返回的数据不存在数据库中则插入
    $inertRooms = array_diff($roomIdArr,$existsRooms);
    if( !empty($inertRooms) ) {
        foreach( $roomList as $k => $v ){
            if( !in_array($v['roomid'],$inertRooms) ) continue;
            $roomList[$k]['uniacid'] = $uniacid;
            pdo_insert('vcshop_wxapp_live',$roomList[$k]);
        }
    }
    return $this->getLiveList($start,$limit);
}
/**
 * dcr163获取制定的范围数据
 * @param $start    开始数据
 * @param $limit    查询条数
 * @return array
 */
public function getLiveList($start,$limit) {
    global $_W;
    $sql = 'SELECT * FROM '.tablename('vcshop_wxapp_live').' WHERE is_delete=0 AND uniacid=:uniacid ORDER BY roomid DESC LIMIT '.$start.','.$limit;
    $lists = pdo_fetchall($sql,array(':uniacid'=>$_W['uniacid']));
    return $lists;
}

朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

http://dcr163.cn/242.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. slot demo
    2025-01-13
  2. 陌天
    2025-01-09
  3. Kerrie Bostick
    2024-12-28
  4. Norma Gainey
    2024-09-21
  5. Amber Powlett
    2024-05-09

标签云