diff --git a/Scripts/py/getcookie.py b/Scripts/py/getcookie.py new file mode 100644 index 0000000..6eda5de --- /dev/null +++ b/Scripts/py/getcookie.py @@ -0,0 +1,180 @@ +from telethon import events, Button +import requests +import re +import time +import qrcode +from asyncio import exceptions +from .. import jdbot, chat_id, img_file, mybot, chname +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 = 'https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=%s&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % time_stamp + get_header = { + 'Connection': 'Keep-Alive', + 'Content-Type': 'application/x-www-form-urlencoded', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'zh-cn', + 'Referer': 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=%s&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % time_stamp, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0', + '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 = 'https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=%s&v=%s&remember=true' % ( + s_token, post_time_stamp) + post_data = { + 'lang': 'chs', + 'appid': 300, + 'returnurl': 'https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action' % post_time_stamp, + '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': 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % post_time_stamp, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0', + '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': + login = False + await jdbot.delete_messages(chat_id, cookiemsg) + msg = await conv.send_message('对话已取消') + conv.cancel() + else: + raise exceptions.TimeoutError() + except exceptions.TimeoutError: + expired_time = time.time() + 60 * 2 + while login: + check_time_stamp = int(time.time() * 1000) + check_url = 'https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=%s&ou_state=0&okl_token=%s' % ( + token, okl_token) + check_data = { + 'lang': 'chs', + 'appid': 300, + 'returnurl': 'https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action' % check_time_stamp, + 'source': 'wq_passport' + } + check_header = { + 'Referer': f'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % check_time_stamp, + '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; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0', + } + 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']))