This commit is contained in:
丹尼尔
2026-03-10 16:44:07 +08:00
commit 36101a4405
10 changed files with 228 additions and 0 deletions

28
src/server.ts Normal file
View File

@@ -0,0 +1,28 @@
import express from 'express';
import cors from 'cors';
import morgan from 'morgan';
import dotenv from 'dotenv';
import { authRouter } from './wechatAuth';
dotenv.config();
const app = express();
app.use(cors());
app.use(express.json());
app.use(morgan('dev'));
app.get('/health', (_req, res) => {
res.json({ status: 'ok' });
});
app.use('/api/auth', authRouter);
const port = process.env.PORT || 3000;
app.listen(port, () => {
// eslint-disable-next-line no-console
console.log(`WeChat admin backend listening on port ${port}`);
});

100
src/wechatAuth.ts Normal file
View File

@@ -0,0 +1,100 @@
import express from 'express';
import axios from 'axios';
const router = express.Router();
const BASE_URL = process.env.WECHAT_UPSTREAM_BASE_URL || 'http://localhost:8080';
router.post('/qrcode', async (req, res) => {
const { key, proxy, ipadOrMac, check } = req.body as {
key: string;
proxy?: string;
ipadOrMac?: string;
check?: boolean;
};
if (!key) {
return res.status(400).json({ error: 'key is required' });
}
try {
const response = await axios.post(
`${BASE_URL}/login/GetLoginQrCodeNewDirect`,
{
Proxy: proxy ?? '',
IpadOrmac: ipadOrMac ?? '',
Check: check ?? false,
},
{ params: { key } },
);
return res.json(response.data);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error fetching login qrcode', err);
return res.status(502).json({ error: 'failed_to_get_qrcode' });
}
});
router.get('/status', async (req, res) => {
const { key } = req.query as { key?: string };
if (!key) {
return res.status(400).json({ error: 'key is required' });
}
try {
const response = await axios.get(`${BASE_URL}/login/GetLoginStatus`, {
params: { key },
});
return res.json(response.data);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error getting login status', err);
return res.status(502).json({ error: 'failed_to_get_status' });
}
});
router.get('/scan-status', async (req, res) => {
const { key } = req.query as { key?: string };
if (!key) {
return res.status(400).json({ error: 'key is required' });
}
try {
const response = await axios.get(`${BASE_URL}/login/CheckLoginStatus`, {
params: { key },
});
return res.json(response.data);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error checking scan status', err);
return res.status(502).json({ error: 'failed_to_check_scan_status' });
}
});
router.post('/logout', async (req, res) => {
const { key } = req.body as { key?: string };
if (!key) {
return res.status(400).json({ error: 'key is required' });
}
try {
const response = await axios.get(`${BASE_URL}/login/LogOut`, {
params: { key },
});
return res.json(response.data);
} catch (err) {
// eslint-disable-next-line no-console
console.error('Error logging out', err);
return res.status(502).json({ error: 'failed_to_logout' });
}
});
export const authRouter = router;