diff --git a/app/Http/Controllers/SakaiController.php b/app/Http/Controllers/SakaiController.php
index 073b2b13..5b296dfb 100755
--- a/app/Http/Controllers/SakaiController.php
+++ b/app/Http/Controllers/SakaiController.php
@@ -31,8 +31,10 @@ class SakaiController
// echo 111;
// exit;
- $oReportUmami = new ReportUmami();
- $oReportUmami->handle();
+// $oReportUmami = new ReportUmami();
+// $oReportUmami->handle();
+
+ (new ReportUmami())->handle();
exit;
diff --git a/app/Services/Cron.php b/app/Services/Cron.php
index 18ae33fa..29463537 100755
--- a/app/Services/Cron.php
+++ b/app/Services/Cron.php
@@ -20,6 +20,7 @@ use App\Services\Cron\FnSitePublish as CronFnSitePublish;
use App\Services\Cron\NasaTestFnSubfile;
use App\Services\Cron\ShadowRocketCrawl;
use App\Services\Cron\ShadowRocketPublish;
+use App\Services\Cron\ReportUmami;
final class Cron
{
@@ -44,8 +45,13 @@ final class Cron
echo "cron开始执行 \n";
+ if ($h === 8 && $i === 3) {
+ (new ReportUmami())->handle();
+ }
+
if ($h % 8 === 0 && $i === 3) {
CronBook::randbox_notify(); // note提醒
+ (new ReportUmami())->handle();
}
if ($h % 4 === 0 && $i === 3) {
diff --git a/app/Services/Cron/ReportUmami.php b/app/Services/Cron/ReportUmami.php
index b707f4ec..ce29c382 100755
--- a/app/Services/Cron/ReportUmami.php
+++ b/app/Services/Cron/ReportUmami.php
@@ -12,12 +12,14 @@ use App\Services\TomTool\Telegram\Slave as TeleSlave;
final class ReportUmami
{
private string $baseUrl;
- private string $username = 'admin';
- private string $password = 'taonihouzi#';
+ private string $username;
+ private string $password;
public function __construct()
{
- $this->baseUrl = (string) config('path.url_umami_base');
+ $this->baseUrl = (string) "https://".config('path.url_umami_base');
+ $this->username = (string) config('key.umami_user');
+ $this->password = (string) config('key.umami_pass');
}
/**
@@ -28,55 +30,59 @@ final class ReportUmami
try {
// 1. 获取 API 认证 Token
$token = $this->getAuthToken();
+
if (!$token) {
- TeleSlave::log()->send("⚠️ [Umami 报表失败]: 无法获取 Auth Token,请检查账号密码。");
+ TeleSlave::log()->enableDetail(false)->send("⚠️ [Umami 报表失败]: 无法获取 Auth Token,请检查账号密码。");
return;
}
// 2. 获取网站列表
$websites = $this->getWebsites($token);
if (empty($websites)) {
- TeleSlave::log()->send("ℹ️ [Umami 报表]: 数据库中未找到任何网站。");
+ TeleSlave::log()->enableDetail(false)->send("ℹ️ [Umami 报表]: 数据库中未找到任何网站。");
return;
}
// 3. 统计过去 24 小时的数据
- $endAt = microtime(true) * 1000; // 当前时间戳 (毫秒)
- $startAt = $endAt - (24 * 3600 * 1000); // 24小时前的时间戳 (毫秒)
-
- $msg = "📊 Umami 每日站点数据日报\n";
- $msg .= "----------------------------\n";
+ $endAt = (int) (microtime(true) * 1000); // 当前时间戳 (毫秒)
+ $startAt = $endAt - (24 * 3600 * 1000); // 24小时前的时间戳 (毫秒)
foreach ($websites as $site) {
- $siteId = $site['id'];
- $siteName = $site['name'];
- $domain = $site['domain'] ?? '';
+
+ $siteId = $site['id'] ?? '';
+ $siteName = $site['name'] ?? '未命名站点';
+ $domain = $site['domain'] ?? '';
+
+ if (!$siteId) {
+ continue;
+ }
// 获取单个网站的统计指标
- $stats = $this->getWebsiteStats($token, $siteId, (int)$startAt, (int)$endAt);
-
+ $stats = $this->getWebsiteStats($token, $siteId, $startAt, $endAt);
+
if ($stats) {
- $pageviews = $stats['pageviews']['value'] ?? 0;
- $visitors = $stats['visitors']['value'] ?? 0;
- $visits = $stats['visits']['value'] ?? 0;
- $bounces = $stats['bounces']['value'] ?? 0;
+ // 对齐结构:直接获取 int 值
+ $pageviews = $stats['pageviews'] ?? 0;
+ $pageviewsPrev = $stats['comparison']['pageviews'] ?? 0;
+ $visitors = $stats['visitors'] ?? 0;
+ $visits = $stats['visits'] ?? 0;
+ $bounces = $stats['bounces'] ?? 0;
// 计算跳出率
$bounceRate = $visits > 0 ? round(($bounces / $visits) * 100, 1) : 0;
- $msg .= "🌐 {$siteName} ({$domain})\n";
- $msg .= "├ 👁️ 页面浏览 (PV): {$pageviews}\n";
- $msg .= "├ 👤 独立访客 (UV): {$visitors}\n";
- $msg .= "├ 🔄 会话次数: {$visits}\n";
- $msg .= "└ 📉 跳出率: {$bounceRate}%\n\n";
+ $msg = "\n\n======= 📊 访客统计:{$domain} ===================";
+ $msg .= "\n- 今日:{$pageviews}";
+ $msg .= "\n- 昨日:{$pageviewsPrev}";
+
}
}
// 4. 发送日志至 Telegram
- TeleSlave::log()->send($msg);
+ TeleSlave::log()->enableDetail(false)->send($msg);
} catch (\Throwable $e) {
- TeleSlave::log()->send("❌ [Umami 报表异常]: " . $e->getMessage());
+ TeleSlave::log()->enableDetail(false)->send("❌ [Umami 报表异常]: " . $e->getMessage());
}
}
@@ -99,7 +105,13 @@ final class ReportUmami
private function getWebsites(string $token): array
{
$response = $this->curlRequest('GET', '/api/websites', [], $token);
- return $response['data'] ?? $response ?? [];
+
+ // Umami 2.x API 网站列表格式通常包含在 data 字段中
+ if (isset($response['data']) && is_array($response['data'])) {
+ return $response['data'];
+ }
+
+ return is_array($response) ? $response : [];
}
/**
@@ -115,8 +127,8 @@ final class ReportUmami
* 通用 cURL 请求工具方法
*/
private function curlRequest(string $method, string $path, array $data = [], ?string $token = null): ?array
- { organize:
- $ch = curl_init($this->baseUrl . $path);
+ {
+ $ch = curl_init(rtrim($this->baseUrl, '/') . $path);
$headers = [
'Content-Type: application/json',
diff --git a/app/Services/TomTool/Telegram/Slave.php b/app/Services/TomTool/Telegram/Slave.php
index 75dc21b3..716dd6b3 100755
--- a/app/Services/TomTool/Telegram/Slave.php
+++ b/app/Services/TomTool/Telegram/Slave.php
@@ -285,7 +285,12 @@ class Slave
throw new \Exception("未设置env的url_master_base");
}
- $sUrlMasterPost = "https://".$sUrlMaSterBase."/api/telegram/post";
+ $h = "https://";
+ if ($sUrlMaSterBase == "dd.loc") {
+ $h = "http://";
+ }
+
+ $sUrlMasterPost = $h.$sUrlMaSterBase."/api/telegram/post";
try {
diff --git a/config/key.php b/config/key.php
new file mode 100755
index 00000000..abfccdc8
--- /dev/null
+++ b/config/key.php
@@ -0,0 +1,6 @@
+ 'admin',
+ "umami_pass" => 'taonihouzi#'
+];