[update] captcha

This commit is contained in:
Lkeme 2023-03-24 17:02:42 +08:00
parent ded6a26774
commit 523ed7979f
156 changed files with 1320 additions and 233 deletions

1
.gitignore vendored
View File

@ -34,3 +34,4 @@ index1.php
!/profile/example
.phpunit.*
captcha/data.json

View File

@ -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)

View File

@ -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
View 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、
* | |_| | | | | | | | | |_| | | |__ | | | |_| | | |__ | |_| | (゚、
* | _ { | | | | | | | _ | | __| | | | ___/ | __| | _ /   \、゙ ~ *
* | |_| | | | | |___ | | | | | | | |___ | |___ | | | |___ | | \ \  じし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();

View 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
View 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
View 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
View 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")
}
}

View File

@ -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" \

View File

@ -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
View 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`或者其他内网地址。

View File

@ -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

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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));
// 投币

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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"
#######################
# 插件功能设置 #
#######################

View File

@ -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="

View File

@ -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日"
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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));
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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);
}
}

View File

@ -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));

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}
}
}

View File

@ -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
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}

View File

@ -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);
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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'];
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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);
}
}

View File

@ -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

View File

@ -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();
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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();
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
// 清理排程文件
// 清理缓存文件
}
}
}

View File

@ -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");
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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
}
}
}

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -5,7 +5,7 @@
* Author: Lkeme
* License: The MIT License
* Email: Useri@live.cn
* Updated: 2022 ~ 2023
* Updated: 2023 ~ 2024
*
* _____ _ _ _ _ _ _____ _ _____ _____ _____
* | _ \ | | | | | | | | | | | ____| | | | _ \ | ____| | _ \ & l、

View File

@ -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