diff --git a/CHANGELOG.md b/CHANGELOG.md index a538440..511633c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,19 @@ # Release Notes # 本项目Log +## v0.0.1.191030 alpha (2019-10-30) + +### Added +- + +### Changed +- unify raffle api +- danmu +- captcha ocr api + +### Fixed +- + ## v0.0.1.190730 alpha (2019-07-30) ### Added diff --git a/conf/user.conf.example b/conf/user.conf.example index ea4c0e0..887dd46 100644 --- a/conf/user.conf.example +++ b/conf/user.conf.example @@ -64,11 +64,10 @@ USE_STORM=true STORM_DROPRATE=0 STORM_ATTEMPT=30,50 -# 活跃弹幕|弹幕房间(为空则随机)|弹幕内容(为空随机,但是URL不能为空) +# 活跃弹幕|弹幕房间(为空则随机)|弹幕内容(为空则随机) USE_DANMU=true DANMU_ROOMID=9522051 DANMU_CONTENT= -CONTENT_FETCH="https://v1.hitokoto.cn/?encode=text" # 视频投币|投币稿件数(每日任务最大5)|自定义稿件ID,空则随机(AV_NUM=1生效) USE_ADD_COIN=false diff --git a/src/BaseRaffle.php b/src/BaseRaffle.php index c085a9d..d58d94f 100644 --- a/src/BaseRaffle.php +++ b/src/BaseRaffle.php @@ -40,16 +40,23 @@ abstract class BaseRaffle */ protected static function startLottery(): bool { - $max_num = mt_rand(5, 10); - while ($max_num) { + $max_num = mt_rand(10, 20); + if (count(static::$wait_list) == 0) { + return false; + } + static::$wait_list = static::arrKeySort(static::$wait_list, 'wait'); + for ($i = 0; $i <= $max_num; $i++) { $raffle = array_shift(static::$wait_list); if (is_null($raffle)) { break; } + if ($raffle['wait'] > strtotime(date("Y-m-d H:i:s"))) { + array_push(static::$wait_list, $raffle); + continue; + } Live::goToRoom($raffle['room_id']); Statistics::addJoinList(static::ACTIVE_TITLE); static::lottery($raffle); - $max_num--; } return true; } @@ -70,6 +77,27 @@ abstract class BaseRaffle */ abstract protected static function lottery(array $data): bool; + /** + * @use 二维数组按key排序 + * @param $arr + * @param $key + * @param string $type + * @return array + */ + protected static function arrKeySort($arr, $key, $type = 'asc') + { + switch ($type) { + case 'desc': + array_multisort(array_column($arr, $key), SORT_DESC, $arr); + return $arr; + case 'asc': + array_multisort(array_column($arr, $key), SORT_ASC, $arr); + return $arr; + default: + return $arr; + } + } + /** * 重复检测 diff --git a/src/Curl.php b/src/Curl.php index ee864cd..a2bf17a 100644 --- a/src/Curl.php +++ b/src/Curl.php @@ -18,7 +18,7 @@ class Curl 'Accept-Language' => 'zh-cn', 'Connection' => 'keep-alive', 'Content-Type' => 'application/x-www-form-urlencoded', - 'User-Agent' => 'bili-universal/8230 CFNetwork/975.0.3 Darwin/18.2.0', + 'User-Agent' => 'bili-universal/8470 CFNetwork/978.0.7 Darwin/18.5.0', // 'Referer' => 'https://live.bilibili.com/', ); @@ -159,7 +159,55 @@ class Curl return self::post($url, null, $headers); } - protected static function http2https($url) + + /** + * @use 单次请求 + * @param $method + * @param $url + * @param array $payload + * @param array $headers + * @param int $timeout + * @return false|string + */ + public static function singleRequest($method, $url, $payload = [], $headers = [], $timeout = 10) + { + $url = self::http2https($url); + Log::debug($url); + $options = array( + 'http' => array( + 'method' => strtoupper($method), + 'header' => self::arr2str($headers), + 'content' => http_build_query($payload), + 'timeout' => $timeout, + ), + ); + $result = @file_get_contents($url, false, stream_context_create($options)); + Log::debug($result); + return $result ? $result : null; + } + + /** + * @use 关联数组转字符串 + * @param array $array + * @param string $separator + * @return string + */ + private static function arr2str(array $array, string $separator = "\r\n"): string + { + $tmp = ''; + foreach ($array as $key => $value) { + $tmp .= "{$key}:{$value}{$separator}"; + } + return $tmp; + } + + + /** + * @use http(s)转换 + * @param string $url + * @return string + */ + private static function http2https(string $url): string { switch (getenv('USE_HTTPS')) { case 'false': diff --git a/src/Danmu.php b/src/Danmu.php index cdb5a86..28729ab 100644 --- a/src/Danmu.php +++ b/src/Danmu.php @@ -38,58 +38,52 @@ class Danmu // 获取随机弹幕 private static function getMsgInfo() { - /* + /** * 整理一部分API,收集于网络,侵权麻烦联系我删除. * 如果设置项不能用可以选择,只保证代码发布时正常. - * 格式全部为TEXT,请自己测试好了再放进配置文件. - * -7. https://api.lwl12.com/hitokoto/v1?encode=realjso - * -6. https://api.ly522.com/yan.php?format=text - * -5. https://v1.hitokoto.cn/?encode=text - * -4. https://api.jysafe.cn/yy/ - * -3. https://m.mom1.cn/api/ - * -2. https://api.ooopn.com/yan/api.php?type=text - * -1. https://api.imjad.cn/hitokoto/ - * 0. https://www.ly522.com/hitokoto/ - * 1. https://www.tddiao.online/word/ - * 2. https://api.guoch.xyz/ - * 3. http://www.ooomg.cn/dutang - * 4. https://api.gushi.ci/rensheng.txt - * 5. https://api.itswincer.com/hitokoto/v2/ - * 6. http://api.imiliy.cn/get/ - * 7. http://api.dsecret.com/yiyan/ - * 8. https://api.xygeng.cn/dailywd/api/api.php + * 格式全部为TEXT,可以自己替换. */ + $punctuations = [',', ',', '。', '!', '.', ';', '——']; + $apis = [ + 'https://api.lwl12.com/hitokoto/v1?encode=realjso', + 'https://api.ly522.com/yan.php?format=text', + 'https://v1.hitokoto.cn/?encode=text', + 'https://api.jysafe.cn/yy/', + 'https://m.mom1.cn/api/yan/api.php', + 'https://api.ooopn.com/yan/api.php?type=text', + 'https://api.imjad.cn/hitokoto/', + 'https://www.ly522.com/hitokoto/', + 'https://www.tddiao.online/word/', + 'https://api.guoch.xyz/', + 'http://www.ooomg.cn/dutang/', + 'https://api.gushi.ci/rensheng.txt', + 'https://api.itswincer.com/hitokoto/v2/', + 'http://api.dsecret.com/yiyan/', + 'https://api.xygeng.cn/dailywd/api/api.php', + ]; + shuffle($apis); try { - $url = getenv('CONTENT_FETCH'); - if (empty($url)) { - exit('活跃弹幕配置错误,请检查相应配置'); - } - $data = Curl::get($url); - $punctuations = [',', ',', '。', '!', '.', ';', '——']; - foreach ($punctuations as $punctuation) { - if (strpos($data, $punctuation)) { - $data = explode($punctuation, $data)[0]; - break; + foreach ($apis as $url) { + $data = Curl::singleRequest('get', $url); + if (is_null($data)) continue; + foreach ($punctuations as $punctuation) { + if (strpos($data, $punctuation)) { + $data = explode($punctuation, $data)[0]; + break; + } } + return $data; } - return $data; - } catch (\Exception $e) { return $e; } } - //转换信息 - private static function convertInfo() - { - preg_match('/bili_jct=(.{32})/', getenv('COOKIE'), $token); - $token = isset($token[1]) ? $token[1] : ''; - return $token; - } //发送弹幕通用模块 private static function sendMsg($info) { + $user_info = User::parseCookies(); $raw = Curl::get('https://api.live.bilibili.com/room/v1/Room/room_init?id=' . $info['roomid']); $de_raw = json_decode($raw, true); @@ -100,8 +94,8 @@ class Danmu 'msg' => $info['content'], 'rnd' => 0, 'roomid' => $de_raw['data']['room_id'], - 'csrf' => self::convertInfo(), - 'csrf_token' => self::convertInfo(), + 'csrf' => $user_info['token'], + 'csrf_token' => $user_info['token'], ]; return Curl::post('https://api.live.bilibili.com/msg/send', Sign::api($payload)); diff --git a/src/Login.php b/src/Login.php index a21266c..7db8322 100644 --- a/src/Login.php +++ b/src/Login.php @@ -180,7 +180,7 @@ class Login $headers = [ 'Content-Type' => 'application/json', ]; - $data = Curl::other('http://captcha.biem.club:19951/', json_encode($payload), $headers); + $data = Curl::other('http://47.102.120.84:19951/', json_encode($payload), $headers); $de_raw = json_decode($data, true); Log::info("验证码识别结果 {$de_raw['message']}"); diff --git a/src/MasterSite.php b/src/MasterSite.php index ba89a3a..32bda7e 100644 --- a/src/MasterSite.php +++ b/src/MasterSite.php @@ -126,16 +126,16 @@ class MasterSite // 获取随机AID private static function getRandomAid(): string { - $page = random_int(1, 100000); - $payload = []; - $url = "https://api.bilibili.com/x/web-interface/newlist?&pn={$page}&ps=1"; - $raw = Curl::get($url, Sign::api($payload)); - $de_raw = json_decode($raw, true); + do { + $page = mt_rand(1, 1000); + $payload = []; + $url = "https://api.bilibili.com/x/web-interface/newlist?&pn={$page}&ps=1"; + $raw = Curl::get($url, Sign::api($payload)); + $de_raw = json_decode($raw, true); + // echo "getRandomAid " . count($de_raw['data']['archives']) . PHP_EOL; + // $aid = array_rand($de_raw['data']['archives'])['aid']; + } while (count($de_raw['data']['archives']) == 0); $aid = $de_raw['data']['archives'][0]['aid']; - - if (is_null($aid) || empty($aid) || $aid == '') { - $aid = random_int(10000000, 30000000); - } return (string)$aid; } diff --git a/src/PkRaffle.php b/src/PkRaffle.php index a04c49d..25a5d20 100644 --- a/src/PkRaffle.php +++ b/src/PkRaffle.php @@ -46,7 +46,8 @@ class PkRaffle extends BaseRaffle $data = [ 'raffle_id' => $de_raw['data'][$i]['pk_id'], 'title' => $de_raw['data'][$i]['title'], - 'room_id' => $de_raw['data'][$i]['room_id'] + 'room_id' => $de_raw['data'][$i]['room_id'], + 'wait' => strtotime(date("Y-m-d H:i:s")) ]; if (static::toRepeatLid($data['raffle_id'])) { continue; diff --git a/src/UnifyRaffle.php b/src/UnifyRaffle.php index bc4e404..9976dcc 100644 --- a/src/UnifyRaffle.php +++ b/src/UnifyRaffle.php @@ -52,7 +52,8 @@ class UnifyRaffle extends BaseRaffle 'raffle_id' => $de_raw['data']['list'][$i]['raffleId'], 'title' => $de_raw['data']['list'][$i]['title'], 'type' => $de_raw['data']['list'][$i]['type'], - 'room_id' => $rid + 'wait' => $de_raw['data']['list'][$i]['time_wait'] + strtotime(date("Y-m-d H:i:s")), + 'room_id' => $rid, ]; if (static::toRepeatLid($data['raffle_id'])) { continue; @@ -97,8 +98,8 @@ class UnifyRaffle extends BaseRaffle $de_raw = json_decode($raw, true); // 判断 switch ($de_raw['data']['status']) { - case 3: - break; + // case 3: + // break; case 2: Statistics::addSuccessList(static::ACTIVE_TITLE); // 提示信息 @@ -121,7 +122,6 @@ class UnifyRaffle extends BaseRaffle return; } - /** * @use 请求抽奖 * @param array $data @@ -138,8 +138,10 @@ class UnifyRaffle extends BaseRaffle 'csrf' => $user_info['token'], 'visit_id' => null, ]; - - $url = 'https://api.live.bilibili.com/xlive/lottery-interface/v3/smalltv/Join'; + // V3接口 暂做保留处理 + // $url = 'https://api.live.bilibili.com/gift/v3/smalltv/join'; + // $url = 'https://api.live.bilibili.com/xlive/lottery-interface/v5/smalltv/Join'; + $url = 'https://api.live.bilibili.com/gift/v4/smalltv/getAward'; $raw = Curl::post($url, Sign::api($payload)); $de_raw = json_decode($raw, true); if (isset($de_raw['code']) && $de_raw['code']) { diff --git a/src/User.php b/src/User.php index 2208f93..8c65a09 100644 --- a/src/User.php +++ b/src/User.php @@ -18,7 +18,7 @@ class User } // 实名检测 - public static function realnameCheck(): bool + public static function realNameCheck(): bool { $payload = []; $raw = Curl::get('https://account.bilibili.com/identify/index', Sign::api($payload));