Compare commits

..

6 Commits

Author SHA1 Message Date
d986684f35 expired 2024-03-02 17:36:15 +08:00
a28ce66fc9 ex 2024-03-02 17:28:29 +08:00
2b69813c63 Delete jd_cjhy_wxMcLevelAndBirthGifts.js 2024-03-02 17:25:19 +08:00
c5f939d402 Update getH5st3_0.js 2024-03-02 17:19:29 +08:00
4f3a183cf3 Update jd_38help.js 2024-03-02 17:09:18 +08:00
f6e83cd492 Create jd_20bean.js 2024-03-02 17:05:13 +08:00
11 changed files with 18 additions and 1380 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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

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

File diff suppressed because one or more lines are too long

View File

@ -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
View File

@ -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()