diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fc3453..638a9f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,25 @@ # Release Notes # 本项目Log +## v0.2.0.200224 alpha (2020-02-24) + +### Added +- 新增工具类 +- 引入新库(需要重新Composer) +- + +### Changed +- 优化数据过滤条件 +- 更新PC端心跳API +- 优化实物抽奖 +- 优化运行条件 +- + +### Fixed +- 修复内存异常 +- 修复重复投币 +- + ## v0.2.0.200214 alpha (2020-02-14) ### Added diff --git a/DOC.md b/DOC.md index 95b455d..2be5c71 100644 --- a/DOC.md +++ b/DOC.md @@ -2,7 +2,7 @@

- +

@@ -15,29 +15,29 @@ B 站直播实用脚本 |plugin |version |description | |--------------------|--------------------|--------------------| -|Login |20.02.14 |账号登录 | -|Sleep |20.02.14 |休眠控制 | -|MasterSite |20.02.14 |主站助手 | -|Daily |20.02.14 |每日礼包 | -|Heart |20.02.14 |双端心跳 | -|Task |20.02.14 |每日任务 | -|Silver |20.02.14 |银瓜子宝箱 | -|Barrage |20.02.14 |活跃弹幕 | -|Silver2Coin |20.02.14 |银瓜子换硬币 | -|GiftSend |20.02.14 |礼物赠送 | -|GroupSignIn |20.02.14 |友爱社签到 | -|ManGa |20.02.14 |漫画签到分享 | -|GiftHeart |20.02.14 |心跳礼物 | -|MaterialObject |20.02.14 |实物抽奖 | -|AloneTcpClient |20.02.14 |独立监控 | -|ZoneTcpClient |20.02.14 |分区监控 | -|StormRaffle |20.02.14 |节奏风暴 | -|GiftRaffle |20.02.14 |活动礼物 | -|PkRaffle |20.02.14 |大乱斗 | -|GuardRaffle |20.02.14 |舰长总督 | -|AnchorRaffle |20.02.14 |天选时刻 | -|AwardRecord |20.02.14 |获奖通知 | -|Statistics |20.02.14 |数据统计 | +|Login |20.02.24 |账号登录 | +|Sleep |20.02.24 |休眠控制 | +|MasterSite |20.02.24 |主站助手 | +|Daily |20.02.24 |每日礼包 | +|Heart |20.02.24 |双端心跳 | +|Task |20.02.24 |每日任务 | +|Silver |20.02.24 |银瓜子宝箱 | +|Barrage |20.02.24 |活跃弹幕 | +|Silver2Coin |20.02.24 |银瓜子换硬币 | +|GiftSend |20.02.24 |礼物赠送 | +|GroupSignIn |20.02.24 |友爱社签到 | +|ManGa |20.02.24 |漫画签到分享 | +|GiftHeart |20.02.24 |心跳礼物 | +|MaterialObject |20.02.24 |实物抽奖 | +|AloneTcpClient |20.02.24 |独立监控 | +|ZoneTcpClient |20.02.24 |分区监控 | +|StormRaffle |20.02.24 |节奏风暴 | +|GiftRaffle |20.02.24 |活动礼物 | +|PkRaffle |20.02.24 |大乱斗 | +|GuardRaffle |20.02.24 |舰长总督 | +|AnchorRaffle |20.02.24 |天选时刻 | +|AwardRecord |20.02.24 |获奖通知 | +|Statistics |20.02.24 |数据统计 | ## 打赏赞助 diff --git a/README.md b/README.md index 2b21a50..0c3a88b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Group: [55308141](https://jq.qq.com/?_wv=1027&k=5AIDaJg) ## 公告 -Currently for Personal Edition **0.2.0.200214 alpha** +Currently for Personal Edition **0.2.0.200224 alpha** ## 文档 diff --git a/composer.json b/composer.json index 81cf215..322c238 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "clue/socket-raw": "^1.4.1", "vlucas/phpdotenv": "^4.1", "amphp/amp": "^2.4", - "lkeme/curl-future": "^0.0.1" + "ares333/php-curl": "^4.6" }, "license": "MIT", "authors": [ @@ -29,7 +29,8 @@ "psr-4": { "BiliHelper\\Core\\": "src/core", "BiliHelper\\Plugin\\": "src/plugin", - "BiliHelper\\Util\\": "src/util" + "BiliHelper\\Util\\": "src/util", + "BiliHelper\\Tool\\": "src/tool" } } } diff --git a/composer.lock b/composer.lock index 3aa0494..9415252 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "94b2a09fe75ecf7401a6694e164b252c", + "content-hash": "687175b9d9d6f818c02bd5174b036b19", "packages": [ { "name": "amphp/amp", - "version": "v2.4.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "13930a582947831bb66ff1aeac28672fd91c38ea" + "reference": "2ac3b550c4997f2ec304faa63c8b2885079a2dc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/13930a582947831bb66ff1aeac28672fd91c38ea", - "reference": "13930a582947831bb66ff1aeac28672fd91c38ea", + "url": "https://api.github.com/repos/amphp/amp/zipball/2ac3b550c4997f2ec304faa63c8b2885079a2dc4", + "reference": "2ac3b550c4997f2ec304faa63c8b2885079a2dc4", "shasum": "", "mirrors": [ { @@ -87,7 +87,56 @@ "non-blocking", "promise" ], - "time": "2019-11-11T19:32:05+00:00" + "time": "2020-02-10T18:10:57+00:00" + }, + { + "name": "ares333/php-curl", + "version": "v4.6.1", + "source": { + "type": "git", + "url": "https://github.com/ares333/php-curl.git", + "reference": "580025300c3cbf7cafe825bd454018ffc62233cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ares333/php-curl/zipball/580025300c3cbf7cafe825bd454018ffc62233cf", + "reference": "580025300c3cbf7cafe825bd454018ffc62233cf", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "ext-curl": "*", + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ares333\\Curl\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Ares", + "homepage": "http://phpdr.net" + } + ], + "description": "The best php curl library.", + "keywords": [ + "PHP cURL", + "aysnc http", + "curl", + "curlmulti" + ], + "time": "2018-12-13T03:47:27+00:00" }, { "name": "bramus/ansi-php", @@ -244,45 +293,6 @@ ], "time": "2019-10-28T12:32:07+00:00" }, - { - "name": "lkeme/curl-future", - "version": "v0.0.1", - "source": { - "type": "git", - "url": "https://github.com/lkeme/CurlFuture.git", - "reference": "ea91acf250d2519cbd187d91fa6d01e9cfa9c6c5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lkeme/CurlFuture/zipball/ea91acf250d2519cbd187d91fa6d01e9cfa9c6c5", - "reference": "ea91acf250d2519cbd187d91fa6d01e9cfa9c6c5", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] - }, - "type": "library", - "autoload": { - "psr-4": { - "CurlFuture\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "leo", - "email": "263068280@qq.com" - } - ], - "description": "Parallel CURL Requests with PHP --Fork", - "time": "2020-01-04T14:29:53+00:00" - }, { "name": "monolog/monolog", "version": "1.25.3", @@ -483,16 +493,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.13.1", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", - "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", + "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", "shasum": "", "mirrors": [ { @@ -510,7 +520,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -543,7 +553,7 @@ "polyfill", "portable" ], - "time": "2019-11-27T13:56:44+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "vlucas/phpdotenv", diff --git a/src/core/App.php b/src/core/App.php index 6a5200a..2099109 100644 --- a/src/core/App.php +++ b/src/core/App.php @@ -24,6 +24,9 @@ class App set_time_limit(0); header("Content-Type:text/html; charset=utf-8"); date_default_timezone_set('Asia/Shanghai'); + if (PHP_SAPI != 'cli') { + die("Please run this script from command line"); + } } /** diff --git a/src/core/Curl.php b/src/core/Curl.php index b2d4249..6c49ecf 100644 --- a/src/core/Curl.php +++ b/src/core/Curl.php @@ -10,8 +10,6 @@ namespace BiliHelper\Core; -use CurlFuture\HttpFuture; - class Curl { public static $headers = array( @@ -21,9 +19,40 @@ class Curl 'Connection' => 'keep-alive', 'Content-Type' => 'application/x-www-form-urlencoded', 'User-Agent' => 'bili-universal/8470 CFNetwork/978.0.7 Darwin/18.5.0', - // 'Referer' => 'https://live.bilibili.com/', +// 'Referer' => 'https://live.bilibili.com/', ); + private static $results = []; + private static $result = []; + + /** + * @use 数组 + * @return array + */ + private static function getResults() + { + $results = self::$results; + self::$results = []; + return $results; + } + + + /** + * @use 字符串or其他 + * @return array + */ + private static function getResult() + { + $result = self::$result; + self::$result = []; + return array_shift($result); + } + + /** + * @use 获取Headers + * @param $headers + * @return array + */ private static function getHeaders($headers) { return array_map(function ($k, $v) { @@ -31,53 +60,110 @@ class Curl }, array_keys($headers), $headers); } - public static function asyncPost($url, $tasks = null, $headers = null, $timeout = 30) + + /** + * @use 初始化Curl + * @param int $tasks_num + * @param bool $bar + * @return \Ares333\Curl\Curl + */ + private static function getMultiClient(int $tasks_num = 1, bool $bar = false) { - $new_tasks = []; - $results = []; - $url = self::http2https($url); - $curl_options = [ + $toolkit = new \Ares333\Curl\Toolkit(); + $toolkit->setCurl(); + $curl = $toolkit->getCurl(); + $curl->maxThread = $tasks_num < 10 ? $tasks_num : 10; + if (!$bar) { + $curl->onInfo = null; + } + return $curl; + } + + + /** + * @use 填充CURL_OPT + * @param $url + * @param $payload + * @param $headers + * @param $timeout + * @return array + */ + private static function fillCurlOpts($url, $payload, $headers, $timeout): array + { + $default_opts = [ + CURLOPT_URL => self::http2https($url), CURLOPT_HEADER => 0, CURLOPT_ENCODING => 'gzip', CURLOPT_IPRESOLVE => 1, - CURLOPT_RETURNTRANSFER => 1, - CURLOPT_SSL_VERIFYPEER => 0, + CURLINFO_HEADER_OUT => true, CURLOPT_TIMEOUT => $timeout, - CURLOPT_CONNECTTIMEOUT => $timeout, + CURLOPT_USERAGENT => self::$headers['User-Agent'], + CURLOPT_HTTPHEADER => is_null($headers) ? self::getHeaders(self::$headers) : self::getHeaders($headers), + CURLOPT_COOKIE => getenv('COOKIE') != "" ? getenv('COOKIE') : "", + // CURLOPT_CONNECTTIMEOUT => 10, + // CURLOPT_AUTOREFERER => true, + // CURLOPT_RETURNTRANSFER => true, + // CURLOPT_FOLLOWLOCATION => true, + // CURLOPT_SSL_VERIFYHOST => false, + // CURLOPT_SSL_VERIFYPEER => false, + // CURLOPT_MAXREDIRS => 5 ]; - if (($cookie = getenv('COOKIE')) != "") { - $curl_options[CURLOPT_COOKIE] = $cookie; + if ($payload) { + $default_opts[CURLOPT_POST] = 1; + $payload = is_bool($payload) ? [] : (is_array($payload) ? http_build_query($payload) : $payload); + $default_opts[CURLOPT_POSTFIELDS] = $payload; } if (getenv('USE_PROXY') == 'true') { - $curl_options[CURLOPT_PROXY] = getenv('PROXY_IP'); - $curl_options[CURLOPT_PROXYPORT] = getenv('PROXY_PORT'); + $default_opts[CURLOPT_PROXY] = getenv('PROXY_IP'); + $default_opts[CURLOPT_PROXYPORT] = getenv('PROXY_PORT'); } - foreach ($tasks as $task) { - $payload = $task['payload']; - $header = is_null($headers) ? self::getHeaders(self::$headers) : self::getHeaders($headers); - $options = [ - 'header' => $header, - 'post_data' => is_array($payload) ? http_build_query($payload) : $payload - ]; - $new_task = new HttpFuture($url, $options, $curl_options); - array_push($new_tasks, [ - 'task' => $new_task, - 'source' => $task['source'] - ]); - } - foreach ($new_tasks as $new_task) { - Log::debug($url); - $result = $new_task['task']->fetch(); - // var_dump($result); - array_push($results, [ - 'content' => $result, - 'source' => $new_task['source'] - ]); - Log::debug($result); - } - return $results; + return $default_opts; } + /** + * @use async + * @param $url + * @param array $tasks + * @param null $headers + * @param int $timeout + * @return array + */ + public static function asyncPost($url, $tasks = [], $headers = null, $timeout = 30) + { + $curl = self::getMultiClient(count($tasks)); + $curl_options = self::fillCurlOpts($url, true, $headers, $timeout); + $curl->onTask = function ($curl) use ($curl_options, &$tasks) { + $task = array_shift($tasks); + if (is_null($task)) { + return; + } + $payload = $task['payload']; + $curl_options[CURLOPT_POSTFIELDS] = is_array($payload) ? http_build_query($payload) : $payload; + $curl->add([ + 'opt' => $curl_options, + 'args' => $task['source'], + ], function ($response, $args) { + Log::debug($response['info']['url']); + array_push(self::$results, [ + 'content' => $response['body'], + 'source' => $args + ]); + Log::debug($response['body']); + }); + }; + $curl->start(); + return self::getResults(); + } + + /** + * @use post + * @param $url + * @param $payload + * @param null $headers + * @param int $timeout + * @return bool|string + * @throws \Exception + */ public static function post($url, $payload = null, $headers = null, $timeout = 30) { $url = self::http2https($url); @@ -124,7 +210,7 @@ class Curl } if ($raw === false || strpos($raw, 'timeout') !== false) { - Log::warning('重试,获取的资源无效!'); + Log::warning('获取的资源无效!'); $ret_count--; continue; } @@ -134,7 +220,7 @@ class Curl return $raw; } catch (\Exception $e) { - Log::warning("重试,Curl请求出错,{$e->getMessage()}!"); + Log::warning("Curl请求出错, {$e->getMessage()}!"); $ret_count--; continue; } @@ -142,7 +228,16 @@ class Curl exit('重试次数过多,请检查代码,退出!'); } - public static function other($url, $payload = null, $headers = null, $cookie = null, $timeout = 30) + /** + * @use request + * @param $url + * @param null $payload + * @param null $headers + * @param null $cookie + * @param int $timeout + * @return bool|string + */ + public static function request($url, $payload = null, $headers = null, $cookie = null, $timeout = 30) { Log::debug($url); $header = is_null($headers) ? self::getHeaders(self::$headers) : self::getHeaders($headers); @@ -181,7 +276,7 @@ class Curl } if ($raw === false || strpos($raw, 'timeout') !== false) { - Log::warning('重试,获取的资源无效!'); + Log::warning('获取的资源无效!'); $ret_count--; continue; } @@ -191,7 +286,7 @@ class Curl return $raw; } catch (\Exception $e) { - Log::warning("重试,Curl请求出错,{$e->getMessage()}!"); + Log::warning("Curl请求出错, {$e->getMessage()}!"); $ret_count--; continue; } @@ -200,6 +295,14 @@ class Curl } + /** + * @use get + * @param $url + * @param null $payload + * @param null $headers + * @return bool|string + * @throws \Exception + */ public static function get($url, $payload = null, $headers = null) { if (!is_null($payload)) { diff --git a/src/plugin/BaseRaffle.php b/src/plugin/BaseRaffle.php index 069ddbf..05a7e4d 100644 --- a/src/plugin/BaseRaffle.php +++ b/src/plugin/BaseRaffle.php @@ -22,7 +22,7 @@ abstract class BaseRaffle protected static $wait_list; protected static $finish_list; protected static $all_list; - protected static $room_stats = ['room_id' => 0, 'status' => false]; + protected static $banned_rids = []; public static function run() { @@ -174,21 +174,24 @@ abstract class BaseRaffle if (getenv(static::ACTIVE_SWITCH) == 'false') { return false; } + $current_rid = (int)$data['rid']; // 去重 - if (static::toRepeatLid($data['lid'], false)) { + if (static::toRepeatLid($current_rid, false)) { return false; } - // 钓鱼&&防止重复请求 - if ($data['rid'] != static::$room_stats['room_id']) { - static::$room_stats = ['room_id' => $data['rid'], 'status' => Live::fishingDetection($data['rid'])]; + // 拒绝钓鱼 防止重复请求 + if (in_array($current_rid, static::$banned_rids)) { + return false; } - if (static::$room_stats['status']) { + $banned_status = Live::fishingDetection($current_rid); + if ($banned_status) { + array_push(static::$banned_rids, $current_rid); return false; } // 实际检测 - $raffles_info = static::check($data['rid']); + $raffles_info = static::check($current_rid); if (!empty($raffles_info)) { - static::parseLotteryInfo($data['rid'], $raffles_info); + static::parseLotteryInfo($current_rid, $raffles_info); } $wait_num = count(static::$wait_list); if ($wait_num > 10 && ($wait_num % 2)) { @@ -196,7 +199,4 @@ abstract class BaseRaffle } return true; } - } - - diff --git a/src/plugin/DataTreating.php b/src/plugin/DataTreating.php index 2aa6379..cb40bc4 100644 --- a/src/plugin/DataTreating.php +++ b/src/plugin/DataTreating.php @@ -10,10 +10,6 @@ namespace BiliHelper\Plugin; -use BiliHelper\Core\Log; -use BiliHelper\Core\Curl; -use BiliHelper\Util\TimeLock; - class DataTreating { // TODO 独立分发 Push||Pull数据 diff --git a/src/plugin/Heart.php b/src/plugin/Heart.php index 10da955..ff56d43 100644 --- a/src/plugin/Heart.php +++ b/src/plugin/Heart.php @@ -38,11 +38,11 @@ class Heart $payload = [ 'room_id' => getenv('ROOM_ID'), ]; - $data = Curl::post('https://api.live.bilibili.com/User/userOnlineHeart', Sign::api($payload)); + $data = Curl::post('https://api.live.bilibili.com/relation/v1/Feed/heartBeat', Sign::api($payload)); $data = json_decode($data, true); if (isset($data['code']) && $data['code']) { - Log::warning('WEB端 直播间心跳停止惹~', ['msg' => $data['message']]); + Log::warning('WEB端 发送心跳异常!', ['msg' => $data['message']]); } else { Log::info('WEB端 发送心跳正常!'); } @@ -60,7 +60,7 @@ class Heart $data = json_decode($data, true); if (isset($data['code']) && $data['code']) { - Log::warning('APP端 直播间心跳停止惹~', ['msg' => $data['message']]); + Log::warning('APP端 发送心跳异常!', ['msg' => $data['message']]); } else { Log::info('APP端 发送心跳正常!'); } diff --git a/src/plugin/Live.php b/src/plugin/Live.php index bdf1e98..ab0af47 100644 --- a/src/plugin/Live.php +++ b/src/plugin/Live.php @@ -18,16 +18,10 @@ class Live { use TimeLock; - - public static function run() - { - return; - } - - /** * @use 获取分区列表 * @return array + * @throws \Exception */ public static function fetchLiveAreas(): array { @@ -47,10 +41,12 @@ class Live return $areas; } + /** * @use AREA_ID转ROOM_ID * @param $area_id * @return array + * @throws \Exception */ public static function areaToRid($area_id): array { @@ -94,6 +90,7 @@ class Live * @use 获取直播房间号 * @param $room_id * @return bool + * @throws \Exception */ public static function getRealRoomID($room_id) { @@ -131,23 +128,11 @@ class Live } - /** - * @use 随机延迟 - * @param int $min - * @param int $max - * @return bool - */ - public static function randDelay($min = 0, $max = 3): bool - { - $rand = $min + random_int() / mt_getrandmax() * ($max - $min); - sleep($rand); - return true; - } - /** * @use 访问直播间 * @param $room_id * @return bool + * @throws \Exception */ public static function goToRoom($room_id): bool { diff --git a/src/plugin/Login.php b/src/plugin/Login.php index 1172dbc..8cee26e 100644 --- a/src/plugin/Login.php +++ b/src/plugin/Login.php @@ -196,7 +196,7 @@ class Login 'Host' => 'passport.bilibili.com', 'Cookie' => 'sid=blhelper' ]; - $data = Curl::other('https://passport.bilibili.com/captcha', null, $headers); + $data = Curl::request('https://passport.bilibili.com/captcha', null, $headers); $data = base64_encode($data); $captcha = self::ocrCaptcha($data); return [ @@ -219,7 +219,7 @@ class Login $headers = [ 'Content-Type' => 'application/json', ]; - $data = Curl::other('http://47.102.120.84:19951/', json_encode($payload), $headers); + $data = Curl::request('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/plugin/MasterSite.php b/src/plugin/MasterSite.php index 61896d6..9222cc1 100644 --- a/src/plugin/MasterSite.php +++ b/src/plugin/MasterSite.php @@ -24,10 +24,10 @@ class MasterSite return; } if (self::watchAid() && self::shareAid() && self::coinAdd()) { - self::setLock( 24 * 60 * 60); + self::setLock(24 * 60 * 60); return; } - self::setLock( 3600); + self::setLock(3600); } @@ -122,12 +122,12 @@ class MasterSite $aid = !empty(getenv('ADD_COIN_AV')) ? getenv('ADD_COIN_AV') : self::getRandomAid(); self::reward($aid); } else { - $coins = $av_num - self::coinLog(); - if ($coins <= 0) { + $need_coins = $av_num - self::coinLog(); + if ($need_coins <= 0) { Log::info('今日投币上限已满!'); break; } - $aids = self::getDayRankingAids($av_num); + $aids = self::getDayRankingAids($need_coins); foreach ($aids as $aid) { self::reward($aid); } @@ -145,6 +145,7 @@ class MasterSite /** * @use 获取随机AID * @return string + * @throws \Exception */ private static function getRandomAid(): string { @@ -198,6 +199,7 @@ class MasterSite /** * @use 分享视频 * @return bool + * @throws \Exception */ private static function shareAid(): bool { @@ -231,6 +233,7 @@ class MasterSite /** * @use 观看视频 * @return bool + * @throws \Exception */ private static function watchAid(): bool { @@ -299,6 +302,7 @@ class MasterSite /** * @use 解析AID到CID * @return array + * @throws \Exception */ private static function parseAid(): array { @@ -316,14 +320,12 @@ class MasterSite } $cid = $de_raw['data']['cid']; $duration = $de_raw['data']['duration']; - break; + return [ + 'aid' => $aid, + 'cid' => $cid, + 'duration' => $duration + ]; } - - return [ - 'aid' => $aid, - 'cid' => $cid, - 'duration' => $duration - ]; } } \ No newline at end of file diff --git a/src/plugin/MaterialObject.php b/src/plugin/MaterialObject.php index 9918bce..9326d21 100644 --- a/src/plugin/MaterialObject.php +++ b/src/plugin/MaterialObject.php @@ -121,6 +121,7 @@ class MaterialObject // 过滤敏感词 $title = $response['data']['title']; if (self::filterTitleWords($title)) { + array_push(self::$invalid_aids, $probe_aid); continue; } // 过滤抽奖轮次 diff --git a/src/tool/DumpMemory.php b/src/tool/DumpMemory.php new file mode 100644 index 0000000..f806e92 --- /dev/null +++ b/src/tool/DumpMemory.php @@ -0,0 +1,17 @@ +