Update Decrypt.py
- Added widevine challenge / response crawler.
This commit is contained in:
parent
e91d2d717e
commit
b5f957b957
@ -1,3 +1,5 @@
|
|||||||
|
import base64
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
from pywidevine.cdm import Cdm
|
from pywidevine.cdm import Cdm
|
||||||
from pywidevine.device import Device
|
from pywidevine.device import Device
|
||||||
@ -17,6 +19,7 @@ def load_license_curl():
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.headers = headers
|
self.headers = headers
|
||||||
self.cookies = cookies
|
self.cookies = cookies
|
||||||
|
self.data = data
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(f'{os.getcwd()}/License_cURL.py', 'r') as file:
|
with open(f'{os.getcwd()}/License_cURL.py', 'r') as file:
|
||||||
@ -33,6 +36,10 @@ def load_license_curl():
|
|||||||
cookies = local_namespace['cookies']
|
cookies = local_namespace['cookies']
|
||||||
else:
|
else:
|
||||||
cookies = None
|
cookies = None
|
||||||
|
if 'data' in local_namespace:
|
||||||
|
data = local_namespace['data']
|
||||||
|
else:
|
||||||
|
data = None
|
||||||
return LicenseCURL()
|
return LicenseCURL()
|
||||||
|
|
||||||
def check_if_url(string):
|
def check_if_url(string):
|
||||||
@ -48,6 +55,22 @@ def check_if_url(string):
|
|||||||
re.IGNORECASE)
|
re.IGNORECASE)
|
||||||
return re.match(url_pattern, string) is not None
|
return re.match(url_pattern, string) is not None
|
||||||
|
|
||||||
|
def replace_widevine_challenge(dictionary, challenge):
|
||||||
|
for key, value in dictionary.items():
|
||||||
|
if 'widevine' in key.lower():
|
||||||
|
dictionary[key] = challenge
|
||||||
|
elif isinstance(value, dict):
|
||||||
|
replace_widevine_value(value, challenge_type)
|
||||||
|
|
||||||
|
|
||||||
|
def find_widevine_license(dictionary):
|
||||||
|
for key, value in dictionary.items():
|
||||||
|
if 'widevine' in key.lower() or 'license' in key.lower():
|
||||||
|
license = dictionary[key]
|
||||||
|
return license
|
||||||
|
elif isinstance(value, dict):
|
||||||
|
replace_widevine_value(value, challenge_type)
|
||||||
|
|
||||||
def decrypt_local_cdm():
|
def decrypt_local_cdm():
|
||||||
cdm_choice = CDM_Selector.select_local_cdm()
|
cdm_choice = CDM_Selector.select_local_cdm()
|
||||||
try:
|
try:
|
||||||
@ -102,28 +125,45 @@ def decrypt_local_cdm():
|
|||||||
headers=license_curl.headers,
|
headers=license_curl.headers,
|
||||||
cookies=license_curl.cookies,
|
cookies=license_curl.cookies,
|
||||||
data=cdm.service_certificate_challenge
|
data=cdm.service_certificate_challenge
|
||||||
).content
|
)
|
||||||
cdm.set_service_certificate(session_id=session_id, certificate=service_certificate)
|
try:
|
||||||
service_cert_set_success = True
|
cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content)
|
||||||
|
service_cert_set_success = True
|
||||||
|
except Exception as error:
|
||||||
|
try:
|
||||||
|
cdm.set_service_certificate(session_id=session_id, certificate=find_widevine_license(service_certificate.json()))
|
||||||
|
service_cert_set_success = True
|
||||||
|
except Exception as error:
|
||||||
|
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate')
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate')
|
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate')
|
||||||
challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh, privacy_mode=service_cert_set_success)
|
challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh, privacy_mode=service_cert_set_success)
|
||||||
db_data = challenge
|
db_data = challenge
|
||||||
|
if license_curl.data:
|
||||||
|
try:
|
||||||
|
lic_data = replace_widevine_value(license_curl.data, base64.b64encode(challenge).decode())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lic_data = challenge
|
||||||
try:
|
try:
|
||||||
license_response = httpx.post(
|
license_response = httpx.post(
|
||||||
url=user_license_url,
|
url=user_license_url,
|
||||||
headers=license_curl.headers,
|
headers=license_curl.headers,
|
||||||
cookies=license_curl.cookies,
|
cookies=license_curl.cookies,
|
||||||
data=challenge
|
data=lic_data
|
||||||
).content
|
)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
||||||
exit(1)
|
exit(1)
|
||||||
try:
|
try:
|
||||||
cdm.parse_license(session_id=session_id, license_message=license_response)
|
cdm.parse_license(session_id=session_id, license_message=license_response.content)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
try:
|
||||||
exit(1)
|
cdm.parse_license(session_id=session_id, license_message=find_widevine_license(license_response.json()))
|
||||||
|
except Exception as error:
|
||||||
|
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
||||||
|
exit(1)
|
||||||
for key in cdm.get_keys(session_id):
|
for key in cdm.get_keys(session_id):
|
||||||
if key.type == 'CONTENT':
|
if key.type == 'CONTENT':
|
||||||
Database.upsert_key(PSSH=f'{db_pssh}', MPD=f'{db_mpd}', KID=f'{key.kid.hex}', KEY=f'{key.key.hex()}', License_URL=f'{db_url}', Headers=f'{db_headers}', Cookies=f'{db_cookies}', Data=f'{db_data}')
|
Database.upsert_key(PSSH=f'{db_pssh}', MPD=f'{db_mpd}', KID=f'{key.kid.hex}', KEY=f'{key.key.hex()}', License_URL=f'{db_url}', Headers=f'{db_headers}', Cookies=f'{db_cookies}', Data=f'{db_data}')
|
||||||
@ -189,28 +229,45 @@ def decrypt_remote_cdm():
|
|||||||
headers=license_curl.headers,
|
headers=license_curl.headers,
|
||||||
cookies=license_curl.cookies,
|
cookies=license_curl.cookies,
|
||||||
data=cdm.service_certificate_challenge
|
data=cdm.service_certificate_challenge
|
||||||
).content
|
)
|
||||||
cdm.set_service_certificate(session_id=session_id, certificate=service_certificate)
|
try:
|
||||||
service_cert_set_success = True
|
cdm.set_service_certificate(session_id=session_id, certificate=service_certificate.content)
|
||||||
|
set_service_certificate_success = True
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
cdm.set_service_certificate(session_id=session_id, certificate=find_widevine_license(service_certificate.json()))
|
||||||
|
set_service_certificate_success = True
|
||||||
|
except Exception as error:
|
||||||
|
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate')
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate')
|
print(f'{Fore.RED}An error occurred.\n\n{error}\n\nTrying without service certificate')
|
||||||
challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh, privacy_mode=service_cert_set_success)
|
challenge = cdm.get_license_challenge(session_id=session_id, pssh=pssh, privacy_mode=service_cert_set_success)
|
||||||
db_data = challenge
|
db_data = challenge
|
||||||
|
if license_curl.data:
|
||||||
|
try:
|
||||||
|
lic_data = replace_widevine_value(license_curl.data, base64.b64encode(challenge).decode())
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
lic_data = challenge
|
||||||
try:
|
try:
|
||||||
license_response = httpx.post(
|
license_response = httpx.post(
|
||||||
url=user_license_url,
|
url=user_license_url,
|
||||||
headers=license_curl.headers,
|
headers=license_curl.headers,
|
||||||
cookies=license_curl.cookies,
|
cookies=license_curl.cookies,
|
||||||
data=challenge
|
data=lic_data
|
||||||
).content
|
)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
||||||
exit(1)
|
exit(1)
|
||||||
try:
|
try:
|
||||||
cdm.parse_license(session_id=session_id, license_message=license_response)
|
cdm.parse_license(session_id=session_id, license_message=license_response.content)
|
||||||
except Exception as error:
|
except Exception as error:
|
||||||
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
try:
|
||||||
exit(1)
|
cdm.parse_license(session_id=session_id, license_message=find_widevine_license(license_response.json()))
|
||||||
|
except Exception as error:
|
||||||
|
print(f'{Fore.RED}An error occurred.\n\n{error}')
|
||||||
|
exit(1)
|
||||||
for key in cdm.get_keys(session_id):
|
for key in cdm.get_keys(session_id):
|
||||||
if key.type == 'CONTENT':
|
if key.type == 'CONTENT':
|
||||||
Database.upsert_key(PSSH=f'{db_pssh}', MPD=f'{db_mpd}', KID=f'{key.kid.hex}', KEY=f'{key.key.hex()}', License_URL=f'{db_url}', Headers=f'{db_headers}', Cookies=f'{db_cookies}', Data=f'{db_data}')
|
Database.upsert_key(PSSH=f'{db_pssh}', MPD=f'{db_mpd}', KID=f'{key.kid.hex}', KEY=f'{key.key.hex()}', License_URL=f'{db_url}', Headers=f'{db_headers}', Cookies=f'{db_cookies}', Data=f'{db_data}')
|
||||||
|
Loading…
Reference in New Issue
Block a user