Created
May 22, 2025 17:18
-
-
Save JJTech0130/b14e568170ddc1894cefa89a4e1f252e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import webview | |
import time | |
from xml.etree import ElementTree as ET | |
def login(): | |
# Open a WebView to https://www.fdspcl.dealerconnection.com/NonDealerLogin?accountCountry=USA&accountLanguage=EN | |
# and wait for it to redirect to https://www.fdspcl.dealerconnection.com/AuthorizeNonDealer | |
# and then get a FDRS cookie | |
window = webview.create_window('Ford Login', 'https://www.fdspcl.dealerconnection.com/NonDealerLogin?accountCountry=USA&accountLanguage=EN', height=800) | |
webview.start(_on_load_finished, window) # type: ignore | |
def _on_load_finished(window: webview.Window): | |
# Wait for the user to log in and the page to redirect | |
while True: | |
url = window.get_current_url() | |
print(f"Current URL: {url}") | |
if url is not None and url.startswith("https://www.fdspcl.dealerconnection.com/AuthorizeNonDealer"): | |
break | |
time.sleep(1) | |
session_id = None | |
user_name = None | |
# Get <meta> tags with name="sessionId" and "userName" (which may not be loaded yet) | |
while True: | |
print(window.get_current_url()) | |
for meta in window.dom.get_elements("meta"): | |
if meta.attributes.get("name") == "sessionId": | |
session_id = meta.attributes.get("content") | |
elif meta.attributes.get("name") == "userName": | |
user_name = meta.attributes.get("content") | |
if session_id and user_name: | |
break | |
time.sleep(1) | |
window.destroy() | |
print(f"Session ID: {session_id}") | |
print(f"User Name: {user_name}") | |
# Get a Ford Corp OAuth token | |
url = "https://corp.sts.ford.com/adfs/oauth2/token" | |
headers = { | |
"content-type": "application/x-www-form-urlencoded", | |
"accept": "application/json", | |
"INTERNAL_USER": "false", | |
"Connection": "close", | |
"User-Agent": "Apache-HttpClient/4.3.6 (java 1.5)" | |
} | |
data = { | |
'grant_type': 'client_credentials', | |
'resource': 'urn:ford:fdsp:pcf:webservice:prod', | |
'response_type': 'token', | |
'client_secret': 'UvMrLyOOsEX4JRAYg5CfK5L9vRB-ykeizf-VpPdy', | |
'client_id': '8306c026-b697-7cdf-0914-5a3c34a8e57d' | |
} | |
response = requests.post(url, headers=headers, data=data) | |
if response.status_code != 200: | |
print(f"Failed to get token: {response.status_code}") | |
return | |
corp_token_data = response.json() | |
corp_token = corp_token_data['access_token'] | |
print(f"Corp Token: {corp_token}") | |
# Convert the session cookie and corp token to a FDRS token | |
url = "https://www.fdspcl.dealerconnection.com/AuthorizationService/getFdspToken" | |
headers = { | |
"Authorization": f"Bearer {corp_token}", | |
"content-type": "application/xml", | |
"Session-Cookie": session_id, | |
"accept": "*/*", | |
"INTERNAL_USER": "false", | |
"Connection": "close", | |
"User-Agent": "Apache-HttpClient/4.3.6 (java 1.5)" | |
} | |
data = f'''<?xml version="1.0" encoding="UTF-8" standalone="yes"?> | |
<GetTokenRequest xmlns="urn:ford/interface/Authorization/Service/v1"> | |
<UserID>{user_name}</UserID> | |
<HostID>TEST_HOST_ID"test</HostID> | |
<LanguageCode>en</LanguageCode> | |
<CountryCode>USA</CountryCode> | |
<UserType>AFTERMARKET</UserType> | |
<FDRSVersion>44.4.4</FDRSVersion> | |
</GetTokenRequest> | |
''' | |
response = requests.post(url, headers=headers, data=data) | |
if response.status_code != 200: | |
print(f"Failed to get FDRS token: {response.status_code}") | |
return | |
fdrs_token_data = response.content | |
# Parse the XML response to get the <securedToken> element | |
root = ET.fromstring(fdrs_token_data) | |
ns = {'': 'urn:ford/interface/Authorization/Service/v1'} | |
secured_token = root.find('.//securedToken', ns) | |
if secured_token is not None: | |
fdrs_token = secured_token.text | |
print(f"FDRS Token: {fdrs_token}") | |
else: | |
print("Failed to get FDRS token from response") | |
return | |
return user_name, fdrs_token | |
if __name__ == "__main__": | |
login() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment