diff --git a/src/admin/controllers/game.controller.ts b/src/admin/controllers/game.controller.ts index bdbaa0b..efca350 100644 --- a/src/admin/controllers/game.controller.ts +++ b/src/admin/controllers/game.controller.ts @@ -5,20 +5,26 @@ import { Game } from '../../models/content/Game' import { generateQrFile } from '../../services/File' import { getInviteeNum } from '../../services/JCFW' import { UserItem } from '../../models/user/UserItem' +import { checkText } from '../../services/Baidu' +import { refreshToken } from '../../services/Wechat' class GameController extends BaseController { @role('anon') - @router('get /api/test') + @router('post /api/test') async test(req) { // let gameId = '60810dd156af0e8550832a44' // let version = '608117912ff0238a3e607d33' // let shop = 'sa6xtgbmj7' // const { file, url } = await generateQrFile({ gameId, version, shop }) // return { file, url } - let accountId = '7101_8004_opBlx1vRs-UIGF6rZDkkSrSTJYAs' - let sessionId = '1622783517_1556611531_60838f020d9c51716f144bf7a71b2af5_e5818d3fc90f8491aa285246cb6d85ce' - let result = await getInviteeNum(accountId, sessionId, [1001]) - return result + // let accountId = '7101_8004_opBlx1vRs-UIGF6rZDkkSrSTJYAs' + // let sessionId = '1622783517_1556611531_60838f020d9c51716f144bf7a71b2af5_e5818d3fc90f8491aa285246cb6d85ce' + // let result = await getInviteeNum(accountId, sessionId, [1001]) + // return result + const { txt } = req.params + // const res = await checkText(txt) + const token = await refreshToken('wxf8c3da4e7dfe00a2', '8c0a1e88a6b43e4be80ed6a597c0b047') + return { token } } @permission(['game:read', 'shop:game_setting']) @router('post /api/games') diff --git a/src/services/Baidu.ts b/src/services/Baidu.ts new file mode 100644 index 0000000..289a898 --- /dev/null +++ b/src/services/Baidu.ts @@ -0,0 +1,36 @@ +import axios from 'axios' + +let random = function (start, end) { + return (Math.random() * (end - start) + start) | 0 +} + +let getIp = function () { + return `${random(1, 254)}.${random(1, 254)}.${random(1, 254)}.${random(1, 254)}` +} + +export async function checkText(txt: string) { + let qs = require('qs') + const url = 'https://ai.baidu.com/aidemo' + let data: string = qs.stringify({ + content: txt, + type: 'textcensor', + apiType: 'censor', + }) + const useragent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${ + (70 + Math.random() * 10) | 0 + }.0.4324.${(Math.random() * 100) | 0} Safari/537.36` + let reqConfig: any = { + method: 'post', + url, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + referer: 'https://ai.baidu.com/tech/textcensoring', + 'User-Agent': useragent, + 'X-Forwarded-For': getIp(), + }, + responseType: 'json', + data: data, + } + const res = await axios(reqConfig) + return res +} diff --git a/src/services/Wechat.ts b/src/services/Wechat.ts index 348adf8..292c016 100644 --- a/src/services/Wechat.ts +++ b/src/services/Wechat.ts @@ -1,5 +1,6 @@ import axios, { AxiosRequestConfig } from 'axios' import fs from 'fs' +import { WxTokenCache } from './WxTokenCache' export async function generateQr({ appId, appSecret, scene, file }) { const stream = fs.createWriteStream(file) @@ -27,11 +28,19 @@ export async function generateQr({ appId, appSecret, scene, file }) { } export async function refreshToken(appId: string, appSecret: string) { + const util = new WxTokenCache() + let token = util.getToken(appId) + if (token) { + return token + } const link = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}` const { data } = await axios.get(link) if (!data.errcode) { + util.updateToken(appId, data.access_token, data.expires_in) return data.access_token } else { throw new Error(data.errmsg) } } + +export async function msgSecCheck(content: string) {} diff --git a/src/services/WxTokenCache.ts b/src/services/WxTokenCache.ts new file mode 100644 index 0000000..81bc10f --- /dev/null +++ b/src/services/WxTokenCache.ts @@ -0,0 +1,41 @@ +import { singleton } from '../decorators/singleton' + +export class WxTokenClass { + public token: string + public expire: number + + constructor(token: string, expire: number) { + this.token = token + this.expire = expire + } +} +/** + * 用于缓存所有题目的分类 + */ +@singleton +export class WxTokenCache { + private _cache: Map = new Map() + + /** + * 根据id获取分类名 + * @param {string} appId + * @return {string} + */ + public getToken(appId: string): string | null { + if (!this._cache.has(appId)) { + return null + } + let data = this._cache.get(appId) + if (data.expire - Date.now() < 10000) { + return null + } else { + return data.token + } + } + + public updateToken(appId: string, token: string, exptime: number) { + let expire = Date.now() + exptime * 1000 + let data = new WxTokenClass(token, expire) + this._cache.set(appId, data) + } +}