This commit is contained in:
Faker 2022-08-22 09:20:53 +08:00
parent 4b00c67991
commit 64b45f836a
12 changed files with 925 additions and 701 deletions

View File

@ -1,20 +1,24 @@
/*
美丽研究院
修复+尽量优化为同步执行,减少并发,说不定就减小黑号概率了呢?
https://raw.githubusercontent.com/aTenb/jdOpenSharePicker/master/jd_beautyStudy.js
更新时间:2021-12-03
来源 Dylan
活动入口京东app首页-美妆馆-底部中间按钮
定时自定义集中访问可能炸
活动入口京东app首页-美妆馆-底部中间按钮
#随机定时运行一次
*/
const $ = new Env('美丽研究院');
const notify = $.isNode() ? require('./sendNotify') : '';
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
const WebSocket = require('ws');
const UA = process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)
const JD_API_HOST = 'https://api.m.jd.com/client.action';
$.accountCheck = true;
$.init = false;
let cookiesArr = [], cookie = '', message;
function oc(fn, defaultVal) {
try {
return fn()
@ -22,6 +26,7 @@ function oc(fn, defaultVal) {
return undefined
}
}
if ($.isNode()) {
Object.keys(jdCookieNode).forEach((item) => {
cookiesArr.push(jdCookieNode[item])
@ -30,7 +35,7 @@ if ($.isNode()) {
} else {
cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item);
}
const JD_API_HOST = 'https://api.m.jd.com/client.action';
!(async () => {
if (!cookiesArr[0]) {
$.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
@ -50,7 +55,7 @@ const JD_API_HOST = 'https://api.m.jd.com/client.action';
$.nickName = '';
message = '';
$.token = '';
//await TotalBean();
await TotalBean();
console.log(`\n******开始【京东账号${$.index}${$.nickName || $.UserName}*********\n`);
if (!$.isLogin) {
$.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
@ -61,9 +66,7 @@ const JD_API_HOST = 'https://api.m.jd.com/client.action';
continue
}
await accountCheck();
while (!$.hasDone) {
await $.wait(3000)
}
await $.wait(10000)
if ($.accountCheck) {
await jdBeauty();
}
@ -73,12 +76,12 @@ const JD_API_HOST = 'https://api.m.jd.com/client.action';
}
}
})()
.catch((e) => {
$.log('', `${$.name}, 失败! 原因: ${e}!`, '')
})
.finally(() => {
$.done();
})
.catch((e) => {
$.log('', `${$.name}, 失败! 原因: ${e}!`, '')
})
.finally(() => {
$.done();
})
async function accountCheck() {
$.hasDone = false;
@ -87,7 +90,7 @@ async function accountCheck() {
await $.wait(10000)
await getIsvToken2()
await $.wait(10000)
await getToken()
await getAuth()
await $.wait(10000)
if (!$.token) {
console.log(`\n\n提示请尝试换服务器ip或者设置"xinruimz-isv.isvjcloud.com"域名直连或者自定义UA再次尝试(环境变量JD_USER_AGENT)\n\n`)
@ -96,15 +99,15 @@ async function accountCheck() {
}
let client = new WebSocket(`wss://xinruimz-isv.isvjcloud.com/wss/?token=${$.token}`, null, {
headers: {
'user-agent': UA,
'user-agent': UA,
}
});
client.onopen = async () => {
console.log(`美容研究院服务器连接成功`);
client.send('{"msg":{"type":"action","args":{"source":1},"action":"_init_"}}');
await $.wait(10000);
await $.wait(20000);
client.send(`{"msg":{"type":"action","args":{"source":1},"action":"get_user"}}`);
await $.wait(10000);
await $.wait(20000);
};
client.onmessage = async function (e) {
if (e.data !== 'pong' && e.data && safeGet(e.data)) {
@ -143,14 +146,13 @@ async function jdBeauty() {
async function mr() {
$.coins = 0
let positionList = ['b1', 'h1', 's1', 'b2', 'h2', 's2']
let positionList2 = ['b2', 'h2', 's2']
$.tokens = []
$.pos = []
$.helpInfo = []
$.needs = []
let client = new WebSocket(`wss://xinruimz-isv.isvjcloud.com/wss/?token=${$.token}`,null,{
headers:{
'user-agent': UA,
'user-agent': UA,
}
})
console.log(`wss://xinruimz-isv.isvjcloud.com/wss/?token=${$.token}`)
@ -165,24 +167,18 @@ async function mr() {
await $.wait(10000);
}
console.log(`\n========生产任务相关========\n`)
for (let help of helpInfo) {
client.send(help);
}
await $.wait(3000)
client.send(`{"msg":{"type":"action","args":{},"action":"get_produce_material"}}`)
await $.wait(10000);
await $.wait(20000);
// 获得正在生产的商品信息
client.send('{"msg":{"type":"action","args":{},"action":"product_producing"}}')
await $.wait(10000);
// 获得库存
client.send(`{"msg":{"type":"action","args":{},"action":"get_package"}}`)
await $.wait(20000);
// 获得可生成的商品列表
client.send(`{"msg":{"type":"action","args":{"page":1,"num":10},"action":"product_lists"}}`)
await $.wait(10000);
// 获得原料生产列表
await $.wait(20000);
// 获得原料生产列表
for (let pos of positionList) {
client.send(`{"msg":{"type":"action","args":{"position":"${pos}"},"action":"produce_position_info_v2"}}`)
await $.wait(10000);
client.send(`{"msg":{"type":"action","args":{"position":"${pos}"},"action":"produce_position_info_v2"}}`)
await $.wait(20000);
}
console.log(`\n========日常任务相关========`)
client.send(`{"msg":{"type":"action","args":{},"action":"check_up"}}`)
@ -196,7 +192,7 @@ async function mr() {
await $.wait(50000);
//最后做时间最久的日常任务
client.send(`{"msg":{"type":"action","args":{},"action":"shop_products"}}`)
await $.wait(10000);
await $.wait(20000);
}
};
client.onclose = () => {
@ -205,10 +201,7 @@ async function mr() {
$.init = true;
$.hasDone = true;
for (let i = 0; i < $.pos.length && i < $.tokens.length; ++i) {
client.send(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}"},"action":"employee_get_user"}}`);
$.helpInfo.push(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}","position":"${$.pos[i]}","token":"${$.tokens[i]}"},"action":"employee_v2"}}`)
client.send(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}","position":"${$.pos[i]}"},"action":"employee_speed_v2"}}`);
client.send(`{"msg":{"action":"write","type":"action","args":{"action_type":3,"channel":2,"source_app":2}}}`);
$.helpInfo.push(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}","position":"${$.pos[i]}","token":"${$.tokens[i]}"},"action":"employee"}}`)
}
};
client.onmessage = async function (e) {
@ -223,9 +216,9 @@ async function mr() {
// 去签到
console.log(`去做签到任务`)
client.send(`{"msg":{"type":"action","args":{},"action":"sign_in"}}`)
await $.wait(10000);
await $.wait(20000);
client.send(`{"msg":{"action":"write","type":"action","args":{"action_type":1,"channel":2,"source_app":2}}}`)
await $.wait(10000);
await $.wait(20000);
}
break
case "get_user":
@ -235,7 +228,7 @@ async function mr() {
console.log(`去做新手任务`)
for (let i = $.userInfo.step; i < 15; ++i) {
client.send(`{"msg":{"type":"action","args":{},"action":"newcomer_update"}}`)
await $.wait(10000);
await $.wait(20000);
}
} else
$.init = true;
@ -249,13 +242,13 @@ async function mr() {
$.check_up = true
// 6-9点签到
//for (let check_up of vo.data.check_up) {
// if (check_up['receive_status'] !== 1) {
// console.log(`去领取第${check_up.times}次签到奖励`)
// client.send(`{"msg":{"type":"action","args":{"check_up_id":${check_up.id}},"action":"check_up_receive"}}`)
// } else {
// console.log(`第${check_up.times}次签到奖励已领取`)
// }
// }
// if (check_up['receive_status'] !== 1) {
// console.log(`去领取第${check_up.times}次签到奖励`)
// client.send(`{"msg":{"type":"action","args":{"check_up_id":${check_up.id}},"action":"check_up_receive"}}`)
// } else {
// console.log(`第${check_up.times}次签到奖励已领取`)
// }
// }
break
case "shop_products":
let count = $.taskState.shop_view.length;
@ -288,14 +281,11 @@ async function mr() {
}
await $.wait(10000);
}
if ($.taskState.meetingplace_view.length <= vo.data.meetingplaces.length) {
for (let vc of vo.data.meetingplaces) {
console.log(`去做第${vc.name}浏览会场任务`)
client.send(`{"msg":{"type":"action","args":{"source":1,"meetingplace_id":${vc.id}},"action":"meetingplace_view"}}`)
await $.wait(2500)
}
for (let i = $.taskState.meetingplace_view; i < $.taskState.mettingplace_count; ++i) {
console.log(`去做第${i + 1}次浏览会场任务`)
client.send(`{"msg":{"type":"action","args":{"source":1},"action":"meetingplace_view"}}`)
await $.wait(10000);
}
if ($.taskState.today_answered === 0) {
console.log(`去做每日问答任务`)
client.send(`{"msg":{"type":"action","args":{"source":1},"action":"get_question"}}`)
@ -366,7 +356,7 @@ async function mr() {
client.send(`{"msg":{"type":"action","args":{"position":"${vo.data.position}","material_id":${ma.id}},"action":"material_produce_v2"}}`)
await $.wait(5000);
} else {
ma = $.material.base[1]['items'][positionList2.indexOf(vo.data.position)]
ma = $.material.base[1]['items'][positionList.indexOf(vo.data.position)]
if (ma) {
console.log(`else去生产${ma.name}`)
client.send(`{"msg":{"type":"action","args":{"position":"${vo.data.position}","material_id":${ma.id}},"action":"material_produce_v2"}}`)
@ -412,7 +402,7 @@ async function mr() {
case "product_lists":
let need_material = []
if (vo.code === '200' || vo.code === 200) {
$.products = vo.data.filter(vo=>vo.level===$.level-1)
$.products = vo.data.filter(vo=>vo.level===$.level)
console.log(`========可生产商品信息========`)
for (let product of $.products) {
let num = Infinity
@ -441,7 +431,6 @@ async function mr() {
console.log(`${product.name}】可生产份数大于0去生产`)
//product_produce 产品研发里的生产
client.send(`{"msg":{"type":"action","args":{"product_id":${product.id},"amount":${num}},"action":"product_produce"}}`)
client.send(`{"msg":{"type":"action","args":{"product_id":${product.id},"amount":${num}},"action":"once_completion"}}`)
await $.wait(10000);
} else {
console.log(msg)
@ -494,20 +483,20 @@ async function mr() {
console.log(`收取产品失败,错误信息${vo.msg}`)
}
break
// case "get_task":
// console.log(`当前任务【${vo.data.describe}】,需要【${vo.data.product.name}】${vo.data.package_stock}/${vo.data.num}份`)
// if (vo.data.package_stock >= vo.data.num) {
// console.log(`满足任务要求,去完成任务`)
// client.send(`{"msg":{"type":"action","args":{"task_id":${vo.data.id}},"action":"complete_task"}}`)
// }
// break
// case "get_task":
// console.log(`当前任务【${vo.data.describe}】,需要【${vo.data.product.name}】${vo.data.package_stock}/${vo.data.num}份`)
// if (vo.data.package_stock >= vo.data.num) {
// console.log(`满足任务要求,去完成任务`)
// client.send(`{"msg":{"type":"action","args":{"task_id":${vo.data.id}},"action":"complete_task"}}`)
// }
// break
case 'get_benefit':
for (let benefit of vo.data) {
if (benefit.type === 1) { //type 1 是京豆
//console.log(`benefit:${JSON.stringify(benefit)}`);
if(benefit.description === "1 京豆" && parseInt(benefit.day_exchange_count) < 5 && $.total > benefit.coins){
if(benefit.description === "1 京豆" && parseInt(benefit.day_exchange_count) < 10 && $.total > benefit.coins){
$timenum = parseInt($.total / benefit.coins);
if ($timenum > 5) $timenum = 5;
if ($timenum > 10) $timenum = 10;
console.log(`\n可兑换${$timenum}次京豆:`)
for (let i = 0; i < $timenum; i++){
client.send(`{"msg":{"type":"action","args":{"benefit_id":${benefit.id}},"action":"to_exchange"}}`);
@ -529,7 +518,7 @@ async function mr() {
break
case "to_exchange":
if(oc(() => vo.data.coins)){
console.log(`兑换${vo.data.coins/-10000}京豆成功`)
console.log(`兑换${vo.data.coins/-1000}京豆成功`)
}else{
console.log(`兑换京豆失败`)
}
@ -537,15 +526,15 @@ async function mr() {
case "get_produce_material":
$.material = vo.data
break
//case "to_employee":
// console.log(`雇佣助力码【${oc(() => vo.data.token)}】`)
// if(oc(() => vo.data.token)){
// $.tokens.push(vo.data.token)
// }else{
// console.log(`not exist:${oc(() => vo.data)}`)
// }
// break
case "employee_v2":
case "to_employee":
console.log(`雇佣助力码【${oc(() => vo.data.token)}`)
if(oc(() => vo.data.token)){
$.tokens.push(vo.data.token)
}else{
console.log(`not exist:${oc(() => vo.data)}`)
}
break
case "employee":
console.log(`${vo.msg}`)
break
}
@ -588,24 +577,18 @@ function getIsvToken() {
}
async function getIsvToken2() {
for (let i=0; i<3; i++){
var body = await getSignfromDY('isvObfuscator',{"id":"","url":"https://xinruimz-isv.isvjcloud.com"})
if(body) break;
await $.wait(5000)
}
let config = {
url: 'https://api.m.jd.com/client.action?functionId=isvObfuscator',
body: body,
body: await getSignfromDY('isvObfuscator',{"id":"","url":"https://xinruimz-isv.isvjcloud.com"}),
headers: {
'Host': 'api.m.jd.com',
'accept': '*/*',
'user-agent': UA,
//'accept-language': 'zh-Hans-JP;q=1, en-JP;q=0.9, zh-Hant-TW;q=0.8, ja-JP;q=0.7, en-US;q=0.6',
//'content-type': 'application/x-www-form-urlencoded',
'accept-language': 'zh-Hans-JP;q=1, en-JP;q=0.9, zh-Hant-TW;q=0.8, ja-JP;q=0.7, en-US;q=0.6',
'content-type': 'application/x-www-form-urlencoded',
'Cookie': cookie
}
}
return new Promise(resolve => {
$.post(config, async (err, resp, data) => {
try {
@ -628,47 +611,47 @@ async function getIsvToken2() {
})
}
function getSignfromDY(functionId, body) {
var strsign = '';
let data = `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(body))}`
var strsign = '';
let data = `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(body))}`
return new Promise((resolve) => {
let opt = {
url: "https://jd.nbplay.xyz/dylan/getsign",
body: data,
let opt = {
url: "https://jd.nbplay.xyz/dylan/getsign",
body: data,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Type': 'application/x-www-form-urlencoded',
}
,timeout: 30000
}
$.post(opt, async(err, resp, data) => {
try {
if (data){
data = JSON.parse(data);
if (data && data.code == 0) {
console.log("连接DY服务成功" );
if (data.data){
strsign = data.data || '';
}
if (strsign != ''){
resolve(strsign);
}
else
console.log("签名获取失败,换个时间再试.");
} else {
console.log(data.msg);
}
}else{console.log('连接连接DY服务失败重试。。。')}
}catch (e) {
$.logErr(e, resp);
}finally {
resolve(strsign);
}
})
$.post(opt, async(err, resp, data) => {
try {
if (data){
data = JSON.parse(data);
if (data && data.code == 0) {
console.log("连接DY服务成功" );
if (data.data){
strsign = data.data || '';
}
if (strsign != ''){
resolve(strsign);
}
else
console.log("签名获取失败,换个时间再试.");
} else {
console.log(data.msg);
}
}else{console.log('连接连接DY服务失败重试。。。')}
}catch (e) {
$.logErr(e, resp);
}finally {
resolve(strsign);
}
})
})
}
function getToken() {
function getAuth() {
let config = {
url: 'https://xinruimz-isv.isvjcloud.com/api/auth',
body: JSON.stringify({"token":$.token2,"source":"01","channel":"meizhuangguandibudaohang"}),
body: JSON.stringify({"token":$.token2,"source":"01"}),
headers: {
'Host': 'xinruimz-isv.isvjcloud.com',
'Accept': 'application/x.jd-school-island.v1+json',
@ -679,7 +662,7 @@ function getToken() {
'user-agent': UA,
'Referer': 'https://xinruimz-isv.isvjcloud.com/logined_jd/',
'Authorization': 'Bearer undefined',
'Cookie': `IsvToken=${$.token2};`
'Cookie': `IsvToken=${$.isvToken};`
}
}
return new Promise(resolve => {
@ -725,7 +708,7 @@ function TotalBean() {
"Cookie": cookie,
"Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
'user-agent': UA,
}
}
}
$.post(options, (err, resp, data) => {
try {

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

@ -27,9 +27,9 @@ let shopname=''
const token = [
"75196DED685B6BF6EB7B55FBD9E45A77",
"A1577946DE409D3AC4B4FDCFF4681625",
"E0087463F85940305DCA705308208EBB",
"BDC952E78780604530F13CBCFB89336A",
"773D63918C47D32F33DDB2FB78C5820A",
"35161A49032726A1A48E435DD2874114",
"BF347A3DBB16134C9A4E602FE93C16AB",
"DA71409388CE531378225A6BBF96CDFE",
"71DEC5804B8E333A9DAA0BF16EC6C8EB",
"A6D7A29DB6C46B7D3F7CD6EC3AE110C6",
@ -40,7 +40,7 @@ const token = [
"6F79CE75B2D272EBC34718C6C07CB63B",
"8CC487234D54778E2F1C738C79B397BA",
"500B9537712BD828EFC8C4D036B9752A",
"12E0F8E3B60238F010D09F944543247B",
"C94708F50069ACB06C01C725D9F331D8",
"96569C6643EC94DDCEEC05DADD5367BA",
"612AB059DEDF1AE49910BC575AEDF97B",
"71DEC5804B8E333A9DAA0BF16EC6C8EB",

575
jd_jinggengInvite.py Normal file
View File

@ -0,0 +1,575 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
File: jd_jinggengInvite.py(jinggeng邀请入会有礼)
Author: HarbourJ
Date: 2022/8/1 22:37
TG: https://t.me/HarbourToulu
cron: 1 1 1 1 1 1
new Env('jinggeng邀请入会有礼');
活动入口: https://jinggeng-isv.isvjcloud.com/ql/front/showInviteJoin?id=9e80809282a4bdc90182ab254c7e0a12&user_id=1000121005&inviterNick=Ny0m1K1tVHIJvt0j4SQ9RbRPXMHHf%2BDrNmMVfT8S5hq3SjYMAACrbEHZQ40J5yPY
变量设置: export redis_url="redis_ip", export redis_pwd="xxx"(没有可写变量)
export jinggengInviteJoin="9e80809282a4bdc90182ab254c7e0a12&1000121005"(活动id&店铺id)
"""
import time
import requests
import sys
import re
import os
from bs4 import BeautifulSoup
from datetime import datetime
import json
import random
from urllib.parse import quote_plus, unquote_plus
import logging
logging.basicConfig(level=logging.INFO, format='%(message)s')
logger = logging.getLogger()
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
try:
if "aarch" in os.uname().machine:
from utils.jd_sign_arm64 import *
else:
from utils.jd_sign_x86 import *
except:
from utils.jd_sign import *
try:
from jdCookie import get_cookies
getCk = get_cookies()
except:
logger.info("请先下载依赖脚本,\n下载链接: https://raw.githubusercontent.com/HarbourJ/HarbourToulu/main/jdCookie.py")
sys.exit(3)
try:
if os.environ.get("redis_url"):
redis_url = os.environ["redis_url"] # redis ip
else:
redis_url = "172.17.0.1"
if os.environ.get("redis_pwd"):
redis_pwd = os.environ["redis_pwd"] # redis 密码
else:
redis_pwd = ""
except:
redis_url = "172.17.0.1"
redis_pwd = ""
try:
if os.environ.get("jinggengInviteJoin"):
jinggengInviteJoin = os.environ["jinggengInviteJoin"]
else:
jinggengInviteJoin = "9e8080e0828365a10182868854b40115&1000004385"
except:
jinggengInviteJoin = "9e80809282a4bdc90182ab254c7e0a12&1000121005"
inviterNicks = [
"Ny0m1K1tVHIJvt0j4SQ9RbRPXMHHf%2BDrNmMVfT8S5hq3SjYMAACrbEHZQ40J5yPY",
"pWGUWZJQ3actex0X2vQyLsjNhNaYFy2HteErE6izlhTf9nrGY7gBkCdGU4C6z%2FxD"
]
if "&" not in jinggengInviteJoin:
logger.info("jinggengInviteJoin变量有误退出程序")
sys.exit()
ac_id = jinggengInviteJoin.split("&")[0]
user_id = jinggengInviteJoin.split("&")[1]
inviterNick = random.choice(inviterNicks)
activity_url = f"https://jinggeng-isv.isvjcloud.com/ql/front/showInviteJoin?id={ac_id}&user_id={user_id}&inviterNick={inviterNick}"
def redis_conn():
try:
import redis
try:
pool = redis.ConnectionPool(host=redis_url, port=6379, decode_responses=True, socket_connect_timeout=5, password=redis_pwd)
r = redis.Redis(connection_pool=pool)
r.get('conn_test')
logger.info('✅redis连接成功')
return r
except:
logger.info("redis连接异常")
except:
logger.info("缺少redis依赖请运行pip3 install redis")
def getToken(ck, r=None):
try:
# redis缓存Token 活动域名+pt_pin
pt_pin = unquote_plus(re.compile(r'pt_pin=(.*?);').findall(ck)[0])
except:
# redis缓存Token 活动域名+ck前7位(获取pin失败)
pt_pin = ck[:8]
try:
if r is not None:
Token = r.get(f'{activityUrl.split("https://")[1].split("-")[0]}_{pt_pin}')
# logger.info("Token过期时间", r.ttl(f'{activityUrl.split("https://")[1].split("-")[0]}_{pt_pin}'))
if Token is not None:
logger.info(f"获取缓存Token->: {Token}")
return Token
else:
logger.info("🈳去设置Token缓存-->")
s.headers = {
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'User-Agent': '',
'Cookie': ck,
'Host': 'api.m.jd.com',
'Referer': '',
'Accept-Language': 'zh-Hans-CN;q=1 en-CN;q=0.9',
'Accept': '*/*'
}
sign_txt = sign({"url": f"{activityUrl}", "id": ""}, 'isvObfuscator')
# logger.info(sign_txt)
f = s.post('https://api.m.jd.com/client.action', verify=False, timeout=30)
if f.status_code != 200:
logger.info(f.status_code)
return
else:
if "参数异常" in f.text:
return
Token_new = f.json()['token']
logger.info(f"Token->: {Token_new}")
if r.set(f'{activityUrl.split("https://")[1].split("-")[0]}_{pt_pin}', Token_new, ex=1800):
logger.info("✅Token缓存设置成功")
else:
logger.info("❌Token缓存设置失败")
return Token_new
else:
s.headers = {
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'User-Agent': '',
'Cookie': ck,
'Host': 'api.m.jd.com',
'Referer': '',
'Accept-Language': 'zh-Hans-CN;q=1 en-CN;q=0.9',
'Accept': '*/*'
}
sign_txt = sign({"url": f"{activityUrl}", "id": ""}, 'isvObfuscator')
# logger.info(sign_txt)
f = s.post('https://api.m.jd.com/client.action', verify=False, timeout=30)
if f.status_code != 200:
logger.info(f.status_code)
return
else:
if "参数异常" in f.text:
return
Token = f.json()['token']
logger.info(f"Token->: {Token}")
return Token
except:
return
def getJdTime():
url = "http://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5"
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Host': 'api.m.jd.com',
'Proxy-Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
try:
response = requests.request("GET", url, headers=headers, timeout=2)
if response.status_code == 200:
res = response.json()
jdTime = res['currentTime2']
except:
jdTime = int(round(time.time() * 1000))
return jdTime
def randomString(e, flag=False):
t = "0123456789abcdef"
if flag: t = t.upper()
n = [random.choice(t) for _ in range(e)]
return ''.join(n)
def refresh_cookies(res):
if res.cookies:
cookies = res.cookies.get_dict()
set_cookie = [(set_cookie + "=" + cookies[set_cookie]) for set_cookie in cookies]
global activityCookie
activityCookieMid = [i for i in activityCookie.split(';') if i != '']
for i in activityCookieMid:
for x in set_cookie:
if i.split('=')[0] == x.split('=')[0]:
if i.split('=')[1] != x.split('=')[1]:
activityCookieMid.remove(i)
activityCookie = ''.join(sorted([(set_cookie + ";") for set_cookie in list(set(activityCookieMid + set_cookie))]))
def getActivity(index=1, isOpenCard=0, inviterCode=None, getIndex=0):
url = f"{activityUrl}&isOpenCard={isOpenCard}&from=kouling"
if len(token) == 0:
IsvToken = ''
else:
IsvToken = f"IsvToken={token};"
headers = {
'Host': 'jinggeng-isv.isvjcloud.com',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'User-Agent': ua,
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Referer': url,
'Cookie': IsvToken + activityCookie
}
response = requests.request("GET", url, headers=headers)
html_text = response.text
if response.status_code == 493:
logger.info(response.status_code, "ip疑似黑了,休息一会再来撸~")
sys.exit()
# if response.cookies:
cookies = response.cookies.get_dict()
set_cookies = [(set_cookie + "=" + cookies[set_cookie]) for set_cookie in cookies]
set_cookie = ''.join(sorted([(set_cookie + ";") for set_cookie in set_cookies]))
if getIndex == 3:
return set_cookie
if "活动时间" in html_text:
refresh_cookies(response)
soup = BeautifulSoup(html_text, 'html.parser')
errorMsg = soup.find('input', attrs={'id': 'errorMsg'})['value']
inviteSucc = soup.find('input', attrs={'id': 'inviteSucc'})['value']
if len(errorMsg) != 0:
errorMsg0 = errorMsg
if len(inviteSucc) != 0:
errorMsg0 = inviteSucc
if index == 1:
if getIndex == 2:
pass
shop_title = soup.find('input', attrs={'id': 'shop_title'})['value'].replace(' ', '')
actName = soup.find('input', attrs={'id': 'actName'})['value']
shop_sid = soup.find('input', attrs={'id': 'shop_sid'})['value']
inviteSuccNums = (soup.find('input', attrs={'id': 'helpLogs'})['value'])
inviteSetting2s = eval(soup.find('input', attrs={'id': 'inviteSetting2'})['value'])
logger.info(f"店铺名称: {shop_title} \n活动名称: {actName} \n店铺ID: {shop_sid}")
num1 = {'1': 'one', '2': 'two', '3': 'three', '4': 'four'}
num2 = {'1': 'leveOneNum', '2': 'leveTwoNum', '3': 'leveThreeNum', '4': 'leveFourNum'}
needInviteNums = []
for a in range(len(inviteSetting2s)):
b = a + 1
inviteSetting2 = inviteSetting2s[num1[str(b)]]
# equityEndTime = inviteSetting2['equityEndTime']
freezeQuantity = inviteSetting2['freezeQuantity']
availableQuantity = inviteSetting2['availableQuantity']
equityType = inviteSetting2['equityType']
equityName = inviteSetting2['equityName']
leveNum = inviteSetting2[num2[str(b)]]
if equityType == "JD_GOODS":
denomination = ''
else:
denomination = inviteSetting2['denomination']
awardId = inviteSetting2['id']
# inviteSucc = soup.find('input', attrs={'id': 'inviteSucc'})['value']
logger.info(f"奖品{b}: {equityName} 奖励: {denomination} 总数: {freezeQuantity}份 剩余: {availableQuantity}份 需要邀请: {leveNum}")
if availableQuantity > 0:
needInviteNums.append((leveNum, awardId, equityType))
if len(needInviteNums) == 0:
logger.info(f"⛈⛈⛈活动奖品全部发完啦!")
sys.exit()
return errorMsg, inviteSuccNums, needInviteNums
return errorMsg0
elif "活动已结束" in html_text:
logger.info("😭活动已结束,下次早点来~")
sys.exit()
else:
return set_cookie
def setMixNick(token):
url = "https://jinggeng-isv.isvjcloud.com/front/setMixNick"
payload = f"strTMMixNick={token}&userId={user_id}&source=01"
headers = {
'Host': 'jinggeng-isv.isvjcloud.com',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://jinggeng-isv.isvjcloud.com',
'User-Agent': ua,
'Connection': 'keep-alive',
'Referer': f'{activityUrl}&isOpenCard=0&from=kouling',
'Content-Length': '116',
'Cookie': activityCookie
}
try:
response = requests.request("POST", url, headers=headers, data=payload)
res = response.text
setMixNick0 = eval(res.replace('true', 'True').replace('false', 'False').replace('none', 'None'))['msg']
refresh_cookies(response)
return setMixNick0
except Exception as e:
logger.info(e)
return
def recordActPvUvdata(token):
url = "https://jinggeng-isv.isvjcloud.com/ql/front/reportActivity/recordActPvUvData"
payload = F"userId={user_id}&actId={ac_id}"
headers = {
'Host': 'jinggeng-isv.isvjcloud.com',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://jinggeng-isv.isvjcloud.com',
'User-Agent': ua,
'Connection': 'keep-alive',
'Referer': f'{activityUrl}&isOpenCard=0&from=kouling',
'Content-Length': '56',
'Cookie': f"IsvToken={token};" + activityCookie
}
response = requests.request("POST", url, headers=headers, data=payload)
refresh_cookies(response)
def checkTokenInSession(token):
url = "https://jinggeng-isv.isvjcloud.com/front/checkTokenInSession"
payload = f"userId={user_id}&token={token}"
headers = {
'Host': 'jinggeng-isv.isvjcloud.com',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://jinggeng-isv.isvjcloud.com',
'User-Agent': ua,
'Connection': 'keep-alive',
'Referer': f'{activityUrl}&isOpenCard=0&from=kouling',
'Content-Length': '99',
'Cookie': activityCookie
}
response = requests.request("POST", url, headers=headers, data=payload)
refresh_cookies(response)
def shopmember(cookie):
url = f'https://shopmember.m.jd.com/shopcard/?venderId={user_id}&channel=401&returnUrl={quote_plus(activityUrl + "&isOpenCard=1")}'
headers = {
'Host': 'shopmember.m.jd.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection': 'keep-alive',
'Cookie': cookie,
'User-Agent': ua,
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Referer': 'https://jinggeng-isv.isvjcloud.com/',
'Accept-Encoding': 'gzip, deflate, br'
}
requests.request("GET", url, headers=headers)
def bindWithVender(cookie):
try:
body = {"venderId": user_id, "shopId": user_id, "bindByVerifyCodeFlag": 1,"registerExtend": {},"writeChildFlag":0, "channel": 401}
url = f'https://api.m.jd.com/client.action?appid=jd_shop_member&functionId=bindWithVender&body={json.dumps(body)}&client=H5&clientVersion=9.2.0&uuid=88888&h5st=20220614102046318%3B7327310984571307%3Bef79a%3Btk02wa31b1c7718neoZNHBp75rw4pE%2Fw7fXko2SdFCd1vIeWy005pEHdm0lw2CimWpaw3qc9il8r9xVLHp%2Bhzmo%2B4swg%3Bdd9526fc08234276b392435c8623f4a737e07d4503fab90bf2cd98d2a3a778ac%3B3.0%3B1655173246318'
headers = {
'Host': 'api.m.jd.com',
'Cookie': cookie,
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Accept': '*/*',
'User-Agent': ua,
'Referer': f'https://shopmember.m.jd.com/shopcard/?venderId={user_id}&channel=401&returnUrl={quote_plus(activityUrl + "&isOpenCard=1")}'
}
response = requests.get(url=url, headers=headers, timeout=30).text
res = json.loads(response)
if res['success']:
open_result = res['message']
if "火爆" in open_result:
logger.info(f"\t⛈⛈⛈{open_result}")
else:
logger.info(f"\t🎉🎉🎉{open_result}")
return res['message']
except Exception as e:
logger.info(e)
def receiveInviteJoinAward(token, awardId):
url = "https://jinggeng-isv.isvjcloud.com/ql/front/receiveInviteJoinAward"
payload = f"act_id={ac_id}&user_id={user_id}&awardId={awardId}"
headers = {
'Host': 'jinggeng-isv.isvjcloud.com',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'https://jinggeng-isv.isvjcloud.com',
'User-Agent': ua,
'Connection': 'keep-alive',
'Referer': f'{activityUrl}&isOpenCard=0&from=kouling&sid=09a25fb32a08d0b0fbdef65ab52a40dw&un_area=15_1213_1215_50108',
'Content-Length': '99',
'Cookie': f"IsvToken={token};" + activityCookie
}
response = requests.request("POST", url, headers=headers, data=payload).text
res = eval(response.replace('true', 'True').replace('false', 'False').replace('none', 'None'))
if res['succ'] is True:
msg = eval(str(res['msg']).replace('\\\\', ''))
if msg['isSendSucc']:
awardType = msg['drawAwardDto']['awardType'].replace('JD_BEAN', '京豆').replace('JD_POINT', '积分')
awardDenomination = msg['drawAwardDto']['awardDenomination']
logger.info(f"\t🎉🎉成功领取{awardDenomination}{awardType}")
else:
logger.info(f"\t🎉🎉{res['msg']}")
if __name__ == '__main__':
r = redis_conn()
try:
cks = getCk
if not cks:
sys.exit()
except:
logger.info("未获取到有效COOKIE,退出程序!")
sys.exit()
global inviterCode, inviteSuccNums, activityUrl, needInviteNums, rewardIndex, firstCk
inviteSuccNums = 0
inviterCode = inviterNick
activityUrl = activity_url
needInviteNums = None
rewardIndex = 0
num = 0
for cookie in cks:
num += 1
if num == 1:
firstCk = cookie
if num % 5 == 0:
logger.info("⏰等待5s")
time.sleep(5)
global ua, activityCookie, token, getIndex
getIndex = 0
ua = userAgent()
try:
pt_pin = re.compile(r'pt_pin=(.*?);').findall(cookie)[0]
pt_pin = unquote_plus(pt_pin)
except IndexError:
pt_pin = f'用户{num}'
logger.info(f'\n******开始【京东账号{num}{pt_pin} *********\n')
logger.info(datetime.now())
token = ''
activityCookie = ''
activityCookie = getActivity(num, 0, inviterCode, 0)
try:
token = getToken(cookie, r)
if token is None:
if num == 1:
logger.info(f"车头获取Token失败,退出本程序!")
# sys.exit()
os._exit()
logger.info(f"获取Token失败⏰等待3s")
time.sleep(3)
continue
except:
logger.info(f"获取Token失败⏰等待3s")
time.sleep(3)
continue
time.sleep(1.5)
setMixNick0 = setMixNick(token)
if setMixNick0 is None:
if num == 1:
logger.info(f"⚠️车头获取邀请码失败,退出本程序!")
sys.exit()
else:
continue
else:
logger.info(f"邀请码->: {setMixNick0}")
time.sleep(1)
logger.info(f"准备助力-->: {inviterCode}")
inviteSuccNum = getActivity(num, 0, inviterCode, 1)
if num == 1:
errorMsg0 = inviteSuccNum[0]
if "跳开卡页面" not in errorMsg0:
logger.info("无法助力自己")
inviteSuccNums0 = inviteSuccNum[1]
needInviteNums = inviteSuccNum[2]
inviteSuccNums = len(eval(inviteSuccNums0))
logger.info(f"🛳已经邀请{inviteSuccNums}")
for i, needNum0 in enumerate(needInviteNums):
needNum = needNum0[0]
awardId = needNum0[1]
if inviteSuccNums >= needNum:
logger.info(f"🎉恭喜已完成第{i + 1}档邀请,快去领奖吧!")
time.sleep(1)
recordActPvUvdata(token)
checkTokenInSession(token)
time.sleep(1)
if equityType == "JD_GOODS":
logger.info(f"\t🎉🎉成功获得实物奖励,请尽快前往领取:{activityUrl}")
else:
receiveInviteJoinAward(token, awardId)
rewardIndex += 1
time.sleep(3)
if i + 1 == len(needInviteNums):
logger.info("🎉🎉🎉奖励全部领取完毕~")
sys.exit()
time.sleep(1)
inviterCode = setMixNick0
activityUrl = f"https://jinggeng-isv.isvjcloud.com/ql/front/showInviteJoin?id={ac_id}&user_id={user_id}&inviterNick={inviterCode}"
continue
else:
errorMsg1 = inviteSuccNum
# logger.info("num != 1", errorMsg1)
if "跳开卡页面" not in errorMsg1:
if "已成功邀请您加入本店会员" in errorMsg1:
logger.info("⛈已经是会员了,无法完成助力")
else:
logger.info(f"🛳{errorMsg1}")
time.sleep(1)
continue
time.sleep(1.5)
recordActPvUvdata(token)
checkTokenInSession(token)
time.sleep(1)
shopmember(cookie)
logger.info("现在去开卡")
open_result = bindWithVender(cookie)
if open_result is not None:
if "火爆" in open_result:
time.sleep(1.5)
logger.info("\t尝试重新入会 第1次")
open_result = bindWithVender(cookie)
if "火爆" in open_result:
time.sleep(1.5)
logger.info("\t尝试重新入会 第2次")
open_result = bindWithVender(cookie)
time.sleep(1)
if num == 1:
getIndex = 2
errorMsg2 = getActivity(num, 1, inviterCode, getIndex)
time.sleep(2)
recordActPvUvdata(token)
checkTokenInSession(token)
# logger.info(errorMsg2, '============================')
if num == 1 and "开卡失败" in errorMsg2:
logger.info(f"⚠️车头疑似火爆号,退出本程序!")
sys.exit()
if "已成功邀请您加入本店会员" in errorMsg2:
inviteSuccNums += 1
logger.info(f"🛳已经邀请{inviteSuccNums}")
for i, needNum1 in enumerate(needInviteNums):
# logger.info(i, needNum1)
needNum = needNum1[0]
awardId = needNum1[1]
equityType = needNum1[2]
if inviteSuccNums >= needNum:
if rewardIndex >= i + 1:
time.sleep(1)
continue
logger.info(f"🎉恭喜已完成第{i + 1}档邀请,快去领奖吧!")
token = getToken(firstCk, r)
activityCookie = getActivity(1, 0, inviterCode, 3)
setMixNick(token)
time.sleep(0.5)
recordActPvUvdata(token)
time.sleep(0.5)
if equityType == "JD_GOODS":
logger.info(f"\t🎉🎉成功获得实物奖励,请尽快前往领取:{activityUrl}")
else:
receiveInviteJoinAward(token, awardId)
rewardIndex += 1
time.sleep(3)
if i + 1 == len(needInviteNums):
logger.info("🎉🎉🎉奖励全部领取完毕~")
sys.exit()
if num == 1:
inviterCode = setMixNick0
activityUrl = f"https://jinggeng-isv.isvjcloud.com/ql/front/showInviteJoin?id={ac_id}&user_id={user_id}&inviterNick={inviterCode}"
time.sleep(3)

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

25
jd_lzdz1_joinCommon.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