增加TG代理选项

This commit is contained in:
Shinku
2026-03-20 00:57:40 +08:00
parent ee6eeaddeb
commit 54203d64a3
4 changed files with 56 additions and 20 deletions
+1
View File
@@ -73,6 +73,7 @@ export function buildConfig(env: NodeJS.ProcessEnv) {
telegramApiBaseUrl: 'https://api.telegram.org', telegramApiBaseUrl: 'https://api.telegram.org',
telegramBotToken: env.TELEGRAM_BOT_TOKEN || '', telegramBotToken: env.TELEGRAM_BOT_TOKEN || '',
telegramChatId: env.TELEGRAM_CHAT_ID || '', telegramChatId: env.TELEGRAM_CHAT_ID || '',
telegramUseSystemProxy: parseBoolean(env.TELEGRAM_USE_SYSTEM_PROXY, false),
smtpEnabled: parseBoolean(env.SMTP_ENABLED, false), smtpEnabled: parseBoolean(env.SMTP_ENABLED, false),
smtpHost: env.SMTP_HOST || '', smtpHost: env.SMTP_HOST || '',
smtpPort: parseInt(env.SMTP_PORT || '587'), smtpPort: parseInt(env.SMTP_PORT || '587'),
+17 -2
View File
@@ -1,4 +1,4 @@
import { FastifyInstance } from 'fastify'; import { FastifyInstance } from 'fastify';
import cron from 'node-cron'; import cron from 'node-cron';
import { config } from '../../config.js'; import { config } from '../../config.js';
import { db, runtimeDbDialect, schema } from '../../db/index.js'; import { db, runtimeDbDialect, schema } from '../../db/index.js';
@@ -43,6 +43,7 @@ interface RuntimeSettingsBody {
telegramApiBaseUrl?: string; telegramApiBaseUrl?: string;
telegramBotToken?: string; telegramBotToken?: string;
telegramChatId?: string; telegramChatId?: string;
telegramUseSystemProxy?: boolean;
smtpEnabled?: boolean; smtpEnabled?: boolean;
smtpHost?: string; smtpHost?: string;
smtpPort?: number; smtpPort?: number;
@@ -288,6 +289,10 @@ function applyImportedSettingToRuntime(key: string, value: unknown) {
config.telegramChatId = value.trim(); config.telegramChatId = value.trim();
return; return;
} }
case 'telegram_use_system_proxy': {
config.telegramUseSystemProxy = !!value;
return;
}
case 'smtp_enabled': { case 'smtp_enabled': {
config.smtpEnabled = !!value; config.smtpEnabled = !!value;
return; return;
@@ -380,6 +385,7 @@ function getRuntimeSettingsResponse(currentAdminIp = '') {
telegramApiBaseUrl: config.telegramApiBaseUrl, telegramApiBaseUrl: config.telegramApiBaseUrl,
telegramBotTokenMasked: maskSecret(config.telegramBotToken), telegramBotTokenMasked: maskSecret(config.telegramBotToken),
telegramChatId: config.telegramChatId, telegramChatId: config.telegramChatId,
telegramUseSystemProxy: config.telegramUseSystemProxy,
smtpEnabled: config.smtpEnabled, smtpEnabled: config.smtpEnabled,
smtpHost: config.smtpHost, smtpHost: config.smtpHost,
smtpPort: config.smtpPort, smtpPort: config.smtpPort,
@@ -512,7 +518,8 @@ export async function settingsRoutes(app: FastifyInstance) {
const telegramTouched = body.telegramEnabled !== undefined const telegramTouched = body.telegramEnabled !== undefined
|| body.telegramApiBaseUrl !== undefined || body.telegramApiBaseUrl !== undefined
|| body.telegramBotToken !== undefined || body.telegramBotToken !== undefined
|| body.telegramChatId !== undefined; || body.telegramChatId !== undefined
|| body.telegramUseSystemProxy !== undefined;
const nextTelegramEnabled = body.telegramEnabled !== undefined const nextTelegramEnabled = body.telegramEnabled !== undefined
? !!body.telegramEnabled ? !!body.telegramEnabled
: config.telegramEnabled; : config.telegramEnabled;
@@ -768,6 +775,14 @@ export async function settingsRoutes(app: FastifyInstance) {
upsertSetting('telegram_chat_id', config.telegramChatId); upsertSetting('telegram_chat_id', config.telegramChatId);
} }
if (body.telegramUseSystemProxy !== undefined) {
if (!!body.telegramUseSystemProxy !== config.telegramUseSystemProxy) {
changedLabels.push('Telegram 使用系统代理');
}
config.telegramUseSystemProxy = !!body.telegramUseSystemProxy;
upsertSetting('telegram_use_system_proxy', config.telegramUseSystemProxy);
}
if (body.smtpEnabled !== undefined) { if (body.smtpEnabled !== undefined) {
if (!!body.smtpEnabled !== config.smtpEnabled) { if (!!body.smtpEnabled !== config.smtpEnabled) {
changedLabels.push('SMTP 开关'); changedLabels.push('SMTP 开关');
+14 -9
View File
@@ -1,5 +1,6 @@
import { fetch } from 'undici'; import { fetch } from 'undici';
import { config } from '../config.js'; import { config } from '../config.js';
import { withExplicitProxyRequestInit } from './siteProxy.js';
import nodemailer, { type Transporter } from 'nodemailer'; import nodemailer, { type Transporter } from 'nodemailer';
import { import {
createNotificationSignature, createNotificationSignature,
@@ -224,15 +225,19 @@ export async function sendNotification(
tasks.push({ tasks.push({
channel: 'telegram', channel: 'telegram',
run: async () => { run: async () => {
const response = await fetch(telegramApiUrl, { const telegramRequestInit = withExplicitProxyRequestInit(
method: 'POST', config.telegramUseSystemProxy ? config.systemProxyUrl : null,
headers: { 'Content-Type': 'application/json' }, {
body: JSON.stringify({ method: 'POST',
chat_id: config.telegramChatId, headers: { 'Content-Type': 'application/json' },
text, body: JSON.stringify({
disable_web_page_preview: true, chat_id: config.telegramChatId,
}), text,
}); disable_web_page_preview: true,
}),
},
);
const response = await fetch(telegramApiUrl, telegramRequestInit);
if (!response.ok) { if (!response.ok) {
throw new Error(`Telegram 响应状态 ${response.status}`); throw new Error(`Telegram 响应状态 ${response.status}`);
} }
+24 -9
View File
@@ -12,6 +12,7 @@ type RuntimeSettings = {
telegramEnabled: boolean; telegramEnabled: boolean;
telegramApiBaseUrl: string; telegramApiBaseUrl: string;
telegramChatId: string; telegramChatId: string;
telegramUseSystemProxy: boolean;
smtpEnabled: boolean; smtpEnabled: boolean;
smtpHost: string; smtpHost: string;
smtpPort: number; smtpPort: number;
@@ -35,6 +36,7 @@ export default function NotificationSettings() {
telegramEnabled: false, telegramEnabled: false,
telegramApiBaseUrl: 'https://api.telegram.org', telegramApiBaseUrl: 'https://api.telegram.org',
telegramChatId: '', telegramChatId: '',
telegramUseSystemProxy: false,
smtpEnabled: false, smtpEnabled: false,
smtpHost: '', smtpHost: '',
smtpPort: 587, smtpPort: 587,
@@ -78,6 +80,7 @@ export default function NotificationSettings() {
telegramEnabled: !!runtimeInfo.telegramEnabled, telegramEnabled: !!runtimeInfo.telegramEnabled,
telegramApiBaseUrl: runtimeInfo.telegramApiBaseUrl || 'https://api.telegram.org', telegramApiBaseUrl: runtimeInfo.telegramApiBaseUrl || 'https://api.telegram.org',
telegramChatId: runtimeInfo.telegramChatId || '', telegramChatId: runtimeInfo.telegramChatId || '',
telegramUseSystemProxy: !!runtimeInfo.telegramUseSystemProxy,
smtpEnabled: !!runtimeInfo.smtpEnabled, smtpEnabled: !!runtimeInfo.smtpEnabled,
smtpHost: runtimeInfo.smtpHost || '', smtpHost: runtimeInfo.smtpHost || '',
smtpPort: Number(runtimeInfo.smtpPort) || 587, smtpPort: Number(runtimeInfo.smtpPort) || 587,
@@ -115,6 +118,7 @@ export default function NotificationSettings() {
telegramEnabled: runtime.telegramEnabled, telegramEnabled: runtime.telegramEnabled,
telegramApiBaseUrl: runtime.telegramApiBaseUrl, telegramApiBaseUrl: runtime.telegramApiBaseUrl,
telegramChatId: runtime.telegramChatId, telegramChatId: runtime.telegramChatId,
telegramUseSystemProxy: runtime.telegramUseSystemProxy,
smtpEnabled: runtime.smtpEnabled, smtpEnabled: runtime.smtpEnabled,
smtpHost: runtime.smtpHost, smtpHost: runtime.smtpHost,
smtpPort: runtime.smtpPort, smtpPort: runtime.smtpPort,
@@ -317,15 +321,26 @@ export default function NotificationSettings() {
</div> </div>
</div> </div>
<label style={{ display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer' }}> <div style={{ display: 'flex', gap: 16 }}>
<span style={{ fontSize: 13, fontWeight: 500, color: runtime.telegramEnabled ? 'var(--color-primary)' : 'var(--color-text-muted)' }}>启用 Telegram</span> <label style={{ display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer' }}>
<input <span style={{ fontSize: 13, fontWeight: 500, color: runtime.telegramUseSystemProxy ? 'var(--color-primary)' : 'var(--color-text-muted)' }}>使用系统代理</span>
type="checkbox" <input
style={{ width: 16, height: 16, cursor: 'pointer' }} type="checkbox"
checked={runtime.telegramEnabled} style={{ width: 16, height: 16, cursor: 'pointer' }}
onChange={(e) => setRuntime((prev) => ({ ...prev, telegramEnabled: e.target.checked }))} checked={runtime.telegramUseSystemProxy}
/> onChange={(e) => setRuntime((prev) => ({ ...prev, telegramUseSystemProxy: e.target.checked }))}
</label> />
</label>
<label style={{ display: 'flex', alignItems: 'center', gap: 8, cursor: 'pointer' }}>
<span style={{ fontSize: 13, fontWeight: 500, color: runtime.telegramEnabled ? 'var(--color-primary)' : 'var(--color-text-muted)' }}>启用 Telegram</span>
<input
type="checkbox"
style={{ width: 16, height: 16, cursor: 'pointer' }}
checked={runtime.telegramEnabled}
onChange={(e) => setRuntime((prev) => ({ ...prev, telegramEnabled: e.target.checked }))}
/>
</label>
</div>
</div> </div>
<div style={{ display: 'grid', gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', gap: '16px 20px', opacity: runtime.telegramEnabled ? 1 : 0.6, transition: 'opacity 0.2s' }}> <div style={{ display: 'grid', gridTemplateColumns: 'minmax(0, 1fr) minmax(0, 1fr)', gap: '16px 20px', opacity: runtime.telegramEnabled ? 1 : 0.6, transition: 'opacity 0.2s' }}>