mirror of
https://github.com/lkeme/BiliHelper-personal.git
synced 2025-12-19 09:30:10 +08:00
[fix] XliveHeartBeat
This commit is contained in:
parent
358553525e
commit
7ab42e6fc0
@ -40,69 +40,69 @@ trait XliveHeartBeat
|
|||||||
protected static function resetVar($force = false)
|
protected static function resetVar($force = false)
|
||||||
{
|
{
|
||||||
if ($force){
|
if ($force){
|
||||||
self::$_room_info = [];
|
static::$_room_info = [];
|
||||||
self::$_current_room_id = 0;
|
static::$_current_room_id = 0;
|
||||||
|
|
||||||
self::$_retry = 3;
|
static::$_retry = 3;
|
||||||
self::$_count_num = 0;
|
static::$_count_num = 0;
|
||||||
self::$_count_time = 0;
|
static::$_count_time = 0;
|
||||||
}
|
}
|
||||||
$data = [
|
$data = [
|
||||||
'id' => self::$_data['id'],
|
'id' => static::$_data['id'],
|
||||||
];
|
];
|
||||||
$data["id"][2] = 0;
|
$data["id"][2] = 0;
|
||||||
self::$_data = $data;
|
static::$_data = $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected static function xliveHeartBeatTask(int $room_id, int $max_time, int $max_num)
|
protected static function xliveHeartBeatTask(int $room_id, int $max_time, int $max_num)
|
||||||
{
|
{
|
||||||
// 加载依赖
|
// 加载依赖
|
||||||
if (!self::depend()) {
|
if (!static::depend()) {
|
||||||
return self::$_default;
|
return static::$_default;
|
||||||
}
|
}
|
||||||
// 对比当前运行
|
// 对比当前运行
|
||||||
if (self::$_current_room_id != $room_id) {
|
if (static::$_current_room_id != $room_id) {
|
||||||
self::resetVar(true);
|
static::resetVar(true);
|
||||||
self::$_current_room_id = $room_id;
|
static::$_current_room_id = $room_id;
|
||||||
}
|
}
|
||||||
// 加载房间信息
|
// 加载房间信息
|
||||||
if (empty(self::$_room_info)) {
|
if (empty(static::$_room_info)) {
|
||||||
$r_data = Live::webGetRoomInfo($room_id);
|
$r_data = Live::webGetRoomInfo($room_id);
|
||||||
if ($r_data['code'] != 0) {
|
if ($r_data['code'] != 0) {
|
||||||
Log::warning('直播间信息获取失败');
|
Log::warning('直播间信息获取失败');
|
||||||
return self::$_default;
|
return static::$_default;
|
||||||
}
|
}
|
||||||
$rdata = $r_data['data'];
|
$rdata = $r_data['data'];
|
||||||
$parent_area_id = $rdata['room_info']['parent_area_id'];
|
$parent_area_id = $rdata['room_info']['parent_area_id'];
|
||||||
$area_id = $rdata['room_info']['area_id'];
|
$area_id = $rdata['room_info']['area_id'];
|
||||||
# 短位转长位
|
# 短位转长位
|
||||||
$room_id = $rdata['room_info']['room_id'];
|
$room_id = $rdata['room_info']['room_id'];
|
||||||
self::$_data['id'] = [$parent_area_id, $area_id, 0, $room_id];
|
static::$_data['id'] = [$parent_area_id, $area_id, 0, $room_id];
|
||||||
}
|
}
|
||||||
// 执行心跳
|
// 执行心跳
|
||||||
$r_data = self::heartBeatIterator();
|
$r_data = static::heartBeatIterator();
|
||||||
$index = self::$_data['id'][2];
|
$index = static::$_data['id'][2];
|
||||||
if ($r_data['code'] != 0) {
|
if ($r_data['code'] != 0) {
|
||||||
if (self::$_retry) {
|
if (static::$_retry) {
|
||||||
Log::warning("心跳失败-{$index} {$r_data['message']}");
|
Log::warning("心跳失败-{$index} {$r_data['message']}");
|
||||||
self::resetVar();
|
static::resetVar();
|
||||||
self::$_retry -= 1;
|
static::$_retry -= 1;
|
||||||
return self::$_default;
|
return static::$_default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self::$_count_num += 1;
|
static::$_count_num += 1;
|
||||||
self::$_count_time += $r_data['heartbeat_interval'];
|
static::$_count_time += $r_data['heartbeat_interval'];
|
||||||
|
|
||||||
// 最大次数限制
|
// 最大次数限制
|
||||||
if ($max_num <= self::$_count_num) {
|
if ($max_num <= static::$_count_num) {
|
||||||
// 成功在id为{room_id}的直播间发送完{ii}次心跳,退出直播心跳(达到最大心跳次数)
|
// 成功在id为{room_id}的直播间发送完{ii}次心跳,退出直播心跳(达到最大心跳次数)
|
||||||
}
|
}
|
||||||
// 最大时间限制
|
// 最大时间限制
|
||||||
if ($max_time <= self::$_count_time) {
|
if ($max_time <= static::$_count_time) {
|
||||||
//成功在id为{room_id}的直播间发送第{ii}次心跳
|
//成功在id为{room_id}的直播间发送第{ii}次心跳
|
||||||
}
|
}
|
||||||
$minute = round(self::$_count_time / 60);
|
$minute = round(static::$_count_time / 60);
|
||||||
Log::info("已在直播间 {$room_id} 连续观看了 {$minute} 分钟");
|
Log::info("已在直播间 {$room_id} 连续观看了 {$minute} 分钟");
|
||||||
return $r_data['heartbeat_interval'];
|
return $r_data['heartbeat_interval'];
|
||||||
|
|
||||||
@ -118,8 +118,8 @@ trait XliveHeartBeat
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// 加载加密服务器
|
// 加载加密服务器
|
||||||
if (is_null(self::$_enc_server)) {
|
if (is_null(static::$_enc_server)) {
|
||||||
self::$_enc_server = getenv('ENC_SERVER');
|
static::$_enc_server = getenv('ENC_SERVER');
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -129,21 +129,21 @@ trait XliveHeartBeat
|
|||||||
{
|
{
|
||||||
$rdata = [];
|
$rdata = [];
|
||||||
# 第1次执行 eHeartBeat
|
# 第1次执行 eHeartBeat
|
||||||
if (self::$_data['id'][2] == 0) {
|
if (static::$_data['id'][2] == 0) {
|
||||||
$r_data = self::eHeartBeat(self::$_data['id']);
|
$r_data = static::eHeartBeat(static::$_data['id']);
|
||||||
} else {
|
} else {
|
||||||
# 第1次之后执行 xHeartBeat
|
# 第1次之后执行 xHeartBeat
|
||||||
self::$_data['ts'] = time() * 1000;
|
static::$_data['ts'] = time() * 1000;
|
||||||
self::$_data['s'] = self::encParamS(self::$_data, self::$_secret_rule);
|
static::$_data['s'] = static::encParamS(static::$_data, static::$_secret_rule);
|
||||||
$r_data = self::xHeartBeat(self::$_data['id']);
|
$r_data = static::xHeartBeat(static::$_data['id']);
|
||||||
}
|
}
|
||||||
if ($r_data['code'] == 0) {
|
if ($r_data['code'] == 0) {
|
||||||
$rdata = $r_data['data'];
|
$rdata = $r_data['data'];
|
||||||
self::$_data['ets'] = $rdata['timestamp'];
|
static::$_data['ets'] = $rdata['timestamp'];
|
||||||
self::$_data['benchmark'] = $rdata['secret_key'];
|
static::$_data['benchmark'] = $rdata['secret_key'];
|
||||||
self::$_data['time'] = $rdata['heartbeat_interval'];
|
static::$_data['time'] = $rdata['heartbeat_interval'];
|
||||||
self::$_secret_rule = $rdata['secret_rule'];
|
static::$_secret_rule = $rdata['secret_rule'];
|
||||||
self::$_data['id'][2] += 1;
|
static::$_data['id'][2] += 1;
|
||||||
}
|
}
|
||||||
return [
|
return [
|
||||||
'code' => $r_data['code'],
|
'code' => $r_data['code'],
|
||||||
@ -182,7 +182,7 @@ trait XliveHeartBeat
|
|||||||
// {'code':0,'message':'0','ttl':1,'data':{'timestamp':1595342828,'heartbeat_interval':300,'secret_key':'seacasdgyijfhofiuxoannn','secret_rule':[2,5,1,4],'patch_status':2}}
|
// {'code':0,'message':'0','ttl':1,'data':{'timestamp':1595342828,'heartbeat_interval':300,'secret_key':'seacasdgyijfhofiuxoannn','secret_rule':[2,5,1,4],'patch_status':2}}
|
||||||
|
|
||||||
unset($payload['id']);
|
unset($payload['id']);
|
||||||
self::$_data = array_merge_recursive(self::$_data, $payload);
|
static::$_data = array_merge_recursive(static::$_data, $payload);
|
||||||
|
|
||||||
return json_decode($raw, true);
|
return json_decode($raw, true);
|
||||||
}
|
}
|
||||||
@ -197,20 +197,20 @@ trait XliveHeartBeat
|
|||||||
$url = 'https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/X';
|
$url = 'https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/X';
|
||||||
$user_info = User::parseCookies();
|
$user_info = User::parseCookies();
|
||||||
$payload = [
|
$payload = [
|
||||||
's' => self::$_data['s'],
|
's' => static::$_data['s'],
|
||||||
'id' => json_encode([$id[0], $id[1], $id[2], $id[3]], true),
|
'id' => json_encode([$id[0], $id[1], $id[2], $id[3]], true),
|
||||||
'device' => self::$_data['device'],
|
'device' => static::$_data['device'],
|
||||||
'ets' => self::$_data['ets'],
|
'ets' => static::$_data['ets'],
|
||||||
'benchmark' => self::$_data['benchmark'],
|
'benchmark' => static::$_data['benchmark'],
|
||||||
'time' => self::$_data['time'],
|
'time' => static::$_data['time'],
|
||||||
'ts' => self::$_data['ts'],
|
'ts' => static::$_data['ts'],
|
||||||
'ua' => self::$_data['ua'],
|
'ua' => static::$_data['ua'],
|
||||||
'csrf_token' => $user_info['token'],
|
'csrf_token' => $user_info['token'],
|
||||||
'csrf' => $user_info['token'],
|
'csrf' => $user_info['token'],
|
||||||
'visit_id' => ''
|
'visit_id' => ''
|
||||||
];
|
];
|
||||||
// print_r($payload);
|
// print_r($payload);
|
||||||
$raw = Curl::post('pc', $url, $payload, self::$hb_headers);
|
$raw = Curl::post('pc', $url, $payload, static::$hb_headers);
|
||||||
# {'code':0,'message':'0','ttl':1,'data':{'heartbeat_interval':300,'timestamp':1595346846,'secret_rule':[2,5,1,4],'secret_key':'seacasdgyijfhofiuxoannn'}}
|
# {'code':0,'message':'0','ttl':1,'data':{'heartbeat_interval':300,'timestamp':1595346846,'secret_rule':[2,5,1,4],'secret_key':'seacasdgyijfhofiuxoannn'}}
|
||||||
return json_decode($raw, true);
|
return json_decode($raw, true);
|
||||||
}
|
}
|
||||||
@ -228,7 +228,7 @@ trait XliveHeartBeat
|
|||||||
];
|
];
|
||||||
// 加密部分
|
// 加密部分
|
||||||
$payload = ['t' => $t, 'r' => $r];
|
$payload = ['t' => $t, 'r' => $r];
|
||||||
$data = Curl::put('other', self::$_enc_server, $payload, $headers);
|
$data = Curl::put('other', static::$_enc_server, $payload, $headers);
|
||||||
$de_raw = json_decode($data, true);
|
$de_raw = json_decode($data, true);
|
||||||
if ($de_raw['code'] == 0) {
|
if ($de_raw['code'] == 0) {
|
||||||
// Log::info("S加密成功 {$de_raw['s']}");
|
// Log::info("S加密成功 {$de_raw['s']}");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user