Запрашивает отказ в доступе к API-интерфейсу Python — Cross Origin даже с заголовками, пользовательским агентом и токеном. Как мне пройти авторизацию?

#python #api #python-requests #cross-domain #endpoint

#python #API #python-запросы #междоменный #конечная точка

Вопрос:

Привет, я новичок в работе с серверами и запросами, так что потерпите меня,

Я пытаюсь отправлять запросы get в API, размещенный на другом сервере, отличном от самого сайта (soldhistory.ca ), чтобы я мог получить JSON-ответ со списком идентификаторов свойств, а затем вручную отправлять отдельные запросы на сервер API, чтобы получить подробную информацию о каждом свойстве. Более поздняя часть отлично работает с моим токеном авторизации (и не работает, когда я использую случайную строку), поэтому я знаю, что проблема не в моем токене авторизации, но получение начального json идентификаторов свойств не работает.

Я продолжаю получать сообщение «Доступ запрещен» — 403, даже когда я отправляю заголовки, токен авторизации и user-agent. Когда я отправляю неправильный токен, я получаю другое сообщение с надписью «Доступ запрещен: токен не найден или истек». Когда я не отправляю токен, он говорит «Требуется подпись». Я думаю, что здесь я упускаю что-то тривиальное. Я также заметил, что при входе в систему в ответе json на это есть токен доступа и другой токен, который отличается от токена доступа в нем, называемый «токен», который, я думаю, может иметь какое-то отношение к проблеме, с которой я сталкиваюсь, но я понятия не имею, что с этим делать. В общем, как мне авторизоваться, чтобы иметь возможность отправлять запросы на сервер API?

Я включил фиктивную учетную запись, которую я создал с поддельными учетными данными, в приведенный ниже код, если кто-нибудь захочет отправлять запросы. Если вы зайдете на сайт, полностью уменьшите масштаб карт и выполните фильтрацию, чтобы показать любую цену и показать только проданные свойства, вы увидите, что есть данные примерно о 450 000 прошлых объектах, проданных в Канаде, которые я хотел бы получить. Моя конечная цель — получить эти данные. Если кто-нибудь может мне помочь, я был бы очень признателен.

Стоит отметить, что я также пытался использовать selenium для первоначального перехода на домашнюю страницу, а затем передачи файлов cookie в сеанс запросов, но это тоже не сработало. Я также безуспешно пытался использовать selenium-запросы, но, возможно, я неправильно их реализовал.

Кроме того, если вы посмотрите на XMLHttpRequests сайта, вы увидите, что выполняется первоначальный запрос с именем properties, а затем последующие запросы get генерируются из этого ответа json. Я пытаюсь получить ответ JSON для свойств. Это метод ПОИСКА.

Код:

 import requests

s = requests.Session()

s.get('https://www.soldhistory.ca')

headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0',
'Accept': '*/*',
'Accept-Language': 'en-CA,en-US;q=0.7,en;q=0.3',
'Access-Control-Request-Method': 'SEARCH',
'Access-Control-Request-Headers': 'access-token,access_token,content-type',
'Referer': 'https://www.soldhistory.ca/mapsearchapp/search/eyJzZWFyY2giOnsic2VhcmNoVHlwZSI6InJlc2lkZW50aWFsIiwibGlzdGluZ1R5cGUiOlsiU29sZCJdLCJvcGVuSG91c2UiOnsiZnJvbSI6MCwidG8iOjB9LCJiZWQiOjAsIm1hcmtldGRheXMiOjAsImJhdGgiOjAsInNlYXJjaEJ5Ijoic2VhcmNoYWxsIiwic2VhcmNoQnlUZXh0IjoiIiwicHJpY2VSYW5nZSI6eyJtaW4iOjAsIm1heCI6MH0sImZlZXRSYW5nZSI6eyJtaW4iOjAsIm1heCI6MH0sInNob3dPbmx5IjpbXSwicHJpY2VEcm9wIjpmYWxzZSwic29ydGJ5IjoibmV3ZXN0IiwiY29uZG9UeXBlIjoiIiwiY29uZG9PY2N1cGFuY3kiOiIiLCJjb25kb1N0YXR1cyI6IiIsImNvbmRvQnVpbGRlciI6IiIsImtleXdvcmRzIjpbXSwiUG9zdGFsQ29kZSI6ZmFsc2UsIlByb3ZpbmNlIjpmYWxzZSwiQ2l0eSI6ZmFsc2UsImNpdHlOYW1lIjoiTWVuZXNldCJ9LCJsb2NhdGlvbiI6eyJMb25naXR1ZGUiOi04Ni43Njc2MTkyMDA0ODM5MiwiTGF0aXR1ZGUiOjUzLjIzNjIzOTgyNTA1NjUxLCJab29tIjoyLCJtYXBWaWV3VHlwZSI6InJvYWRtYXAiLCJtYXBJbmZvVHlwZSI6W10sInNlbGVjdGVkUGF0aElEIjoiIiwiQm91bmRzIjp7InNvdXRoIjotNC41NDgwMzU0MjY0NTgxNzQsIndlc3QiOi0xODAsIm5vcnRoIjo3OC4zNTI5NDI4MzEyNjQ2MywiZWFzdCI6MTgwfX0sImNvbnRyb2xTcGVjaWFsIjp7fX0=',
'Origin': 'https://www.soldhistory.ca',
'Connection': 'keep-alive',
}

