mirror of
https://github.com/shufflewzc/faker2.git
synced 2025-07-26 16:43:50 +00:00
Compare commits
6 Commits
f4bdff02b8
...
d986684f35
Author | SHA1 | Date | |
---|---|---|---|
d986684f35 | |||
a28ce66fc9 | |||
2b69813c63 | |||
c5f939d402 | |||
4f3a183cf3 | |||
f6e83cd492 |
@ -1,341 +0,0 @@
|
|||||||
import axios from "axios"
|
|
||||||
import {Md5} from "ts-md5"
|
|
||||||
import * as dotenv from "dotenv"
|
|
||||||
import {existsSync, readFileSync} from "fs"
|
|
||||||
import {sendNotify} from './sendNotify'
|
|
||||||
|
|
||||||
dotenv.config()
|
|
||||||
|
|
||||||
let fingerprint: string | number, token: string = '', enCryptMethodJD: any
|
|
||||||
|
|
||||||
const USER_AGENTS: Array<string> = [
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;android;10.0.2;9;network/4g;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79",
|
|
||||||
"jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;iPhone;10.0.2;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
"jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36",
|
|
||||||
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36",
|
|
||||||
"jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
|
|
||||||
]
|
|
||||||
|
|
||||||
function TotalBean(cookie: string) {
|
|
||||||
return {
|
|
||||||
cookie: cookie,
|
|
||||||
isLogin: true,
|
|
||||||
nickName: ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRandomNumberByRange(start: number, end: number) {
|
|
||||||
end <= start && (end = start + 100)
|
|
||||||
return Math.floor(Math.random() * (end - start) + start)
|
|
||||||
}
|
|
||||||
|
|
||||||
let USER_AGENT = USER_AGENTS[getRandomNumberByRange(0, USER_AGENTS.length)]
|
|
||||||
|
|
||||||
async function getBeanShareCode(cookie: string) {
|
|
||||||
let {data}: any = await axios.post('https://api.m.jd.com/client.action',
|
|
||||||
`functionId=plantBeanIndex&body=${encodeURIComponent(
|
|
||||||
JSON.stringify({version: "9.0.0.1", "monitor_source": "plant_app_plant_index", "monitor_refer": ""})
|
|
||||||
)}&appid=ld&client=apple&area=5_274_49707_49973&build=167283&clientVersion=9.1.0`, {
|
|
||||||
headers: {
|
|
||||||
Cookie: cookie,
|
|
||||||
Host: "api.m.jd.com",
|
|
||||||
Accept: "*/*",
|
|
||||||
Connection: "keep-alive",
|
|
||||||
"User-Agent": USER_AGENT
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (data.data?.jwordShareInfo?.shareUrl)
|
|
||||||
return data.data.jwordShareInfo.shareUrl.split('Uuid=')![1]
|
|
||||||
else
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getFarmShareCode(cookie: string) {
|
|
||||||
let {data}: any = await axios.post('https://api.m.jd.com/client.action?functionId=initForFarm', `body=${encodeURIComponent(JSON.stringify({"version": 4}))}&appid=wh5&clientVersion=9.1.0`, {
|
|
||||||
headers: {
|
|
||||||
"cookie": cookie,
|
|
||||||
"origin": "https://home.m.jd.com",
|
|
||||||
"referer": "https://home.m.jd.com/myJd/newhome.action",
|
|
||||||
"User-Agent": USER_AGENT,
|
|
||||||
"Content-Type": "application/x-www-form-urlencoded"
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
if (data.farmUserPro)
|
|
||||||
return data.farmUserPro.shareCode
|
|
||||||
else
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
|
|
||||||
async function requireConfig(check: boolean = false): Promise<string[]> {
|
|
||||||
let cookiesArr: string[] = []
|
|
||||||
const jdCookieNode = require('../jdCookie.js')
|
|
||||||
let keys: string[] = Object.keys(jdCookieNode)
|
|
||||||
for (let i = 0; i < keys.length; i++) {
|
|
||||||
let cookie = jdCookieNode[keys[i]]
|
|
||||||
if (!check) {
|
|
||||||
cookiesArr.push(cookie)
|
|
||||||
} else {
|
|
||||||
if (await checkCookie(cookie)) {
|
|
||||||
cookiesArr.push(cookie)
|
|
||||||
} else {
|
|
||||||
let username = decodeURIComponent(jdCookieNode[keys[i]].match(/pt_pin=([^;]*)/)![1])
|
|
||||||
console.log('Cookie失效', username)
|
|
||||||
await sendNotify('Cookie失效', '【京东账号】' + username)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log(`共${cookiesArr.length}个京东账号\n`)
|
|
||||||
return cookiesArr
|
|
||||||
}
|
|
||||||
|
|
||||||
async function checkCookie(cookie) {
|
|
||||||
await wait(1000)
|
|
||||||
try {
|
|
||||||
let {data}: any = await axios.get(`https://api.m.jd.com/client.action?functionId=GetJDUserInfoUnion&appid=jd-cphdeveloper-m&body=${encodeURIComponent(JSON.stringify({"orgFlag": "JD_PinGou_New", "callSource": "mainorder", "channel": 4, "isHomewhite": 0, "sceneval": 2}))}&loginType=2&_=${Date.now()}&sceneval=2&g_login_type=1&callback=GetJDUserInfoUnion&g_ty=ls`, {
|
|
||||||
headers: {
|
|
||||||
'authority': 'api.m.jd.com',
|
|
||||||
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
|
|
||||||
'referer': 'https://home.m.jd.com/',
|
|
||||||
'cookie': cookie
|
|
||||||
}
|
|
||||||
})
|
|
||||||
data = JSON.parse(data.match(/GetJDUserInfoUnion\((.*)\)/)[1])
|
|
||||||
return data.retcode === '0';
|
|
||||||
} catch (e) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function wait(timeout: number) {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
setTimeout(resolve, timeout)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
async function requestAlgo(appId: number = 10032) {
|
|
||||||
fingerprint = generateFp()
|
|
||||||
return new Promise<void>(async resolve => {
|
|
||||||
let {data}: any = await axios.post('https://cactus.jd.com/request_algo?g_ty=ajax', {
|
|
||||||
"version": "1.0",
|
|
||||||
"fp": fingerprint,
|
|
||||||
"appId": appId,
|
|
||||||
"timestamp": Date.now(),
|
|
||||||
"platform": "web",
|
|
||||||
"expandParams": ""
|
|
||||||
}, {
|
|
||||||
"headers": {
|
|
||||||
'Authority': 'cactus.jd.com',
|
|
||||||
'Pragma': 'no-cache',
|
|
||||||
'Cache-Control': 'no-cache',
|
|
||||||
'Accept': 'application/json',
|
|
||||||
'User-Agent': USER_AGENT,
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Origin': 'https://st.jingxi.com',
|
|
||||||
'Sec-Fetch-Site': 'cross-site',
|
|
||||||
'Sec-Fetch-Mode': 'cors',
|
|
||||||
'Sec-Fetch-Dest': 'empty',
|
|
||||||
'Referer': 'https://st.jingxi.com/',
|
|
||||||
'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7'
|
|
||||||
},
|
|
||||||
})
|
|
||||||
if (data['status'] === 200) {
|
|
||||||
token = data.data.result.tk
|
|
||||||
let enCryptMethodJDString = data.data.result.algo
|
|
||||||
if (enCryptMethodJDString) enCryptMethodJD = new Function(`return ${enCryptMethodJDString}`)()
|
|
||||||
} else {
|
|
||||||
console.log(`fp: ${fingerprint}`)
|
|
||||||
console.log('request_algo 签名参数API请求失败:')
|
|
||||||
}
|
|
||||||
resolve()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateFp() {
|
|
||||||
let e = "0123456789"
|
|
||||||
let a = 13
|
|
||||||
let i = ''
|
|
||||||
for (; a--;)
|
|
||||||
i += e[Math.random() * e.length | 0]
|
|
||||||
return (i + Date.now()).slice(0, 16)
|
|
||||||
}
|
|
||||||
|
|
||||||
function getJxToken(cookie: string, phoneId: string = '') {
|
|
||||||
function generateStr(input: number) {
|
|
||||||
let src = 'abcdefghijklmnopqrstuvwxyz1234567890'
|
|
||||||
let res = ''
|
|
||||||
for (let i = 0; i < input; i++) {
|
|
||||||
res += src[Math.floor(src.length * Math.random())]
|
|
||||||
}
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!phoneId)
|
|
||||||
phoneId = generateStr(40)
|
|
||||||
let timestamp = Date.now().toString()
|
|
||||||
let nickname = cookie.match(/pt_pin=([^;]*)/)![1]
|
|
||||||
let jstoken = Md5.hashStr('' + decodeURIComponent(nickname) + timestamp + phoneId + 'tPOamqCuk9NLgVPAljUyIHcPRmKlVxDy')
|
|
||||||
return {
|
|
||||||
'strPgtimestamp': timestamp,
|
|
||||||
'strPhoneID': phoneId,
|
|
||||||
'strPgUUNum': jstoken
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function exceptCookie(filename: string = 'x.ts') {
|
|
||||||
let except: any = []
|
|
||||||
if (existsSync('./utils/exceptCookie.json')) {
|
|
||||||
try {
|
|
||||||
except = JSON.parse(readFileSync('./utils/exceptCookie.json').toString() || '{}')[filename] || []
|
|
||||||
} catch (e) {
|
|
||||||
console.log('./utils/exceptCookie.json JSON格式错误')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return except
|
|
||||||
}
|
|
||||||
|
|
||||||
function randomString(e: number, word?: number) {
|
|
||||||
e = e || 32
|
|
||||||
let t = word === 26 ? "012345678abcdefghijklmnopqrstuvwxyz" : "0123456789abcdef", a = t.length, n = ""
|
|
||||||
for (let i = 0; i < e; i++)
|
|
||||||
n += t.charAt(Math.floor(Math.random() * a))
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
function o2s(arr: object, title: string = '') {
|
|
||||||
title ? console.log(title, JSON.stringify(arr)) : console.log(JSON.stringify(arr))
|
|
||||||
}
|
|
||||||
|
|
||||||
function randomNumString(e: number) {
|
|
||||||
e = e || 32
|
|
||||||
let t = '0123456789', a = t.length, n = ""
|
|
||||||
for (let i = 0; i < e; i++)
|
|
||||||
n += t.charAt(Math.floor(Math.random() * a))
|
|
||||||
return n
|
|
||||||
}
|
|
||||||
|
|
||||||
function randomWord(n: number = 1) {
|
|
||||||
let t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', a = t.length
|
|
||||||
let rnd: string = ''
|
|
||||||
for (let i = 0; i < n; i++) {
|
|
||||||
rnd += t.charAt(Math.floor(Math.random() * a))
|
|
||||||
}
|
|
||||||
return rnd
|
|
||||||
}
|
|
||||||
|
|
||||||
function obj2str(obj: object) {
|
|
||||||
return JSON.stringify(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getDevice() {
|
|
||||||
let {data} = await axios.get('https://betahub.cn/api/apple/devices/iPhone', {
|
|
||||||
headers: {
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
data = data[getRandomNumberByRange(0, 16)]
|
|
||||||
return data.identifier
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getVersion(device: string) {
|
|
||||||
let {data} = await axios.get(`https://betahub.cn/api/apple/firmwares/${device}`, {
|
|
||||||
headers: {
|
|
||||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
data = data[getRandomNumberByRange(0, data.length)]
|
|
||||||
return data.firmware_info.version
|
|
||||||
}
|
|
||||||
|
|
||||||
async function jdpingou() {
|
|
||||||
let device: string, version: string;
|
|
||||||
device = await getDevice();
|
|
||||||
version = await getVersion(device);
|
|
||||||
return `jdpingou;iPhone;5.19.0;${version};${randomString(40)};network/wifi;model/${device};appBuild/100833;ADID/;supportApplePay/1;hasUPPay/0;pushNoticeIsOpen/0;hasOCPay/0;supportBestPay/0;session/${getRandomNumberByRange(10, 90)};pap/JA2019_3111789;brand/apple;supportJDSHWK/1;Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148`
|
|
||||||
}
|
|
||||||
|
|
||||||
function get(url: string, headers?: any): Promise<any> {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
axios.get(url, {
|
|
||||||
headers: headers
|
|
||||||
}).then(res => {
|
|
||||||
if (typeof res.data === 'string' && res.data.includes('jsonpCBK')) {
|
|
||||||
resolve(JSON.parse(res.data.match(/jsonpCBK.?\(([\w\W]*)\);?/)[1]))
|
|
||||||
} else {
|
|
||||||
resolve(res.data)
|
|
||||||
}
|
|
||||||
}).catch(err => {
|
|
||||||
reject({
|
|
||||||
code: err?.response?.status || -1,
|
|
||||||
msg: err?.response?.statusText || err.message || 'error'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function post(url: string, prarms?: string | object, headers?: any): Promise<any> {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
axios.post(url, prarms, {
|
|
||||||
headers: headers
|
|
||||||
}).then(res => {
|
|
||||||
resolve(res.data)
|
|
||||||
}).catch(err => {
|
|
||||||
reject({
|
|
||||||
code: err?.response?.status || -1,
|
|
||||||
msg: err?.response?.statusText || err.message || 'error'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export default USER_AGENT
|
|
||||||
export {
|
|
||||||
TotalBean,
|
|
||||||
getBeanShareCode,
|
|
||||||
getFarmShareCode,
|
|
||||||
requireConfig,
|
|
||||||
wait,
|
|
||||||
getRandomNumberByRange,
|
|
||||||
requestAlgo,
|
|
||||||
getJxToken,
|
|
||||||
randomString,
|
|
||||||
o2s,
|
|
||||||
randomNumString,
|
|
||||||
getShareCodePool,
|
|
||||||
randomWord,
|
|
||||||
obj2str,
|
|
||||||
jdpingou,
|
|
||||||
get,
|
|
||||||
post
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
@ -1,72 +0,0 @@
|
|||||||
import axios from "axios"
|
|
||||||
import {format} from "date-fns"
|
|
||||||
import * as CryptoJS from 'crypto-js'
|
|
||||||
|
|
||||||
class H5ST {
|
|
||||||
tk: string;
|
|
||||||
timestamp: string;
|
|
||||||
rd: string;
|
|
||||||
appId: string;
|
|
||||||
fp: string;
|
|
||||||
time: number;
|
|
||||||
ua: string
|
|
||||||
enc: string;
|
|
||||||
|
|
||||||
constructor(appId: string, ua: string, fp: string) {
|
|
||||||
this.appId = appId
|
|
||||||
this.ua = ua
|
|
||||||
this.fp = fp || this.__genFp()
|
|
||||||
}
|
|
||||||
|
|
||||||
__genFp() {
|
|
||||||
let e = "0123456789";
|
|
||||||
let a = 13;
|
|
||||||
let i = '';
|
|
||||||
for (; a--;)
|
|
||||||
i += e[Math.random() * e.length | 0];
|
|
||||||
return (i + Date.now()).slice(0, 16)
|
|
||||||
}
|
|
||||||
|
|
||||||
async __genAlgo() {
|
|
||||||
this.time = Date.now()
|
|
||||||
this.timestamp = format(this.time, "yyyyMMddHHmmssSSS")
|
|
||||||
let {data} = await axios.post(`https://cactus.jd.com/request_algo?g_ty=ajax`, {
|
|
||||||
'version': '3.0',
|
|
||||||
'fp': this.fp,
|
|
||||||
'appId': this.appId.toString(),
|
|
||||||
'timestamp': this.time,
|
|
||||||
'platform': 'web',
|
|
||||||
'expandParams': ''
|
|
||||||
}, {
|
|
||||||
headers: {
|
|
||||||
'Host': 'cactus.jd.com',
|
|
||||||
'accept': 'application/json',
|
|
||||||
'content-type': 'application/json',
|
|
||||||
'user-agent': this.ua,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.tk = data.data.result.tk
|
|
||||||
this.rd = data.data.result.algo.match(/rd='(.*)'/)[1]
|
|
||||||
this.enc = data.data.result.algo.match(/algo\.(.*)\(/)[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
__genKey(tk: string, fp: string, ts: string, ai: string, algo: object) {
|
|
||||||
let str = `${tk}${fp}${ts}${ai}${this.rd}`;
|
|
||||||
return algo[this.enc](str, tk)
|
|
||||||
}
|
|
||||||
|
|
||||||
__genH5st(body: object) {
|
|
||||||
let y = this.__genKey(this.tk, this.fp, this.timestamp, this.appId, CryptoJS).toString(CryptoJS.enc.Hex)
|
|
||||||
let s = ''
|
|
||||||
for (let key of Object.keys(body)) {
|
|
||||||
key === 'body' ? s += `${key}:${CryptoJS.SHA256(body[key]).toString(CryptoJS.enc.Hex)}&` : s += `${key}:${body[key]}&`
|
|
||||||
}
|
|
||||||
s = s.slice(0, -1)
|
|
||||||
s = CryptoJS.HmacSHA256(s, y).toString(CryptoJS.enc.Hex)
|
|
||||||
return encodeURIComponent(`${this.timestamp};${this.fp};${this.appId.toString()};${this.tk};${s};3.0;${this.time.toString()}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export {
|
|
||||||
H5ST
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
let logs = [
|
|
||||||
'"random":"34038984","log":"1649609592095~18RCD4zkS04d41d8cd98f00b204e9800998ecf8427e~1,1~E97F477EB64B001195F05A4D48067CD6C272595D~0doi8po~C~TRpGXBAPbWUeE0ZbWxoIam8ZFF9AXxAPBxQQQkEXDBoDBwYMAw8KBgcAAw4KAgEMABoeE0VQUhoIE0ZBQkxGV0dTFBQQRldUFAIQRVRBV01TRFMXGhpCVVwXDGMGHQIZBhQBHQAZB2UeE1hfFAIDHRBWRRoIEwVQUFpQAFABAAgEVAZTD1sGBwABUw9RCQMHDw1WCQAFFBQQX0IXDBp+WFxAThhKCQRqAAwQHRBBFAIQAAQBDw4CCAcMBAgLBBAZFFJZEwgXVxoeE1RFVBoIExAZFFZEEwgXcVddVl5QFnFcUhwXGhpcUEQXDBoLAwsGBRoeE0FWRBoIagQDARQBBgdoGhpAXhAPbRpTEx4XVxoeE1MXGhpTEx4XVxoeE1MXGhpTE28ZFFFdUBAPFF5UV1RTUExGEx4XV1IQCxBAFBQQUlsXDBpFAhwHGAwQHRBWUGdEEwgXBggQHRBXUhoIE0BUWFxdXA8GAggBCQsNAhoeE19fFAJpAR4FGghvHRBXWldVEwgXVxoeE19GURoIE1MXSw==~04y5u3i"',
|
|
||||||
|
|
||||||
|
|
||||||
]
|
|
||||||
|
|
||||||
export {
|
|
||||||
logs
|
|
||||||
}
|
|
File diff suppressed because one or more lines are too long
13
jd_20bean.js
Normal file
13
jd_20bean.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
449
magic.json
449
magic.json
@ -1,449 +0,0 @@
|
|||||||
{
|
|
||||||
"api_id": 3741859,
|
|
||||||
"api_hash": "f81a30b542215b3d578",
|
|
||||||
"bot_id": 1657667,
|
|
||||||
"bot_token": "1657544667:AAGO7sit_k_0u_C1w7U",
|
|
||||||
"user_id": 9513088,
|
|
||||||
"proxy": true,
|
|
||||||
"proxy_type": "socks5",
|
|
||||||
"proxy_addr": "127.0.0.1",
|
|
||||||
"proxy_port": 7890,
|
|
||||||
"proxy_username": "",
|
|
||||||
"proxy_password": "",
|
|
||||||
"proxy_secret": "如果proxy_type是MTProxy,则该值必填",
|
|
||||||
"log_path": "/ql/log",
|
|
||||||
"log_send": true,
|
|
||||||
"log_send_id 你日志要发给谁就填谁id": 1,
|
|
||||||
"log_send_id": -1657544,
|
|
||||||
"monitor_cache_size": 100,
|
|
||||||
"monitor_cars 是你要监控的对象,需要填上自己bot的id和线报频道或群组id": 1,
|
|
||||||
"monitor_cars": [
|
|
||||||
-1001718319262,
|
|
||||||
-1001718319261
|
|
||||||
],
|
|
||||||
|
|
||||||
"monitor_auto_stops": [
|
|
||||||
"jd_AutoOpenCard"
|
|
||||||
],
|
|
||||||
"monitor_black_keywords 黑名单关键词基于正则表达式实现": 1,
|
|
||||||
"monitor_black_keywords": [
|
|
||||||
"(ShopToken)"
|
|
||||||
],
|
|
||||||
"monitor_converters_whitelist_keywords 不转换关键词基于正则表达式实现": 1,
|
|
||||||
"monitor_converters_whitelist_keywords": [
|
|
||||||
"(M_WX_)"
|
|
||||||
],
|
|
||||||
"monitor_converters 转换关键词基于正则表达式实现": 1,
|
|
||||||
"monitor_converters": {
|
|
||||||
"((?=.*jd_task_lzzd_custom)(?=.*https)^.*$)": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(jd_lzkj_activityId|jd_task_lzzd_custom)": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"https://lzkjdz-isv.isvjcloud.com/wxTeam/activity2/875406?activityId=%s\""
|
|
||||||
},
|
|
||||||
"((?=.*jd_task_cjzd_custom)(?=.*https)^.*$)": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(jd_task_cjzd_custom|jd_cjhy_activityId)": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"https://cjhydz-isv.isvjcloud.com/wxTeam/activity?activityId=%s\""
|
|
||||||
},
|
|
||||||
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*cjhy)(.|\\n)(?=(.|\\n)*积分)(.|\\n)*$": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"https://cjhydz-isv.isvjcloud.com/wxTeam/activity?activityId=%s\""
|
|
||||||
},
|
|
||||||
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*lzkj)(.|\\n)(?=(.|\\n)*积分)(.|\\n)*$": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"https://lzkjdz-isv.isvjcloud.com/wxTeam/activity2/875406?activityId=%s\""
|
|
||||||
},
|
|
||||||
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*cjhy)(.|\\n)*$": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"https://cjhydz-isv.isvjcloud.com/wxTeam/activity?activityId=%s\""
|
|
||||||
},
|
|
||||||
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*lzkj)(.|\\n)*$": {
|
|
||||||
"env": "export M_WX_TEAM_URL=\"https://lzkjdz-isv.isvjcloud.com/wxTeam/activity2/875406?activityId=%s\""
|
|
||||||
},
|
|
||||||
"(jd_zpcj|(?=.*jd_task_zp_custom)(?=.*https)^.*$)": {
|
|
||||||
"env": "export M_WX_LUCK_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"((?=.*jd_task_jg_custom)(?=.*https)^.*$)": {
|
|
||||||
"env": "export M_WX_ADD_CART_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"((?=.*jd_task_gz_custom)(?=.*https)^.*$)": {
|
|
||||||
"env": "export M_WX_FOLLOW_DRAW_URL=\"%s\""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"monitor_scripts": {
|
|
||||||
"M_WX_TEAM_URL": {
|
|
||||||
"name": "M组队瓜分京豆",
|
|
||||||
"task 就是你面板上的那个任务,想怎么写就怎么写 或者 你手动怎么执行就怎么写": 1,
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_team.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_TEAM_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_TEAM_JF_URL": {
|
|
||||||
"name": "M组队瓜分积分",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_team.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_TEAM_JF_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_LEVEL_BIRTH_URL": {
|
|
||||||
"name": "M等级生日礼包",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_levelBirth.js now",
|
|
||||||
"wait": 5,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_LEVEL_BIRTH_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_JOY_INVITE_URL": {
|
|
||||||
"name": "M邀请有礼JOY",
|
|
||||||
"task": "task /ql/scripts/m_jd_joy_invite.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_JOY_INVITE_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_KNOWLEDGE_URL": {
|
|
||||||
"name": "知识超人",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_knowledge.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_KNOWLEDGE_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_LOREAL_INVITE_URL": {
|
|
||||||
"name": "M邀请有礼LOREAL",
|
|
||||||
"task": "task /ql/scripts/m_jd_loreal_invite.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_LOREAL_INVITE_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_ADD_CART_URL": {
|
|
||||||
"name": "M加购有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_addCart.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_ADD_CART_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_GYG_SHOP_ARGV": {
|
|
||||||
"name": "M店铺刮奖",
|
|
||||||
"task": "task /ql/scripts/m_jd_shop_gyg.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_GYG_SHOP_ARGV",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_SHOP_POINT_EXCHANGE_ARGV": {
|
|
||||||
"name": "M店铺积分兑换",
|
|
||||||
"task": "task /ql/scripts/m_jd_shop_pointExchange.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_SHOP_POINT_EXCHANGE_ARGV",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_LUCK_DRAW_URL": {
|
|
||||||
"name": "M幸运抽奖",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_luckDraw.js now",
|
|
||||||
"wait": 10,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_LUCK_DRAW_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_COMPLETE_DRAW_URL": {
|
|
||||||
"name": "M完善有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_completeDraw.js now",
|
|
||||||
"wait": 30,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_COMPLETE_DRAW_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_CENTER_DRAW_URL": {
|
|
||||||
"name": "M老虎机抽奖",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_centerDraw.js now",
|
|
||||||
"wait": 30,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_CENTER_DRAW_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_GAME_URL": {
|
|
||||||
"name": "M无线游戏",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_game.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_GAME_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_SHOP_GIFT_URL": {
|
|
||||||
"name": "M关注有礼无线",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_shopGift.js now",
|
|
||||||
"wait": 30,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_SHOP_GIFT_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_UNPACK_DRAW_URL": {
|
|
||||||
"name": "M分享福袋",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_unPackDraw.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_UNPACK_DRAW_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_DAILY_GIFT_URL": {
|
|
||||||
"name": "M每日领奖",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_dailyGift.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_DAILY_GIFT_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_SHOP_SIGN_URL": {
|
|
||||||
"name": "M签到有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_shopSign.js now",
|
|
||||||
"wait": 10,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_SHOP_SIGN_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_POINT_DRAW_URL": {
|
|
||||||
"name": "M积分兑换",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_pointDraw.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_POINT_DRAW_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_BUILD_DRAW_URL": {
|
|
||||||
"name": "M盖楼领奖",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_buildDraw.js now",
|
|
||||||
"wait": 30,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "DEFAULT_WX_QUEUE",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_CARTKOI_URL": {
|
|
||||||
"name": "M购物车锦鲤",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_cartKoi.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_CARTKOI_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_SECOND_DRAW_URL": {
|
|
||||||
"name": "M读秒手速",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_secondDraw.js now",
|
|
||||||
"wait": 10,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "DEFAULT_WX_QUEUE",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_FANS_DRAW_URL": {
|
|
||||||
"name": "M粉丝互动",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_fansDraw.js now",
|
|
||||||
"wait": 30,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "DEFAULT_WX_QUEUE",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_FAV_SHOP_ARGV": {
|
|
||||||
"name": "M收藏有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_fav_shop_gift.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_FAV_SHOP_ARGV",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_FOLLOW_DRAW_URL": {
|
|
||||||
"name": "M关注抽奖",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_followDraw.js now",
|
|
||||||
"wait": 10,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_WX_FOLLOW_DRAW_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_FOLLOW_SHOP_ARGV": {
|
|
||||||
"name": "M关注有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_follow_shop.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_FOLLOW_SHOP_ARGV",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_OPEN_CARD_ARGV": {
|
|
||||||
"name": "M入会有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_open_card.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_OPEN_CARD_ARGV",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_OPEN_CARD_FORCE_ARGV": {
|
|
||||||
"name": "M强制入会",
|
|
||||||
"task": "task /ql/scripts/m_jd_open_card_force.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": true,
|
|
||||||
"queue_name": "M_OPEN_CARD_FORCE_ARGV",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_SHARE_URL": {
|
|
||||||
"name": "M分享有礼",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_share.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_SHARE_URL",
|
|
||||||
"enable": true
|
|
||||||
},
|
|
||||||
"M_WX_DADOUDOU_URL": {
|
|
||||||
"name": "M打豆豆",
|
|
||||||
"task": "task /ql/scripts/m_jd_wx_dadoudou.js now",
|
|
||||||
"wait": 0,
|
|
||||||
"queue": false,
|
|
||||||
"queue_name": "M_WX_DADOUDOU_URL",
|
|
||||||
"enable": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"/wxTeam/": {
|
|
||||||
"name": "M组队瓜分",
|
|
||||||
"env": "export jd_zdjr_activityId=\"%s\"\nexport jd_zdjr_activityUrl=\"%s\"\nexport jd_zdjr_type=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxFansInterActionActivity/": {
|
|
||||||
"name": "M粉丝互动",
|
|
||||||
"env": "export M_WX_FANS_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxMcLevelAndBirthGifts/": {
|
|
||||||
"name": "M等级生日礼包",
|
|
||||||
"env": "export M_WX_LEVEL_BIRTH_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxCollectionActivity/|^(?=.*lorealjdcampaign)(?=.*activityType=10024).*$)": {
|
|
||||||
"name": "M加购有礼",
|
|
||||||
"env": "export M_WX_ADD_CART_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(^(?=.*lorealjdcampaign)(?=.*activityType=10024).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10024).*$)": {
|
|
||||||
"name": "M加购有礼",
|
|
||||||
"env": "export M_WX_ADD_CART_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(^(?=.*dVF7gQUVKyUcuSsVhuya5d2XD4F)(?=.*code).*$)": {
|
|
||||||
"name": "M邀请有礼JOY",
|
|
||||||
"env": "export invite_code=\"%s\""
|
|
||||||
},
|
|
||||||
"(wxCollectCard)": {
|
|
||||||
"name": "M集卡有礼",
|
|
||||||
"env": "export M_WX_COLLECT_CARD_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxKnowledgeActivity/)": {
|
|
||||||
"name": "知识超人",
|
|
||||||
"env": "export M_WX_KNOWLEDGE_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/microDz/": {
|
|
||||||
"name": "微定制开卡",
|
|
||||||
"env": "#微定制\nexport WDZactivityId=\"%s\""
|
|
||||||
},
|
|
||||||
"^(?=.*lorealjdcampaign)(?=.*activityType=10006).*$": {
|
|
||||||
"name": "M邀请有礼LOREAL",
|
|
||||||
"env": "export M_LOREAL_INVITE_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10006).*$": {
|
|
||||||
"name": "M邀请有礼INTERACT",
|
|
||||||
"env": "export M_INTERACT_INVITE_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10070).*$": {
|
|
||||||
"name": "M邀请有礼INTERACT",
|
|
||||||
"env": "export M_INTERACT_INVITE_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/lzclient/|/wxDrawActivity/|^(?=.*gzsl-isv)(?=.*game).*$)": {
|
|
||||||
"name": "M幸运抽奖",
|
|
||||||
"env": "export M_WX_LUCK_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(^(?=.*prod/cc/interactsaas)(?=.*activityType=10020).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10021).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10026).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10031).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10063).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10080).*$)": {
|
|
||||||
"name": "M幸运抽奖",
|
|
||||||
"env": "export M_WX_LUCK_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/completeInfoActivity/": {
|
|
||||||
"name": "M完善有礼",
|
|
||||||
"env": "export M_WX_COMPLETE_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10049).*$": {
|
|
||||||
"name": "M完善有礼",
|
|
||||||
"env": "export M_WX_COMPLETE_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/drawCenter/": {
|
|
||||||
"name": "M老虎机抽奖",
|
|
||||||
"env": "export M_WX_CENTER_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxGameActivity/": {
|
|
||||||
"name": "M无线游戏",
|
|
||||||
"env": "export M_WX_GAME_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxShopGift/|shopGiftBag.html|newShopGiftBag.html)": {
|
|
||||||
"name": "M关注特效",
|
|
||||||
"env": "export M_WX_SHOP_GIFT_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10058).*$": {
|
|
||||||
"name": "M无线关注",
|
|
||||||
"env": "export M_WX_SHOP_GIFT_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxUnPackingActivity/)": {
|
|
||||||
"name": "M分享福袋",
|
|
||||||
"env": "export M_WX_UNPACK_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/daily/": {
|
|
||||||
"name": "M每日领奖",
|
|
||||||
"env": "export M_WX_DAILY_GIFT_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/signActivity?": {
|
|
||||||
"name": "M签到有礼",
|
|
||||||
"env": "export M_WX_SHOP_SIGN_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(^(?=.*prod/cc/interactsaas)(?=.*activityType=10023).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10040).*$)": {
|
|
||||||
"name": "M签到有礼",
|
|
||||||
"env": "export M_WX_SHOP_SIGN_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxPointShopView/point)": {
|
|
||||||
"name": "M积分兑换",
|
|
||||||
"env": "export M_WX_POINT_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxBuildActivity/": {
|
|
||||||
"name": "M盖楼领奖",
|
|
||||||
"env": "export M_WX_BUILD_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxCartKoi/": {
|
|
||||||
"name": "M购物车锦鲤",
|
|
||||||
"env": "export M_WX_CARTKOI_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10036).*$": {
|
|
||||||
"name": "M购物车锦鲤",
|
|
||||||
"env": "export M_WX_CARTKOI_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/fansactiveall/|/videofangrowth/|/fansactivecopy/)": {
|
|
||||||
"name": "M粉丝红包",
|
|
||||||
"env": "export M_FANS_RED_PACKET_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxSecond/)": {
|
|
||||||
"name": "M读秒手速",
|
|
||||||
"env": "export M_WX_SECOND_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(/wxShopFollowActivity/)": {
|
|
||||||
"name": "M关注抽奖",
|
|
||||||
"env": "export M_WX_FOLLOW_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"(^(?=.*prod/cc/interactsaas)(?=.*activityType=10053).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10069).*$)": {
|
|
||||||
"name": "M无线关注",
|
|
||||||
"env": "export M_WX_FOLLOW_DRAW_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxCollectCard/": {
|
|
||||||
"name": "M集卡有礼",
|
|
||||||
"env": "export M_WX_COLLECT_CARD_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxShareActivity/": {
|
|
||||||
"name": "M分享有礼",
|
|
||||||
"env": "export M_WX_SHARE_URL=\"%s\""
|
|
||||||
},
|
|
||||||
"/wxgame/activity/": {
|
|
||||||
"name": "M打豆豆",
|
|
||||||
"env": "export M_WX_DADOUDOU_URL=\"%s\""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
426
magic.py
426
magic.py
@ -1,426 +0,0 @@
|
|||||||
import asyncio
|
|
||||||
import datetime
|
|
||||||
import json
|
|
||||||
import logging
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import time
|
|
||||||
from urllib import parse
|
|
||||||
|
|
||||||
from cacheout import FIFOCache
|
|
||||||
from telethon import TelegramClient, events
|
|
||||||
|
|
||||||
# 0. 进入容器
|
|
||||||
# 1. pip3 install -U cacheout
|
|
||||||
# 2. 复制magic.py,magic.json到/ql/config/目录 并配置
|
|
||||||
# 3. python3 /ql/config/magic.py 用手机号登录
|
|
||||||
# 4. 给bot发送在吗 有反应即可
|
|
||||||
# 5. pm2 start /ql/config/magic.py -x --interpreter python3
|
|
||||||
# 6. 挂起bot到后台 查看状态 pm2 l
|
|
||||||
# 7. 如果修改了magic.json,执行pm2 restart magic 即可重启
|
|
||||||
# pm2 start /jd/config/magic.py -x --interpreter python3
|
|
||||||
|
|
||||||
logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s', level=logging.INFO)
|
|
||||||
# 创建
|
|
||||||
logger = logging.getLogger("magic")
|
|
||||||
logger.setLevel(logging.INFO)
|
|
||||||
|
|
||||||
_ConfigCar = ""
|
|
||||||
_ConfigSh = ""
|
|
||||||
if os.path.exists("/jd/config/magic.json"):
|
|
||||||
_ConfigCar = "/jd/config/magic.json"
|
|
||||||
_ConfigSh = "/jd/config/config.sh"
|
|
||||||
elif os.path.exists("/ql/config/magic.json"):
|
|
||||||
_ConfigCar = "/ql/config/magic.json"
|
|
||||||
_ConfigSh = "/ql/config/config.sh"
|
|
||||||
elif os.path.exists("/ql/data/config/magic.json"):
|
|
||||||
_ConfigCar = "/ql/data/config/magic.json"
|
|
||||||
_ConfigSh = "/ql/data/config/config.sh"
|
|
||||||
else:
|
|
||||||
logger.info("未找到magic.json config.sh")
|
|
||||||
|
|
||||||
with open(_ConfigCar, 'r', encoding='utf-8') as f:
|
|
||||||
magic_json = f.read()
|
|
||||||
properties = json.loads(magic_json)
|
|
||||||
|
|
||||||
# 缓存
|
|
||||||
cache = FIFOCache(maxsize=properties.get("monitor_cache_size"), ttl=0, timer=time.time)
|
|
||||||
|
|
||||||
# Telegram相关
|
|
||||||
api_id = properties.get("api_id")
|
|
||||||
api_hash = properties.get("api_hash")
|
|
||||||
bot_id = properties.get("bot_id")
|
|
||||||
bot_token = properties.get("bot_token")
|
|
||||||
user_id = properties.get("user_id")
|
|
||||||
# 监控相关
|
|
||||||
log_path = properties.get("log_path")
|
|
||||||
log_send = properties.get("log_send", True)
|
|
||||||
log_send_id = properties.get("log_send_id")
|
|
||||||
monitor_cars = properties.get("monitor_cars")
|
|
||||||
logger.info(f"监控的频道或群组-->{monitor_cars}")
|
|
||||||
monitor_converters = properties.get("monitor_converters")
|
|
||||||
logger.info(f"监控转换器-->{monitor_converters}")
|
|
||||||
monitor_converters_whitelist_keywords = properties.get("monitor_converters_whitelist_keywords")
|
|
||||||
logger.info(f"不转换白名单关键字-->{monitor_converters_whitelist_keywords}")
|
|
||||||
monitor_black_keywords = properties.get("monitor_black_keywords")
|
|
||||||
logger.info(f"黑名单关键字-->{monitor_black_keywords}")
|
|
||||||
monitor_scripts = properties.get("monitor_scripts")
|
|
||||||
monitor_auto_stops = properties.get("monitor_auto_stops")
|
|
||||||
logger.info(f"监控的自动停车-->{monitor_auto_stops}")
|
|
||||||
rules = properties.get("rules")
|
|
||||||
logger.info(f"监控的自动解析-->{monitor_auto_stops}")
|
|
||||||
|
|
||||||
if properties.get("proxy"):
|
|
||||||
if properties.get("proxy_type") == "MTProxy":
|
|
||||||
proxy = {
|
|
||||||
'addr': properties.get("proxy_addr"),
|
|
||||||
'port': properties.get("proxy_port"),
|
|
||||||
'proxy_secret': properties.get('proxy_secret', "")
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
proxy = {
|
|
||||||
'proxy_type': properties.get("proxy_type"),
|
|
||||||
'addr': properties.get("proxy_addr"),
|
|
||||||
'port': properties.get("proxy_port"),
|
|
||||||
'username': properties.get('proxy_username', ""),
|
|
||||||
'password': properties.get('proxy_password', "")
|
|
||||||
}
|
|
||||||
client = TelegramClient("magic", api_id, api_hash, proxy=proxy, auto_reconnect=True, retry_delay=1, connection_retries=99999).start()
|
|
||||||
else:
|
|
||||||
client = TelegramClient("magic", api_id, api_hash, auto_reconnect=True, retry_delay=1, connection_retries=99999).start()
|
|
||||||
|
|
||||||
|
|
||||||
def rest_of_day():
|
|
||||||
"""
|
|
||||||
:return: 截止到目前当日剩余时间
|
|
||||||
"""
|
|
||||||
today = datetime.datetime.strptime(str(datetime.date.today()), "%Y-%m-%d")
|
|
||||||
tomorrow = today + datetime.timedelta(days=1)
|
|
||||||
nowTime = datetime.datetime.now()
|
|
||||||
return (tomorrow - nowTime).seconds - 90 # 获取秒
|
|
||||||
|
|
||||||
|
|
||||||
def rwcon(arg):
|
|
||||||
if arg == "str":
|
|
||||||
with open(_ConfigSh, 'r', encoding='utf-8') as f1:
|
|
||||||
configs = f1.read()
|
|
||||||
return configs
|
|
||||||
elif arg == "list":
|
|
||||||
with open(_ConfigSh, 'r', encoding='utf-8') as f1:
|
|
||||||
configs = f1.readlines()
|
|
||||||
return configs
|
|
||||||
elif isinstance(arg, str):
|
|
||||||
with open(_ConfigSh, 'w', encoding='utf-8') as f1:
|
|
||||||
f1.write(arg)
|
|
||||||
elif isinstance(arg, list):
|
|
||||||
with open(_ConfigSh, 'w', encoding='utf-8') as f1:
|
|
||||||
f1.write("".join(arg))
|
|
||||||
|
|
||||||
|
|
||||||
async def export(text):
|
|
||||||
messages = text.split("\n")
|
|
||||||
change = ""
|
|
||||||
key = ""
|
|
||||||
for message in messages:
|
|
||||||
if "export " not in message:
|
|
||||||
continue
|
|
||||||
kv = message.replace("export ", "")
|
|
||||||
key = kv.split("=")[0]
|
|
||||||
value = re.findall(r'"([^"]*)"', kv)[0]
|
|
||||||
configs = rwcon("str")
|
|
||||||
if kv in configs:
|
|
||||||
continue
|
|
||||||
if key in configs:
|
|
||||||
configs = re.sub(f'{key}=("|\').*("|\')', kv, configs)
|
|
||||||
change += f"【替换】环境变量成功\nexport {kv}"
|
|
||||||
await client.send_message(bot_id, change)
|
|
||||||
else:
|
|
||||||
end_line = 0
|
|
||||||
configs = rwcon("list")
|
|
||||||
for config in configs:
|
|
||||||
if "第二区域" in config and "↑" in config:
|
|
||||||
end_line = configs.index(config) - 1
|
|
||||||
break
|
|
||||||
configs.insert(end_line, f'export {key}="{value}"\n')
|
|
||||||
change += f"【新增】环境变量成功\nexport {kv}"
|
|
||||||
await client.send_message(bot_id, change)
|
|
||||||
rwcon(configs)
|
|
||||||
if len(change) == 0:
|
|
||||||
await client.send_message(bot_id, f'【取消】{key}环境变量无需改动')
|
|
||||||
|
|
||||||
|
|
||||||
# 设置变量
|
|
||||||
@client.on(events.NewMessage(chats=monitor_cars, pattern='^没水了$'))
|
|
||||||
async def handler(event):
|
|
||||||
for auto_stop_file in monitor_auto_stops:
|
|
||||||
os.popen(f"ps -ef | grep {auto_stop_file}" + " | grep -v grep | awk '{print $1}' | xargs kill -9")
|
|
||||||
await client.send_message(bot_id, f'没水停车')
|
|
||||||
|
|
||||||
|
|
||||||
# 设置变量
|
|
||||||
@client.on(events.NewMessage(chats=[bot_id], pattern='^在吗$'))
|
|
||||||
async def handler(event):
|
|
||||||
await client.send_message(bot_id, f'老板啥事?')
|
|
||||||
|
|
||||||
|
|
||||||
# 提取多行转换
|
|
||||||
async def converter_lines(text):
|
|
||||||
before_eps = text.split("\n")
|
|
||||||
after_eps = [elem for elem in before_eps if elem.startswith("export")]
|
|
||||||
return await converter_handler("\n".join(after_eps))
|
|
||||||
|
|
||||||
|
|
||||||
# 设置变量
|
|
||||||
@client.on(events.NewMessage(from_users=[user_id], pattern='^(run|Run)$'))
|
|
||||||
async def handler(event):
|
|
||||||
try:
|
|
||||||
reply = await event.get_reply_message()
|
|
||||||
if event.is_reply is False:
|
|
||||||
return
|
|
||||||
if "export" in reply.text:
|
|
||||||
# 提取变量
|
|
||||||
text = await converter_lines(reply.text)
|
|
||||||
text = re.findall(r'(export.*)', text)[0]
|
|
||||||
await export(text)
|
|
||||||
kv = text.replace("export ", "")
|
|
||||||
logger.info(kv)
|
|
||||||
key = kv.split("=")[0]
|
|
||||||
action = monitor_scripts.get(key)
|
|
||||||
command = action.get("task", "")
|
|
||||||
await cmd(command)
|
|
||||||
else:
|
|
||||||
# 提取变量
|
|
||||||
activity_id, url = await get_activity_info(reply.text)
|
|
||||||
if activity_id is None:
|
|
||||||
logger.info(f"未找到id [%s],退出", url)
|
|
||||||
return
|
|
||||||
is_break = False
|
|
||||||
for rule_key in rules:
|
|
||||||
if is_break:
|
|
||||||
break
|
|
||||||
result = re.search(rule_key, url)
|
|
||||||
if result is None:
|
|
||||||
logger.info(f"不匹配%s,下一个", rule_key)
|
|
||||||
continue
|
|
||||||
value = rules.get(rule_key)
|
|
||||||
env = value.get("env")
|
|
||||||
argv_len = len(re.findall("%s", env))
|
|
||||||
env_key = re.findall("export (.*)=", env)[0]
|
|
||||||
if argv_len == 1:
|
|
||||||
env = env % url
|
|
||||||
elif argv_len == 2:
|
|
||||||
env = env % (activity_id, url)
|
|
||||||
elif argv_len == 3:
|
|
||||||
domain = re.search('(https?://[^/]+)', url)[0]
|
|
||||||
env = env % (activity_id, domain, "None")
|
|
||||||
else:
|
|
||||||
logger.info("还不支持")
|
|
||||||
break
|
|
||||||
await export(env)
|
|
||||||
action = monitor_scripts.get(env_key)
|
|
||||||
command = action.get("task", "")
|
|
||||||
await cmd(command)
|
|
||||||
break
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
|
|
||||||
|
|
||||||
# 设置变量
|
|
||||||
@client.on(events.NewMessage(chats=[bot_id], pattern='^清理缓存$'))
|
|
||||||
async def handler(event):
|
|
||||||
b_size = cache.size()
|
|
||||||
logger.info(f"清理前缓存数量,{b_size}")
|
|
||||||
cache.clear()
|
|
||||||
a_size = cache.size()
|
|
||||||
logger.info(f"清理后缓存数量,{a_size}")
|
|
||||||
await client.send_message(bot_id, f'清理缓存结束 {b_size}-->{a_size}')
|
|
||||||
|
|
||||||
|
|
||||||
async def get_activity_info(text):
|
|
||||||
result = re.findall(r'((http|https)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|])', text)
|
|
||||||
if len(result) <= 0:
|
|
||||||
return None, None
|
|
||||||
url = re.search('((http|https)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|])', text)[0]
|
|
||||||
params = parse.parse_qs(parse.urlparse(url).query)
|
|
||||||
ban_rule_list = [
|
|
||||||
'activityId',
|
|
||||||
'giftId',
|
|
||||||
'actId',
|
|
||||||
'tplId',
|
|
||||||
'token',
|
|
||||||
'code',
|
|
||||||
'a',
|
|
||||||
'id']
|
|
||||||
activity_id = ''
|
|
||||||
for key in ban_rule_list:
|
|
||||||
activity_id = params.get(key)
|
|
||||||
logger.info(activity_id)
|
|
||||||
if activity_id is not None:
|
|
||||||
activity_id = params.get(key)
|
|
||||||
activity_id = activity_id[0]
|
|
||||||
break
|
|
||||||
return activity_id, url
|
|
||||||
|
|
||||||
|
|
||||||
@client.on(events.NewMessage(chats=monitor_cars, pattern=r'(export\s?\w*=(".*"|\'.*\')|[/ikun])'))
|
|
||||||
async def handler(event):
|
|
||||||
origin = event.message.text
|
|
||||||
text = re.findall(r'https://i.walle.com/api\?data=(.+)?\)', origin)
|
|
||||||
if len(text) > 0:
|
|
||||||
text = parse.unquote_plus(text[0])
|
|
||||||
elif "export" in origin:
|
|
||||||
text = origin
|
|
||||||
else:
|
|
||||||
return
|
|
||||||
groupname = "mybot"
|
|
||||||
try:
|
|
||||||
groupname = f'[{event.chat.title}](https://t.me/c/{event.chat.id}/{event.message.id})'
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
origin_text = text
|
|
||||||
logger.info(f"原始数据 {origin_text}")
|
|
||||||
# 黑名单
|
|
||||||
for b_key in monitor_black_keywords:
|
|
||||||
result = re.search(b_key, origin_text)
|
|
||||||
if result is not None:
|
|
||||||
await client.send_message(bot_id, f'黑名单 {b_key} {text}')
|
|
||||||
return
|
|
||||||
text = await converter_handler(text)
|
|
||||||
activity_id, url = await get_activity_info(text)
|
|
||||||
if "mybot" not in groupname:
|
|
||||||
if activity_id is not None:
|
|
||||||
if cache.get(activity_id) is not None:
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】跑过 `{activity_id}`')
|
|
||||||
return
|
|
||||||
cache.set(activity_id, activity_id, rest_of_day())
|
|
||||||
else:
|
|
||||||
if cache.get(text) is not None:
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】跑过 {text}')
|
|
||||||
return
|
|
||||||
cache.set(text, text, rest_of_day())
|
|
||||||
logger.info(f"最终变量 {text}")
|
|
||||||
kv = text.replace("export ", "")
|
|
||||||
key = kv.split("=")[0]
|
|
||||||
action = monitor_scripts.get(key)
|
|
||||||
logger.info(f'ACTION {action}')
|
|
||||||
if action is None: # 没有自动车
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】没有自动车 {text}')
|
|
||||||
return
|
|
||||||
# 没有匹配的动作 或没开启
|
|
||||||
if not action.get("enable"):
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】没启用任务 {key}')
|
|
||||||
return
|
|
||||||
command = action.get("task", "")
|
|
||||||
if command == '':
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】没有配置任务 {key}')
|
|
||||||
return
|
|
||||||
name = action.get("name")
|
|
||||||
if action.get("queue"):
|
|
||||||
await queues[action.get("queue_name")].put({"text": text, "groupname": groupname, "action": action})
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】入队执行 #{name}')
|
|
||||||
return
|
|
||||||
await export(text)
|
|
||||||
await client.send_message(bot_id, f'【{groupname}】开始执行 #{name}')
|
|
||||||
await cmd(command)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
await client.send_message(bot_id, f'{str(e)}')
|
|
||||||
|
|
||||||
|
|
||||||
async def converter_handler(text):
|
|
||||||
text = "\n".join(list(filter(lambda x: "export " in x, text.replace("`", "").split("\n"))))
|
|
||||||
for c_w_key in monitor_converters_whitelist_keywords:
|
|
||||||
result = re.search(c_w_key, text)
|
|
||||||
if result is not None:
|
|
||||||
logger.info(f"无需转换 {text}")
|
|
||||||
return text
|
|
||||||
logger.info(f"转换前数据 {text}")
|
|
||||||
try:
|
|
||||||
tmp_text = text
|
|
||||||
# 转换
|
|
||||||
for c_key in monitor_converters:
|
|
||||||
result = re.search(c_key, text)
|
|
||||||
if result is None:
|
|
||||||
logger.info(f"规则不匹配 {c_key},下一个")
|
|
||||||
continue
|
|
||||||
rule = monitor_converters.get(c_key)
|
|
||||||
target = rule.get("env")
|
|
||||||
argv_len = len(re.findall("%s", target))
|
|
||||||
values = re.findall(r'"([^"]*)"', text)
|
|
||||||
if argv_len == 1:
|
|
||||||
target = target % (values[0])
|
|
||||||
elif argv_len == 2:
|
|
||||||
target = target % (values[0], values[1])
|
|
||||||
elif argv_len == 3:
|
|
||||||
target = target % (values[0], values[1], values[2])
|
|
||||||
else:
|
|
||||||
print("不支持更多参数")
|
|
||||||
text = target
|
|
||||||
break
|
|
||||||
except Exception as e:
|
|
||||||
logger.info(str(e))
|
|
||||||
logger.info(f"转换后数据 {text}")
|
|
||||||
return text
|
|
||||||
|
|
||||||
|
|
||||||
queues = {}
|
|
||||||
|
|
||||||
|
|
||||||
async def task(task_name, task_key):
|
|
||||||
logger.info(f"队列监听--> {task_name} {task_key} 已启动,等待任务")
|
|
||||||
curr_queue = queues[task_key]
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
param = await curr_queue.get()
|
|
||||||
logger.info(f"出队执行 {param}")
|
|
||||||
exec_action = param.get("action")
|
|
||||||
# 默认立马执行
|
|
||||||
await client.send_message(bot_id, f'【{param.get("groupname")}】出队执行 #{exec_action.get("name")}')
|
|
||||||
await export(param.get("text"))
|
|
||||||
await cmd(exec_action.get("task", ""))
|
|
||||||
if curr_queue.qsize() > 1:
|
|
||||||
exec_action = param.get("action")
|
|
||||||
await client.send_message(bot_id, f'{exec_action["name"]},队列长度{curr_queue.qsize()},将等待{exec_action["wait"]}秒...')
|
|
||||||
await asyncio.sleep(exec_action['wait'])
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
|
|
||||||
|
|
||||||
async def cmd(exec_cmd):
|
|
||||||
try:
|
|
||||||
logger.info(f'执行命令 {exec_cmd}')
|
|
||||||
name = re.findall(r'(?:.*/)*([^. ]+)\.(?:js|py|sh)', exec_cmd)[0]
|
|
||||||
tmp_log = f'{log_path}/{name}.{datetime.datetime.now().strftime("%H%M%S%f")}.log'
|
|
||||||
logger.info(f'日志文件 {tmp_log}')
|
|
||||||
proc = await asyncio.create_subprocess_shell(
|
|
||||||
f"{exec_cmd} >> {tmp_log} 2>&1",
|
|
||||||
stdout=asyncio.subprocess.PIPE,
|
|
||||||
stderr=asyncio.subprocess.PIPE
|
|
||||||
)
|
|
||||||
await proc.communicate()
|
|
||||||
if log_send:
|
|
||||||
await client.send_file(log_send_id, tmp_log)
|
|
||||||
os.remove(tmp_log)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
await client.send_message(bot_id, f'something wrong,I\'m sorry\n{str(e)}')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
try:
|
|
||||||
logger.info("开始运行")
|
|
||||||
for key in monitor_scripts:
|
|
||||||
action = monitor_scripts[key]
|
|
||||||
name = action.get('name')
|
|
||||||
queue = action.get("queue")
|
|
||||||
queue_name = action.get("queue_name")
|
|
||||||
if queues.get(queue_name) is not None:
|
|
||||||
logger.info(f"队列监听--> {name} {queue_name} 已启动,等待任务")
|
|
||||||
continue
|
|
||||||
queues[queue_name] = asyncio.Queue()
|
|
||||||
client.loop.create_task(task(name, queue_name))
|
|
||||||
client.run_until_disconnected()
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(e)
|
|
||||||
client.disconnect()
|
|
Reference in New Issue
Block a user