Как войти в instacart используя запросы? - PullRequest
0 голосов
/ 14 апреля 2020

Итак, я попробовал следующую черновую версию:

import requests
from bs4 import BeautifulSoup

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
    }

session = requests.Session()

res1 = session.get('http://www.instacart.com', headers=headers)
soup = BeautifulSoup(res1.content, 'html.parser')
token = soup.find('meta', {'name': 'csrf-token'}).get('content')
data = {"user": {"email": "user@gmail.com", "password": "xxxxx"},
        "authenticity_token": token}
res2 = session.post('https://www.instacart.com/accounts/login', headers=headers, data=data)
print(res2)

Я всегда получаю следующую ошибку:

<Response [400]>
apparent_encoding:'ascii'
connection:<requests.adapters.HTTPAdapter object at 0x0000021F3FF8F940>
content:b'{"status":400,"error":"There was a problem in the JSON you submitted: Empty input () at line 1, column 1"}'

Что я делаю не так?

1 Ответ

2 голосов
/ 14 апреля 2020

На самом деле вы пропустили правильный Params для запроса POST.

Я сделал запрос GET к сайту main, чтобы собрать необходимый authenticity_token, который используется в пределах запроса POST. и затем сделал POST запрос на правильный login URL.

import requests
from bs4 import BeautifulSoup

params = {
    'source': 'web',
    'cache_key': 'undefined'
}

data = {
    'email': 'email@email.com',
    'grant_type': 'password',
    'password': 'yourpassword',
    'scope': '',
    'signup_v3_endpoints_web': 'null'
}

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0",
}


def main(url):
    with requests.Session() as req:
        r = req.get(url, headers=headers)
        soup = BeautifulSoup(r.content, 'html.parser')
        data['authenticity_token'] = soup.find(
            "meta", {'name': 'csrf-token'}).get("content")
        r = req.post(
            "https://www.instacart.com/v3/dynamic_data/authenticate/login", params=params, json=data, headers=headers).json()
        print(r)


main("https://www.instacart.com")
...