mirror of
https://github.com/smallfawn/QLScriptPublic.git
synced 2026-06-04 21:00:53 +08:00
feat(feat some code): null
This commit is contained in:
parent
7f85794520
commit
e15bcacb1b
194
daily/choubao.js
Normal file
194
daily/choubao.js
Normal file
@ -0,0 +1,194 @@
|
||||
/*
|
||||
------------------------------------------
|
||||
@Author: sm
|
||||
@Date: 2024.06.07 19:15
|
||||
@Description:
|
||||
cron: 30 9 * * *
|
||||
------------------------------------------
|
||||
#Notice:
|
||||
臭宝乐园 微信小程序 签到得积分 换螺蛳粉
|
||||
抓https://cb-bags-slb.weinian.com.cn 请求头token 多账户&或换行.
|
||||
变量名称:choubaoleyuan
|
||||
⚠️【免责声明】
|
||||
------------------------------------------
|
||||
1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。
|
||||
2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
|
||||
3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。
|
||||
4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
|
||||
5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。
|
||||
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。
|
||||
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。
|
||||
*/
|
||||
|
||||
const {
|
||||
Env
|
||||
} = require("../tools/env")
|
||||
const $ = new Env("臭宝乐园");
|
||||
let ckName = `choubaoleyuan`;
|
||||
const strSplitor = "#";
|
||||
const axios = require("axios");
|
||||
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
|
||||
|
||||
|
||||
class Task {
|
||||
constructor(env) {
|
||||
this.index = $.userIdx++
|
||||
this.user = env.split(strSplitor);
|
||||
this.token = this.user[0];
|
||||
|
||||
}
|
||||
|
||||
async run() {
|
||||
await this.getUserInfo()
|
||||
await this.track()
|
||||
await this.checkSign()
|
||||
}
|
||||
async getUserInfo() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://cb-bags-slb.weinian.com.cn/wnuser/v1/memberUser/getMemberUser`,
|
||||
headers: {
|
||||
"accept": "*/*",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"authorization": "" + this.token + "",
|
||||
"content-type": "application/json",
|
||||
"priority": "u=1, i",
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "cross-site",
|
||||
"user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
|
||||
}
|
||||
}
|
||||
let {
|
||||
data: result
|
||||
} = await axios.request(options);
|
||||
if (result?.status == '200') {
|
||||
//打印签到结果
|
||||
$.log(`🌸账号[${this.index}]` + `[${result.data.nickName}] 积分[${result.data.points}]🎉`);
|
||||
} else {
|
||||
$.log(`🌸账号[${this.index}] 获取用户信息-失败:${result.msg}❌`)
|
||||
}
|
||||
}
|
||||
async track() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://cb-bags-slb.weinian.com.cn/member/v1/memberBuryPoint/add`,
|
||||
headers: {
|
||||
"accept": "*/*",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"authorization": "" + this.token + "",
|
||||
"content-type": "application/json",
|
||||
"priority": "u=1, i",
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "cross-site",
|
||||
"user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
|
||||
},
|
||||
data: { "appletVersion": "2.0.31", "phoneSystem": "Windows Unknown x64", "phoneModel": "microsoft", "functionName": "签到", "module": "首页", "linkUrl": "pages/signIn/signIn", "secondPage": "" }
|
||||
}
|
||||
await axios.request(options);
|
||||
}
|
||||
async checkSign() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://cb-bags-slb.weinian.com.cn/wnuser/v1/memberUser/checkSignNum`,
|
||||
headers: {
|
||||
"accept": "*/*",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"authorization": "" + this.token + "",
|
||||
"content-type": "application/json",
|
||||
"priority": "u=1, i",
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "cross-site",
|
||||
"user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027'
|
||||
},
|
||||
data: {
|
||||
|
||||
}
|
||||
};
|
||||
let {
|
||||
data: result
|
||||
} = await axios.request(options);
|
||||
if (result?.status == '200') {
|
||||
//打印签到结果
|
||||
await this.signIn()
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
async signIn() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://cb-bags-slb.weinian.com.cn/wnuser/v1/memberUser/daySign`,
|
||||
headers: {
|
||||
"accept": "*/*",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"authorization": "" + this.token + "",
|
||||
"content-type": "application/json",
|
||||
"priority": "u=1, i",
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "cross-site"
|
||||
},
|
||||
data: {
|
||||
|
||||
}
|
||||
};
|
||||
let {
|
||||
data: result
|
||||
} = await axios.request(options);
|
||||
if (result?.status == '200') {
|
||||
//打印签到结果
|
||||
$.log(`🌸账号[${this.index}]` + `签到成功🎉`);
|
||||
} else {
|
||||
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}❌`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
await getNotice()
|
||||
$.checkEnv(ckName);
|
||||
|
||||
for (let user of $.userList) {
|
||||
await new Task(user).run();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done());
|
||||
|
||||
async function getNotice() {
|
||||
try {
|
||||
let options = {
|
||||
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
|
||||
headers: {
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
timeout: 3000
|
||||
}
|
||||
let {
|
||||
data: res
|
||||
} = await axios.request(options);
|
||||
$.log(res)
|
||||
return res
|
||||
} catch (e) { }
|
||||
|
||||
}
|
||||
186
daily/guyu.js
Normal file
186
daily/guyu.js
Normal file
@ -0,0 +1,186 @@
|
||||
/*
|
||||
------------------------------------------
|
||||
@Author: sm
|
||||
@Date: 2024.06.07 19:15
|
||||
@Description: 谷雨小程序 换化妆品
|
||||
cron: 30 11 * * *
|
||||
------------------------------------------
|
||||
#Notice:
|
||||
抓取token方法:
|
||||
https://mall-mobile-v6.vecrp.com/mobile 请求头的token
|
||||
多账户&或换行
|
||||
变量名:gy
|
||||
|
||||
⚠️【免责声明】
|
||||
------------------------------------------
|
||||
1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。
|
||||
2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
|
||||
3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。
|
||||
4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
|
||||
5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。
|
||||
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。
|
||||
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。
|
||||
*/
|
||||
|
||||
const {
|
||||
Env
|
||||
} = require("../tools/env")
|
||||
const $ = new Env("谷雨小程序");
|
||||
let ckName = `guyu`;
|
||||
const strSplitor = "#";
|
||||
const axios = require("axios");
|
||||
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
|
||||
|
||||
|
||||
class Task {
|
||||
constructor(env) {
|
||||
this.index = $.userIdx++
|
||||
this.user = env.split(strSplitor);
|
||||
this.token = this.user[0];
|
||||
|
||||
}
|
||||
|
||||
async run() {
|
||||
await this.getUserPoints()
|
||||
await this.signIn()
|
||||
}
|
||||
sha1(str) {
|
||||
return require("crypto").createHash("sha1").update(str).digest("hex");
|
||||
}
|
||||
request(options) {
|
||||
|
||||
var sign,
|
||||
n = void 0
|
||||
, d = {},
|
||||
l = "R6WbJ830wNsEdjH9GumwKYiYxHz0K9QD",
|
||||
n = (new Date).getTime(),
|
||||
n = '1775622877751'
|
||||
d = "post" === options.method || "POST" === options.method ? {
|
||||
body: JSON.stringify(options.data),
|
||||
secretKey: l,
|
||||
ts: n
|
||||
} : Object.assign({}, options.params, {
|
||||
secretKey: l,
|
||||
ts: n
|
||||
}),
|
||||
sign = this.sha1(function (e) {
|
||||
var t, a = [];
|
||||
for (t in e) {
|
||||
var r = t + e[t];
|
||||
a.push(r)
|
||||
}
|
||||
a.sort();
|
||||
var u = "";
|
||||
return a.map((function (e) {
|
||||
"" === u ? u = e : u += e
|
||||
}
|
||||
)),
|
||||
u
|
||||
}(d))
|
||||
let baseHeaders = {
|
||||
host: "mall-mobile-v6.vecrp.com",
|
||||
"accept": "*/*",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"appid": "wxda948f3be0afc375",
|
||||
"content-type": "application/json;charset=UTF-8",
|
||||
"sec-fetch-dest": "empty",
|
||||
"sec-fetch-mode": "cors",
|
||||
"sec-fetch-site": "cross-site",
|
||||
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf254173b) XWEB/19027",
|
||||
"sign": "" + sign,
|
||||
"starttime": "" + n,
|
||||
"token": "" + this.token,
|
||||
"ts": "" + n,
|
||||
"x-tracedid": "" + $.uuid(),
|
||||
"xweb_xhr": "1",
|
||||
"Referer": "https://servicewechat.com/wxda948f3be0afc375/65/page-frame.html",
|
||||
}
|
||||
options.headers = Object.assign(options.headers, baseHeaders)
|
||||
return axios.request(options)
|
||||
}
|
||||
async signIn() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://mall-mobile-v6.vecrp.com/mobile/activity/sign/sign`,
|
||||
|
||||
headers: {},
|
||||
data: {
|
||||
activityId: 'cdd30467-abb8-4944-8941-2879aa950a86',
|
||||
shopId: '100186753',
|
||||
signDate: new Date,
|
||||
mtParticipateId: ''
|
||||
}
|
||||
|
||||
};
|
||||
let {
|
||||
data: result
|
||||
} = await this.request(options);
|
||||
|
||||
if (result?.success) {
|
||||
//打印签到结果
|
||||
$.log(`🌸账号[${this.index}]` + `签到成功`);
|
||||
} else {
|
||||
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}❌`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
async getUserPoints() {
|
||||
let options = {
|
||||
method: 'GET',
|
||||
url: `https://mall-mobile-v6.vecrp.com/mobile/customer/getMyAllPoint`,
|
||||
params: {
|
||||
shopId: '100186753'
|
||||
},
|
||||
headers: {},
|
||||
|
||||
}
|
||||
let {
|
||||
data: result
|
||||
} = await this.request(options);
|
||||
if (result?.success) {
|
||||
$.log(`账号[${this.index}]` + `积分:${result.result[0].score}`);
|
||||
} else {
|
||||
$.log(`账号[${this.index}] 获取积分-失败:${result.msg}❌`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
await getNotice()
|
||||
$.checkEnv(ckName);
|
||||
|
||||
for (let user of $.userList) {
|
||||
await new Task(user).run();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done());
|
||||
|
||||
async function getNotice() {
|
||||
try {
|
||||
let options = {
|
||||
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
|
||||
headers: {
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
timeout: 3000
|
||||
}
|
||||
let {
|
||||
data: res
|
||||
} = await axios.request(options);
|
||||
$.log(res)
|
||||
return res
|
||||
} catch (e) { }
|
||||
|
||||
}
|
||||
610
pangguai.py
610
pangguai.py
@ -1,610 +0,0 @@
|
||||
|
||||
"""
|
||||
* 设置变量 PGSH_TOKEN,多号使用&隔开,网页获取ck:https://bigostk.github.io/pg/
|
||||
* ck格式1:token#备注
|
||||
* ck格式2: token
|
||||
* 代理开关变量名:pg_dl,True为开启代理模式,False为关闭,默认为False
|
||||
* 代理变量名:pg_dlurl,代理地址是动态代理api接口,一次性提取一个,选择txt格式,\r\n或者\n模式都可以
|
||||
* 并发开关变量名:pg_bf,True为开启并发模式,False为关闭,默认为False
|
||||
* 并发数量变量名:pg_bfsum,并发几个就写几个,默认为3
|
||||
* 推送开关变量名:pg_ts,True为开启推送,False为关闭,默认为False
|
||||
* 推送变量名1:WxPusher:pg_WxPusher_token是你的WxPusher的推送组的token,pg_WxPusher_uid是你的WxPusher该推送组的用户uid,推送给谁就填写谁的,填写一个即可
|
||||
* 推送变量名2:pushplus:pg_pushplus_token是你的pushplus的token
|
||||
* Top: 上面两个推送配置哪个就使用哪个推送,两个都配置的话就两个都进行推送
|
||||
* 数据库地址变量名:pg_ckurl,保证打开数据库里面是ck,并使用&隔开,或者ck#备注,并使用&隔开
|
||||
* 不填备注默认使用隐私格式手机号作为用户名,否则使用填写的备注作为用户名
|
||||
* 出现False就是任务已完成或者不可完成
|
||||
|
||||
"""
|
||||
import subprocess
|
||||
|
||||
def check_yl():
|
||||
lb = ['requests', 'urllib3', 'requests_toolbelt', 'fake_useragent'] # 添加 fake_useragent 依赖
|
||||
for yl in lb:
|
||||
try:
|
||||
subprocess.check_call(["pip", "show", yl], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
except subprocess.CalledProcessError:
|
||||
print(f"{yl} 未安装,开始安装...")
|
||||
subprocess.check_call(["pip", "install", yl, "-i", "https://pypi.tuna.tsinghua.edu.cn/simple"],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
print(f"{yl} 安装完成")
|
||||
|
||||
check_yl()
|
||||
############################### 本地环境ck,环境变量存在此处不生效
|
||||
|
||||
|
||||
# 在下方填入你的Token后,运行代码
|
||||
ck = ""
|
||||
|
||||
|
||||
|
||||
ckurl1 = "" # 数据库地址,适配部分群友要求
|
||||
jh = False # 聚合ck模式,开启即所有环境模式ck都生效,都会合成为一个ck列表,关闭则优先处理环境变量,默认为True,False为关闭
|
||||
|
||||
#############################
|
||||
# -----运行模式配置区,自行配置------
|
||||
|
||||
bf1 = False # True开启并发,False关闭并发
|
||||
bfsum1 = 5 # 并发数,开启并发模式生效
|
||||
lljf = 1 # 运行新版浏览任务,22金币,只有10天
|
||||
|
||||
# -------推送配置区,自行填写-------
|
||||
|
||||
ts1 = True # True开启推送,False关闭推送
|
||||
|
||||
# -------代理配置区,自行填写-------
|
||||
|
||||
dl1 = False # True开启代理,False关闭代理
|
||||
dl_url = "" # 代理池api
|
||||
|
||||
# -----代理时间配置区,秒为单位------
|
||||
|
||||
dl_sleep = 30 # 代理切换时间
|
||||
qqtime = 15 # 请求超时时间
|
||||
|
||||
# -----时间配置区,默认即可------
|
||||
|
||||
a = "6"
|
||||
b = "22" # 表示6-22点之间才执行任务
|
||||
|
||||
#############################
|
||||
# ---------勿动区----------
|
||||
|
||||
# 已隐藏乾坤于此区域
|
||||
|
||||
###########################
|
||||
# ---------代码块---------
|
||||
|
||||
import requests
|
||||
import time
|
||||
import random
|
||||
import string
|
||||
import os
|
||||
import json
|
||||
import hashlib
|
||||
import threading
|
||||
from functools import partial
|
||||
from urllib.parse import urlparse
|
||||
from datetime import datetime, timedelta
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from urllib3.exceptions import InsecureRequestWarning
|
||||
from requests_toolbelt import MultipartEncoder
|
||||
from fake_useragent import UserAgent
|
||||
|
||||
# ==================================================================================
|
||||
# ======================== 伪装模块 - Anti-Detection Module ========================
|
||||
# ==================================================================================
|
||||
|
||||
class Humanizer:
|
||||
"""
|
||||
这是一个模拟人类行为的模块,用于取代固定的延时和参数。
|
||||
人类行为不是固定的 time.sleep(6),而是充满随机和不确定性。
|
||||
"""
|
||||
def __init__(self):
|
||||
try:
|
||||
self.ua = UserAgent()
|
||||
except Exception:
|
||||
self.fallback_uas = [
|
||||
"okhttp/3.14.9",
|
||||
"Dalvik/2.1.0 (Linux; U; Android 13; SM-S908U Build/TP1A.220624.014)",
|
||||
"Dalvik/2.1.0 (Linux; U; Android 12; SM-G998B Build/SP1A.210812.016)",
|
||||
"Dalvik/2.1.0 (Linux; U; Android 11; Pixel 5 Build/RQ3A.210805.001a)"
|
||||
]
|
||||
self.ua = None
|
||||
self.phone_brands = ["Xiaomi", "Redmi", "HUAWEI", "OPPO", "VIVO", "Realme", "OnePlus", "Samsung"]
|
||||
|
||||
def random_sleep(self, min_s, max_s):
|
||||
"""模拟人类操作的随机停顿,单位为秒"""
|
||||
time.sleep(random.uniform(min_s, max_s))
|
||||
|
||||
def get_user_agent(self, type='android'):
|
||||
"""获取一个随机的、真实的User-Agent"""
|
||||
if self.ua:
|
||||
return self.ua.random
|
||||
else:
|
||||
return random.choice(self.fallback_uas)
|
||||
|
||||
def get_device_brand(self):
|
||||
"""随机获取一个手机品牌"""
|
||||
return random.choice(self.phone_brands)
|
||||
|
||||
@staticmethod
|
||||
def shuffle_headers(headers):
|
||||
"""将请求头的顺序随机化"""
|
||||
header_list = list(headers.items())
|
||||
random.shuffle(header_list)
|
||||
return dict(header_list)
|
||||
|
||||
humanizer = Humanizer() # 实例化“伪装者”
|
||||
|
||||
# ======================== 伪装模块结束 ========================
|
||||
|
||||
|
||||
dl = os.environ.get('pg_dl', dl1)
|
||||
proxy_api_url = os.environ.get('pg_dlurl', dl_url)
|
||||
bf = os.environ.get('pg_bf', bf1)
|
||||
bfsum = os.environ.get('pg_bfsum', bfsum1)
|
||||
ts = os.environ.get('pg_ts', str(ts1)) # 确保ts从环境变量获取时是字符串
|
||||
ckurl = os.environ.get('pg_ckurl', ckurl1)
|
||||
WxPusher_uid = os.environ.get('pg_WxPusher_uid')
|
||||
WxPusher_token = os.environ.get('pg_WxPusher_token')
|
||||
pushplus_token = os.environ.get('pg_pushplus_token')
|
||||
|
||||
|
||||
v = '7.0.3-final' # 版本号升级
|
||||
|
||||
global_proxy = {
|
||||
'http': None,
|
||||
'https': None
|
||||
}
|
||||
|
||||
|
||||
def start_dlapi():
|
||||
dlstart = threading.Thread(target=get_proxy, args=(stop_event,))
|
||||
dlstart.start()
|
||||
|
||||
|
||||
stop_event = threading.Event()
|
||||
|
||||
|
||||
def get_proxy(stop_event):
|
||||
global global_proxy, ipp
|
||||
a = 0
|
||||
while not stop_event.is_set():
|
||||
a += 1
|
||||
try:
|
||||
response = requests.get(proxy_api_url)
|
||||
if response.status_code == 200:
|
||||
proxy1 = response.text.strip()
|
||||
if "白名单" not in proxy1 and ":" in proxy1:
|
||||
print(f'✅第{a}次获取代理成功: {proxy1}')
|
||||
ipp = proxy1.split(':')[0]
|
||||
global_proxy = {'http': f'http://{proxy1}', 'https': f'http://{proxy1}'}
|
||||
humanizer.random_sleep(dl_sleep - 5, dl_sleep + 5)
|
||||
else:
|
||||
print(f"请求代理池: {proxy1}")
|
||||
if "白名单" in proxy1:
|
||||
print("响应中存在白名单字样,结束运行")
|
||||
os._exit(0)
|
||||
else:
|
||||
print(f'❎第{a}次获取代理失败!状态码: {response.status_code},将随机等待后重试!')
|
||||
humanizer.random_sleep(dl_sleep, dl_sleep * 1.5)
|
||||
except Exception as e:
|
||||
print(f"❎获取代理时发生网络错误: {e},将随机等待后重试!")
|
||||
humanizer.random_sleep(dl_sleep, dl_sleep * 1.5)
|
||||
|
||||
|
||||
def p(p):
|
||||
if len(p) == 11:
|
||||
return p[:3] + '****' + p[7:]
|
||||
else:
|
||||
return p
|
||||
|
||||
|
||||
class PGSH:
|
||||
def __init__(self, cki):
|
||||
self.msg = None
|
||||
self.messages = []
|
||||
self.title = None
|
||||
self.phone = None
|
||||
self.token = cki.split('#')[0]
|
||||
self.cook = cki
|
||||
self.total_amount = 0
|
||||
self.id = None
|
||||
|
||||
self.device_ua = humanizer.get_user_agent()
|
||||
self.device_brand = humanizer.get_device_brand()
|
||||
|
||||
self.hd = {
|
||||
'User-Agent': self.device_ua,
|
||||
'Accept': 'application/json, text/plain, */*',
|
||||
'Version': "1.58.0",
|
||||
'Content-Type': "application/x-www-form-urlencoded;charset=UTF-8",
|
||||
'Authorization': self.token,
|
||||
'channel': "android_app"
|
||||
}
|
||||
self.hd1 = {
|
||||
'User-Agent': self.device_ua,
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Authorization': self.token,
|
||||
'Version': "1.58.0",
|
||||
'channel': "android_app",
|
||||
'phoneBrand': self.device_brand,
|
||||
'Content-Type': "application/x-www-form-urlencoded;charset=UTF-8"
|
||||
}
|
||||
self.session = requests.Session()
|
||||
|
||||
self.listUrl = 'https://userapi.qiekj.com/task/list'
|
||||
self.phone_url = 'https://userapi.qiekj.com/user/info'
|
||||
self.check_url = 'https://userapi.qiekj.com/user/balance'
|
||||
self.rcrw_url = 'https://userapi.qiekj.com/task/completed'
|
||||
self.sign_url = 'https://userapi.qiekj.com/signin/doUserSignIn'
|
||||
self.jtjl_url = 'https://userapi.qiekj.com/ladderTask/applyLadderReward'
|
||||
self.jrjf_url = "https://userapi.qiekj.com/integralRecord/pageList" # 新增:今日积分URL
|
||||
|
||||
def _make_request(self, method, url, headers, data=None, params=None, max_retries=3):
|
||||
humanizer.random_sleep(1.5, 3.5)
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
final_headers = humanizer.shuffle_headers(headers)
|
||||
response = self.session.request(
|
||||
method, url, headers=final_headers, data=data, params=params,
|
||||
proxies=global_proxy if dl else None, timeout=qqtime, verify=False
|
||||
)
|
||||
response.raise_for_status()
|
||||
return response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"~请求异常: {e}。模拟真人, {attempt + 1}/{max_retries} 次尝试...")
|
||||
if attempt < max_retries - 1:
|
||||
humanizer.random_sleep(3, 7)
|
||||
else:
|
||||
print(f"~达到最大重试次数,任务失败。")
|
||||
return None
|
||||
|
||||
def sg(self, y):
|
||||
timestamp = str(int(time.time() * 1000))
|
||||
path = urlparse(y).path
|
||||
data = f"appSecret=nFU9pbG8YQoAe1kFh+E7eyrdlSLglwEJeA0wwHB1j5o=&channel=android_app×tamp={timestamp}&token={self.token}&version=1.58.0&{path}"
|
||||
data1 = f"appSecret=Ew+ZSuppXZoA9YzBHgHmRvzt0Bw1CpwlQQtSl49QNhY=&channel=alipay×tamp={timestamp}&token={self.token}&{path}"
|
||||
sign = hashlib.sha256(data.encode()).hexdigest()
|
||||
sign1 = hashlib.sha256(data1.encode()).hexdigest()
|
||||
return sign, sign1, timestamp
|
||||
|
||||
def name(self):
|
||||
data = {'token': self.token}
|
||||
re = self._make_request('post', self.phone_url, headers=self.hd, data=data)
|
||||
if re and re['code'] == 0:
|
||||
try:
|
||||
self.phone = self.cook.split('#')[1] if "#" in self.cook else p(re['data']['phone'])
|
||||
except Exception:
|
||||
print(f'[账号] Cookie备注解析异常')
|
||||
return False
|
||||
|
||||
self.id = re["data"]["id"]
|
||||
sign, _, timestamp = self.sg(self.check_url)
|
||||
self.hd['sign'] = sign
|
||||
self.hd['timestamp'] = timestamp
|
||||
r = self._make_request('post', self.check_url, headers=self.hd, data=data)
|
||||
|
||||
if r and r['code'] == 0:
|
||||
balance = r['data']['integral']
|
||||
print(f"[{self.phone}] ✅登录成功!积分余额: {balance}")
|
||||
return True
|
||||
else:
|
||||
print(f"[{self.phone}] ❎获取余额失败: {r.get('msg', '未知错误') if r else '请求失败'}")
|
||||
return False
|
||||
else:
|
||||
msg = re.get("msg", "未知错误") if re else "请求失败"
|
||||
print(f"[账号] ❎登录失败==> {msg}")
|
||||
return False
|
||||
|
||||
def sign(self):
|
||||
data = {'activityId': '600001', 'token': self.token}
|
||||
sign, _, timestamp = self.sg(self.sign_url)
|
||||
self.hd['sign'] = sign
|
||||
self.hd['timestamp'] = timestamp
|
||||
re = self._make_request('post', self.sign_url, headers=self.hd, data=data)
|
||||
if re:
|
||||
print(f"[{self.phone}] ✅签到==> {re.get('msg', '无消息')}")
|
||||
|
||||
# 支付宝广告任务
|
||||
def zfbgg1(self):
|
||||
# 采纳用户建议:分组执行,每组6-10次,组间休息10-30秒
|
||||
print(f"--- 支付宝任务开始,将分批执行(每批6-10次) ---")
|
||||
total_tasks_done = 0
|
||||
max_tasks_possible = 50 # 任务上限
|
||||
|
||||
while total_tasks_done < max_tasks_possible:
|
||||
batch_size = random.randint(6, 10)
|
||||
print(f"--- 开始新一批任务,本批 {batch_size} 次 ---")
|
||||
|
||||
for t in range(batch_size):
|
||||
if total_tasks_done >= max_tasks_possible:
|
||||
print("~已达到50次任务上限,停止。")
|
||||
break
|
||||
|
||||
data = {'taskType': "9", 'token': self.token}
|
||||
_, sign1, timestamp = self.sg(self.rcrw_url)
|
||||
hd1 = {
|
||||
'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 13; MEIZU 20 Build/TKQ1.221114.001) Chrome/105.0.5195.148 MYWeb/0.11.0.240407200246 UWS/3.22.2.9999 UCBS/3.22.2.9999_220000000000 Mobile Safari/537.36 NebulaSDK/1.8.100112 Nebula AlipayDefined(nt:WIFI,ws:1080|1862|2.8125) AliApp(AP/10.5.88.8000) AlipayClient/10.5.88.8000 Language/zh-Hans useStatusBar/true isConcaveScreen/true NebulaX/1.0.0 DTN/2.0",
|
||||
'Connection': "Keep-Alive", 'Accept-Encoding': "gzip", 'Content-Type': "application/x-www-form-urlencoded",
|
||||
'Accept-Charset': "UTF-8", 'channel': "alipay", 'sign': sign1,
|
||||
'x-release-type': "ONLINE", 'version': "", 'timestamp': timestamp
|
||||
}
|
||||
response = self._make_request('post', self.rcrw_url, headers=hd1, data=data)
|
||||
|
||||
if response and response.get("data"):
|
||||
total_tasks_done += 1
|
||||
print(f"[{self.phone}] ✅第{total_tasks_done}次支付宝广告==> {response['data']}")
|
||||
else:
|
||||
msg = response.get('msg') if response else "请求失败"
|
||||
print(f"[{self.phone}] ❎第{total_tasks_done + 1}次广告失败==> {msg}, 模拟用户放弃")
|
||||
total_tasks_done = max_tasks_possible # 设置为最大值以跳出外层循环
|
||||
break # 跳出内层循环
|
||||
|
||||
humanizer.random_sleep(4, 8) # 模拟单次任务的观看延迟
|
||||
|
||||
if total_tasks_done >= max_tasks_possible:
|
||||
break # 跳出外层循环
|
||||
|
||||
# 模拟一组任务完成后的休息
|
||||
print(f"--- 本批完成,模拟休息... ---")
|
||||
humanizer.random_sleep(10, 30)
|
||||
|
||||
print(f"--- 支付宝任务结束,共完成 {total_tasks_done} 次 ---")
|
||||
|
||||
def rcrw(self):
|
||||
data = {'token': self.token}
|
||||
sign, _, timestamp = self.sg(self.listUrl)
|
||||
self.hd['sign'] = sign
|
||||
self.hd['timestamp'] = timestamp
|
||||
response = self._make_request('post', self.listUrl, headers=self.hd, data=data)
|
||||
if response and response.get('code') == 0:
|
||||
tasks = response.get('data', {}).get('items', [])
|
||||
if not tasks:
|
||||
print("~日常任务列表为空。")
|
||||
return
|
||||
|
||||
random.shuffle(tasks)
|
||||
print(f'[{self.phone}] ✅获取到{len(tasks)}个日常任务, 将随机顺序执行...')
|
||||
for item in tasks:
|
||||
title = item["title"]
|
||||
task_data = {'taskCode': item["taskCode"], 'token': self.token}
|
||||
sign, _, timestamp = self.sg(self.rcrw_url)
|
||||
self.hd['sign'] = sign
|
||||
self.hd['timestamp'] = timestamp
|
||||
|
||||
humanizer.random_sleep(3, 7)
|
||||
|
||||
response1 = self._make_request('post', self.rcrw_url, headers=self.hd, data=task_data)
|
||||
data1 = response1.get("data") if response1 else "请求失败"
|
||||
if data1:
|
||||
print(f'[{self.phone}] ✅完成日常任务[{title}]成功==> {data1}')
|
||||
else:
|
||||
print(f'[{self.phone}] ❎完成日常任务[{title}]失败==> {response1.get("msg") if response1 else "请求失败"}')
|
||||
else:
|
||||
print("❎获取日常任务列表失败!")
|
||||
|
||||
def timejl(self):
|
||||
url = "https://userapi.qiekj.com/timedBenefit/applyRewardForTimeBenefit"
|
||||
params = {'token': self.token}
|
||||
sign, _, timestamp = self.sg(url)
|
||||
self.hd1['sign'] = sign
|
||||
self.hd1['timestamp'] = timestamp
|
||||
r = self._make_request('get', url, headers=self.hd1, params=params)
|
||||
if r and r.get("code") == 0:
|
||||
print(f'[{self.phone}] ✅领取时间段奖励成功==> {r["data"]["rewardNum"]}')
|
||||
else:
|
||||
print(f'[{self.phone}] ❎领取时间段奖励失败==> {r.get("msg") if r else "请求失败"}')
|
||||
|
||||
def start(self):
|
||||
if not self.name():
|
||||
return
|
||||
|
||||
available_tasks = [
|
||||
{'name': '签到', 'func': self.sign},
|
||||
{'name': '领取时间段奖励', 'func': self.timejl},
|
||||
{'name': '支付宝广告', 'func': self.zfbgg1},
|
||||
{'name': '遍历日常任务', 'func': self.rcrw},
|
||||
]
|
||||
|
||||
random.shuffle(available_tasks)
|
||||
|
||||
print(f"\n[{self.phone}] --------滴滴, {self.device_brand} 牌快车发车, 坐稳了--------")
|
||||
print(f"本次任务序列: {[task['name'] for task in available_tasks]}")
|
||||
|
||||
for task in available_tasks:
|
||||
humanizer.random_sleep(5, 12)
|
||||
print(f"----- [{self.phone}] 开始执行: {task['name']} -----")
|
||||
try:
|
||||
task['func']()
|
||||
except Exception as e:
|
||||
print(f"执行任务 [{task['name']}] 时发生意外错误: {e}")
|
||||
|
||||
humanizer.random_sleep(10, 20)
|
||||
print(f"----- [{self.phone}] 所有任务已执行完毕 -----")
|
||||
|
||||
# 新增:查询当日积分(基于原版jrjf逻辑,适配为实例方法)
|
||||
def query_daily_points(self, i):
|
||||
try:
|
||||
# 1. 获取用户名
|
||||
# (name() 已经在start()中调用, self.phone 应该有值, 但为保险起见重新获取)
|
||||
hd_user = self.hd.copy()
|
||||
sign, _, timestamp = self.sg(self.phone_url)
|
||||
hd_user['sign'] = sign
|
||||
hd_user['timestamp'] = timestamp
|
||||
r = requests.post(self.phone_url, data={'token': self.token}, headers=hd_user).json()
|
||||
|
||||
if r['code'] != 0:
|
||||
return {'序号': i + 1, '用户': f"账号{i+1}", 'arg1': f"登录失败: {r['msg']}", 'arg2': "N/A"}
|
||||
|
||||
phone = p(r['data']['phone'])
|
||||
if "#" in self.cook:
|
||||
phone = self.cook.split('#')[1]
|
||||
|
||||
# 2. 获取总积分
|
||||
hd_balance = self.hd.copy()
|
||||
sign, _, timestamp = self.sg(self.check_url)
|
||||
hd_balance['sign'] = sign
|
||||
hd_balance['timestamp'] = timestamp
|
||||
r1 = requests.post(self.check_url, data={'token': self.token}, headers=hd_balance).json()
|
||||
balance = r1['data']['integral'] if r1['code'] == 0 else 'N/A'
|
||||
|
||||
# 3. 获取今日积分
|
||||
data = {
|
||||
'page': (None, '1'), 'pageSize': (None, '100'),
|
||||
'type': (None, '100'), 'receivedStatus': (None, '1'),
|
||||
'token': (None, self.token),
|
||||
}
|
||||
# 这个请求头是原版查询积分专用的,保持一致
|
||||
hd_jrjf = {
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 23117RK66C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/118.0.0.0 Mobile Safari/537.36 AgentWeb/5.0.0 UCBrowser/11.6.4.950 com.qiekj.QEUser',
|
||||
'Accept': 'application/json, text/plain, */*',
|
||||
'channel': 'android_app',
|
||||
}
|
||||
re_response = requests.post(self.jrjf_url, headers=hd_jrjf, files=data).json()
|
||||
|
||||
total_amount = 0
|
||||
if re_response.get('data') and re_response['data'].get('items'):
|
||||
current_date = datetime.now().strftime('%Y-%m-%d')
|
||||
for item in re_response['data']['items']:
|
||||
received_date = item['receivedTime'][:10]
|
||||
if received_date == current_date:
|
||||
total_amount += item['amount']
|
||||
print(f"[{phone}] ✅今日获得积分: {total_amount}")
|
||||
return {
|
||||
'序号': i + 1, '用户': phone, 'arg1': balance, 'arg2': total_amount
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"[账号{i + 1}] ❎查询当日积分出现错误: {e}")
|
||||
return {
|
||||
'序号': i + 1, '用户': f"账号{i+1}", 'arg1': "查询出错", 'arg2': "N/A"
|
||||
}
|
||||
|
||||
# ==================================================================================
|
||||
# ============================ 独立推送和汇总功能 ============================
|
||||
# ==================================================================================
|
||||
|
||||
def WxPusher_ts(content):
|
||||
try:
|
||||
url = 'https://wxpusher.zjiecode.com/api/send/message'
|
||||
params = {
|
||||
'appToken': WxPusher_token,
|
||||
'content': content,
|
||||
'summary': '胖乖生活-任务汇总',
|
||||
'contentType': 3, # 1为text, 2为html, 3为markdown
|
||||
'uids': [WxPusher_uid]
|
||||
}
|
||||
re = requests.post(url, json=params)
|
||||
msg = re.json().get('msg', None)
|
||||
print(f'WxPusher推送结果:{msg}\n')
|
||||
except Exception as e:
|
||||
print(f"WxPusher推送出现错误: {e}")
|
||||
|
||||
def pushplus_ts(content):
|
||||
try:
|
||||
url = 'https://www.pushplus.plus/send/'
|
||||
data = {
|
||||
"token": pushplus_token,
|
||||
"title": '胖乖生活-任务汇总',
|
||||
"content": content,
|
||||
"template": "html" # pushplus支持html
|
||||
}
|
||||
re = requests.post(url, json=data)
|
||||
msg = re.json().get('msg', None)
|
||||
print(f'pushplus推送结果:{msg}\n')
|
||||
except Exception as e:
|
||||
print(f"pushplus推送出现错误: {e}")
|
||||
|
||||
def format_and_send_summary(msg_list):
|
||||
try:
|
||||
sorted_data = sorted(msg_list, key=lambda x: x['序号'])
|
||||
table_content = ''
|
||||
for row in sorted_data:
|
||||
table_content += f"<tr><td style='border: 1px solid #ccc; padding: 6px;'>{row['序号']}</td><td style='border: 1px solid #ccc; padding: 6px;'>{row['用户']}</td><td style='border: 1px solid #ccc; padding: 6px;'>{row['arg1']}</td><td style='border: 1px solid #ccc; padding: 6px;'>{row['arg2']}</td></tr>"
|
||||
|
||||
summary_html = f"<table style='border-collapse: collapse;'><tr style='background-color: #f2f2f2;'><th style='border: 1px solid #ccc; padding: 8px;'>🆔</th><th style='border: 1px solid #ccc; padding: 8px;'>用户名</th><th style='border: 1px solid #ccc; padding: 8px;'>总积分</th><th style='border: 1px solid #ccc; padding: 8px;'>今日积分</th></tr>{table_content}</table>"
|
||||
|
||||
if WxPusher_token and WxPusher_uid:
|
||||
WxPusher_ts(summary_html)
|
||||
if pushplus_token:
|
||||
pushplus_ts(summary_html)
|
||||
except Exception as e:
|
||||
print(f"汇总推送出现错误: {e}")
|
||||
|
||||
|
||||
# ============================ 脚本主入口 ============================
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(f"当前版本: {v}")
|
||||
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
|
||||
print = partial(print, flush=True)
|
||||
|
||||
# --- Cookie 获取逻辑 ---
|
||||
if jh:
|
||||
ck1 = []
|
||||
if 'PGSH_TOKEN' in os.environ: ck1.append(os.environ.get('PGSH_TOKEN'))
|
||||
if ckurl != "": ck1.append(requests.get(ckurl).text.strip())
|
||||
if ck != "": ck1.append(ck)
|
||||
if not ck1: print("变量为空..."); exit(-1)
|
||||
cookie = '&'.join(ck1)
|
||||
else:
|
||||
if 'PGSH_TOKEN' in os.environ:
|
||||
cookie = os.environ.get('PGSH_TOKEN')
|
||||
else:
|
||||
cookie = ck if ckurl == "" else requests.get(ckurl).text.strip()
|
||||
if cookie == "": print("变量为空..."); exit(-1)
|
||||
cookies = cookie.split("&")
|
||||
print(f"胖乖生活共获取到 {len(cookies)} 个账号")
|
||||
|
||||
if dl:
|
||||
start_dlapi()
|
||||
print("代理模块已启动,等待初始化...")
|
||||
time.sleep(5)
|
||||
|
||||
# --- 任务执行逻辑 ---
|
||||
if bf:
|
||||
print("✅开启高仿真并发模式")
|
||||
with ThreadPoolExecutor(max_workers=int(bfsum)) as executor:
|
||||
futures = [executor.submit(PGSH(ck_item).start) for ck_item in cookies]
|
||||
for future in as_completed(futures): future.result()
|
||||
else:
|
||||
print("✅开启高仿真常规运行模式")
|
||||
for i, ck_item in enumerate(cookies):
|
||||
print(f"\n================== 开始第{i + 1}个账号 ==================")
|
||||
PGSH(ck_item).start()
|
||||
if i < len(cookies) - 1:
|
||||
interval = random.uniform(10, 30)
|
||||
print(f"{interval:.1f}秒后进行下一个账号...")
|
||||
time.sleep(interval)
|
||||
|
||||
if dl:
|
||||
stop_event.set()
|
||||
|
||||
print("\n所有账号任务执行完毕。")
|
||||
|
||||
# --- 积分汇总和推送逻辑 ---
|
||||
if ts.lower() == 'true': # 检查推送总开关
|
||||
print("\n======开始查询所有账号当日收益======")
|
||||
summary_list = []
|
||||
for i, ck_item in enumerate(cookies):
|
||||
print(f"---正在查询第{i + 1}个账号...")
|
||||
try:
|
||||
# 必须为每个账号创建新实例,以确保使用正确的token
|
||||
temp_instance = PGSH(ck_item)
|
||||
summary_list.append(temp_instance.query_daily_points(i))
|
||||
except Exception as e:
|
||||
print(f"查询账号 {i+1} 积分时出错: {e}")
|
||||
summary_list.append({'序号': i + 1, '用户': f"账号{i+1}", 'arg1': "查询失败", 'arg2': "N/A"})
|
||||
|
||||
format_and_send_summary(summary_list)
|
||||
else:
|
||||
print("推送未开启(pg_ts=False),跳过积分统计。")
|
||||
|
||||
# 当前脚本来自于 脚本库下载!
|
||||
# 脚本库官方QQ群:
|
||||
# 脚本库中的所有脚本文件均来自热心网友上传和互联网收集。
|
||||
# 脚本库仅提供文件上传和下载服务,不提供脚本文件的审核。
|
||||
# 您在使用脚本库下载的脚本时自行检查判断风险。
|
||||
# 所涉及到的 账号安全、数据泄露、设备故障、软件违规封禁、财产损失等问题及法律风险,与脚本库无关!均由开发者、上传者、使用者自行承担。
|
||||
Loading…
Reference in New Issue
Block a user