Bilibili 直播挂机脚本

PHP 这个最好的语言不拿来写点脚本真是可惜了。

用途

自动向 Bilibili 服务器发送心跳包,从而实现 24H 挂机涨经验升级。我本人挂机半个月左右,从 Lv1 升级到了 Lv21,虽然等级没什么卵用 :D

更新

  • 0.2.0 采用并发机制,支持多账号
  • 0.1.0 初始版本

食用方法

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

正常结果

===============================
name   : 雪狼meto 
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'][1]);

		        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->user as $id=>$user){
			if($user['status']!=1)continue;
			$curl[$id]=$this->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>0);
		foreach($curl as $id=>$c){
			$result[$id]=curl_multi_getcontent($c);
			curl_multi_remove_handle($mh,$c);
		}
		curl_multi_close($mh);
		foreach($result as $id=>$vo){
			$vo=json_decode($vo,1);
			$this->user[$id]['cron']=$vo;
		}
    }
	public function check(){
		$mh=curl_multi_init();
		foreach($this->user as $id=>$user){
			if($user['status']!=1)continue;
			$curl[$id]=$this->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>0);
		foreach($curl as $id=>$c){
			$result[$id]=curl_multi_getcontent($c);
			curl_multi_remove_handle($mh,$c);
		}
		curl_multi_close($mh);
		foreach($result as $id=>$vo){
			$vo=json_decode($vo,1);
			if($vo['code']<0)$this->user[$id]['status']=0;
			$this->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

参考资料


本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可
本文链接:https://i-meto.com/bilibili-heart/

metowolf

Read more posts by this author.