Bilibili 直播挂机脚本

Copy一位大佬的代码,在收藏的同时也能学习一下。

PHP作为世界上最好用的语言,弄这个,简直是小意思...

脚本用途:自动向 Bilibili 服务器发送心跳包,从而实现 24H 挂机涨经验升级。

  1. Github 获取最新脚本,上传到服务器或者空间上(require >PHP5.4)。
  2. 修改脚本中的 COOKIE 为 live.bilibili.com 站下的 cookie 值(为了防止过期,建议使用隐身窗口打开,选中记住登录,再进行获取,获取方法见文末)
  3. 访问该 PHP 脚本路径,http://[yoursite]/onlineHeart.php,查看结果是否正常
  4. 设置该脚本 5 分钟运行一次,可以使用 crontab 添加规则,也可以利用监控平台 5 分钟监控一次。

正常结果

===============================
name   : 你の名字  
level  : 27  
exp    : 3630400/10000000 [36.3%]  
status : OK  
===============================
...
===============================

如果显示 status : @2017-02-26 15:53:01 则表示心跳包过快发送,通常需要间隔 4:52 发送,设置成 5 分钟最为合理了

源码说明

<?php  
/**
 *  Author: METO
 *  Version: 0.2.0
 */
class bilibili{  
    public $user=array(
        array(
            'cookie' => '填写用户cookie',
            'status' => 1,
        ),
        array(
            'cookie' => '第二个用户cookie',
            'status' => 0, // 0 表示禁用
        ),
        // 多用户以此类推
    );
    public function display(){
        header('Content-Type: text/txt; charset=UTF-8');
        echo "===============================\n";
        foreach($this->user as $result){
            if($result['status']){
                $data=$result['data'];
                $a=$data['data']['user_intimacy'];
                $b=$data['data']['user_next_intimacy'];
                $per=round($a/$b*100,2);
                if(!isset($result['cron']['data'][1]))$msg='OK';
                else $msg='@'.date('Y-m-d H:i:s',$result['cron']['data'][2]);
            echo "name   : {$data['data']['uname']} \n";
            echo "level  : {$data['data']['user_level']} \n";
            echo "exp    : {$a}/{$b} [{$per}%]\n";
            echo "status : {$msg}\n";
            echo "===============================\n";
        }
        else{
            echo "status : {$result['data']['msg']}\n";
            echo "===============================\n";
        }
    }
}
public function cron(){
    $mh=curl_multi_init();
    foreach($this-&gt;user as $id=&gt;$user){
        if($user['status']!=1)continue;
        $curl[$id]=$this-&gt;create('http://live.bilibili.com/User/userOnlineHeart',$user['cookie']);
        curl_multi_add_handle($mh,$curl[$id]);
    }
    do{
        curl_multi_exec($mh,$running);
        curl_multi_select($mh);
    }while($running&gt;0);
    foreach($curl as $id=&gt;$c){
        $result[$id]=curl_multi_getcontent($c);
        curl_multi_remove_handle($mh,$c);
    }
    curl_multi_close($mh);
    foreach($result as $id=&gt;$vo){
        $vo=json_decode($vo,1);
        $this-&gt;user[$id]['cron']=$vo;
    }
}
public function check(){
    $mh=curl_multi_init();
    foreach($this-&gt;user as $id=&gt;$user){
        if($user['status']!=1)continue;
        $curl[$id]=$this-&gt;create('http://live.bilibili.com/User/getUserInfo',$user['cookie']);
        curl_multi_add_handle($mh,$curl[$id]);
    }
    do{
        curl_multi_exec($mh,$running);
        curl_multi_select($mh);
    }while($running&gt;0);
    foreach($curl as $id=&gt;$c){
        $result[$id]=curl_multi_getcontent($c);
        curl_multi_remove_handle($mh,$c);
    }
    curl_multi_close($mh);
    foreach($result as $id=&gt;$vo){
        $vo=json_decode($vo,1);
        if($vo['code']&lt;0)$this-&gt;user[$id]['status']=0;
        $this-&gt;user[$id]['data']=$vo;
    }
}
private function create($url,$cookie){
    $curl=curl_init();
    curl_setopt($curl,CURLOPT_URL,$url);
    curl_setopt($curl,CURLOPT_COOKIE,$cookie);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl,CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($curl,CURLOPT_REFERER,'http://live.bilibili.com/');
    curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5');
    return $curl;
}

}
$API=new bilibili;
$API->check();
$API->cron();
$API->display();

lwl12 的 python 版本实现多了一步获取当前直播间 roomid,我反复试验多次,并不需要这个参数,如果发现无法正常发送心跳包的话欢迎来提 bug

按 F12 在 console 输入 document.cookie
由于 bilibili 打开了 HttpOnly Cookie,需要在 network 选项卡中找到类似 live_player?optype=&roomid=xxx 的地址,在右侧 Request Header 中复制 cookie

参考资料

利用宝塔自带脚本可以直接监控,所以说我是懒人嘛,嘿嘿

TIM截图20170706211857.png

宝塔很方便,给大家安利一波,每天备份...很实用~

TIM截图20170706211937.png

我专门创了个小号挂起,坐等升级~~~

相关文章

热门文章

花落尘埃,等一人归来,静听雨打窗台。
朱门微开,留倩影徘徊,遥寄千里之外。

已有 10 条评论

  1. 晓丶玉女 晓丶玉女

    大佬,我直接在宝塔配置了APACHE和PHP,请问那个.php要放哪里执行?

    1. 新建一个站点,可以绑定域名,把文件上传去,最后用自带的监控

      1. 晓丶玉女 晓丶玉女

        多谢解答,我用我的vps搭建宝塔面板后一直不清楚它的apache默认目录,直接打开IP地址也是出错误而不是正常的apache界面,后来换了一个思路,不用网页验证是否成功挂机,而是直接运行php文件,然后宝塔上挂着运行的shell脚本,但每次都有一个错误:PHP Notice: Undefined index: data in /var/www/html/onlineHeart.php on line 38
        status :
        请问这个又是什么原因,后来重装了一次系统,再自己编译安装php和apache,在网页打开的时候就不会出现这一段文字,但是在ssh里用php命令打开还是会出现这个错误,求解答

        1. 你看看你的编码是否有问题

          1. 晓丶玉女 晓丶玉女

            并不是编码问题,我在自己的Centos虚拟机中再次尝试了一次,直接PHP运行文件还是会出那一段文字,检查了一下所在行,是 echo "status : {$result['data']['msg']}\n"; 这一段,不知道是否有问题

            1. cookie你填对了吗?

          2. 晓丶玉女 晓丶玉女

            应该算是填对了,我定时启动后看到经验会涨,其实这一行报错也没多大所谓了,还是能涨经验的

  2. 受教!学习了!

  3. 受教!学习了!

  4. py py

    还是有些不明白,有个主机阿里的,弄了宝塔什么都没有直接设置定时任务,复制上面发的也不行,去系统里面执行也不可以,该怎么弄,求指点

添加新评论