DISNEY-4K-SCRIPT/pydisney/disneyplus_login.py

163 lines
5.7 KiB
Python

import re
import requests, json
class LOGIN(object):
def __init__(self, email, password, proxies=False):
self.email = email
self.password = password
self.web_page = 'https://www.disneyplus.com/login'
self.devices_url = "https://global.edge.bamgrid.com/devices"
self.login_url = 'https://global.edge.bamgrid.com/idp/login'
self.token_url = "https://global.edge.bamgrid.com/token"
self.grant_url = 'https://global.edge.bamgrid.com/accounts/grant'
self.SESSION = requests.Session()
if proxies:
self.SESSION.proxies.update(proxies)
def clientapikey(self):
r = self.SESSION.get(self.web_page)
match = re.search("window.server_path = ({.*});", r.text)
janson = json.loads(match.group(1))
clientapikey = janson["sdk"]["clientApiKey"]
return clientapikey
def assertion(self, client_apikey):
postdata = {
"applicationRuntime": "firefox",
"attributes": {},
"deviceFamily": "browser",
"deviceProfile": "macosx"
}
header = {"authorization": "Bearer {}".format(client_apikey), "Origin": "https://www.disneyplus.com"}
res = self.SESSION.post(url=self.devices_url, headers=header, json=postdata)
assertion = res.json()["assertion"]
return assertion
def access_token(self, client_apikey, assertion_):
header = {"authorization": "Bearer {}".format(client_apikey), "Origin": "https://www.disneyplus.com"}
postdata = {
"grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
"latitude": "0",
"longitude": "0",
"platform": "browser",
"subject_token": assertion_,
"subject_token_type": "urn:bamtech:params:oauth:token-type:device"
}
res = self.SESSION.post(url=self.token_url, headers=header, data=postdata)
if res.status_code == 200:
access_token = res.json()["access_token"]
return access_token
if 'unreliable-location' in str(res.text):
print('Make sure you use NL proxy/vpn, or your proxy/vpn is blacklisted.')
exit()
else:
try:
print('Error: ' + str(res.json()["errors"]['error_description']))
exit()
except Exception:
print('Error: ' + str(res.text))
exit()
return None
def login(self, access_token):
headers = {
'accept': 'application/json; charset=utf-8',
'authorization': "Bearer {}".format(access_token),
'content-type': 'application/json; charset=UTF-8',
'Origin': 'https://www.disneyplus.com',
'Referer': 'https://www.disneyplus.com/login/password',
'Sec-Fetch-Mode': 'cors',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
'x-bamsdk-platform': 'windows',
'x-bamsdk-version': '3.10',
}
data = {'email': self.email, 'password': self.password}
res = self.SESSION.post(url=self.login_url, data=json.dumps(data), headers=headers)
if res.status_code == 200:
id_token = res.json()["id_token"]
return id_token
try:
print('Error: ' + str(res.json()["errors"]))
exit()
except Exception:
print('Error: ' + str(res.text))
exit()
return None
def grant(self, id_token, access_token):
headers = {
'accept': 'application/json; charset=utf-8',
'authorization': "Bearer {}".format(access_token),
'content-type': 'application/json; charset=UTF-8',
'Origin': 'https://www.disneyplus.com',
'Referer': 'https://www.disneyplus.com/login/password',
'Sec-Fetch-Mode': 'cors',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
'x-bamsdk-platform': 'windows',
'x-bamsdk-version': '3.10',
}
data = {'id_token': id_token}
res = self.SESSION.post(url=self.grant_url, data=json.dumps(data), headers=headers)
assertion = res.json()["assertion"]
return assertion
def FinalToken(self, subject_token, client_apikey):
header = {"authorization": "Bearer {}".format(client_apikey), "Origin": "https://www.disneyplus.com"}
postdata = {
"grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
"latitude": "0",
"longitude": "0",
"platform": "browser",
"subject_token": subject_token,
"subject_token_type": "urn:bamtech:params:oauth:token-type:account"
}
res = self.SESSION.post(url=self.token_url, headers=header, data=postdata)
if res.status_code == 200:
access_token = res.json()["access_token"]
expires_in = res.json()["expires_in"]
return access_token, expires_in
try:
print('Error: ' + str(res.json()["errors"]))
exit()
except Exception:
print('Error: ' + str(res.text))
exit()
return None, None
def GetAuthToken(self):
clientapikey_ = self.clientapikey()
assertion_ = self.assertion(clientapikey_)
access_token_ = self.access_token(clientapikey_, assertion_)
id_token_ = self.login(access_token_)
user_assertion = self.grant(id_token_, access_token_)
TOKEN, EXPIRE = self.FinalToken(user_assertion, clientapikey_)
return TOKEN, EXPIRE