mirror of
https://github.com/Oreomeow/VIP.git
synced 2026-02-03 10:33:15 +08:00
200 lines
8.3 KiB
Python
200 lines
8.3 KiB
Python
import re
|
||
import time
|
||
from asyncio import exceptions
|
||
|
||
import qrcode
|
||
import requests
|
||
from telethon import Button, events
|
||
|
||
from .. import chat_id, chname, img_file, jdbot, mybot
|
||
from ..bot.utils import press_event
|
||
|
||
cookiemsg = ""
|
||
# 扫码获取cookie 直接采用LOF大佬代码
|
||
# getSToken请求获取,s_token用于发送post请求是的必须参数
|
||
s_token = ""
|
||
# getSToken请求获取,guid,lsid,lstoken用于组装cookies
|
||
guid, lsid, lstoken = "", "", ""
|
||
# 由上面参数组装生成,getOKLToken函数发送请求需要使用
|
||
cookies = ""
|
||
# getOKLToken请求获取,token用户生成二维码使用、okl_token用户检查扫码登录结果使用
|
||
token, okl_token = "", ""
|
||
# 最终获取到的可用的cookie
|
||
jd_cookie = ""
|
||
|
||
|
||
def getSToken():
|
||
time_stamp = int(time.time() * 1000)
|
||
get_url = f"https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state={time_stamp}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport"
|
||
|
||
get_header = {
|
||
"Connection": "Keep-Alive",
|
||
"Content-Type": "application/x-www-form-urlencoded",
|
||
"Accept": "application/json, text/plain, */*",
|
||
"Accept-Language": "zh-cn",
|
||
"Referer": f"https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state={time_stamp}&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport",
|
||
"User-Agent": "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5 UCBrowser/13.4.2.1122",
|
||
"Host": "plogin.m.jd.com",
|
||
}
|
||
|
||
resp = requests.get(url=get_url, headers=get_header)
|
||
parseGetRespCookie(resp.headers, resp.json())
|
||
|
||
|
||
def parseGetRespCookie(headers, get_resp):
|
||
global s_token
|
||
global cookies
|
||
s_token = get_resp.get("s_token")
|
||
set_cookies = headers.get("set-cookie")
|
||
guid = re.findall(r"guid=(.+?);", set_cookies)[0]
|
||
lsid = re.findall(r"lsid=(.+?);", set_cookies)[0]
|
||
lstoken = re.findall(r"lstoken=(.+?);", set_cookies)[0]
|
||
cookies = f"guid={guid}; lang=chs; lsid={lsid}; lstoken={lstoken}; "
|
||
|
||
|
||
def getOKLToken():
|
||
post_time_stamp = int(time.time() * 1000)
|
||
post_url = f"https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token={s_token}&v={post_time_stamp}&remember=true"
|
||
|
||
post_data = {
|
||
"lang": "chs",
|
||
"appid": 300,
|
||
"returnurl": f"https://wqlogin2.jd.com/passport/LoginRedirect?state={post_time_stamp}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action",
|
||
"source": "wq_passport",
|
||
}
|
||
|
||
post_header = {
|
||
"Connection": "Keep-Alive",
|
||
"Content-Type": "application/x-www-form-urlencoded; Charset=UTF-8",
|
||
"Accept": "application/json, text/plain, */*",
|
||
"Cookie": cookies,
|
||
"Referer": f"https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state={post_time_stamp}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport",
|
||
"User-Agent": "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5 UCBrowser/13.4.2.1122",
|
||
"Host": "plogin.m.jd.com",
|
||
}
|
||
|
||
try:
|
||
global okl_token
|
||
resp = requests.post(
|
||
url=post_url, headers=post_header, data=post_data, timeout=20
|
||
)
|
||
parsePostRespCookie(resp.headers, resp.json())
|
||
except Exception as error:
|
||
print("Post网络请求错误", error)
|
||
|
||
|
||
def parsePostRespCookie(headers, data):
|
||
global token
|
||
global okl_token
|
||
token = data.get("token")
|
||
okl_token = re.findall(r"okl_token=(.+?);", headers.get("set-cookie"))[0]
|
||
|
||
|
||
def parseJDCookies(headers):
|
||
global jd_cookie
|
||
set_cookie = headers.get("Set-Cookie")
|
||
pt_key = re.findall(r"pt_key=(.+?);", set_cookie)[0]
|
||
pt_pin = re.findall(r"pt_pin=(.+?);", set_cookie)[0]
|
||
jd_cookie = f"pt_key={pt_key};pt_pin={pt_pin};"
|
||
|
||
|
||
def creatqr(text):
|
||
"""实例化QRCode生成qr对象"""
|
||
qr = qrcode.QRCode(
|
||
version=1,
|
||
error_correction=qrcode.constants.ERROR_CORRECT_H,
|
||
box_size=10,
|
||
border=4,
|
||
)
|
||
qr.clear()
|
||
# 传入数据
|
||
qr.add_data(text)
|
||
qr.make(fit=True)
|
||
# 生成二维码
|
||
img = qr.make_image()
|
||
# 保存二维码
|
||
img.save(img_file)
|
||
|
||
|
||
@jdbot.on(events.NewMessage(from_users=chat_id, pattern=r"^/getcookie"))
|
||
async def my_cookie(event):
|
||
"""接收/getcookie后执行程序"""
|
||
login = True
|
||
msg = await jdbot.send_message(chat_id, "正在获取二维码,请稍后")
|
||
global cookiemsg
|
||
try:
|
||
SENDER = event.sender_id
|
||
async with jdbot.conversation(SENDER, timeout=30) as conv:
|
||
getSToken()
|
||
getOKLToken()
|
||
url = f"https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token={token}"
|
||
creatqr(url)
|
||
markup = [
|
||
Button.inline("已扫码", data="confirm"),
|
||
Button.inline("取消", data="cancel"),
|
||
]
|
||
await jdbot.delete_messages(chat_id, msg)
|
||
cookiemsg = await jdbot.send_message(
|
||
chat_id,
|
||
"30s内点击取消将取消本次操作\n如不取消,扫码结果将于30s后显示\n扫码后不想等待点击已扫码",
|
||
file=img_file,
|
||
buttons=markup,
|
||
)
|
||
convdata = await conv.wait_event(press_event(SENDER))
|
||
res = bytes.decode(convdata.data)
|
||
if res != "cancel":
|
||
raise exceptions.TimeoutError()
|
||
login = False
|
||
await jdbot.delete_messages(chat_id, cookiemsg)
|
||
msg = await conv.send_message("对话已取消")
|
||
conv.cancel()
|
||
except exceptions.TimeoutError:
|
||
expired_time = time.time() + 60 * 2
|
||
while login:
|
||
check_time_stamp = int(time.time() * 1000)
|
||
check_url = f"https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token={token}&ou_state=0&okl_token={okl_token}"
|
||
|
||
check_data = {
|
||
"lang": "chs",
|
||
"appid": 300,
|
||
"returnurl": f"https://wqlogin2.jd.com/passport/LoginRedirect?state={check_time_stamp}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action",
|
||
"source": "wq_passport",
|
||
}
|
||
|
||
check_header = {
|
||
"Referer": f"https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state={check_time_stamp}&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport",
|
||
"Cookie": cookies,
|
||
"Connection": "Keep-Alive",
|
||
"Content-Type": "application/x-www-form-urlencoded; Charset=UTF-8",
|
||
"Accept": "application/json, text/plain, */*",
|
||
"User-Agent": "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5 UCBrowser/13.4.2.1122",
|
||
}
|
||
|
||
resp = requests.post(
|
||
url=check_url, headers=check_header, data=check_data, timeout=30
|
||
)
|
||
data = resp.json()
|
||
if data.get("errcode") == 0:
|
||
parseJDCookies(resp.headers)
|
||
await jdbot.delete_messages(chat_id, cookiemsg)
|
||
await jdbot.send_message(chat_id, "以下为获取到的cookie")
|
||
await jdbot.send_message(chat_id, jd_cookie)
|
||
return
|
||
if data.get("errcode") == 21:
|
||
await jdbot.delete_messages(chat_id, cookiemsg)
|
||
await jdbot.send_message(chat_id, f'发生了某些错误\n{data.get("errcode")}')
|
||
return
|
||
if time.time() > expired_time:
|
||
await jdbot.delete_messages(chat_id, cookiemsg)
|
||
await jdbot.send_message(chat_id, "超过3分钟未扫码,二维码已过期")
|
||
return
|
||
except Exception as e:
|
||
await jdbot.send_message(chat_id, f"something wrong,I'm sorry\n{str(e)}")
|
||
|
||
|
||
if chname:
|
||
jdbot.add_event_handler(
|
||
my_cookie,
|
||
events.NewMessage(from_users=chat_id, pattern=mybot["命令别名"]["getcookie"]),
|
||
)
|