Как отправить запрос json POST с помощью запросов, если на сайте используется jwt? - PullRequest
2 голосов
/ 16 июня 2020

Я пытаюсь отправить запрос POST для входа в этот URL , я сначала проверил вкладку сети и обнаружил, что почтовый запрос отправляется на этот URL: https://api-my.te.eg/api/user/login?channelId=WEB_APP

и полезная нагрузка запроса:

{
  "header": {
    "msisdn": "PhoneNUMBER=XXXXXXXX",
    "timestamp": "1592335210",
    "locale": "Ar"
  },
  "body": {
    "password": "xxxxxxxxxxxxxxxxxxxx"
  }
}

Я пытался отправить запрос, но всегда получаю:

{"header":{"timstamp":0,"customerId":null,"msisdn":null,"messageCode":null,"responseCode":"1200","responseMessage":"Your Session has been expired, please sign in to continue","locale":null,"referenceId":null,"channelId":null,"responeAdditionalParameters":null},"body":null}

Вот код:

import requests
import calendar
import time
#Here i tried to send a generated timestamp, idk if this is needed or not
ts = calendar.timegm(time.gmtime())
loginUrl = 'https://api-my.te.eg/api/user/login?channelId=WEB_APP'
values = {
    "msisdn": MobileNumberID,
    "timestamp": str(ts),
    "locale": "Ar"
}

data = {
    "password": PasswordID
}

url = requests.post(loginUrl , data=data , headers=values)
print(url.text)

1 Ответ

0 голосов
/ 16 июня 2020

Я посмотрел на сайт, и в теле они также передают свойство заголовка в данных

Итак, вы должны использовать

data = {
  "header": {
    "msisdn": "024568478",
    "timestamp": "1592337873",
    "locale": "Ar"
  },
  "body": {
    "password": "PJGkRJte5ntnKt9TQ8XM3Q=="
  }
}

, а в заголовках вы должны передавать собственные заголовки возможно, что-то вроде:

headers={'Content-Type': 'application/json', }

, но я также вижу, когда вы входите на этот сайт, они передают аргумент jwt в заголовках. Похоже, это какая-то встроенная система безопасности. Похоже, вы не можете использовать этот API. Это только для серверной части этого сайта.

Вы искали на сайте, есть ли у них документация по API, может быть, там написано, как вы можете рассчитать значение для jwt?

EDIT:

Когда у вас работает логин, это так. Как использовать сеансы в python запросах:

s = requests.Session()
data = {"login":"my_login", "password":"my_password"}
url = "http://example.net/login"
r = s.post(url, data=data)

Если вы не обойдете jwt. Вы можете использовать Selenium в python. Он работает за счет автоматизации веб-браузера. Таким образом, вы можете открыть chrome и указать, какую страницу загрузить, заполнить форму входа и прочитать html элементов в браузере. Это будет работать на 95% веб-сайтов. У некоторых даже есть защита от этого. Некоторые сайты используют cloudflare, они защищены от селеновой автоматизации.

...