mirror of
https://github.com/lkeme/BiliHelper-personal.git
synced 2025-12-18 17:00:06 +08:00
[update] captcha
This commit is contained in:
parent
ded6a26774
commit
523ed7979f
1
.gitignore
vendored
1
.gitignore
vendored
@ -34,3 +34,4 @@ index1.php
|
||||
!/profile/example
|
||||
|
||||
.phpunit.*
|
||||
captcha/data.json
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
|
||||
<p align="center">
|
||||
|
||||
<img src="https://img.shields.io/badge/Version-2.0.7.230311-orange.svg?longCache=true&style=for-the-badge">
|
||||
<img src="https://img.shields.io/badge/Version-2.0.7.230324-orange.svg?longCache=true&style=for-the-badge">
|
||||
<img src="https://img.shields.io/badge/PHP-8.1+-green.svg?longCache=true&style=for-the-badge">
|
||||
<img src="https://img.shields.io/badge/Composer-latest-blueviolet.svg?longCache=true&style=for-the-badge">
|
||||
<img src="https://img.shields.io/badge/License-mit-blue.svg?longCache=true&style=for-the-badge">
|
||||
@ -66,6 +66,7 @@
|
||||
有疑问一定要先看看文档或Issue里是否存在相同的问题,再考虑其他渠道咨询。
|
||||
|
||||
* [使用文档 / DOC.md](./docs/DOC.md)
|
||||
* [验证码文档 / CAPTCHA.md](./docs/CAPTCHA.md)
|
||||
* [推送文档 / NOTIFY.md](./docs/NOTIFY.md)
|
||||
* [更新日志 / CHANGELOG.md](./docs/CHANGELOG.md)
|
||||
* [配置文档 / WIKI.md](https://github.com/lkeme/BiliHelper-personal/wiki/%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3)
|
||||
|
||||
2
app.php
2
app.php
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
147
captcha/index.php
Normal file
147
captcha/index.php
Normal file
@ -0,0 +1,147 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Website: https://mudew.com/
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2023 ~ 2024
|
||||
* Source: Colter23/geetest-validator
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
* | |_| | | | | | | | | |_| | | |__ | | | |_| | | |__ | |_| | (゚、 。 7
|
||||
* | _ { | | | | | | | _ | | __| | | | ___/ | __| | _ / \、゙ ~ヽ *
|
||||
* | |_| | | | | |___ | | | | | | | |___ | |___ | | | |___ | | \ \ じしf_, )ノ
|
||||
* |_____/ |_| |_____| |_| |_| |_| |_____| |_____| |_| |_____| |_| \_\
|
||||
*/
|
||||
|
||||
class JsonFileManager
|
||||
{
|
||||
private string $filename;
|
||||
|
||||
public function __construct($filename)
|
||||
{
|
||||
$this->filename = $filename;
|
||||
}
|
||||
|
||||
public function read(): array
|
||||
{
|
||||
$json = file_get_contents($this->filename);
|
||||
if (empty($json)) {
|
||||
return [];
|
||||
}
|
||||
return json_decode($json, true);
|
||||
}
|
||||
|
||||
public function write(array $data): void
|
||||
{
|
||||
$json = json_encode($data, JSON_PRETTY_PRINT);
|
||||
file_put_contents($this->filename, $json);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class HttpServer
|
||||
{
|
||||
private JsonFileManager $json;
|
||||
protected string $filename = 'data.json';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->createFile();
|
||||
$this->json = new JsonFileManager($this->filename);
|
||||
}
|
||||
|
||||
public function start(): void
|
||||
{
|
||||
// 获取请求路径
|
||||
$requestUri = $_SERVER['REQUEST_URI'];
|
||||
$path = parse_url($requestUri, PHP_URL_PATH);
|
||||
// $queryString = parse_url($requestUri, PHP_URL_QUERY);
|
||||
|
||||
// 否则处理其他API请求
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
|
||||
$this->handleRequest($path, $method);
|
||||
}
|
||||
|
||||
protected function createFile(): bool
|
||||
{
|
||||
if (file_exists($this->filename)) {
|
||||
return false;
|
||||
}
|
||||
// 判断文件类型是否为目录, 如果不存在则创建
|
||||
if (!file_exists(dirname($this->filename))) {
|
||||
mkdir(dirname($this->filename), 0777, true);
|
||||
}
|
||||
if (touch($this->filename)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $path
|
||||
* @param $method
|
||||
* @return void
|
||||
*/
|
||||
protected function handleRequest($path, $method): void
|
||||
{
|
||||
// 如果是 /geetest 路径,返回静态页面
|
||||
if ($path == '/geetest' && $method === 'GET') {
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
include('static/index.html');
|
||||
exit();
|
||||
}
|
||||
|
||||
// 如果是 /geetest 路径,POST请求,处理验证
|
||||
if ($path === '/feedback' && $method === 'POST') {
|
||||
// 获取参数,从json里的读取
|
||||
$data = $this->json->read();
|
||||
$challenge = $_POST['challenge'];
|
||||
$validate = $_POST['validate'];
|
||||
$seccode = $_POST['seccode'];
|
||||
$data[$challenge] = [
|
||||
'challenge' => $challenge,
|
||||
'validate' => $validate,
|
||||
'seccode' => $seccode,
|
||||
];
|
||||
$this->json->write($data);
|
||||
$this->toResponse(10003);
|
||||
return;
|
||||
}
|
||||
if ($path === '/fetch' && $method === 'GET') {
|
||||
// 获取参数,从json里的读取
|
||||
$challenge = $_GET['challenge'];
|
||||
$data = $this->json->read();
|
||||
if (empty($data[$challenge])) {
|
||||
$this->toResponse(10001, '暂未获取到验证结果');
|
||||
} else {
|
||||
$this->toResponse(10000, '成功获取到验证结果', $data[$challenge]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
// other
|
||||
http_response_code(404);
|
||||
$this->toResponse(404, 'Not Found');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $code
|
||||
* @param string $message
|
||||
* @param array $data
|
||||
* @return void
|
||||
*/
|
||||
protected function toResponse(int $code = 200, string $message = 'success', array $data = []): void
|
||||
{
|
||||
header('Content-Type: application/json');
|
||||
// http_response_code($code);
|
||||
echo json_encode(['code' => $code, 'message' => $message, 'data' => $data]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
(new HttpServer)->start();
|
||||
|
||||
191
captcha/static/css/style.css
Normal file
191
captcha/static/css/style.css
Normal file
@ -0,0 +1,191 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
background: #f1f2f4;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.box {
|
||||
margin: 100px auto;
|
||||
padding: 20px 30px 25px 30px;
|
||||
max-width: 400px;
|
||||
border-radius: 15px;
|
||||
background: #fff;
|
||||
border: 2px solid #90b5e2;
|
||||
}
|
||||
|
||||
.title {
|
||||
text-align: center;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.result-title {
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
margin-top: 25px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.toast-box {
|
||||
position: fixed;
|
||||
transform: translate(-50%, -50%);
|
||||
left: 50%;
|
||||
top: -30px;
|
||||
border-radius: 4px;
|
||||
font-size: 15px;
|
||||
line-height: 18px;
|
||||
padding: 12px 30px;
|
||||
background: rgba(0, 0, 0, .8);
|
||||
color: #fff;
|
||||
opacity: 0;
|
||||
text-align: center;
|
||||
min-width: 150px;
|
||||
max-width: 300px;
|
||||
white-space: nowrap;
|
||||
transition: all 0.5s ease;
|
||||
}
|
||||
|
||||
|
||||
.form {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 7px 12px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
line-height: 20px;
|
||||
color: inherit;
|
||||
background-clip: padding-box;
|
||||
border: 1px solid #e6e7e9;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
border-radius: 4px;
|
||||
transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
color: inherit;
|
||||
border-color: #90b5e2;
|
||||
outline: 0;
|
||||
box-shadow: 0 0 0 4px rgb(32 107 196 / 25%);
|
||||
}
|
||||
.form-control:disabled {
|
||||
background-color: #f1f5f9;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#captcha {
|
||||
width: 336px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
|
||||
width: 336px;
|
||||
height: 42px;
|
||||
color: #f8fafc;
|
||||
background-color: #3873ff;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 0 rgba(29, 39, 59, 0.04), inset 0 -1px 0 rgba(29, 39, 59, 0.2);
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
color: #f8fafc;
|
||||
text-decoration: none;
|
||||
background-color: #437cff;
|
||||
border-color: transparent;
|
||||
}
|
||||
#success {
|
||||
background-color: #2fb344;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
#wait {
|
||||
height: 42px;
|
||||
width: 336px;
|
||||
text-align: center;
|
||||
border-radius: 4px;
|
||||
background-color: #F3F3F3;
|
||||
}
|
||||
|
||||
.hide {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.loading {
|
||||
margin: auto;
|
||||
width: 70px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.loading-dot {
|
||||
float: left;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
margin: 18px 4px;
|
||||
background: #ccc;
|
||||
border-radius: 50%;
|
||||
opacity: 0;
|
||||
box-shadow: 0 0 2px black;
|
||||
animation: loadingFade 1s infinite;
|
||||
}
|
||||
|
||||
.loading-dot:nth-child(1) {
|
||||
animation-delay: 0s;
|
||||
}
|
||||
|
||||
.loading-dot:nth-child(2) {
|
||||
animation-delay: 0.1s;
|
||||
}
|
||||
|
||||
.loading-dot:nth-child(3) {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
|
||||
.loading-dot:nth-child(4) {
|
||||
animation-delay: 0.3s;
|
||||
}
|
||||
|
||||
@keyframes loadingFade {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 0.8;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.geetest_radar_btn {
|
||||
border-radius: 4px !important;
|
||||
}
|
||||
58
captcha/static/index.html
Normal file
58
captcha/static/index.html
Normal file
@ -0,0 +1,58 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh_CN">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>极验手动验证</title>
|
||||
|
||||
<link href="/static/css/style.css" rel="stylesheet" type="text/css">
|
||||
<script src="//libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
|
||||
<script src="/static/js/gt.js"></script>
|
||||
<script src="/static/js/index.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="box">
|
||||
<div class="title">极验手动验证</div>
|
||||
<div class="form">
|
||||
<label class="form-label">gt</label>
|
||||
<input type="text" class="form-control" id="gt" placeholder="请输入 gt">
|
||||
</div>
|
||||
<div class="form">
|
||||
<label class="form-label">challenge</label>
|
||||
<input type="text" class="form-control" id="challenge" placeholder="请输入 challenge">
|
||||
</div>
|
||||
|
||||
<div id="captcha">
|
||||
<div id="gen" class="btn">生成验证码</div>
|
||||
<div id="success" class="btn hide">验证成功</div>
|
||||
<div id="wait" class="hide">
|
||||
<div class="loading">
|
||||
<div class="loading-dot"></div>
|
||||
<div class="loading-dot"></div>
|
||||
<div class="loading-dot"></div>
|
||||
<div class="loading-dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="result" class="hide">
|
||||
<div class="result-title">验证结果</div>
|
||||
<div class="form">
|
||||
<label class="form-label">validate</label>
|
||||
<input type="text" class="form-control" id="validate" style="cursor: text;" disabled>
|
||||
</div>
|
||||
<div class="form">
|
||||
<label class="form-label">seccode</label>
|
||||
<input type="text" class="form-control" id="seccode" style="cursor: text;" disabled>
|
||||
</div>
|
||||
<div class="btn" id="result-btn">提交反馈结果</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="toast-box">消息</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
354
captcha/static/js/gt.js
Normal file
354
captcha/static/js/gt.js
Normal file
@ -0,0 +1,354 @@
|
||||
// 由Geetest提供 https://docs.geetest.com/sensebot/deploy/client/web
|
||||
// "v0.4.9 Geetest Inc."
|
||||
|
||||
(function (window) {
|
||||
"use strict";
|
||||
if (typeof window === 'undefined') {
|
||||
throw new Error('Geetest requires browser environment');
|
||||
}
|
||||
|
||||
var document = window.document;
|
||||
var Math = window.Math;
|
||||
var head = document.getElementsByTagName("head")[0];
|
||||
|
||||
function _Object(obj) {
|
||||
this._obj = obj;
|
||||
}
|
||||
|
||||
_Object.prototype = {
|
||||
_each: function (process) {
|
||||
var _obj = this._obj;
|
||||
for (var k in _obj) {
|
||||
if (_obj.hasOwnProperty(k)) {
|
||||
process(k, _obj[k]);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
function Config(config) {
|
||||
var self = this;
|
||||
new _Object(config)._each(function (key, value) {
|
||||
self[key] = value;
|
||||
});
|
||||
}
|
||||
|
||||
Config.prototype = {
|
||||
api_server: 'api.geetest.com',
|
||||
protocol: 'http://',
|
||||
typePath: '/gettype.php',
|
||||
fallback_config: {
|
||||
slide: {
|
||||
static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"],
|
||||
type: 'slide',
|
||||
slide: '/static/js/geetest.0.0.0.js'
|
||||
},
|
||||
fullpage: {
|
||||
static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"],
|
||||
type: 'fullpage',
|
||||
fullpage: '/static/js/fullpage.0.0.0.js'
|
||||
}
|
||||
},
|
||||
_get_fallback_config: function () {
|
||||
var self = this;
|
||||
if (isString(self.type)) {
|
||||
return self.fallback_config[self.type];
|
||||
} else if (self.new_captcha) {
|
||||
return self.fallback_config.fullpage;
|
||||
} else {
|
||||
return self.fallback_config.slide;
|
||||
}
|
||||
},
|
||||
_extend: function (obj) {
|
||||
var self = this;
|
||||
new _Object(obj)._each(function (key, value) {
|
||||
self[key] = value;
|
||||
})
|
||||
}
|
||||
};
|
||||
var isNumber = function (value) {
|
||||
return (typeof value === 'number');
|
||||
};
|
||||
var isString = function (value) {
|
||||
return (typeof value === 'string');
|
||||
};
|
||||
var isBoolean = function (value) {
|
||||
return (typeof value === 'boolean');
|
||||
};
|
||||
var isObject = function (value) {
|
||||
return (typeof value === 'object' && value !== null);
|
||||
};
|
||||
var isFunction = function (value) {
|
||||
return (typeof value === 'function');
|
||||
};
|
||||
var MOBILE = /Mobi/i.test(navigator.userAgent);
|
||||
var pt = MOBILE ? 3 : 0;
|
||||
|
||||
var callbacks = {};
|
||||
var status = {};
|
||||
|
||||
var nowDate = function () {
|
||||
var date = new Date();
|
||||
var year = date.getFullYear();
|
||||
var month = date.getMonth() + 1;
|
||||
var day = date.getDate();
|
||||
var hours = date.getHours();
|
||||
var minutes = date.getMinutes();
|
||||
var seconds = date.getSeconds();
|
||||
|
||||
if (month >= 1 && month <= 9) {
|
||||
month = '0' + month;
|
||||
}
|
||||
if (day >= 0 && day <= 9) {
|
||||
day = '0' + day;
|
||||
}
|
||||
if (hours >= 0 && hours <= 9) {
|
||||
hours = '0' + hours;
|
||||
}
|
||||
if (minutes >= 0 && minutes <= 9) {
|
||||
minutes = '0' + minutes;
|
||||
}
|
||||
if (seconds >= 0 && seconds <= 9) {
|
||||
seconds = '0' + seconds;
|
||||
}
|
||||
var currentdate = year + '-' + month + '-' + day + " " + hours + ":" + minutes + ":" + seconds;
|
||||
return currentdate;
|
||||
}
|
||||
|
||||
var random = function () {
|
||||
return parseInt(Math.random() * 10000) + (new Date()).valueOf();
|
||||
};
|
||||
|
||||
var loadScript = function (url, cb) {
|
||||
var script = document.createElement("script");
|
||||
script.charset = "UTF-8";
|
||||
script.async = true;
|
||||
|
||||
// 对geetest的静态资源添加 crossOrigin
|
||||
if ( /static\.geetest\.com/g.test(url)) {
|
||||
script.crossOrigin = "anonymous";
|
||||
}
|
||||
|
||||
script.onerror = function () {
|
||||
cb(true);
|
||||
};
|
||||
var loaded = false;
|
||||
script.onload = script.onreadystatechange = function () {
|
||||
if (!loaded &&
|
||||
(!script.readyState ||
|
||||
"loaded" === script.readyState ||
|
||||
"complete" === script.readyState)) {
|
||||
|
||||
loaded = true;
|
||||
setTimeout(function () {
|
||||
cb(false);
|
||||
}, 0);
|
||||
}
|
||||
};
|
||||
script.src = url;
|
||||
head.appendChild(script);
|
||||
};
|
||||
|
||||
var normalizeDomain = function (domain) {
|
||||
// special domain: uems.sysu.edu.cn/jwxt/geetest/
|
||||
// return domain.replace(/^https?:\/\/|\/.*$/g, ''); uems.sysu.edu.cn
|
||||
return domain.replace(/^https?:\/\/|\/$/g, ''); // uems.sysu.edu.cn/jwxt/geetest
|
||||
};
|
||||
var normalizePath = function (path) {
|
||||
path = path.replace(/\/+/g, '/');
|
||||
if (path.indexOf('/') !== 0) {
|
||||
path = '/' + path;
|
||||
}
|
||||
return path;
|
||||
};
|
||||
var normalizeQuery = function (query) {
|
||||
if (!query) {
|
||||
return '';
|
||||
}
|
||||
var q = '?';
|
||||
new _Object(query)._each(function (key, value) {
|
||||
if (isString(value) || isNumber(value) || isBoolean(value)) {
|
||||
q = q + encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';
|
||||
}
|
||||
});
|
||||
if (q === '?') {
|
||||
q = '';
|
||||
}
|
||||
return q.replace(/&$/, '');
|
||||
};
|
||||
var makeURL = function (protocol, domain, path, query) {
|
||||
domain = normalizeDomain(domain);
|
||||
|
||||
var url = normalizePath(path) + normalizeQuery(query);
|
||||
if (domain) {
|
||||
url = protocol + domain + url;
|
||||
}
|
||||
|
||||
return url;
|
||||
};
|
||||
|
||||
var load = function (config, send, protocol, domains, path, query, cb) {
|
||||
var tryRequest = function (at) {
|
||||
|
||||
var url = makeURL(protocol, domains[at], path, query);
|
||||
loadScript(url, function (err) {
|
||||
if (err) {
|
||||
if (at >= domains.length - 1) {
|
||||
cb(true);
|
||||
// report gettype error
|
||||
if (send) {
|
||||
config.error_code = 508;
|
||||
var url = protocol + domains[at] + path;
|
||||
reportError(config, url);
|
||||
}
|
||||
} else {
|
||||
tryRequest(at + 1);
|
||||
}
|
||||
} else {
|
||||
cb(false);
|
||||
}
|
||||
});
|
||||
};
|
||||
tryRequest(0);
|
||||
};
|
||||
|
||||
|
||||
var jsonp = function (domains, path, config, callback) {
|
||||
if (isObject(config.getLib)) {
|
||||
config._extend(config.getLib);
|
||||
callback(config);
|
||||
return;
|
||||
}
|
||||
if (config.offline) {
|
||||
callback(config._get_fallback_config());
|
||||
return;
|
||||
}
|
||||
|
||||
var cb = "geetest_" + random();
|
||||
window[cb] = function (data) {
|
||||
if (data.status == 'success') {
|
||||
callback(data.data);
|
||||
} else if (!data.status) {
|
||||
callback(data);
|
||||
} else {
|
||||
callback(config._get_fallback_config());
|
||||
}
|
||||
window[cb] = undefined;
|
||||
try {
|
||||
delete window[cb];
|
||||
} catch (e) {
|
||||
}
|
||||
};
|
||||
load(config, true, config.protocol, domains, path, {
|
||||
gt: config.gt,
|
||||
callback: cb
|
||||
}, function (err) {
|
||||
if (err) {
|
||||
callback(config._get_fallback_config());
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var reportError = function (config, url) {
|
||||
load(config, false, config.protocol, ['monitor.geetest.com'], '/monitor/send', {
|
||||
time: nowDate(),
|
||||
captcha_id: config.gt,
|
||||
challenge: config.challenge,
|
||||
pt: pt,
|
||||
exception_url: url,
|
||||
error_code: config.error_code
|
||||
}, function (err) {})
|
||||
}
|
||||
|
||||
var throwError = function (errorType, config) {
|
||||
var errors = {
|
||||
networkError: '网络错误',
|
||||
gtTypeError: 'gt字段不是字符串类型'
|
||||
};
|
||||
if (typeof config.onError === 'function') {
|
||||
config.onError(errors[errorType]);
|
||||
} else {
|
||||
throw new Error(errors[errorType]);
|
||||
}
|
||||
};
|
||||
|
||||
var detect = function () {
|
||||
return window.Geetest || document.getElementById("gt_lib");
|
||||
};
|
||||
|
||||
if (detect()) {
|
||||
status.slide = "loaded";
|
||||
}
|
||||
|
||||
window.initGeetest = function (userConfig, callback) {
|
||||
|
||||
var config = new Config(userConfig);
|
||||
|
||||
if (userConfig.https) {
|
||||
config.protocol = 'https://';
|
||||
} else if (!userConfig.protocol) {
|
||||
config.protocol = window.location.protocol + '//';
|
||||
}
|
||||
|
||||
// for KFC
|
||||
if (userConfig.gt === '050cffef4ae57b5d5e529fea9540b0d1' ||
|
||||
userConfig.gt === '3bd38408ae4af923ed36e13819b14d42') {
|
||||
config.apiserver = 'yumchina.geetest.com/'; // for old js
|
||||
config.api_server = 'yumchina.geetest.com';
|
||||
}
|
||||
|
||||
if(userConfig.gt){
|
||||
window.GeeGT = userConfig.gt
|
||||
}
|
||||
|
||||
if(userConfig.challenge){
|
||||
window.GeeChallenge = userConfig.challenge
|
||||
}
|
||||
|
||||
if (isObject(userConfig.getType)) {
|
||||
config._extend(userConfig.getType);
|
||||
}
|
||||
jsonp((config.api_server_v3 || [config.api_server || config.apiserver]), config.typePath, config, function (newConfig) {
|
||||
var type = newConfig.type;
|
||||
var init = function () {
|
||||
config._extend(newConfig);
|
||||
callback(new window.Geetest(config));
|
||||
};
|
||||
|
||||
callbacks[type] = callbacks[type] || [];
|
||||
var s = status[type] || 'init';
|
||||
if (s === 'init') {
|
||||
status[type] = 'loading';
|
||||
|
||||
callbacks[type].push(init);
|
||||
|
||||
load(config, true, config.protocol, newConfig.static_servers || newConfig.domains, newConfig[type] || newConfig.path, null, function (err) {
|
||||
if (err) {
|
||||
status[type] = 'fail';
|
||||
throwError('networkError', config);
|
||||
} else {
|
||||
status[type] = 'loaded';
|
||||
var cbs = callbacks[type];
|
||||
for (var i = 0, len = cbs.length; i < len; i = i + 1) {
|
||||
var cb = cbs[i];
|
||||
if (isFunction(cb)) {
|
||||
cb();
|
||||
}
|
||||
}
|
||||
callbacks[type] = [];
|
||||
}
|
||||
});
|
||||
} else if (s === "loaded") {
|
||||
init();
|
||||
} else if (s === "fail") {
|
||||
throwError('networkError', config);
|
||||
} else if (s === "loading") {
|
||||
callbacks[type].push(init);
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
|
||||
})(window);
|
||||
180
captcha/static/js/index.js
Normal file
180
captcha/static/js/index.js
Normal file
@ -0,0 +1,180 @@
|
||||
window.onload = function () {
|
||||
const wait = document.querySelector("#wait")
|
||||
const genBtn = document.querySelector("#gen")
|
||||
const successBtn = document.querySelector("#success")
|
||||
const resultBox = document.querySelector("#result")
|
||||
const resultBtn = document.querySelector("#result-btn")
|
||||
const toastBox = document.querySelector(".toast-box")
|
||||
|
||||
const gtInput = document.querySelector("#gt")
|
||||
const challengeInput = document.querySelector("#challenge")
|
||||
const validateInput = document.querySelector("#validate")
|
||||
const seccodeInput = document.querySelector("#seccode")
|
||||
|
||||
class GeeTest {
|
||||
constructor(gt, challenge) {
|
||||
this.gt = gt;
|
||||
this.challenge = challenge;
|
||||
}
|
||||
|
||||
init(now = false) {
|
||||
initGeetest({
|
||||
gt: this.gt,
|
||||
challenge: this.challenge,
|
||||
offline: false,
|
||||
new_captcha: true,
|
||||
|
||||
product: now ? "bind" : "popup",
|
||||
width: "100%",
|
||||
}, function (captchaObj) {
|
||||
if (now) setTimeout(() => {
|
||||
hide(wait);
|
||||
captchaObj.verify();
|
||||
}, Math.floor(Math.random() * 2000) + 1000);
|
||||
else captchaObj.appendTo("#captcha");
|
||||
|
||||
captchaObj.onReady(() => {
|
||||
if (!now) hide(wait);
|
||||
}).onSuccess(() => {
|
||||
console.log("验证成功");
|
||||
showToastBox("验证成功");
|
||||
if (now) {
|
||||
hide(wait);
|
||||
show(successBtn);
|
||||
}
|
||||
const result = captchaObj.getValidate();
|
||||
|
||||
validateInput.value = result.geetest_validate;
|
||||
seccodeInput.value = result.geetest_seccode;
|
||||
|
||||
show(resultBox)
|
||||
}).onError(err => {
|
||||
console.log("验证失败");
|
||||
console.log(err);
|
||||
showToastBox("验证失败 " + err.msg, 3000);
|
||||
if (now) {
|
||||
hide(wait);
|
||||
show(genBtn);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
genBtn.onclick = () => {
|
||||
let gt = gtInput.value;
|
||||
let challenge = challengeInput.value;
|
||||
if (gt === undefined || gt === '' || challenge === undefined || challenge === '') {
|
||||
console.log("gt 和 challenge 不能为空");
|
||||
showToastBox("gt 和 challenge 不能为空", 3000);
|
||||
return;
|
||||
}
|
||||
if (gt.length !== 32 || challenge.length !== 32) {
|
||||
console.log("gt 或 challenge 长度错误");
|
||||
showToastBox("gt 或 challenge 长度错误", 3000);
|
||||
return;
|
||||
}
|
||||
|
||||
hide(genBtn);
|
||||
show(wait);
|
||||
|
||||
new GeeTest(gt, challenge).init(true);
|
||||
}
|
||||
|
||||
const search = location.search;
|
||||
|
||||
if (search !== '') {
|
||||
hide(genBtn);
|
||||
show(wait);
|
||||
|
||||
let gt = '';
|
||||
let challenge = '';
|
||||
|
||||
const arr = search.substring(1).split("&");
|
||||
for (const i in arr) {
|
||||
const t = arr[i].split("=");
|
||||
switch (t[0]) {
|
||||
case "gt":
|
||||
gt = t[1];
|
||||
break;
|
||||
case "challenge":
|
||||
challenge = t[1];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (gt !== '' && challenge !== '') {
|
||||
gtInput.value = gt;
|
||||
challengeInput.value = challenge;
|
||||
new GeeTest(gt, challenge).init();
|
||||
} else {
|
||||
console.log("未从URL中找到 gt 与 challenge");
|
||||
hide(wait);
|
||||
show(genBtn);
|
||||
}
|
||||
}
|
||||
|
||||
resultBtn.onclick = () => {
|
||||
const text = "validate=" + validateInput.value + "&seccode=" + seccodeInput.value
|
||||
// const clipboard = navigator.clipboard
|
||||
// if (clipboard === undefined) {
|
||||
// const el = document.createElement('input');
|
||||
// el.setAttribute('value', text);
|
||||
// document.body.appendChild(el);
|
||||
// el.select();
|
||||
// const res = document.execCommand('copy');
|
||||
// document.body.removeChild(el);
|
||||
// showToastBox(res? "复制成功" : "复制失败");
|
||||
// } else clipboard.writeText(text).then(() => {
|
||||
// console.log("复制成功");
|
||||
// showToastBox("复制成功");
|
||||
// }, err => {
|
||||
// console.log("复制失败");
|
||||
// console.log(err);
|
||||
// showToastBox("复制失败");
|
||||
// });
|
||||
|
||||
$.ajax({
|
||||
url: 'feedback',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
challenge: challengeInput.value,
|
||||
validate: validateInput.value,
|
||||
seccode: seccodeInput.value
|
||||
},
|
||||
success: function (data) {
|
||||
if (data.code === 10003) {
|
||||
showToastBox("提交反馈成功");
|
||||
} else {
|
||||
showToastBox("提交反馈失败");
|
||||
}
|
||||
},
|
||||
error: function (err) {
|
||||
showToastBox('error: ' + err.status + ' ' + err.statusText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let timer = null
|
||||
|
||||
function showToastBox(text, timeout = 2000) {
|
||||
toastBox.innerHTML = text;
|
||||
toastBox.style.opacity = 1;
|
||||
toastBox.style.top = '50px';
|
||||
if (timer != null) clearTimeout(timer)
|
||||
timer = setTimeout(() => {
|
||||
toastBox.style.top = '-30px';
|
||||
toastBox.style.opacity = 0;
|
||||
}, timeout)
|
||||
}
|
||||
|
||||
function hide(el) {
|
||||
el.classList.add("hide")
|
||||
}
|
||||
|
||||
function show(el) {
|
||||
el.classList.remove("hide")
|
||||
}
|
||||
}
|
||||
@ -5,6 +5,9 @@ LABEL AUTHOR = "Lkeme <Useri@live.cn>"
|
||||
|
||||
ENV USER_NAME='' \
|
||||
USER_PASSWORD='' \
|
||||
CAPTCHA='0' \
|
||||
CAPTCHA_HOST='0.0.0.0' \
|
||||
CAPTCHA_PORT='50001' \
|
||||
REPO_URL='https://github.com/' \
|
||||
CUSTOM_CLONE_URL='https://speed.example.com/example/example.git' \
|
||||
MIRRORS="0" \
|
||||
|
||||
@ -86,7 +86,13 @@ case ${VERSION} in
|
||||
sed -i ''"$(cat /app/profile/user/config/user.ini -n | grep "password = \"\"" | awk '{print $1}')"'c '"$(echo "password = \"${USER_PASSWORD}\"")"'' ${V2_CONIFG_PATH}
|
||||
fi
|
||||
|
||||
php app.php m:a
|
||||
if [ "$CAPTCHA" == "1" ]; then
|
||||
echo -e "\n ======== \n ${Info} ${GreenBG} 正在使用验证码服务 ${Font} \n ======== \n"
|
||||
echo -e "\n ======== \n ${Info} ${GreenBG} 验证码服务地址:http://${CAPTCHA_HOST}:${CAPTCHA_PORT} ${Font} \n ======== \n"
|
||||
cd ./captcha && php -S $CAPTCHA_HOST:$CAPTCHA_PORT & cd .. && php app.php m:a
|
||||
else
|
||||
php app.php m:a
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo -e "\n ======== \n ${Info} ${RedBG} 错误的版本方案选择 ${Font} \n ======== \n"
|
||||
|
||||
50
docs/CAPTCHA.md
Normal file
50
docs/CAPTCHA.md
Normal file
@ -0,0 +1,50 @@
|
||||
## 关于验证码
|
||||
|
||||
> 在登录模块中,账密模式或短信验证码模式可能会遇到验证码,这里将会介绍如何解决验证码问题。
|
||||
|
||||
### 开关
|
||||
|
||||
```ini
|
||||
[login_captcha]
|
||||
; 验证码手动识别
|
||||
enable = false
|
||||
; 验证码手动识别服务地址
|
||||
url = "http://localhost:50001"
|
||||
```
|
||||
|
||||
### 如何开启验证码手动识别服务地址
|
||||
|
||||
> 需要手动开启配置开关`enable = true`,并且配置`url`为验证码手动识别服务地址。
|
||||
|
||||
#### Docker用户
|
||||
|
||||
以外部挂载配置文件为例
|
||||
|
||||
```bash
|
||||
docker run -itd --rm -e CAPTCHA=1 -e CAPTCHA_HOST=localhost -e CAPTCHA_PORT=50002 -p 50002:50002 -v /path/to/your/confFilePath:/app/profile/user lkeme/bilihelper-personal
|
||||
|
||||
-e CAPTCHA=1 # 开启验证码手动识别服务 默认 0
|
||||
-e CAPTCHA_HOST=localhost # 默认 0.0.0.0
|
||||
-e CAPTCHA_PORT=50002 # 验证码手动识别服务地址 默认 50001 需要注意端口映射关系
|
||||
```
|
||||
|
||||
|
||||
> 注意:如果你使用的是`docker-compose`,请参考`docker-compose.yml`文件中的`captcha`服务配置。
|
||||
|
||||
##### 本地用户
|
||||
|
||||
```bash
|
||||
cd captcha && php -S localhost:50001
|
||||
cd captcha && php -S localhost:50002
|
||||
```
|
||||
|
||||
> 验证码处理目录在`captcha`目录下,可以自行修改。
|
||||
|
||||
|
||||
### 如何使用验证码手动识别服务地址
|
||||
|
||||
在开启验证码手动识别服务地址后,登录模块会自动显示手动地址。复制地址到浏览器中打开,会显示相应的界面。
|
||||
|
||||
识别后提交反馈,程序会自动进行获取。
|
||||
|
||||
> 0.0.0.0是指所有地址,本地以及外网都可以访问,如果你只想本地访问,可以使用`localhost`或者其他内网地址。
|
||||
@ -8,6 +8,25 @@
|
||||
|
||||
[comment]: <> (</details>)
|
||||
|
||||
## v2.0.7.230324 alpha (2023-03-24)
|
||||
|
||||
### Added
|
||||
|
||||
- 手动验证码识别
|
||||
|
||||
### Changed
|
||||
|
||||
- 更新设备信息
|
||||
|
||||
### Fixed
|
||||
|
||||
-
|
||||
|
||||
### Remarks
|
||||
|
||||
- 请注意配置文件有所变动,注意更新。
|
||||
|
||||
|
||||
## v2.0.7.230311 alpha (2023-03-11)
|
||||
|
||||
### Added
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -150,4 +150,3 @@ class BpConsumption extends BasePlugin
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -180,4 +180,3 @@ class GameForecast extends BasePlugin
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -156,4 +156,3 @@ class LiveReservation extends BasePlugin
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -126,10 +126,6 @@ class Login extends BasePlugin
|
||||
// 二维码模式
|
||||
$this->qrcodeLogin();
|
||||
break;
|
||||
case 4:
|
||||
// 行为验证码模式(暂未开放)
|
||||
// self::captchaLogin();
|
||||
failExit('此登录模式暂未开放');
|
||||
default:
|
||||
failExit('登录模式配置错误');
|
||||
}
|
||||
@ -447,6 +443,22 @@ class Login extends BasePlugin
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 验证码登录
|
||||
* @param string $target_url
|
||||
* @return void
|
||||
*/
|
||||
protected function captchaLogin(string $target_url): void
|
||||
{
|
||||
// $captcha_ori = $this->getCaptcha();
|
||||
// $captcha = $this->ocrCaptcha($captcha_ori);
|
||||
$captcha_info = $this->matchCaptcha($target_url);
|
||||
// 暂时不做额外处理
|
||||
$captcha = $this->ocrCaptcha($captcha_info['gt'], $captcha_info['challenge']);
|
||||
$this->accountLogin($captcha['validate'], $captcha['challenge'], $mode = '账密模式(行为验证码)');
|
||||
}
|
||||
|
||||
/**
|
||||
* 登录后处理
|
||||
* @param string $mode
|
||||
@ -483,7 +495,10 @@ class Login extends BasePlugin
|
||||
break;
|
||||
case -105:
|
||||
// 需要验证码
|
||||
$this->loginFail($mode, '此次登录需要验证码或' . $data['message']);
|
||||
Log::warning("此次请求需要行为验证码");
|
||||
$this->captchaLogin($data['data']['url']);
|
||||
break;
|
||||
// $this->loginFail($mode, '此次登录需要验证码或' . $data['message']);
|
||||
case -629:
|
||||
// 密码错误
|
||||
$this->loginFail($mode, $data['message']);
|
||||
@ -530,14 +545,14 @@ class Login extends BasePlugin
|
||||
$password = getConf('login_account.password');
|
||||
|
||||
// TODO 冗余
|
||||
switch ($mode_id){
|
||||
switch ($mode_id) {
|
||||
case 1:
|
||||
if (empty($username) || empty($password)) {
|
||||
failExit('空白的帐号和口令');
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (empty($username) ) {
|
||||
if (empty($username)) {
|
||||
failExit('空白的帐号');
|
||||
}
|
||||
break;
|
||||
@ -577,10 +592,13 @@ class Login extends BasePlugin
|
||||
* 发送短信验证码
|
||||
* @param string $phone
|
||||
* @param string $cid
|
||||
* @param string $validate
|
||||
* @param string $challenge
|
||||
* @return array
|
||||
*/
|
||||
protected function sendSms(string $phone, string $cid): array
|
||||
protected function sendSms(string $phone, string $cid, string $validate = '', string $challenge = '', string $recaptcha_token = ''): array
|
||||
{
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"is_new":false,"captcha_key":"","recaptcha_url":"https://www.bilibili.com/h5/project-msg-auth/verify?ct=geetest\u0026recaptcha_token=f968b6432dde47a9aa274adfc60b2d1a\u0026gee_gt=1c0ea7c7d47d8126dda19ee3431a5f38\u0026gee_challenge=dec6522102ce0aa5cbdab370930123f8\u0026hash=ef1e5849a6746ad680a1dfa8924da497"}}
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"is_new":false,"captcha_key":"4e292933816755442c1568e2043b8e41","recaptcha_url":""}}
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"is_new":false,"captcha_key":"","recaptcha_url":"https://www.bilibili.com/h5/project-msg-auth/verify?ct=geetest\u0026recaptcha_token=ad520c3a4a3c46e29b1974d85efd2c4b\u0026gee_gt=1c0ea7c7d47d8126dda19ee3431a5f38\u0026gee_challenge=c772673050dce482b9f63ff45b681ceb\u0026hash=ea2850a43cc6b4f1f7b925d601098e5e"}}
|
||||
// TODO 参数位置调整
|
||||
@ -589,7 +607,12 @@ class Login extends BasePlugin
|
||||
'tel' => $phone,
|
||||
'statistics' => getDevice('app.bili_a.statistics'),
|
||||
];
|
||||
|
||||
if ($validate != '' && $challenge != '') {
|
||||
$payload['recaptcha_token'] = $recaptcha_token;
|
||||
$payload['gee_validate'] = $validate;
|
||||
$payload['gee_challenge'] = $challenge;
|
||||
$payload['gee_seccode'] = "$validate|jordan";
|
||||
}
|
||||
$raw = ApiLogin::sendSms($payload);
|
||||
$response = json_decode($raw, true);
|
||||
//
|
||||
@ -598,9 +621,39 @@ class Login extends BasePlugin
|
||||
$payload['captcha_key'] = $response['data']['captcha_key'];
|
||||
return $payload;
|
||||
}
|
||||
if ($response['code'] == 0 && isset($response['data']['recaptcha_url']) && $response['data']['recaptcha_url'] != '') {
|
||||
Log::warning("此次请求需要行为验证码");
|
||||
$target_url = $response['data']['recaptcha_url'];
|
||||
// 单独处理
|
||||
preg_match('/recaptcha_token=([a-f0-9]+)/', $target_url, $matches);
|
||||
$recaptcha_token = $matches[1];
|
||||
|
||||
$captcha_info = $this->matchCaptcha($target_url);
|
||||
// 暂时不做额外处理
|
||||
$captcha = $this->ocrCaptcha($captcha_info['gt'], $captcha_info['challenge']);
|
||||
$this->sendSms($phone, $cid, $captcha['validate'], $captcha['challenge'], $recaptcha_token);
|
||||
}
|
||||
|
||||
|
||||
failExit("短信验证码发送失败 $raw");
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $target_url
|
||||
* @return array
|
||||
*/
|
||||
protected function matchCaptcha(string $target_url): array
|
||||
{
|
||||
preg_match('/gt=([a-f0-9]+)/', $target_url, $matches);
|
||||
$gt = $matches[1];
|
||||
preg_match('/challenge=([a-f0-9]+)/', $target_url, $matches);
|
||||
$challenge = $matches[1];
|
||||
if (empty($gt) || empty($challenge)) {
|
||||
failExit('提取验证码失败');
|
||||
}
|
||||
return ['gt' => $gt, 'challenge' => $challenge];
|
||||
}
|
||||
|
||||
/**
|
||||
* 输入短信验证码
|
||||
* @param string $msg
|
||||
@ -638,18 +691,41 @@ class Login extends BasePlugin
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 验证码模式
|
||||
* @param string $mode
|
||||
* @return void
|
||||
* @param string $gt
|
||||
* @param string $challenge
|
||||
* @return array
|
||||
*/
|
||||
protected function captchaLogin(string $mode = '验证码模式'): void
|
||||
protected function ocrCaptcha(string $gt, string $challenge): array
|
||||
{
|
||||
// $captcha_ori = $this->getCaptcha();
|
||||
// $captcha = $this->ocrCaptcha($captcha_ori);
|
||||
// $this->accountLogin($captcha['validate'], $captcha['challenge'], $mode);
|
||||
if (getConf('login_captcha.url') && getEnable('login_captcha')) {
|
||||
Log::info('请在浏览器中打开以下链接,完成验证码识别');
|
||||
Log::info(getConf('login_captcha.url') . '/geetest?gt=' . $gt . '&challenge=' . $challenge);
|
||||
Log::info('请在2分钟内完成识别操作');
|
||||
// 设置请求时间和时间间隔
|
||||
$maxTime = 120; // 最大请求时间(秒)
|
||||
$interval = 2; // 请求间隔(秒)
|
||||
|
||||
// 循环请求
|
||||
$startTime = time();
|
||||
while (time() - $startTime < $maxTime) {
|
||||
$response = ApiCaptcha::fetch($challenge);
|
||||
if ($response['code'] == 10000) {
|
||||
Log::notice($response['message']);
|
||||
return $response['data'];
|
||||
} else {
|
||||
Log::info($response['message']);
|
||||
}
|
||||
sleep($interval);
|
||||
}
|
||||
failExit('验证码识别超时');
|
||||
} else {
|
||||
failExit('验证码识别并未开启');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 转换Cookie
|
||||
* @param string $token
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -145,7 +145,6 @@ class MainSite extends BasePlugin
|
||||
$aids = $this->fetchCustomArchives($actual_num);
|
||||
// 从二维数组里取出aid
|
||||
$aids = array_column($aids, 'aid');
|
||||
var_dump($aids);
|
||||
//
|
||||
Log::info("主站任务: 预投币稿件 " . implode(" ", $aids));
|
||||
// 投币
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -7,7 +7,7 @@ use Bhp\Log\Log;
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -17,7 +17,7 @@ version = 0.0.1
|
||||
username = ""
|
||||
password = ""
|
||||
|
||||
; 登录模式/[1.账密模式 2.短信验证码模式 3.扫码模式 4.行为验证码模式(暂未开放)]
|
||||
; 登录模式/[1.账密模式 2.短信验证码模式 3.扫码模式]
|
||||
[login_mode]
|
||||
mode = 1
|
||||
|
||||
@ -29,6 +29,12 @@ code = 86
|
||||
[login_check]
|
||||
phone = true
|
||||
|
||||
[login_captcha]
|
||||
; 验证码手动识别
|
||||
enable = false
|
||||
; 验证码手动识别服务地址
|
||||
url = "http://localhost:50001"
|
||||
|
||||
#######################
|
||||
# 插件功能设置 #
|
||||
#######################
|
||||
|
||||
@ -3,8 +3,8 @@ device_version: 0.0.1
|
||||
app:
|
||||
bili_a: # Android
|
||||
package: "tv.danmaku.bili"
|
||||
version: "7.20.0"
|
||||
build: "7200300"
|
||||
version: "7.22.0"
|
||||
build: "7220300"
|
||||
channel: "bili"
|
||||
device: "phone"
|
||||
mobi_app: "android"
|
||||
@ -15,7 +15,7 @@ app:
|
||||
secret_key: "NTYwYzUyY2NkMjg4ZmVkMDQ1ODU5ZWQxOGJmZmQ5NzM"
|
||||
app_key_n: "NzgzYmJiNzI2NDQ1MWQ4Mg=="
|
||||
secret_key_n: "MjY1MzU4M2M4ODczZGVhMjY4YWI5Mzg2OTE4YjFkNjU="
|
||||
statistics: '{"appId":1,"platform":3,"version":"7.20.0","abtest":""}'
|
||||
statistics: '{"appId":1,"platform":3,"version":"7.22.0","abtest":""}'
|
||||
bili_i: # IOS
|
||||
app_key: "MjdlYjUzZmM5MDU4ZjhjMw=="
|
||||
secret_key: "YzJlZDUzYTc0ZWVlZmUzY2Y5OWZiZDAxZDhjOWMzNzU="
|
||||
|
||||
@ -7,10 +7,10 @@
|
||||
"dev_raw_url": "https://gh.notifyplus.cf/https://github.com/lkeme/BiliHelper-personal/blob/dev/resources/version.json",
|
||||
"master_purge_url": "https://cdn.staticaly.com/gh/lkeme/BiliHelper-personal/master/resources/version.json",
|
||||
"dev_purge_url": "https://cdn.staticaly.com/gh/lkeme/BiliHelper-personal/dev/resources/version.json",
|
||||
"version": "2.0.7.230311",
|
||||
"version": "2.0.7.230324",
|
||||
"des": "程序有更新,请及时线上查看更新哦~",
|
||||
"time": "2023年03月11日",
|
||||
"time": "2023年03月24日",
|
||||
"ini_version": "0.0.1",
|
||||
"ini_des": "配置有更新,请及时线上查看更新哦~",
|
||||
"ini_time": "2023年03月11日"
|
||||
"ini_time": "2023年03月24日"
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -75,4 +75,3 @@ class ApiGuess
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -62,4 +62,3 @@ class ApiManga
|
||||
return Request::postJson(true, 'app', $url, Sign::common($payload));
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -56,5 +56,17 @@ class ApiCaptcha
|
||||
];
|
||||
return Request::postJson(true,'other', $url, $payload, $headers);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $challenge
|
||||
* @return array
|
||||
*/
|
||||
public static function fetch(string $challenge): array
|
||||
{
|
||||
$url = getConf('login_captcha.url') . '/fetch';
|
||||
$payload = [
|
||||
'challenge' => $challenge,
|
||||
];
|
||||
return Request::getJson(true, 'other', $url, $payload);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -55,7 +55,7 @@ class ApiLogin
|
||||
*/
|
||||
public static function sendSms(array $payload): string
|
||||
{
|
||||
$url = 'https://passport.bilibili.com//x/passport-login/sms/send';
|
||||
$url = 'https://passport.bilibili.com/x/passport-login/sms/send';
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"is_new":false,"captcha_key":"4e292933816755442c1568e2043b8e41","recaptcha_url":""}}
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"is_new":false,"captcha_key":"","recaptcha_url":"https://www.bilibili.com/h5/project-msg-auth/verify?ct=geetest\u0026recaptcha_token=ad520c3a4a3c46e29b1974d85efd2c4b\u0026gee_gt=1c0ea7c7d47d8126dda19ee3431a5f38\u0026gee_challenge=c772673050dce482b9f63ff45b681ceb\u0026hash=ea2850a43cc6b4f1f7b925d601098e5e"}}
|
||||
return Request::post('app', $url, Sign::login($payload));
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -128,4 +128,3 @@ class ApiOauth2
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -58,4 +58,3 @@ class ApiQrcode
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -79,4 +79,4 @@ class ApiPay
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -46,4 +46,4 @@ class ApiWallet
|
||||
return Request::putJson(true, 'pc', $url, $payload, $headers);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -32,4 +32,4 @@ class ApiArea
|
||||
return Request::getJson(true, 'other', $url, $payload);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -38,4 +38,4 @@ class ApiDanMu
|
||||
return Request::getJson(true, 'other', $url, $payload);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -67,4 +67,4 @@ class ApiReservation
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -81,4 +81,4 @@ class ApiCoin
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -94,4 +94,4 @@ class ApiWatch
|
||||
return Request::postJson(true, 'pc', $url, $payload, $headers);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -60,4 +60,4 @@ class ApiPrivilege
|
||||
return Request::postJson(true, 'pc', $url, $payload, $headers);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -36,4 +36,4 @@ class ApiUser
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"mid":1234,"vip_type":2,"vip_status":1,"vip_due_date":1667750400000,"vip_pay_type":0,"theme_type":0,"label":{"text":"年度大会员","label_theme":"annual_vip","text_color":"#FFFFFF","bg_style":1,"bg_color":"#FB7299","border_color":""},"avatar_subscript":1,"avatar_subscript_url":"http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png","nickname_color":"#FB7299","is_new_user":false}}
|
||||
return Request::getJson(true, 'pc', $url, $payload, $headers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -85,4 +85,3 @@ class ApiRevenueWallet
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -53,4 +53,4 @@ class ApiXLiveSign
|
||||
// {"code":0,"message":"0","ttl":1,"data":{"text":"3000点用户经验,2根辣条","specialText":"再签到4天可以获得666银瓜子","allDays":30,"hadSignDays":1,"isBonusDay":0}}
|
||||
return Request::getJson(true, 'pc', $url, $payload, $headers);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -41,4 +41,4 @@ class ApiFansMedal
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -93,4 +93,4 @@ class ApiHeartBeat
|
||||
}
|
||||
return $response['s'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -56,5 +56,4 @@ class ApiBox
|
||||
return Request::getJson(true, 'pc', $url, $payload);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -102,4 +102,4 @@ class Bootstrap extends SingleTon
|
||||
{
|
||||
Console::getInstance()->register();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -69,4 +69,4 @@ class AppCommand extends Command
|
||||
//
|
||||
Task::execTasks();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -54,4 +54,4 @@ final class RestoreCommand extends Command
|
||||
// 清理排程文件
|
||||
// 清理缓存文件
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -51,4 +51,4 @@ final class ScriptCommand extends Command
|
||||
{
|
||||
Log::info("执行 $this->desc");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -103,4 +103,4 @@ class Core extends SingleTon
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
* Author: Lkeme
|
||||
* License: The MIT License
|
||||
* Email: Useri@live.cn
|
||||
* Updated: 2022 ~ 2023
|
||||
* Updated: 2023 ~ 2024
|
||||
*
|
||||
* _____ _ _ _ _ _ _____ _ _____ _____ _____
|
||||
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & /l、
|
||||
@ -40,4 +40,3 @@ class FilterWords extends BaseResource
|
||||
return str_replace("\\", "/", APP_RESOURCES_PATH . $filename);
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user