From 361963711eb4d6f52fc381224d17273936adfd59 Mon Sep 17 00:00:00 2001 From: whyour Date: Wed, 17 Mar 2021 20:43:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0cookie=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E6=96=87=E4=BB=B6=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/api/config.ts | 24 ++++++ back/api/cookie.ts | 21 ++++- back/config/index.ts | 5 ++ back/services/cookie.ts | 16 +++- src/pages/code/index.tsx | 17 ---- src/pages/cookie/index.tsx | 162 ++++++++++++++++++++++--------------- 6 files changed, 156 insertions(+), 89 deletions(-) diff --git a/back/api/config.ts b/back/api/config.ts index a8168937..0e0a3258 100644 --- a/back/api/config.ts +++ b/back/api/config.ts @@ -3,6 +3,8 @@ import { Router, Request, Response, NextFunction } from 'express'; import { Container } from 'typedi'; import { Logger } from 'winston'; import config from '../config'; +import * as fs from 'fs'; +import { celebrate, Joi } from 'celebrate'; const route = Router(); export default (app: Router) => { @@ -40,4 +42,26 @@ export default (app: Router) => { } }, ); + + route.post( + '/save', + celebrate({ + body: Joi.object({ + name: Joi.string().required(), + content: Joi.string().required(), + }), + }), + async (req: Request, res: Response, next: NextFunction) => { + const logger: Logger = Container.get('logger'); + try { + const { name, content } = req.body; + const path = (config.fileMap as any)[name]; + fs.writeFileSync(path, content); + res.send({ code: 200, msg: '保存成功' }); + } catch (e) { + logger.error('🔥 error: %o', e); + return next(e); + } + }, + ); }; diff --git a/back/api/cookie.ts b/back/api/cookie.ts index 5aa1b099..c9ec7fe0 100644 --- a/back/api/cookie.ts +++ b/back/api/cookie.ts @@ -1,10 +1,7 @@ import { Router, Request, Response, NextFunction } from 'express'; import { Container } from 'typedi'; import CookieService from '../services/cookie'; -import { celebrate, Joi } from 'celebrate'; import { Logger } from 'winston'; -import { getFileContentByName } from '../config/util'; -import config from '../config'; const route = Router(); export default (app: Router) => { @@ -49,7 +46,23 @@ export default (app: Router) => { const logger: Logger = Container.get('logger'); try { const cookieService = Container.get(CookieService); - const data = await cookieService.addCookie(); + const data = await cookieService.addCookie(req.query.cookie as string); + return res.send({ code: 200, data }); + } catch (e) { + logger.error('🔥 error: %o', e); + return next(e); + } + }, + ); + + route.post( + '/cookie/refresh', + async (req: Request, res: Response, next: NextFunction) => { + const logger: Logger = Container.get('logger'); + try { + const cookieService = Container.get(CookieService); + console.log(req); + const data = await cookieService.refreshCookie(req.body); return res.send({ code: 200, data }); } catch (e) { logger.error('🔥 error: %o', e); diff --git a/back/config/index.ts b/back/config/index.ts index 48a9e867..9fdf8aeb 100644 --- a/back/config/index.ts +++ b/back/config/index.ts @@ -41,4 +41,9 @@ export default { crontabFile, sampleFile, confFile, + fileMap: { + 'config.sh': confFile, + 'crontab.list': crontabFile, + 'diy.sh': diyFile, + }, }; diff --git a/back/services/cookie.ts b/back/services/cookie.ts index 7aa36c82..6b1f584b 100644 --- a/back/services/cookie.ts +++ b/back/services/cookie.ts @@ -159,13 +159,13 @@ export default class CookieService { return userCookie; } - public async addCookie() { + public async addCookie(oldCookie: string) { const res: any = await this.checkLogin(); if (res.body.errcode === 0) { let ucookie = this.getCookie(res); let content = getFileContentByName(config.confFile); const regx = /.*Cookie[0-9]{1}\=\"(.+?)\"/g; - const lastCookie = (content.match(regx) as any[]).pop(); + const lastCookie = oldCookie || (content.match(regx) as any[]).pop(); const cookieRegx = /Cookie([0-9]+)\=.+?/.exec(lastCookie); if (cookieRegx) { const num = parseInt(cookieRegx[1]) + 1; @@ -246,6 +246,17 @@ export default class CookieService { return result; } + public async refreshCookie(body: any) { + const { cookie } = body; + const { nickname, status } = await this.getJdInfo(cookie); + return { + pin: cookie.match(/pt_pin=(.+?);/)[1], + cookie, + status, + nickname: nickname, + }; + } + private getJdInfo(cookie: string) { return fetch( `https://me-api.jd.com/user_new/info/GetJDUserInfoUnion?orgFlag=JD_PinGou_New&callSource=mainorder&channel=4&isHomewhite=0&sceneval=2&_=${Date.now()}&sceneval=2&g_login_type=1&g_ty=ls`, @@ -266,7 +277,6 @@ export default class CookieService { ) .then((x) => x.json()) .then((x) => { - console.log(x.data.userInfo); if (x.retcode === '0' && x.data && x.data.userInfo) { return { nickname: x.data.userInfo.baseInfo.nickname, status: 0 }; } else if (x.retcode === 13) { diff --git a/src/pages/code/index.tsx b/src/pages/code/index.tsx index a206f3a2..c33988fd 100644 --- a/src/pages/code/index.tsx +++ b/src/pages/code/index.tsx @@ -22,18 +22,6 @@ const Crontab = () => { .finally(() => setLoading(false)); }; - const updateConfig = () => { - request - .post(`${config.apiPrefix}save`, { - data: { content: value, name: 'diy.sh' }, - }) - .then((data) => { - notification.success({ - message: data.msg, - }); - }); - }; - useEffect(() => { if (document.body.clientWidth < 768) { setWdith('auto'); @@ -52,11 +40,6 @@ const Crontab = () => { className="code-mirror-wrapper" title="互助码" loading={loading} - extra={[ - , - ]} header={{ style: { padding: '4px 16px 4px 15px', diff --git a/src/pages/cookie/index.tsx b/src/pages/cookie/index.tsx index 4726d074..d2c86057 100644 --- a/src/pages/cookie/index.tsx +++ b/src/pages/cookie/index.tsx @@ -16,67 +16,75 @@ enum StatusColor { 'warning', } -const columns = [ - { - title: '用户名', - dataIndex: 'pin', - key: 'pin', - align: 'center' as const, - render: (text: string, record: any) => { - return {decodeURIComponent(text)}; - }, - }, - { - title: '昵称', - dataIndex: 'nickname', - key: 'nickname', - align: 'center' as const, - }, - { - title: '值', - dataIndex: 'cookie', - key: 'cookie', - align: 'center' as const, - render: (text: string, record: any) => { - return ( - - {text} - - ); - }, - }, - { - title: '状态', - key: 'status', - dataIndex: 'status', - align: 'center' as const, - render: (text: string, record: any) => { - return ( - - {Status[record.status]} - - ); - }, - }, - { - title: '操作', - key: 'action', - render: (text: string, record: any) => ( - - Invite {record.name} - Delete - - ), - }, -]; - const Config = () => { + const columns = [ + { + title: '用户名', + dataIndex: 'pin', + key: 'pin', + align: 'center' as const, + render: (text: string, record: any) => { + return {decodeURIComponent(text)}; + }, + }, + { + title: '昵称', + dataIndex: 'nickname', + key: 'nickname', + align: 'center' as const, + }, + { + title: '值', + dataIndex: 'cookie', + key: 'cookie', + align: 'center' as const, + width: '50%', + render: (text: string, record: any) => { + return ( + + {text} + + ); + }, + }, + { + title: '状态', + key: 'status', + dataIndex: 'status', + align: 'center' as const, + render: (text: string, record: any) => { + return ( + + + {Status[record.status]} + + + ); + }, + }, + { + title: '操作', + key: 'action', + align: 'center' as const, + render: (text: string, record: any, index: number) => ( + + {record.status === 0 && -} + {record.status === 1 && ( + reacquire(record)}>重新获取 + )} + {record.status === 2 && ( + refreshStatus(record, index)}>刷新状态 + )} + + ), + }, + ]; const [width, setWdith] = useState('100%'); const [marginLeft, setMarginLeft] = useState(0); const [marginTop, setMarginTop] = useState(-72); @@ -109,7 +117,7 @@ const Config = () => { return new Promise((resolve) => setTimeout(resolve, time)); } - const showQrCode = () => { + const showQrCode = (oldCookie?: string) => { request.get(`${config.apiPrefix}qrcode`).then(async (data) => { if (data.qrcode) { const modal = Modal.info({ @@ -135,18 +143,21 @@ const Config = () => { ), }); - getCookie(modal); + getCookie(modal, oldCookie); } else { notification.error({ message: '获取二维码失败' }); } }); }; - const getCookie = async (modal: { destroy: () => void }) => { + const getCookie = async ( + modal: { destroy: () => void }, + oldCookie: string = '', + ) => { for (let i = 0; i < 50; i++) { const { data: { cookie, errcode, message }, - } = await request.get(`${config.apiPrefix}cookie`); + } = await request.get(`${config.apiPrefix}cookie?cookie=${oldCookie}`); if (cookie) { notification.success({ message: 'Cookie获取成功', @@ -166,6 +177,26 @@ const Config = () => { } }; + const reacquire = async (record: any) => { + await showQrCode(record.cookie); + }; + + const refreshStatus = (record: any, index: number) => { + request + .post(`${config.apiPrefix}cookie/refresh`, { + data: { cookie: record.cookie }, + }) + .then(async (data: any) => { + if (data.data && data.data.cookie) { + (value as any).splice(index, 1, data.data); + setValue([...(value as any)] as any); + notification.success({ message: '更新状态成功' }); + } else { + notification.error({ message: '更新状态失败' }); + } + }); + }; + useEffect(() => { if (document.body.clientWidth < 768) { setWdith('auto'); @@ -185,7 +216,7 @@ const Config = () => { title="Cookie管理" loading={loading} extra={[ - , ]} @@ -212,6 +243,7 @@ const Config = () => { rowKey="pin" size="middle" bordered + scroll={{ x: '100%' }} /> );