response = s.options('https://api.mapsearch.vps-private.net/properties', headers=headers)

headers2 = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0',
'Accept': 'application/json',
'Accept-Language': 'en-CA,en-US;q=0.7,en;q=0.3',
'Content-Type': 'application/json',
'Origin': 'https://www.soldhistory.ca',
'Connection': 'keep-alive',
'Referer': 'https://www.soldhistory.ca/',
}

data2 = '{"mail":"robbydummy123@gmail.com","pass":"helloworld"}'


response2 = s.post('https://www.soldhistory.ca/mapsearchapp/visitor/login', headers=headers2, data=data2, verify=True)

parsed = response2.json()
print(json.dumps(parsed, indent=1, sort_keys=True))


accessToken = parsed['accessToken']



headers3 = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0',
'Accept': 'application/json',
'Accept-Language': 'en-CA,en-US;q=0.7,en;q=0.3',
'access_token': accessToken,
'Access-Token': accessToken,
'Content-Type': 'application/json',
'Content-Length': '317',
'Origin': 'https://www.soldhistory.ca',
'Connection': 'keep-alive',
'Referer': 'https://www.soldhistory.ca/mapsearchapp/search/eyJzZWFyY2giOnsic2VhcmNoVHlwZSI6InJlc2lkZW50aWFsIiwibGlzdGluZ1R5cGUiOlsiU29sZCJdLCJvcGVuSG91c2UiOnsiZnJvbSI6MCwidG8iOjB9LCJiZWQiOjAsIm1hcmtldGRheXMiOjAsImJhdGgiOjAsInNlYXJjaEJ5Ijoic2VhcmNoYWxsIiwic2VhcmNoQnlUZXh0IjoiIiwicHJpY2VSYW5nZSI6eyJtaW4iOjAsIm1heCI6MH0sImZlZXRSYW5nZSI6eyJtaW4iOjAsIm1heCI6MH0sInNob3dPbmx5IjpbXSwicHJpY2VEcm9wIjpmYWxzZSwic29ydGJ5IjoibmV3ZXN0IiwiY29uZG9UeXBlIjoiIiwiY29uZG9PY2N1cGFuY3kiOiIiLCJjb25kb1N0YXR1cyI6IiIsImNvbmRvQnVpbGRlciI6IiIsImtleXdvcmRzIjpbXSwiUG9zdGFsQ29kZSI6ZmFsc2UsIlByb3ZpbmNlIjpmYWxzZSwiQ2l0eSI6ZmFsc2UsImNpdHlOYW1lIjoiTWVuZXNldCJ9LCJsb2NhdGlvbiI6eyJMb25naXR1ZGUiOi04Ni43Njc2MTkyMDA0ODM5MiwiTGF0aXR1ZGUiOjUzLjIzNjIzOTgyNTA1NjUxLCJab29tIjoyLCJtYXBWaWV3VHlwZSI6InJvYWRtYXAiLCJtYXBJbmZvVHlwZSI6W10sInNlbGVjdGVkUGF0aElEIjoiIiwiQm91bmRzIjp7InNvdXRoIjotNC41NDgwMzU0MjY0NTgxNzQsIndlc3QiOi0xODAsIm5vcnRoIjo3OC4zNTI5NDI4MzEyNjQ2MywiZWFzdCI6MTgwfX0sImNvbnRyb2xTcGVjaWFsIjp7fX0=',
}

data3 = '{"query":{"coordinates":{"$geoWithin":{"$box":[[160.3305414532229,35.087235763335656],[2.6547602032228923,71.87799155489013]]}},"searchType":"residential","listingType":{"$in":["Sale","Sold","Rent"]}},"fields":["Latitude","Longitude","listingType","searchType","Price"],"sort":{"Price":1},"limit":20,"soldData":false}'

response3 = s.post('https://api.mapsearch.vps-private.net/properties', headers=headers3, data=data3)

parsed = response3.json()
print(json.dumps(parsed, indent=1, sort_keys=True))
print(response3.status_code)
 

Комментарии:

1. Почему Selenium помечено?

2. @DebanjanB Я попробовал решение с selenium, но оно не сработало, поэтому я решил пометить его. Это мой первый вопрос, поэтому я не уверен, что такое этикет?

3. вы заметили, что в json также есть ключ с именем ‘token response2 ‘? кроме того, есть ли какие-либо инструкции по использованию этого API?

4. @tzadok привет, да, я упоминал об этом в своем первоначальном сообщении, но я не уверен, в какой заголовок запроса он входит, потому что он не входит в header3, основываясь на том, что показали мне инструменты разработки. Я попытался включить его случайно, но это все равно не сработало. Есть идеи, куда это может пойти? Кроме того, я должен был прояснить, что это не общедоступный API, я пытаюсь отправить запрос на api enpoint на сайте.