Skip to content

Instantly share code, notes, and snippets.

@JJTech0130
Created May 22, 2025 17:18
Show Gist options
  • Save JJTech0130/b14e568170ddc1894cefa89a4e1f252e to your computer and use it in GitHub Desktop.
Save JJTech0130/b14e568170ddc1894cefa89a4e1f252e to your computer and use it in GitHub Desktop.
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