438 lines
16 KiB
Python
438 lines
16 KiB
Python
import requests
|
|
import json
|
|
|
|
# 1. Create a session object
|
|
session = requests.Session()
|
|
|
|
# 2. Set the User-Agent for the session
|
|
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"
|
|
session.headers.update({'User-Agent': user_agent})
|
|
|
|
# 3. Define and add cookies to the session
|
|
cookies_to_add = [
|
|
("SID", "g.a000vwi83sZx47d1q9Po8BgPR3jBX7lpsrzWSuPIKyp6RycUEctVzyy0oo1gNvQbwZa53AWllwACgYKAVQSARMSFQHGX2MiUpZ3JZlRTzUS5L-5fPmgpBoVAUF8yKprZzPlNM_X83070Ct35bq_0076", "/", ".google.com"),
|
|
("__Secure-1PSID", "g.a000vwi83sZx47d1q9Po8BgPR3jBX7lpsrzWSuPIKyp6RycUEctVKNqZm8qWU9ZC2DlRVPn0igACgYKAfQSARMSFQHGX2MiYGW66m_L_p1vlqiuEg-IrxoVAUF8yKrgRbA9tcA4VinZix0qlexX0076", "/", ".google.com"),
|
|
("__Secure-3PSID", "g.a000vwi83sZx47d1q9Po8BgPR3jBX7lpsrzWSuPIKyp6RycUEctVnGF-cJAl9Wr1rJ-NOCW63wACgYKAZASARMSFQHGX2Mi1gYcRRnI8v2AdvofwvFG5BoVAUF8yKooSw-opCZ1-vxmkQXCB7330076", "/", ".google.com"),
|
|
("HSID", "AJifEcy5MKbQSoqIz", "/", ".google.com"),
|
|
("SSID", "AB87p4RIXK_USto4D", "/", ".google.com"),
|
|
("APISID", "fQw9oTJbNnptFKdr/AIXxJuvoAk3qrIeWi", "/", ".google.com"),
|
|
("SAPISID", "3zFHAXrGoL_XNe0X/A7AafTXBL2NRj7N2h", "/", ".google.com"),
|
|
("__Secure-1PAPISID", "3zFHAXrGoL_XNe0X/A7AafTXBL2NRj7N2h", "/", ".google.com"),
|
|
("__Secure-3PAPISID", "3zFHAXrGoL_XNe0X/A7AafTXBL2NRj7N2h", "/", ".google.com"),
|
|
("AEC", "AVcja2e2MbzHDDL2yqJDMgUeDL-S3BEFB_yK293aRhQwshqv22Bd7IQ9mvg", "/", ".google.com"),
|
|
("NID", "523=SVwTZRVo9GJ5sSI0guSXNWwegQ7YY0h597wyCkrqkuIRMnQqpH3qrPA0SGB77KF69ibosOMUd-VNbNg1R7TXjPYFxYTUTP0uLtg41CaQctv6j1NKBaVPJoUkK3wzQ1e3l5yGsfBwGtypz5vxHP6yeyRtVWmYSiDiHr7AN1dKYXwzVVi7Dp8bvtppEAwUX7dQCqQ-4qGlHcoMW44STYwNELgd6CVXWPIhypl4qx_Wwcv7sY3GGP04s2kb0ljX7rYXKagj_Uv3xJDujDa4XUTAJKficyiWOrZT5LpeewUp1Kt5RyEBH2U7IHocmsWC6lfAKsoIt21wc1QwYioj9XkIIasJ4tCu1F7yXHjrglyGwbe5i67stMHI2FL3KXdoxe3ly_MORZWlVNM1Co7W43Rab01HMj2Ad940eXU9aV1PVzwlTtqiF0R0gLO_ubD6kykDRVMVMdMjMapz_dgIUfbkGMluSVykNRKnO7yf_rS7DKjXZXsh18UEsLcz6WjKtEYgmvm51MdH2JN5dcElSK_SWxrejJl-UW_eT_EqUQaeCtK2N7dTMFT38PGAkZFEKCvMqpjU86iLbFbmq_lKT-dm6IjIxFXj8yv652EYoCBlS3MsTjaQWP4_yRJa3oWhnB1kgwiBgBVmidRShZOT09L77WL6jVKE6YE09QrjGnoH_RjZFTwwGiuSFCLKfz9SwVsJBNV-nn5nZrU40kWmlhnfBNY3Kphq0fwO9RQ6wvzMAGzz684-kxzePSX3CgA74-rppEZrkXFMFjSaZGE-D7NAQp1qD2ez0-H2n0OXbRaLDN7JXn9fqhZu_FwvHJGfTBPZOZnk7taSnZSipmFU8gsTRQSVdFX6SlCXGpKueSRjhho", "/", ".google.com"),
|
|
("S", "maestro=IUwVdLn0rPZ27SY26uYPEonS9u1J9oQi8YzVJpqIc-w", "/", ".google.com"),
|
|
("__Secure-1PSIDTS", "sidts-CjIB7pHptaI1HakO1xLmYgvHilIKZJuufs1na9HjqCHJL13_z6LJNW13liGWofxE3NQ-NxAA", "/", ".google.com"),
|
|
("__Secure-3PSIDTS", "sidts-CjIB7pHptaI1HakO1xLmYgvHilIKZJuufs1na9HjqCHJL13_z6LJNW13liGWofxE3NQ-NxAA", "/", ".google.com"),
|
|
("_gid", "GA1.3.1639311329.1744393279", "/", ".lookerstudio.google.com"), # Different domain
|
|
("_ga", "GA1.1.1275703331.1743917675", "/", ".lookerstudio.google.com"), # Different domain
|
|
("_ga_LPCKLD3Z7X", "GS1.1.1744393286.6.0.1744393286.0.0.0", "/", ".lookerstudio.google.com"), # Different domain
|
|
("RAP_XSRF_TOKEN", "AImk1AJGP3sIKZ7N5-RA2jKHcJ0jdpxGKw:1744393288187", "/", "lookerstudio.google.com"), # Different domain (no leading dot)
|
|
("_gat", "1", "/", ".lookerstudio.google.com"), # Different domain
|
|
("SIDCC", "AKEyXzW9xrpFKS4Ox9-THfQ3DfB62JRx-bxxg0ZEiKYze2jaerhvWrVMFVCyjTjxIJfOhCOKQw4", "/", ".google.com"),
|
|
("__Secure-1PSIDCC", "AKEyXzXdMIev0GvM5xA0kMifj4jnuGZYNiob-2fJssX_jTBlwE8M4Bm9edS4J_i7UTSMFFEbCIm_", "/", ".google.com"),
|
|
("__Secure-3PSIDCC", "AKEyXzU8YysnVlR_9UcCx2GFo5hIUNPh6OqSCRE6Fpo9y12BNmobniOBCjTZc1_qHTS6VnivWX25", "/", ".google.com"),
|
|
("_ga_S4FJY0X3VX", "GS1.1.1744393279.7.1.1744393369.0.0.0", "/", ".lookerstudio.google.com") # Different domain
|
|
]
|
|
|
|
for name, value, path, domain in cookies_to_add:
|
|
session.cookies.set(name=name, value=value, path=path, domain=domain)
|
|
|
|
# 4. Define the Target URL
|
|
url = "https://lookerstudio.google.com/batchedDataV2?appVersion=20250324_0406"
|
|
|
|
# 5. Define Headers (User-Agent and Cookies are handled by the session)
|
|
headers = {
|
|
"authority": "lookerstudio.google.com",
|
|
"accept": "application/json, text/plain, */*",
|
|
"accept-encoding": "gzip, deflate, br, zstd", # requests usually handles this, but specifying can be safer
|
|
"accept-language": "en-US,en;q=0.9",
|
|
"cache-control": "no-cache",
|
|
# "encoding": "null", # This header seems unusual/invalid for requests, omitting
|
|
"origin": "https://lookerstudio.google.com",
|
|
"pragma": "no-cache",
|
|
"priority": "u=1, i",
|
|
"referer": "https://lookerstudio.google.com/reporting/1413fcfb-1416-4e56-8967-55f8e9f30ec8/page/p_pbm4eo88qc",
|
|
"sec-ch-ua": '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"',
|
|
"sec-ch-ua-mobile": "?0",
|
|
"sec-ch-ua-platform": '"Windows"',
|
|
"sec-fetch-dest": "empty",
|
|
"sec-fetch-mode": "cors",
|
|
"sec-fetch-site": "same-origin",
|
|
"x-client-data": "CIS2yQEIorbJAQipncoBCMHbygEIk6HLAQiFoM0BCP6lzgEIvdXOAQjJ4M4BCIbizgEIu+fOAQjS6M4BCKzpzgE=",
|
|
"x-rap-xsrf-token": "AImk1AJGP3sIKZ7N5-RA2jKHcJ0jdpxGKw:1744393288187",
|
|
# Content-Type will be set automatically by requests when using json=payload
|
|
}
|
|
|
|
# 6. Define the JSON Body (Payload)
|
|
# Use triple quotes for the multi-line string and parse it with json.loads
|
|
body_string = """
|
|
{
|
|
"dataRequest": [
|
|
{
|
|
"requestContext": {
|
|
"reportContext": {
|
|
"reportId": "1413fcfb-1416-4e56-8967-55f8e9f30ec8",
|
|
"pageId": "p_pbm4eo88qc",
|
|
"mode": 1,
|
|
"componentId": "cd-rdkny9a9qc",
|
|
"displayType": "simple-table",
|
|
"actionId": "crossFilters"
|
|
},
|
|
"requestMode": 0
|
|
},
|
|
"datasetSpec": {
|
|
"dataset": [
|
|
{
|
|
"datasourceId": "c2fc8cdd-46bb-454c-bf09-90ebfd4067d7",
|
|
"revisionNumber": 0,
|
|
"parameterOverrides": []
|
|
}
|
|
],
|
|
"queryFields": [
|
|
{
|
|
"name": "qt_3nwfu9yq1c",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"resultTransformation": {
|
|
"analyticalFunction": 0,
|
|
"isRelativeToBase": false
|
|
},
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Event_Id_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_8yjok4izsc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"resultTransformation": {
|
|
"analyticalFunction": 0,
|
|
"isRelativeToBase": false
|
|
},
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_DateTime_EST_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_sfkc163arc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_KYTC_Type_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_4e66idhbrc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Incident_Source_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_re76qrqe2c",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_District_",
|
|
"aggregation": 0
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_tfkc163arc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_County_Name_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_ufkc163arc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Route_Label_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_vfkc163arc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_BMP_Initial_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_o7kc163arc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_EMP_Initial_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_p7kc163arc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Description_"
|
|
}
|
|
}
|
|
],
|
|
"sortData": [
|
|
{
|
|
"sortColumn": {
|
|
"name": "qt_8yjok4izsc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_DateTime_EST_"
|
|
}
|
|
},
|
|
"sortDir": 1
|
|
}
|
|
],
|
|
"includeRowsCount": true,
|
|
"relatedDimensionMask": {
|
|
"addDisplay": false,
|
|
"addUniqueId": false,
|
|
"addLatLong": false
|
|
},
|
|
"paginateInfo": {
|
|
"startRow": 1,
|
|
"rowsCount": 50
|
|
},
|
|
"dsFilterOverrides": [],
|
|
"filters": [
|
|
{
|
|
"filterDefinition": {
|
|
"filterExpression": {
|
|
"include": false,
|
|
"conceptType": 0,
|
|
"concept": {
|
|
"ns": "t0",
|
|
"name": "qt_exs3vib9qc"
|
|
},
|
|
"filterConditionType": "PT",
|
|
"stringValues": [
|
|
"Shoulder"
|
|
],
|
|
"numberValues": [],
|
|
"queryTimeTransformation": {
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Source_Type_"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"dataSubsetNs": {
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"contextNs": "c0"
|
|
},
|
|
"version": 3
|
|
},
|
|
{
|
|
"filterDefinition": {
|
|
"filterExpression": {
|
|
"include": true,
|
|
"conceptType": 0,
|
|
"concept": {
|
|
"name": "qt_kjyfx83arc",
|
|
"ns": "t0"
|
|
},
|
|
"queryTimeTransformation": {
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_County_Name_"
|
|
}
|
|
},
|
|
"filterConditionType": "IN",
|
|
"stringValues": [
|
|
"Boyd",
|
|
"Carter",
|
|
"Greenup"
|
|
]
|
|
}
|
|
},
|
|
"dataSubsetNs": {
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"contextNs": "c0"
|
|
},
|
|
"version": 3,
|
|
"isCanvasFilter": true
|
|
}
|
|
],
|
|
"features": [],
|
|
"dateRanges": [],
|
|
"contextNsCount": 1,
|
|
"calculatedField": [],
|
|
"needGeocoding": false,
|
|
"geoFieldMask": [],
|
|
"multipleGeocodeFields": [],
|
|
"timezone": "America/New_York"
|
|
},
|
|
"role": "main",
|
|
"retryHints": {
|
|
"useClientControlledRetry": true,
|
|
"isLastRetry": false,
|
|
"retryCount": 0,
|
|
"originalRequestId": "cd-rdkny9a9qc_0_0"
|
|
}
|
|
},
|
|
{
|
|
"requestContext": {
|
|
"reportContext": {
|
|
"reportId": "1413fcfb-1416-4e56-8967-55f8e9f30ec8",
|
|
"pageId": "p_pbm4eo88qc",
|
|
"mode": 1,
|
|
"componentId": "cd-hgodhfhbrc",
|
|
"displayType": "dimension-filter",
|
|
"actionId": "crossFilters"
|
|
},
|
|
"requestMode": 7
|
|
},
|
|
"datasetSpec": {
|
|
"dataset": [
|
|
{
|
|
"datasourceId": "c2fc8cdd-46bb-454c-bf09-90ebfd4067d7",
|
|
"revisionNumber": 0,
|
|
"parameterOverrides": []
|
|
}
|
|
],
|
|
"queryFields": [
|
|
{
|
|
"name": "qt_vwmdhfhbrc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Incident_Source_"
|
|
}
|
|
},
|
|
{
|
|
"name": "qt_d5jjfyu6wc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "datastudio_record_count_system_field_id_98323387"
|
|
}
|
|
}
|
|
],
|
|
"sortData": [
|
|
{
|
|
"sortColumn": {
|
|
"name": "qt_vwmdhfhbrc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Incident_Source_"
|
|
}
|
|
},
|
|
"sortDir": 0
|
|
}
|
|
],
|
|
"includeRowsCount": true,
|
|
"relatedDimensionMask": {
|
|
"addDisplay": false,
|
|
"addUniqueId": false,
|
|
"addLatLong": false
|
|
},
|
|
"paginateInfo": {
|
|
"startRow": 1,
|
|
"rowsCount": 5001
|
|
},
|
|
"dsFilterOverrides": [],
|
|
"filters": [
|
|
{
|
|
"filterDefinition": {
|
|
"filterExpression": {
|
|
"include": true,
|
|
"conceptType": 0,
|
|
"concept": {
|
|
"name": "qt_kjyfx83arc",
|
|
"ns": "t0"
|
|
},
|
|
"queryTimeTransformation": {
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_County_Name_"
|
|
}
|
|
},
|
|
"filterConditionType": "IN",
|
|
"stringValues": [
|
|
"Boyd",
|
|
"Carter",
|
|
"Greenup"
|
|
]
|
|
}
|
|
},
|
|
"dataSubsetNs": {
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"contextNs": "c0"
|
|
},
|
|
"version": 3,
|
|
"isCanvasFilter": true
|
|
}
|
|
],
|
|
"features": [],
|
|
"dateRanges": [],
|
|
"contextNsCount": 1,
|
|
"dateRangeDimensions": [
|
|
{
|
|
"name": "qt_ilkdhfhbrc",
|
|
"datasetNs": "d0",
|
|
"tableNs": "t0",
|
|
"dataTransformation": {
|
|
"sourceFieldName": "_Incident_Begin_Time_",
|
|
"transformationConfig": {
|
|
"transformationType": 5
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"calculatedField": [],
|
|
"needGeocoding": false,
|
|
"geoFieldMask": [],
|
|
"multipleGeocodeFields": [],
|
|
"timezone": "America/New_York"
|
|
},
|
|
"role": "main",
|
|
"retryHints": {
|
|
"useClientControlledRetry": true,
|
|
"isLastRetry": false,
|
|
"retryCount": 0,
|
|
"originalRequestId": "cd-hgodhfhbrc_0_0"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
"""
|
|
payload = json.loads(body_string)
|
|
|
|
# 7. Send the POST request using the session
|
|
try:
|
|
print(f"Sending POST request to {url}...")
|
|
response = session.post(url, headers=headers, json=payload)
|
|
|
|
# Raise an exception for bad status codes (4xx or 5xx)
|
|
response.raise_for_status()
|
|
|
|
# 8. Process the response
|
|
print(f"Status Code: {response.status_code}")
|
|
|
|
# Attempt to print the response as JSON, fall back to text if decoding fails
|
|
try:
|
|
print(response.text)
|
|
print("Response JSON:")
|
|
# Use json.dumps for pretty printing the received JSON
|
|
print(json.dumps(response.json(), indent=2))
|
|
except json.JSONDecodeError:
|
|
print("Response Text (non-JSON):")
|
|
print(response.text)
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
print(f"An error occurred during the request: {e}")
|
|
if hasattr(e, 'response') and e.response is not None:
|
|
print(f"Response status code: {e.response.status_code}")
|
|
print(f"Response text: {e.response.text}") |