#python #python-requests
#питон #python-запросы
Вопрос:
Я успешно смоделировал вызовы API с моим клиентом postman. Клиент Postman автоматически заполняет требуемый идентификатор JSESSIONID, файл COOKIE и идентификатор КЛИЕНТА.
Однако, когда я пытаюсь реализовать то же самое с python, я получаю 401. Похоже, что переменная сеанса API запроса не содержит требуемой информации
Я хотел бы повторить весь шаг ниже как с помощью сгенерированного Postman скрипта python, так и с моим скриптом
Сценарий почтальона
В первом вызове POST я использую свой секретный ключ для запроса секретного
import requests
url = "https://url.com/v1/session/auth/token?X-Requested-By=Maddyamp;Content-Type=application/x-www-form-urlencoded"
payload="secret_key=zxcvfc-103f-950d-856d-cxvfdghamp;username=myuser001amp;access_level=FULL"
headers = {
'X-Requested-By': 'Maddy', #This is my header
'Content-Type': 'application/x-www-form-urlencoded', #My header
'Cookie': 'route=e7esaafb42ce234234242347482341f; clientId= zxcvfc-103f-950d-856d-cxvfdg; JSESSIONID=e34cc53d-e99c-4296-a4fe-0d70a246bd11' #Postman generated
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Я получаю секрет JHNXZasdasdasdasjdakdasdjdalsdjasdladasdlalsdjajsdjaskdjaksjdaskjdjaskdljasj очень долго
затем второй вызов GET выполняется с секретом, который я получил.
import requests
url = "https://url.com/callosum/v1/session/login/token?username=myuser001amp;auth_token=JHNXZasdasdasdasjdakdasdjdalsdjasdladasdlalsdjajsdjaskdjaksjdaskjdjaskdljasjamp;redirect_url=https://url.com/callosum/v1/tspublic/v1/user/list"
payload={}
headers = {
'Cookie': 'route=e78as0dad9009q029420349249f; clientId=s0255-6598-5103-dec3-defererer090; JSESSIONID=dfgas8484-659595656-6526-5626-7589898ads'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
#Ответ содержит вывод в формате JSON со списком пользователей
Не приведенный выше мусор заголовка, содержащий идентификатор, сеанс и файл cookie, генерируется почтальоном
Теперь вот как выглядит мой скрипт на Python
url = "https://url.com/callosum/v1/session/auth/token?X-Requested-By=Maddyamp;Content-Type=application/x-www-form-urlencoded"
payload="secret_key=zxcvfc-103f-950d-856d-cxvfdghamp;username=myuser001amp;access_level=FULL"
headers = {
'X-Requested-By': 'Maddy', #These one is mine
'Content-Type': 'application/x-www-form-urlencoded' #these one is mine
}
with requests.session() as s:
secret = s.post(url, data=payload, headers=headers,verify=False).text
#secret contain the lengthy secret for the get call stored in the variable secret
payload1 = {}
#The url2 contains login url and redirect url that contains the user API for get method
url2 = "https://url.com/callosum/v1/session/login/token?username=myuser001amp;auth_token={}amp;redirect_url=https://url.com/callosum/v1/tspublic/v1/user/list".format(secret)
r = s.get(url2,data=payload1,verify =False)
#Also tried without payload and with and without header results are the same
print(r.cookies)
print(r.text) #401 unauthroized
Я получаю секрет, но не данные. Пожалуйста, дайте мне знать, если есть что-то, что нужно добавить.
С наилучшими пожеланиями, Габби
Комментарии:
1. Обратите внимание, что я использовал доверенную аутентификацию с помощью секретного ключа, а затем запрашиваю секретный токен через post-вызов, с помощью которого я выполняю запрос get по URL-адресу входа и получаю доступ к API по URL-адресу перенаправления.
2. Вы должны отредактировать эти данные в своем вопросе. Я настоятельно рекомендую добавить GET URL-адреса, на который вы собираетесь ОПУБЛИКОВАТЬ, прежде чем добавлять заголовки и полезную нагрузку для ПУБЛИКАЦИИ. Если это все еще не работает, простейший метод, который я нашел, — это отследить успешный вход в систему браузера, используя, например, Telerik Fiddler, затем обновите свой код Python для репликации заголовков / параметров / содержимого / последовательности GET / POST.
3. Привет, Барни, сам первый вызов — это post, и нет Get, если вы это имеете в виду. Сама заявка на токен аутентификации попадает под post.
4. Да — я говорю, что вы должны добавить GET перед POSt, точно так же, как это будет делать ваш браузер при переходе на страницу входа.