del some script

This commit is contained in:
smallfawn committed 2026-04-06 17:03:02 +08:00
1 parent 46bf38d3db
commit bd2055532b
8 files changed
-2558

No files matched your search

-3
View File
@@ -1,3 +0,0 @@
{
"liveServer.settings.port": 5501
}
-10
View File
@@ -1,10 +0,0 @@
[
{
"AT": "",
"RT": ""
},
{
"AT": "",
"RT": ""
}
]
-263
View File
@@ -1,263 +0,0 @@
/**
* cron 44 14 * * * baitianGame.js
* Show:完成每日做任务和积分抢购(兑换)
* //多账号分隔符 换行 或者 @
* 变量名:baitianGameCookie
* 变量值:http://www.100bt.com/m/creditMall/?gameId=2#home 网页的cookie 随便找个商品兑换抓http://service.100bt.com/creditmall/
* 请求头Header cookie 全部
* scriptVersionNow = "0.0.1";
*
兑换ID
配置文件 export baitianExchangeId=0 不用引号 0代表兑换塔罗牌*1套 不写变量默认不兑换
//时序残响塔罗牌*1套 0
//奥奇传说餐具盒*1 1
//奥拉毛绒亚比球(随机款)*1 2
//1奥币 3
//小精灵白色毛绒包*1 4
//奥比岛软糯抱抱熊*1 5
//赤月毛绒公仔 6
//奥比岛PU皮潮流挎包 7
//奥比岛小精灵毛绒公仔 8
//时序残响天文台套装*1 9
//奥奇毛绒眼罩(随机款)*1 10
//奥奇手游小诺捏捏团*1 11
//"奥比岛幸运按摩捶*1" 12
//"奥拉星女仆咖啡立牌*1套", 13
//"时序残响方形炫酷徽章*1" 14
//"奥比岛爱心抱枕*1" 15
//"奥比岛多彩明信片*5" 16
//"奥奇传说手游明信片*3", 17
//"奥奇阿修公仔*1" 18
//"时序残响角色立牌*1" 19
//"奥奇传说束口袋*1" 20
// "奥拉星手游兑换码", 21
//"食物语手游精美书签*5" 22
// "食物语精美贴纸*1" 23
// "奥拉星页游礼包" 24.
//"奥奇页游礼包", 25
//"10奥币"26
//"奥比岛页游礼包" 27
//"奥拉星战斗卡牌*1" 28
//"奥雅页游礼包" 29
//"30奥币" 30
*/
const $ = new Env("100bt百田游戏");
const notify = $.isNode() ? require("./sendNotify") : "";
let ckName = "baitianGameCookie";
let envSplitor = ["@", "\n"]; //多账号分隔符
let strSplitor = "&"; //多变量分隔符
let userIdx = 0;
let userList = [];
class UserInfo {
constructor(str) {
this.index = ++userIdx;
this.ck = str.split(strSplitor)[0]; //单账号多变量分隔符
this.ckStatus = true;
this.taskIdList = [];
}
async main() {
$.log(`正在做任务请耐心等待`);
await this.do_list()
if (this.taskIdList.length > 0) {
console.log(this.taskIdList)
for (let taskId of this.taskIdList) {
console.log(`正在做[${taskId.taskName}]任务`)
await $.wait(10000);
await this.do_task(taskId.taskId);
}
}
if (process.env["baitianExchangeId"]) {
await this.do_exchange(process.env["baitianExchangeId"]);
}
}
async do_list() {
let expando = "jQuery" + ("1.8.3" + Math.random()).replace(/\D/g, "");
let time1 = new Date().getTime();
let time2 = new Date().getTime();
try {
let options = {
fn: "任务列表查询",
method: "get",
url: `http://service.100bt.com/creditmall/activity/daily_task_list.jsonp??callback=${expando}_${time1}&gameId=2&_=${time2}`,
headers: {
Accept: "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
Cookie: this.ck,
Host: "service.100bt.com",
"Proxy-Connection": "keep-alive",
Referer: "http://www.100bt.com/",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
},
};
let { body: result } = await httpRequest(options);
//console.log(options);
//result = JSON.parse(result);
result = result.replace(`${expando}_${time1}`, "")
result = result.replace(`(`, "")
result = result.replace(`)`, "")
result = JSON.parse(result)
if (result.jsonResult.code == "0") {
for (let taskId of result.jsonResult.data) {
if (taskId.status == "0") {
this.taskIdList.push({ taskName: taskId.name, taskId: taskId.taskID })
}
}
}
} catch (e) {
console.log(e);
}
}
async do_task(taskId) {
//taskId=100 签到
//"taskID": 191, 奥拉星招募
//"taskID": 187, 预约奥拉星2手游
//"taskID": 185, 测测你的额外1小时
// "taskID": 188, 进入亚比概念站
//"taskID": 22每日查看最新预告
let expando = "jQuery" + ("1.8.3" + Math.random()).replace(/\D/g, "");
let time1 = new Date().getTime();
let time2 = new Date().getTime();
try {
let options = {
fn: "做任务",
method: "get",
url: `http://service.100bt.com/creditmall/activity/do_task.jsonp?callback=${expando}_${time1}&taskId=${taskId}&gameId=2&_=${time2}`,
headers: {
Accept: "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
Cookie: this.ck,
Host: "service.100bt.com",
"Proxy-Connection": "keep-alive",
Referer: "http://www.100bt.com/",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
},
};
let { body: result } = await httpRequest(options);
//console.log(options);
//result = JSON.parse(result);
result = result.replace(`${expando}_${time1}`, "")
result = result.replace(`(`, "")
result = result.replace(`)`, "")
result = JSON.parse(result)
$.log(JSON.stringify(result.jsonResult.message));
} catch (e) {
console.log(e);
}
}
async do_exchange(pageIndex) {
let expando = "jQuery" + ("1.8.3" + Math.random()).replace(/\D/g, "");
let time1 = new Date().getTime();
let time2 = new Date().getTime();
try {
let options = {
fn: "兑换",
method: "get",
url: `http://service.100bt.com/creditmall/mall/page.jsonp?callback=${expando}_${time1}&pageIndex=${pageIndex}&pageSize=1&orderBy=1&_=${time2}`,
headers: {
Accept: "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
Cookie: this.ck,
Host: "service.100bt.com",
"Proxy-Connection": "keep-alive",
Referer: "http://www.100bt.com/",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0",
},
};
let { body: result } = await httpRequest(options);
//console.log(options);
//result = JSON.parse(result);
$.log(JSON.stringify(result));
} catch (e) {
console.log(e);
}
}
}
async function start() {
let taskall = [];
for (let user of userList) {
if (user.ckStatus) {
taskall.push(await user.main());
}
}
await Promise.all(taskall);
}
!(async () => {
if (!(await checkEnv())) return;
if (userList.length > 0) {
await start();
}
await SendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//********************************************************
/**
* 变量检查与处理
* @returns
*/
async function checkEnv() {
let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || "";
if (userCookie) {
let e = envSplitor[0];
for (let o of envSplitor)
if (userCookie.indexOf(o) > -1) {
e = o;
break;
}
for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n));
} else {
console.log("未找到CK");
return;
}
return console.log(`共找到${userList.length}个账号`), true; //true == !0
}
/////////////////////////////////////////////////////////////////////////////////////
function httpRequest(options) {
if (!options["method"]) {
return console.log(`请求方法不存在`);
}
if (!options["fn"]) {
console.log(`函数名不存在`);
}
return new Promise((resolve) => {
$[options.method](options, (err, resp, data) => {
try {
if (err) {
$.logErr(err);
} else {
try {
resp = JSON.parse(resp);
} catch (error) { }
}
} catch (e) {
$.logErr(e, resp);
} finally {
resolve(resp);
}
});
});
}
async function SendMsg(message) {
if (!message) return;
if ($.isNode()) {
await notify.sendNotify($.name, message);
} else {
$.msg($.name, "", message);
}
}
// prettier-ignore
function Env(t, s) { return new (class { constructor(t, s) { (this.name = t), (this.data = null), (this.dataFile = "box.dat"), (this.logs = []), (this.logSeparator = "\n"), (this.startTime = new Date().getTime()), Object.assign(this, s), this.log("", `\ud83d\udd14${this.name},\u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } isSurge() { return "undefined" != typeof $httpClient && "undefined" == typeof $loon } isLoon() { return "undefined" != typeof $loon } getScript(t) { return new Promise((s) => { this.get({ url: t }, (t, e, i) => s(i)) }) } runScript(t, s) { return new Promise((e) => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); (o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o); const [h, a] = i.split("@"), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: o }, headers: { "X-Key": h, Accept: "*/*" }, }; this.post(r, (t, s, i) => e(i)) }).catch((t) => this.logErr(t)) } loaddata() { if (!this.isNode()) return {}; { (this.fs = this.fs ? this.fs : require("fs")), (this.path = this.path ? this.path : require("path")); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s); if (!e && !i) return {}; { const i = e ? t : s; try { return JSON.parse(this.fs.readFileSync(i)) } catch (t) { return {} } } } } writedata() { if (this.isNode()) { (this.fs = this.fs ? this.fs : require("fs")), (this.path = this.path ? this.path : require("path")); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s), o = JSON.stringify(this.data); e ? this.fs.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o) } } lodash_get(t, s, e) { const i = s.replace(/\[(\d+)\]/g, ".$1").split("."); let o = t; for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e; return o } lodash_set(t, s, e) { return Object(t) !== t ? t : (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []), (s.slice(0, -1).reduce((t, e, i) => Object(t[e]) === t[e] ? t[e] : (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {}), t)[s[s.length - 1]] = e), t) } getdata(t) { let s = this.getval(t); if (/^@/.test(t)) { const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t), o = e ? this.getval(e) : ""; if (o) try { const t = JSON.parse(o); s = t ? this.lodash_get(t, i, "") : s } catch (t) { s = "" } } return s } setdata(t, s) { let e = !1; if (/^@/.test(s)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s), h = this.getval(i), a = i ? ("null" === h ? null : h || "{}") : "{}"; try { const s = JSON.parse(a); this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i)) } catch (s) { const h = {}; this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i)) } } else e = this.setval(t, s); return e } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? ((this.data = this.loaddata()), this.data[t]) : (this.data && this.data[t]) || null } setval(t, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? ((this.data = this.loaddata()), (this.data[s] = t), this.writedata(), !0) : (this.data && this.data[s]) || null } initGotEnv(t) { (this.got = this.got ? this.got : require("got")), (this.cktough = this.cktough ? this.cktough : require("tough-cookie")), (this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar()), t && ((t.headers = t.headers ? t.headers : {}), void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, s = () => { }) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && ((e.body = i), (e.statusCode = e.status)), s(t, e, i) }) : this.isQuanX() ? $task.fetch(t).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t)) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, s) => { try { const e = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), (s.cookieJar = this.ckjar) } catch (t) { this.logErr(t) } }).then((t) => { const { statusCode: e, statusCode: i, headers: o, body: h, } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, (t) => s(t))) } post(t, s = () => { }) { if ((t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), delete t.headers["Content-Length"], this.isSurge() || this.isLoon())) $httpClient.poLine truncated
-1405
View File
File diff suppressed because it is too large. Load diff
-8
View File
@@ -1,8 +0,0 @@
[
{
"acToken": "",
"rtToken": "",
"enData":"",
"enKey":""
}
]
-209
View File
@@ -1,209 +0,0 @@
'use strict';
/*
=========================
qinglong api
base qinglong project
=========================
*/
const got = require('got');
require('dotenv').config();
const { readFile } = require('fs/promises');
const path = require('path');
const qlDir = '/ql';
const fs = require('fs');
let Fileexists = fs.existsSync('/ql/data/config/auth.json');
let authFile="";
if (Fileexists)
authFile="/ql/data/config/auth.json"
else
authFile="/ql/config/auth.json"
//const authFile = path.join(qlDir, 'config/auth.json');
const api = got.extend({
prefixUrl: 'http://127.0.0.1:5600',
retry: { limit: 0 },
});
async function getToken() {
const authConfig = JSON.parse(await readFile(authFile));
return authConfig.token;
}
module.exports.getEnvs = async (envName) => {
const token = await getToken();
const body = await api({
url: 'api/envs',
searchParams: {
searchValue: envName,
t: Date.now(),
},
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
},
}).json();
return body.data;
};
module.exports.getEnvsCount = async () => {
const data = await this.getEnvs();
return data.length;
};
module.exports.addEnv = async (cookie, remarks,envName) => {
const token = await getToken();
const body = await api({
method: 'post',
url: 'api/envs',
params: { t: Date.now() },
json: [{
name: envName,
value: cookie,
remarks,
}],
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
'Content-Type': 'application/json;charset=UTF-8',
},
}).json();
return body;
};
module.exports.updateEnv = async (cookie, eid, remarks,envName) => {
const token = await getToken();
const body = await api({
method: 'put',
url: 'api/envs',
params: { t: Date.now() },
json: {
name: envName,
value: cookie,
_id: eid,
remarks,
},
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
'Content-Type': 'application/json;charset=UTF-8',
},
}).json();
return body;
};
module.exports.updateEnv11 = async (cookie, eid, remarks,envName) => {
const token = await getToken();
const body = await api({
method: 'put',
url: 'api/envs',
params: { t: Date.now() },
json: {
name: envName,
value: cookie,
id: eid,
remarks,
},
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
'Content-Type': 'application/json;charset=UTF-8',
},
}).json();
return body;
};
module.exports.DisableCk = async (eid) => {
const token = await getToken();
const body = await api({
method: 'put',
url: 'api/envs/disable',
params: { t: Date.now() },
body: JSON.stringify([eid]),
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
'Content-Type': 'application/json;charset=UTF-8',
},
}).json();
return body;
};
module.exports.EnableCk = async (eid) => {
const token = await getToken();
const body = await api({
method: 'put',
url: 'api/envs/enable',
params: { t: Date.now() },
body: JSON.stringify([eid]),
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
'Content-Type': 'application/json;charset=UTF-8',
},
}).json();
return body;
};
module.exports.getstatus = async(eid) => {
const envs = await this.getEnvs();
var tempid = 0;
for (let i = 0; i < envs.length; i++) {
tempid = 0;
if (envs[i]._id) {
tempid = envs[i]._id;
}
if (envs[i].id) {
tempid = envs[i].id;
}
if (tempid == eid) {
return envs[i].status;
}
}
return 99;
};
module.exports.getEnvById = async(eid) => {
const envs = await this.getEnvs();
var tempid = 0;
for (let i = 0; i < envs.length; i++) {
tempid = 0;
if (envs[i]._id) {
tempid = envs[i]._id;
}
if (envs[i].id) {
tempid = envs[i].id;
}
if (tempid == eid) {
return envs[i].value;
}
}
return "";
};
/*module.exports.getEnvByCookie = async (cookie) => {
const envs = await this.getEnvs();
for (let i = 0; i < envs.length; i++) {
var tempptpin = decodeURIComponent(envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/) && envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/)[1]);
if(tempptpin==cookie){
return envs[i];
}
}
return "";
};*/
module.exports.delEnv = async (eid) => {
const token = await getToken();
const body = await api({
method: 'delete',
url: 'api/envs',
params: { t: Date.now() },
body: JSON.stringify([eid]),
headers: {
Accept: 'application/json',
authorization: `Bearer ${token}`,
'Content-Type': 'application/json;charset=UTF-8',
},
}).json();
return body;
};
-233
View File
@@ -1,233 +0,0 @@
"""
小程序搜 泉站大桶订水桶装水同城送水
变量 authcode # authorization #备注 (没有备注 也可以运行)
变量名 qztoken
项目 泉站订水
"""
import os
import requests
from datetime import datetime, timezone, timedelta
import json
import sys
import time
import random
from io import StringIO
enable_notification =1 # 控制是否启用通知的变量 0 不发送 1 发
# 只有在需要发送通知时才尝试导入notify模块
if enable_notification == 1:
try:
from notify import send
except ModuleNotFoundError:
print("警告:未找到notify.py模块。它不是一个依赖项,请勿错误安装。程序将退出。")
sys.exit(1)
#---------解--的简化0.2框架--------
# 配置参数
base_url = "https://microuser.quanzhan888.com" # 实际的基础URL
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x6309080f)XWEB/8519"
def get_beijing_date(): # 获取北京日期的函数
beijing_time = datetime.now(timezone(timedelta(hours=8)))
return beijing_time.date()
def timestamp_to_beijing_time(timestamp):
utc_zone = timezone.utc
beijing_zone = timezone(timedelta(hours=8))
utc_time = datetime.fromtimestamp(timestamp, utc_zone)
beijing_time = utc_time.astimezone(beijing_zone)
return beijing_time.strftime("%Y-%m-%d %H:%M:%S")
def get_env_variable(var_name):
value = os.getenv(var_name)
if value is None:
print(f'环境变量{var_name}未设置,请检查。')
return None
accounts = value.strip().split('\n') # 使用 \n 分割
num_accounts = len(accounts)
print(f'-----------本次账号运行数量:{num_accounts}-----------')
print(f'泉站大桶订水--QGh3amllamll ')
return accounts
#113.28824159502027
#23.103660007697727
def fz_hs(auth_code, authorization, user_agent, sign): #封装headers
return {
'Host': 'microuser.quanzhan888.com',
'Connection': 'keep-alive',
'Content-Length': '2',
'charset': 'utf-8',
'product': "shop",
'authcode': auth_code,
'authorization': authorization,
'user-agent': user_agent,
'sign': sign,
'Accept-Encoding': 'gzip,compress,br,deflate',
'platform': "wx",
'x-requested-with': 'xmlhttprequest',
'content-type': 'application/x-www-form-urlencoded',
}
def wdqbsj(auth_code, authorization): # 个人信息/钱包
url = f"{base_url}/user/get-wallet-info"
headers = fz_hs(auth_code, authorization, user_agent, "99914b932bd37a50b983c5e7c90ae93b")
data = json.dumps({}) # 发送空的JSON数据
#print(url)
try:
response = requests.post(url, headers=headers, data=data)
response.raise_for_status()
response_data = response.json()
#print("解析的JSON数据:", response_data)
# 判断code并提取所需数据
if response_data.get('code') == 0:
user_id = response_data['data']['wallet_info'].get('user_id')
total_balance = response_data['data']['wallet_info'].get('total_balance')
today_income = response_data['data']['wallet_info'].get('today_income')
#print(f"用户ID: {user_id}, 总余额: {total_balance}, 今日收入: {today_income}")
print(f"🆔: {user_id}, 总💸: {total_balance}, 今日: {today_income}")
# 判断今日收入是否大于0
if float(today_income) > 0:
print("今日已有收入,不需要签到")
#tj_sign(auth_code, authorization)#测试提交签到
else:
print("今日无收入,需要签到")
tj_sign(auth_code, authorization)
else:
print("响应代码不为0,完整响应体:", response_data)
except ValueError:
print("响应不是有效的JSON格式。")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
def tj_sign(auth_code, authorization): # 提交签到
url = f"{base_url}/user/do-sign"
headers = fz_hs(auth_code, authorization, user_agent, "99914b932bd37a50b983c5e7c90ae93b")
data = json.dumps({}) # 发送空的JSON数据
try:
response = requests.post(url, headers=headers, data=data)
response.raise_for_status()
response_data = response.json()
#print("解析的JSON数据:", response_data)
# 提取所需数据并转换时间戳
if 'data' in response_data and len(response_data['data']) > 0:
for item in response_data['data']:
user_id = item.get('user_id')
sign_date = timestamp_to_beijing_time(item.get('sign_date'))
sign_time = timestamp_to_beijing_time(item.get('sign_time'))
#print(f"用户: {user_id}, 签名日期: {sign_date}, 签到时间: {sign_time}")
print(f" 签名日期: {sign_date}, 签到🎉: {sign_time}")
return response_data
except ValueError:
print("响应不是有效的JSON格式。")
return None
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
#------------通知开始-----------
class Tee:
def __init__(self, *files):
self.files = files
def write(self, obj):
for file in self.files:
file.write(obj)
file.flush() # 确保及时输出
def flush(self):
for file in self.files:
file.flush()
#------------通知结束-----------
def main():
string_io = StringIO()
original_stdout = sys.stdout
try:
sys.stdout = Tee(sys.stdout, string_io)
var_name = 'qztoken' # 环境变量名
accounts = get_env_variable(var_name)
if not accounts:
return
print(f'找到 {len(accounts)} 个账号的令牌。')
total_tokens = len(accounts)
for index, account in enumerate(accounts, start=1):
parts = account.split('#')
auth_code, authorization = parts[0], parts[1]
remark = None if len(parts) == 2 else parts[2] # 检查是否有备注
remark_info = f" --- 备注: {remark}" if remark else ""
print(f"------账号 {index}/{total_tokens}{remark_info} ------")
wdqbsj(auth_code, authorization) # 个人信息/钱包
# 暂停3到5秒
time.sleep(random.randint(3, 5))
finally:
sys.stdout = original_stdout
output_content = string_io.getvalue()
if enable_notification:
send("-泉站大桶订水-通知", output_content)
if __name__ == "__main__":
main()
"""
#本地测试用
os.environ['qztoken'] = '''
authcode # authorization
'''
def main():
var_name = 'qztoken' # 环境变量名
accounts = get_env_variable(var_name)
if not accounts:
return
print(f'找到 {len(accounts)} 个账号的令牌。')
total_tokens = len(accounts)
for index, account in enumerate(accounts, start=1):
parts = account.split('#')
auth_code, authorization = parts[0], parts[1]
remark = None if len(parts) == 2 else parts[2] # 检查是否有备注
remark_info = f" --- 备注: {remark}" if remark else ""
print(f"------账号 {index}/{total_tokens}{remark_info} ------")
wdqbsj(auth_code, authorization)# 个人信息/钱包
if __name__ == "__main__":
main()
"""
-427
View File
@@ -1,427 +0,0 @@
/**
变量名 qzmCookie 抓包 x-qzm-token 每天0.6,满10提现,绑定支付宝时会自动提现0.3,秒到,
*/
const $ = new ENV("趣攒米视频任务", ["qzmCookie"]);
const cookieArr = $.qzmCookie.split("&");
class QZM {
constructor(ck, index) {
this.ck = ck.split("#")[0];
this.index = ++index;
this.oaid = this.randomString(16);
this.androidId = this.randomString(16);
}
randomString(length) {
// const table = "0123456789ABCDEF";
const table = "0123456789abcdef";
const _0x5ddc9a = {
length: length
};
return Array.from(_0x5ddc9a, () => table[Math.floor(Math.random() * table.length)]).join("");
}
randomStringNum(length) {
// const table = "0123456789ABCDEF";
const table = "0123456789";
const _0x5ddc9a = {
length: length
};
return Array.from(_0x5ddc9a, () => table[Math.floor(Math.random() * table.length)]).join("");
}
async main() {
const info = await this.getUserInfo();
if (!info) {
return void 0;
}
try {
$.log(`账号[${this.index}]【${this.nickName}】 获取任务列表`)
const tasks = await this.taskList()
$.log(`账号[${this.index}]【${this.nickName}】 刷新令牌`)
await this.access()
for (const task of tasks) {
const source = task.source;
$.log(`账号[${this.index}]【${this.nickName}】 开始任务 ${task.name}`)
for (let i = 0; i < 10; i++) {
try {
$.log(`账号[${this.index}]【${this.nickName}】 假装看广告 ${i+1}`)
await this.ecpm();
}catch (e) {
console.log(e)
}
await $.wait(10000)
}
try {
$.log(`账号[${this.index}]【${this.nickName}】 领取奖励`)
const re = await this.reward(source)
if (re){
$.log(`账号[${this.index}]【${this.nickName}】 领取奖励成功`)
}else {
$.log(`账号[${this.index}]【${this.nickName}】 领取奖励失败`)
}
}catch (e) {
console.log(e)
}
}
} catch (e) {
console.log(e)
}
try {
$.log(`账号[${this.index}]【${this.nickName}】 兑换金币`)
await this.getUserInfo()
if (this.point>=1000){
await this.trade(this.point)
}else {
$.log(`账号[${this.index}]【${this.nickName}】 当前金币数量不可兑换`)
}
}catch (e) {
console.log(e)
}
}
async getUserInfo() {
const options = {
'method': 'GET',
'url': 'https://api.quzanmi.com/api/user/info/mine',
'headers': {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'http://anh5.quzanmi.com',
'Pragma': 'no-cache',
'Referer': 'http://anh5.quzanmi.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 22081212C Build/UKQ1.230917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.3 Mobile Safari/537.36 AgentWeb/5.0.8 UCBrowser/11.6.4.950',
'sec-ch-ua': '"Android WebView";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'x-qzm-aid': `|${this.oaid}|${this.androidId}`,
'x-qzm-bundle': 'com.zhangwen.quzanmi|Xiaomi|13|1.0.0',
'x-qzm-device': 'android',
'x-qzm-time': parseInt((Date.now() / 1000).toString()).toString(),
'x-qzm-token': this.ck,
}
};
const res = await $.request(options);
if (res.code === 2000) {
this.id = res.data.id;
this.phone = res.data.phone_number;
this.nickName = res.data.nickname;
this.realName = res.data.realname;
this.score = res.data.score;
this.today_income = res.data.today_income;
this.banlance = res.data.balance;
this.payment_num = res.data.payment_num;
this.point = res.data.point;
this.total_balance = res.data.total_balance;
// console.log( res.data)
$.log(`账号[${this.index}]【${this.nickName}】 真名: ${this.realName} 手机号: ${this.phone}`);
$.log(`账号[${this.index}]【${this.nickName}】 余额: ${this.banlance} 金币: ${this.point}`);
return true;
} else {
$.log(`获取用户信息失败: ${res.message}`);
return false;
}
}
async taskList() {
const options = {
'method': 'GET',
'url': 'https://api.quzanmi.com/api/ad/android/list',
'headers': {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'http://anh5.quzanmi.com',
'Pragma': 'no-cache',
'Referer': 'http://anh5.quzanmi.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 22081212C Build/UKQ1.230917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.3 Mobile Safari/537.36 AgentWeb/5.0.8 UCBrowser/11.6.4.950',
'sec-ch-ua': '"Android WebView";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'x-qzm-aid': `|${this.oaid}|${this.androidId}`,
'x-qzm-bundle': 'com.zhangwen.quzanmi|Redmi|14|1.0.1',
'x-qzm-device': 'android',
'x-qzm-time': parseInt((Date.now() / 1000).toString()).toString(),
'x-qzm-token': this.ck,
}
};
const res = await $.request(options);
if (res.code === 2000) {
const list = res.data.filter(item => item.source.includes("videoad"));
// console.log(list)
return list
} else {
$.log(`账号[${this.index}]【${this.nickName}】 获取任务列表 ${res.msg}`);
return false;
}
}
async access() {
const options = {
'method': 'POST',
'url': 'https://api.aibianxian.net/igame/api/v1.0/cplApi/access',
'headers': {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'http://anh5.quzanmi.com',
'Pragma': 'no-cache',
'Referer': 'http://anh5.quzanmi.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 22081212C Build/UKQ1.230917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.3 Mobile Safari/537.36 AgentWeb/5.0.8 UCBrowser/11.6.4.950',
'sec-ch-ua': '"Android WebView";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'x-qzm-aid': `|${this.oaid}|${this.androidId}`,
'x-qzm-bundle': 'com.zhangwen.quzanmi|Redmi|14|1.0.1',
'x-qzm-device': 'android',
'x-qzm-time': parseInt((Date.now() / 1000).toString()).toString(),
'x-qzm-token': this.ck,
'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryZnyXeBEEvBYSL7mL'
},
formData: {
'app_key': '142793900',
'device': 'android',
'device_info': this.oaid,
'target_id': this.id
}
};
const res = await $.request(options);
// console.log(res)
if (res.code == 200) {
this.token = res.data.token;
// console.log(this.token)
return true
} else {
$.log(`账号[${this.index}]【${this.nickName}】 刷新令牌 ${res.msg}`);
return false;
}
}
randomEcpm(min, max) {
// 生成一个介于min和max之间的随机整数
const randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
// 将随机数转换为字符串
return randomNumber.toString();
}
async reward(source) {
const options = {
url: `https://api.quzanmi.com/api/ad/android/reward`,
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'http://anh5.quzanmi.com',
'Pragma': 'no-cache',
'Referer': 'http://anh5.quzanmi.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'Content-Type': 'application/json;charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 22081212C Build/UKQ1.230917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.3 Mobile Safari/537.36 AgentWeb/5.0.8 UCBrowser/11.6.4.950',
'sec-ch-ua': '"Android WebView";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'x-qzm-aid': `|${this.oaid}|${this.androidId}`,
'x-qzm-bundle': 'com.zhangwen.quzanmi|Redmi|14|1.0.1',
'x-qzm-device': 'android',
'x-qzm-time': parseInt((Date.now() / 1000).toString()).toString(),
'x-qzm-token': this.ck,
},
body: JSON.stringify({"source": source})
}
const res = await $.request(options);
if (res.code === 2000) {
return true
} else {
$.log(`账号[${this.index}]【${this.nickName}】 领取奖励 ${res.msg}`);
return false;
}
}
async ecpm() {
const options = {
url: `https://api.quzanmi.com/api/ad/app/ecpm`,
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'http://anh5.quzanmi.com',
'Pragma': 'no-cache',
'Referer': 'http://anh5.quzanmi.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'Content-Type': 'application/json;charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 22081212C Build/UKQ1.230917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.3 Mobile Safari/537.36 AgentWeb/5.0.8 UCBrowser/11.6.4.950',
'sec-ch-ua': '"Android WebView";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'x-qzm-aid': `|${this.oaid}|${this.androidId}`,
'x-qzm-bundle': 'com.zhangwen.quzanmi|Redmi|14|1.0.1',
'x-qzm-device': 'android',
'x-qzm-time': parseInt((Date.now() / 1000).toString()).toString(),
'x-qzm-token': this.ck,
},
body: JSON.stringify({"ecpm": this.randomEcpm(100000,800000)+".0", "source": "android", "kind": "rewardAd", "rit_id": "1"+this.randomStringNum(8)})
}
const res = await $.request(options);
if (res.code === 2000) {
return true
} else {
return false;
}
}
async trade(point){
const options = {
url: 'https://api.quzanmi.com/api/user/point/trade',
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Origin': 'http://anh5.quzanmi.com',
'Pragma': 'no-cache',
'Referer': 'http://anh5.quzanmi.com/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'cross-site',
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 22081212C Build/UKQ1.230917.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/125.0.6422.3 Mobile Safari/537.36 AgentWeb/5.0.8 UCBrowser/11.6.4.950',
'sec-ch-ua': '"Android WebView";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
'sec-ch-ua-mobile': '?1',
'sec-ch-ua-platform': '"Android"',
'x-qzm-aid': `|${this.oaid}|${this.androidId}`,
'x-qzm-bundle': 'com.zhangwen.quzanmi|Redmi|14|1.0.1',
'x-qzm-device': 'android',
'x-qzm-time': parseInt((Date.now() / 1000).toString()).toString(),
'x-qzm-token': this.ck,
},
body: JSON.stringify({
"point": Math.floor(point / 1000) * 1000
})
}
// console.log(options)
const res = await $.request(options);
// console.log(res)
if (res.code === 2000) {
$.log(`账号[${this.index}]【${this.nickName}】 兑换金币成功`);
return true
} else {
$.log(`账号[${this.index}]【${this.nickName}】 兑换金币 ${res.msg}`);
return false;
}
}
};
(async () => {
const qzm = [];
for (const index in cookieArr) {
qzm.push(new QZM(cookieArr[index], index));
}
for (const qzmElement of qzm) {
try {
await qzmElement.main();
} catch (e) {
console.log(e)
}
}
})();
function ENV(name, envNames) {
const request = require("request");
const cryptoJS = require("crypto-js");
return new class {
constructor(name, envNames = []) {
this.name = name;
this.envNames = envNames;
this.startTime = Date.now();
this.logs = [];
if (this.envNames.length > 0) {
for (const envName of envNames) {
this[envName] = process.env[envName];
}
}
this.log(`🔔${this.name},开始!`)
}
log(...args) {
args.length > 0 && (this.logs = [...this.logs, ...args])
console.log(...args)
}
md5(str) {
return cryptoJS.MD5(str).toString()
}
sha256(str) {
return cryptoJS.SHA256(str).toString()
}
aesCBCEncrypt(data, key, iv) {
const n = cryptoJS.enc.Hex.parse(key);
const r = cryptoJS.enc.Hex.parse(iv);
const o = cryptoJS.AES.encrypt(data, n, {
iv: r,
mode: cryptoJS.mode.CBC,
padding: cryptoJS.pad.Pkcs7
});
return cryptoJS.enc.Base64.stringify(o.ciphertext);
}
aesCBCDecrypt(data, key, iv) {
const n = cryptoJS.enc.Hex.parse(key);
const r = cryptoJS.enc.Hex.parse(iv);
const o = cryptoJS.AES.decrypt(data, n, {
iv: r,
mode: cryptoJS.mode.CBC,
padding: cryptoJS.pad.Pkcs7
});
return o.toString(cryptoJS.enc.Utf8);
}
request(options) {
options.gzip = true;
return new Promise((resolve, reject) => {
request(options, (error, response, body) => {
if (error) {
resolve(error)
}
try {
const objBody = JSON.parse(body);
resolve(objBody);
} catch (e) {
resolve(body)
}
})
})
}
wait(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
}(name, envNames)
}