|
import pyodbc |
|
import msal |
|
import requests |
|
import json |
|
|
|
# Azure AD details |
|
client_id = 'XXXX' |
|
client_secret = 'XXXX' |
|
tenant_id = 'XXXX' |
|
authority = f'https://login.microsoftonline.com/{tenant_id}' |
|
resource = 'https://XXXX.crm8.dynamics.com' |
|
|
|
# SQL endpoint |
|
sql_server = 'XXXX.crm8.dynamics.com' |
|
database = 'XXXX' |
|
|
|
# Get token with error handling |
|
try: |
|
print(f"Attempting to authenticate with tenant: {tenant_id}") |
|
print(f"Authority URL: {authority}") |
|
|
|
app = msal.ConfidentialClientApplication(client_id, authority=authority, client_credential=client_secret) |
|
|
|
print("Acquiring token…") |
|
token_response = app.acquire_token_for_client(scopes=[f'{resource}/.default']) |
|
|
|
if 'error' in token_response: |
|
print(f"Token acquisition failed: {token_response['error']}") |
|
print(f"Error description: {token_response.get('error_description', 'No description available')}") |
|
else: |
|
access_token = token_response['access_token'] |
|
print("Token acquired successfully and your token is!"+access_token) |
|
print(f"Token length: {len(access_token)} characters") |
|
|
|
except ValueError as e: |
|
print(f"Configuration Error: {e}") |
|
print("\nPossible solutions:") |
|
print("1. Verify your tenant ID is correct") |
|
print("2. Check if the tenant exists and is active") |
|
print("3. Ensure you're using the right Azure cloud (commercial, government, etc.)") |
|
|
|
except Exception as e: |
|
print(f"Unexpected error: {e}") |
|
|
|
#Get 5 contacts from Dataverse using Web API |
|
import requests |
|
import json |
|
|
|
try: |
|
print("Making Web API request to get contacts…") |
|
|
|
# Dataverse Web API endpoint for contacts |
|
web_api_url = f"{resource}/api/data/v9.2/contacts" |
|
|
|
# Set up headers with authorization token |
|
headers = { |
|
'Authorization': f'Bearer {access_token}', |
|
'OData-MaxVersion': '4.0', |
|
'OData-Version': '4.0', |
|
'Accept': 'application/json', |
|
'Content-Type': 'application/json' |
|
} |
|
|
|
# Add query parameters to get only 5 contacts with specific fields |
|
params = { |
|
'$top': 5, |
|
'$select': 'contactid,fullname,emailaddress1,telephone1,createdon' |
|
} |
|
|
|
# Make the GET request |
|
response = requests.get(web_api_url, headers=headers, params=params) |
|
|
|
if response.status_code == 200: |
|
print("Web API request successful!") |
|
contacts_data = response.json() |
|
|
|
print(f"\nFound {len(contacts_data['value'])} contacts:") |
|
print("-" * 80) |
|
|
|
for i, contact in enumerate(contacts_data['value'], 1): |
|
print(f"Contact {i}:") |
|
print(f" ID: {contact.get('contactid', 'N/A')}") |
|
print(f" Name: {contact.get('fullname', 'N/A')}") |
|
print(f" Email: {contact.get('emailaddress1', 'N/A')}") |
|
print(f" Phone: {contact.get('telephone1', 'N/A')}") |
|
print(f" Created: {contact.get('createdon', 'N/A')}") |
|
print("-" * 40) |
|
|
|
else: |
|
print(f"Web API request failed with status code: {response.status_code}") |
|
print(f"Error details: {response.text}") |
|
|
|
except requests.exceptions.RequestException as e: |
|
print(f"Request error: {e}") |
|
except KeyError as e: |
|
print(f"Token not available: {e}") |
|
except Exception as e: |
|
print(f"Unexpected error: {e}") |