Setting('authCode', env('authCode', false), true)) {
$auth = true;
}
return $this->success("ok", [
'email' => $this->Setting('email', ''),
'qqGroup' => $this->Setting("qqGroup", ''),
"recordNumber" => $this->Setting("recordNumber", ''),
"auth" => $auth
]);
}
public function background()
{
$bg = $this->Setting('backgroundImage');
if ($bg) {
return redirect($bg, 302);
}
return download("static/background.jpeg",);
}
//获取邮件验证码
function getMailCode(): \think\response\Json
{
$mail = $this->request->post("mail", false);
$code = rand(100000, 999999);
if ($mail) {
if (Cache::get('code' . $mail)) {
return $this->success("请勿频繁获取验证码");
}
$status = \Mail::send($mail, "
您的验证码是: $code
");
if ($status) {
Cache::set('code' . $mail, $code, 60);
return $this->success("发送成功");
}
}
return $this->error('发送失败');
}
private function addHttpProtocolRemovePath($url): string
{
// 解析URL
$parsedUrl = parse_url($url);
// 检查是否已经有协议,如果没有则添加http://
if (!isset($parsedUrl['scheme'])) {
// 检查是否以 // 开头,如果是,则转换为相对协议
if (isset($parsedUrl['host']) && strpos($url, '//') === 0) {
$url = 'http:' . $url;
} else {
$url = 'http://' . $url;
}
} else {
// 如果有协议但没有路径,保留原样
$url = $parsedUrl['scheme'] . '://';
// 如果有主机,则添加主机部分
if (isset($parsedUrl['host'])) {
$url .= $parsedUrl['host'];
// 如果有端口号,则添加端口号
if (isset($parsedUrl['port'])) {
$url .= ':' . $parsedUrl['port'];
}
}
}
return $url;
}
private function addHttpProtocol($url)
{
// 检查是否已经有协议,如果没有则添加http://
if (!parse_url($url, PHP_URL_SCHEME)) {
// 检查是否以 // 开头,如果是,则转换为相对协议
if (strpos($url, '//') === 0) {
$url = 'https:' . $url;
} else {
$url = 'http://' . $url;
}
}
return $url;
}
private function hasOnlyPath($url): bool
{
$parsedUrl = parse_url($url);
// 检查是否存在路径但不存在域名和协议
if (isset($parsedUrl['path']) && !isset($parsedUrl['host']) && !isset($parsedUrl['scheme'])) {
return true;
}
return false;
}
function getIcon(): \think\response\Json
{
$avatar = $this->request->post('avatar');
if ($avatar) {
$remote_avatar = $this->Setting("remote_avatar", "https://avatar.mtab.cc/6.x/bottts/png?seed=", true);
$str = $this->downloadFile($remote_avatar . $avatar, md5($avatar) . '.png');
return $this->success(['src' => $str]);
}
$url = $this->request->post('url', false);
$icon = "";
$cdn = $this->Setting('assets_host', '');
if ($url) {
$realUrl = $this->addHttpProtocolRemovePath($url);
$client = \Axios::http();
try {
$response = $client->get($realUrl, [
'headers' => [
"User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
]
]);
$status = $response->getStatusCode();
} catch (\Exception $e) {
return $this->error('无法连接远程目标服务器');
}
if ($status == 200) {
$body = $response->getBody()->getContents();
$dom = new Dom();
$dom->loadStr($body);
$title = $dom->find('title');
if (count($title) > 0) {
$title = $title->innerText;
}
try {
$list = $dom->find('[rel="icon"]');
if (count($list) == 0) {
$list = $dom->find('[rel="shortcut icon"]');
}
if (count($list) == 0) {
$list = $dom->find('[rel="Shortcut Icon"]');
}
if (count($list) > 0) {
$href = $list->href;
if ($this->hasOnlyPath($href)) {
if ($href[0] != '/') {
$href = "/" . $href;
}
$href = $realUrl . $href;
}
$href = $this->addHttpProtocol($href);
$icon = $href;
$response = \Axios::http()->get($icon, [
'headers' => [
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
]
]);
$contentType = $response->getHeader('content-type');
$contentType = $contentType[0];
if (preg_match('/(png|jpg|jpeg|x-icon|svg\+xml)$/', $contentType, $matches)) {
$contentType = array(
'png' => 'png',
'jpg' => 'jpg',
'jpeg' => 'jpeg',
'x-icon' => 'ico',
'svg+xml' => 'svg',
);
$fileFormat = $matches[1];
$icon = $this->downloadFile($icon, md5($realUrl) . '.' . $contentType[$fileFormat]);
if ($icon) {
$icon = $cdn . $icon;
}
} else {
$icon = '';
}
}
} catch (\ErrorException $e) {
}
}
if (strlen($icon) == 0) {
try {
$client = \Axios::http();
$response = $client->get($realUrl . '/favicon.ico');
$status = $response->getStatusCode();
if ($status == 200) {
$icon = $realUrl . '/favicon.ico';
$icon = $this->downloadFile($icon, md5($realUrl) . '.ico');
if ($icon) {
$icon = $cdn . $icon;
}
}
} catch (\Exception $e) {
}
}
if (strlen($icon) > 0) {
return $this->success(['src' => $icon, 'name' => $title]);
}
}
return $this->error('没有抓取到图标');
}
private function downloadFile($url, $name)
{
$client = \Axios::http();
$path = '/images/' . date('Y/m/d/');
$remotePath = public_path() . $path;
$downloadPath = $remotePath . $name;
if (!is_dir($remotePath)) {
mkdir($remotePath, 0755, true);
}
try {
$response = $client->request('GET', $url, [
'sink' => $downloadPath,
'headers' => [
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
]
]);
return $path . $name;
} catch (RequestException $e) {
}
return false;
}
function renderIco(): \think\Response
{
$send = $this->request->get('seed');
$client = new Client();
$remote_avatar = $this->Setting('remote_avatar', 'https://avatar.mtab.cc/6.x/bottts/png?seed=', true);
$response = $client->get($remote_avatar . urlencode($send), [
'stream' => true,
'timeout' => 10,
]);
return response($response->getBody(), 200, ['Content-Type' => 'image/png']);
}
function upload(): \think\response\Json
{
$file = $this->request->file('file');
if (empty($file)) {
return $this->error('not File');
}
if ($file->getSize() > 1024 * 1024 * 5) {
return $this->error('文件最大5MB');
}
if (in_array(strtolower($file->getOriginalExtension()), ['png', 'jpg', 'jpeg', 'webp', 'ico', 'svg'])) {
// 验证文件并保存
try {
// 构建保存路径
$savePath = '/images/' . date('Y/m/d');
$hash = Str::random(32);
$fileName = $hash . '.' . $file->getOriginalExtension();
$filePath = Filesystem::disk('images')->putFileAs($savePath, $file, $fileName);
$cdn = $this->Setting('assets_host', '/', true);
return $this->success(['url' => $cdn . $filePath]);
} catch (\think\exception\ValidateException $e) {
// 验证失败,给出错误提示
// ...
}
}
return $this->error('上传失败');
}
function AdminUpload(): \think\response\Json
{
$this->getAdmin();
$file = $this->request->file('file');
if (empty($file)) {
return $this->error('not File');
}
if ($file->getSize() > 1024 * 1024 * 5) {
return $this->error('max fileSize is 5M');
}
// 验证文件并保存
try {
// 构建保存路径
$savePath = '/images/' . date('Y/m/d');
$hash = Str::random(32);
$fileName = $hash . '.' . $file->getOriginalExtension();
$filePath = Filesystem::disk('images')->putFileAs($savePath, $file, $fileName);
$cdn = $this->Setting('assets_host', '/', true);
return $this->success(['url' => $cdn . $filePath]);
} catch (\think\exception\ValidateException $e) {
// 验证失败,给出错误提示
// ...
}
return $this->error('上传失败');
}
function refresh(): \think\response\Json
{
$user = $this->getUser();
if ($user) {
$data = [];
$data['link_update_time'] = LinkModel::where("user_id", $user['user_id'])->value("update_time");
return $this->success("ok", $data);
}
return $this->error("not login");
}
}