del
parent
b0679b2882
commit
4a0274cfb2
413
京乐玩-赚京豆.py
413
京乐玩-赚京豆.py
|
@ -1,413 +0,0 @@
|
|||
# 京乐玩-瓜分京豆 通用模板 create by doubi
|
||||
# openid 留空即可,不建议青龙使用,青龙玩不动,最好本地,本地在同目录下创建一个‘cklist.txt,将ck放在里面’
|
||||
# 目前新号助力10豆/人 老号助力2豆/人
|
||||
from secrets import choice
|
||||
import sys
|
||||
import re
|
||||
import random, asyncio, datetime, json, time, random, hashlib, os
|
||||
from unittest import result
|
||||
|
||||
import httpx
|
||||
from urllib.parse import quote_plus, unquote_plus
|
||||
from functools import partial
|
||||
import logging
|
||||
from requests import ConnectTimeout
|
||||
|
||||
activatyname = "京乐玩-瓜分京豆"
|
||||
salt = "cXRofWK6"
|
||||
me = "" # 小程序openid 留空
|
||||
group_size = 200 # 并发数建议 50-1500
|
||||
|
||||
inveteck = '' # 车头子ck
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s %(levelname)s %(lineno)d %(message)s",
|
||||
datefmt="%H:%M:%S",
|
||||
)
|
||||
logger = logging.getLogger(activatyname)
|
||||
|
||||
httpx_client = httpx.AsyncClient()
|
||||
|
||||
# 随机ua
|
||||
def randomuserAgent():
|
||||
# global uuid, addressid, iosVer, iosV, clientVersion, iPhone, area, ADID, lng, lat
|
||||
uuid = "".join(
|
||||
random.sample(
|
||||
[
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"d",
|
||||
"e",
|
||||
"f",
|
||||
"g",
|
||||
"h",
|
||||
"i",
|
||||
"j",
|
||||
"k",
|
||||
"l",
|
||||
"m",
|
||||
"n",
|
||||
"o",
|
||||
"p",
|
||||
"q",
|
||||
"r",
|
||||
"s",
|
||||
"t",
|
||||
"u",
|
||||
"v",
|
||||
"w",
|
||||
"x",
|
||||
"y",
|
||||
"z",
|
||||
"0",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"a",
|
||||
"b",
|
||||
"c",
|
||||
"z",
|
||||
],
|
||||
40,
|
||||
)
|
||||
)
|
||||
addressid = "".join(random.sample("1234567898647", 10))
|
||||
iosVer = "".join(
|
||||
random.sample(["15.1.1", "14.5.1", "14.4", "14.3", "14.2", "14.1", "14.0.1"], 1)
|
||||
)
|
||||
iosV = iosVer.replace(".", "_")
|
||||
clientVersion = "".join(random.sample(["10.3.0", "10.2.7", "10.2.4"], 1))
|
||||
iPhone = "".join(random.sample(["8", "9", "10", "11", "12", "13"], 1))
|
||||
area = (
|
||||
"".join(random.sample("0123456789", 2))
|
||||
+ "_"
|
||||
+ "".join(random.sample("0123456789", 4))
|
||||
+ "_"
|
||||
+ "".join(random.sample("0123456789", 5))
|
||||
+ "_"
|
||||
+ "".join(random.sample("0123456789", 4))
|
||||
)
|
||||
ADID = (
|
||||
"".join(random.sample("0987654321ABCDEF", 8))
|
||||
+ "-"
|
||||
+ "".join(random.sample("0987654321ABCDEF", 4))
|
||||
+ "-"
|
||||
+ "".join(random.sample("0987654321ABCDEF", 4))
|
||||
+ "-"
|
||||
+ "".join(random.sample("0987654321ABCDEF", 4))
|
||||
+ "-"
|
||||
+ "".join(random.sample("0987654321ABCDEF", 12))
|
||||
)
|
||||
lng = "119.31991256596" + str(random.randint(100, 999))
|
||||
lat = "26.1187118976" + str(random.randint(100, 999))
|
||||
UserAgent = ""
|
||||
if not UserAgent:
|
||||
return f"jdapp;iPhone;10.0.4;{iosVer};{uuid};network/wifi;ADID/{ADID};model/iPhone{iPhone},1;addressid/{addressid};appBuild/167707;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS {iosV} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/null;supportJDSHWK/1"
|
||||
else:
|
||||
return UserAgent
|
||||
|
||||
|
||||
# 检测ck状态
|
||||
async def check(ua, ck):
|
||||
try:
|
||||
url = "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion"
|
||||
header = {
|
||||
"Host": "me-api.jd.com",
|
||||
"Accept": "*/*",
|
||||
"Connection": "keep-alive",
|
||||
"Cookie": ck,
|
||||
"User-Agent": ua,
|
||||
"Accept-Language": "zh-cn",
|
||||
"Referer": "https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&",
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
}
|
||||
result = (await httpx_client.get(url=url, headers=header)).text
|
||||
codestate = json.loads(result)
|
||||
if codestate["retcode"] == "1001":
|
||||
msg = "当前ck已失效,请检查"
|
||||
return {"code": 1001, "data": msg}
|
||||
elif codestate["retcode"] == "0" and "userInfo" in codestate["data"]:
|
||||
nickName = codestate["data"]["userInfo"]["baseInfo"]["nickname"]
|
||||
return {"code": 200, "name": nickName, "ck": ck}
|
||||
except Exception as e:
|
||||
return {"code": 0, "data": e}
|
||||
|
||||
|
||||
# 格式化时间
|
||||
def get_time():
|
||||
return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
|
||||
# 时间戳
|
||||
def get_now():
|
||||
return round(time.time() * 1000)
|
||||
|
||||
|
||||
# 获取京乐玩直播信息
|
||||
async def index(ck, ua):
|
||||
while 1:
|
||||
try:
|
||||
url = "https://jnk.m.jd.com/mission/user/index"
|
||||
headers = {
|
||||
"Accept-Encoding": "gzip,compress,br,deflate",
|
||||
"Connection": "keep-alive",
|
||||
"Host": "jnk.m.jd.com",
|
||||
"Cookie": ck,
|
||||
"Referer": "https://servicewechat.com/wx5afd69b196301a2f/135/page-frame.html",
|
||||
"User-Agent": ua,
|
||||
"content-type": "application/json",
|
||||
}
|
||||
body = {}
|
||||
res = (await httpx_client.post(url=url, headers=headers, data=json.dumps(body))).text
|
||||
res_json = json.loads(res)
|
||||
if res_json["success"]:
|
||||
data = res_json["data"]
|
||||
for key in data:
|
||||
if "live" in key.keys():
|
||||
return {"success": True, "data": key["live"]}
|
||||
else:
|
||||
return {"success": False}
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
def get_viewId(pin, actId):
|
||||
tt = str(get_now()) # (new Date).getTime() 第一个tt生成viewid,然后viewid不变
|
||||
bePromotion = "1"
|
||||
pin = unquote_plus(pin)
|
||||
viewId = hashlib.md5(
|
||||
quote_plus(pin + actId + tt + salt + bePromotion).encode("utf-8")
|
||||
).hexdigest()
|
||||
token = gettoken(viewId, actId)
|
||||
msg = {
|
||||
"viewId": str(viewId),
|
||||
"tt": int(tt),
|
||||
"tokenVersion": 2,
|
||||
"token": str(token),
|
||||
"actId": int(actId),
|
||||
"bePromotion": 1,
|
||||
}
|
||||
logger.info(msg)
|
||||
return msg
|
||||
|
||||
|
||||
def gettoken(viewId, actId):
|
||||
tt = str(get_now())
|
||||
token = hashlib.md5(
|
||||
quote_plus(viewId + actId + tt + salt).encode("utf-8")
|
||||
).hexdigest()
|
||||
return token
|
||||
|
||||
|
||||
def get_token(viewId, actId):
|
||||
tt = str(get_now())
|
||||
token = hashlib.md5(
|
||||
quote_plus(viewId + actId + tt + salt).encode("utf-8")
|
||||
).hexdigest()
|
||||
msg = {
|
||||
"viewId": str(viewId),
|
||||
"tt": int(tt),
|
||||
"tokenVersion": 2,
|
||||
"token": str(token),
|
||||
"actId": int(actId),
|
||||
"bePromotion": 1,
|
||||
}
|
||||
return msg
|
||||
|
||||
|
||||
# promotion/invite
|
||||
async def post_url(def_id, ck, body):
|
||||
while 1:
|
||||
try:
|
||||
url = "https://jnk.m.jd.com/" + def_id
|
||||
headers = {
|
||||
"Cookie": f"{ck}wxclient=gxhwx;ie_ai=1;",
|
||||
"content-type": "application/json",
|
||||
"Connection": "keep-alive",
|
||||
"Accept-Encoding": "gzip,compress,br,deflate",
|
||||
"Referer": "https://servicewechat.com/wx5afd69b196301a2f/135/page-frame.html",
|
||||
"Host": "jnk.m.jd.com",
|
||||
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.18(0x1800123f) NetType/WIFI Language/zh_CN",
|
||||
}
|
||||
bdoy = json.dumps(body)
|
||||
res = (await httpx_client.post(url=url, headers=headers, data=json.dumps(body))).text
|
||||
pin = re.findall(r"(pt_pin=([^; ]+)(?=;?))", ck)[0][1]
|
||||
logger.info(f'post_url:{unquote_plus(pin)}:{res}')
|
||||
res_json = json.loads(res)
|
||||
# return json.dumps(res_json,indent=2,ensure_ascii=False)
|
||||
return res_json
|
||||
except:
|
||||
pass
|
||||
|
||||
# 检查pin
|
||||
def checkpin(cks: list, pin):
|
||||
for ck in cks:
|
||||
if pin in ck:
|
||||
return ck
|
||||
else:
|
||||
None
|
||||
|
||||
async def task(ck, promotionId):
|
||||
pin = re.findall(r"(pt_pin=([^; ]+)(?=;?))", ck)[0][1]
|
||||
logger.info(f"您好[{pin}]")
|
||||
result = await post_url(
|
||||
"mission/user/promotion/status", ck, {"promotionId": promotionId}
|
||||
)
|
||||
res = get_viewId(pin, str(promotionId))
|
||||
viewId = res["viewId"]
|
||||
result = await post_url("viewlog/user/recordLog", ck, res)
|
||||
await asyncio.sleep(25)
|
||||
success = 0
|
||||
while True:
|
||||
token = get_token(viewId, str(promotionId))
|
||||
result = await post_url("viewlog/user/recordLog", ck, token)
|
||||
if result['code']==-100 or '未登录' in str(result):
|
||||
return
|
||||
if result["code"] == 0 and success == 5:
|
||||
logger.info(result["msg"])
|
||||
break
|
||||
if success == 2 or success == 3:
|
||||
result = await post_url(
|
||||
"mission/user/promotion/join",
|
||||
ck,
|
||||
{
|
||||
"promotionId": promotionId,
|
||||
"nickName": "微信用户",
|
||||
"avatarUrl": "https://static-alias-1.360buyimg.com/jzt/mp/images/default_user_img.png",
|
||||
"openId": "",
|
||||
},
|
||||
)
|
||||
if result['code']==1:
|
||||
break
|
||||
else:
|
||||
success += 1
|
||||
continue
|
||||
else:
|
||||
success += 1
|
||||
continue
|
||||
await post_url("mission/user/promotion/status", ck, {"promotionId": promotionId})
|
||||
await post_url(
|
||||
"mission/user/promotion/join",
|
||||
ck,
|
||||
{
|
||||
"promotionId": promotionId,
|
||||
"nickName": "微信用户",
|
||||
"avatarUrl": "https://static-alias-1.360buyimg.com/jzt/mp/images/default_user_img.png",
|
||||
"openId": "",
|
||||
},
|
||||
)
|
||||
|
||||
async def promotionCreate(ck):
|
||||
number = '123456789'
|
||||
sa = []
|
||||
for i in range(6):
|
||||
sa.append(choice(number))
|
||||
numbers = ''.join(sa)
|
||||
body = {"nickName":"微信用户",
|
||||
"avatarUrl":"https://static-alias-1.360buyimg.com/jzt/mp/images/default_user_img.png",
|
||||
"openId":"",
|
||||
"cellphone":f"15214{str(numbers)}"
|
||||
}
|
||||
result = await post_url('mission/user/promotion/create',ck,body)
|
||||
return result
|
||||
|
||||
async def search(ck,ua):
|
||||
while 1:
|
||||
try:
|
||||
result = await index(ck, ua) # 获取频道信息
|
||||
if not result["success"]:
|
||||
logger.warn("目前没有任何直播间信息")
|
||||
return [],None
|
||||
liveres = []
|
||||
for n, live in enumerate(result["data"], 1):
|
||||
liveId = live["liveId"] # 直播id
|
||||
result = await post_url('mission/user/promotion/invite',ck,{
|
||||
"nickName":"微信用户",
|
||||
"avatarUrl":"https://static-alias-1.360buyimg.com/jzt/mp/images/default_user_img.png",
|
||||
"openId":str(''),"liveId":liveId})
|
||||
if result['success']:
|
||||
if result['msg'] is None:
|
||||
liveId = result['data']['liveId']
|
||||
liveres.append(str(liveId))
|
||||
if '未注册' in str(result):
|
||||
result = await promotionCreate(ck)
|
||||
if result['success']:
|
||||
print('注册成功')
|
||||
else:
|
||||
print('注册失败log:'+str(result))
|
||||
else:
|
||||
print(result['msg'])
|
||||
continue
|
||||
|
||||
return liveres
|
||||
except:
|
||||
pass
|
||||
|
||||
# 主程序
|
||||
async def main():
|
||||
try:
|
||||
cks = os.environ["JD_COOKIE"].split("&")
|
||||
except:
|
||||
with open('cklist.txt','r') as f:
|
||||
cks = f.read().split('\n')
|
||||
logger.info(f"共:{len(cks)}个CK")
|
||||
|
||||
while True:
|
||||
logger.info("------轮询------")
|
||||
logger.info(f"轮询ck")
|
||||
rand_ck = choice(cks[5:15])
|
||||
ua = randomuserAgent() # 随机ua
|
||||
if inveteck == '':
|
||||
logger.info(f"没有配置车头子ck,快去填写吧")
|
||||
return
|
||||
liveres = await search(rand_ck, ua)
|
||||
if len(liveres) == 0:
|
||||
logger.info("暂无活动,等待")
|
||||
await asyncio.sleep(5) # 等待时间
|
||||
continue
|
||||
|
||||
liveId1 = liveres[0]
|
||||
while 1:
|
||||
result = await post_url(
|
||||
"mission/user/promotion/invite",
|
||||
inveteck,
|
||||
{
|
||||
"nickName": "微信用户",
|
||||
"avatarUrl": "https://static-alias-1.360buyimg.com/jzt/mp/images/default_user_img.png",
|
||||
"openId": str(me),
|
||||
"liveId": liveId1,
|
||||
},
|
||||
)
|
||||
logger.info(f'result:{result}')
|
||||
if '未注册' in str(result):
|
||||
result = await promotionCreate(inveteck)
|
||||
if result['success']:
|
||||
print('注册成功')
|
||||
break
|
||||
if '火爆' in str(result):
|
||||
continue
|
||||
if "promotionId" in result["data"]:
|
||||
promotionId = result["data"]["promotionId"]
|
||||
break
|
||||
else:
|
||||
logger.info(result["msg"])
|
||||
return
|
||||
|
||||
cks = cks[1:]
|
||||
for idx in range(0, len(cks), group_size):
|
||||
logger.info(f"开始执行第{idx//group_size + 1}组")
|
||||
group = cks[idx : idx + group_size]
|
||||
done, pending = await asyncio.wait(
|
||||
[asyncio.create_task(task(ck, promotionId)) for ck in group], timeout=None
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
Loading…
Reference in New Issue