Добавление товара в корзину с использованием запросов (Python) - PullRequest
0 голосов
/ 29 апреля 2020

Попытка добавить товар в корзину и распечатать корзину повара ie. Сделали это на некоторых сайтах без проблем. Но Запрос полезной нагрузки выглядит иначе на этом сайте. Ссылка на элемент при попытке добавить ->

https://www.footish.se/sneakers/nike-wmns-m2k-tekno-ao3108-104bq3378-002

Полезная нагрузка выглядит следующим образом

{"item":{"__type":"JetShop.StoreControls.Services.AddToCartItem","Quantity":"1","AttributeData":["EUR 37.5","","MjQwMzA4fDEwOTkuMDB8LTEuMDB8QlEzMzc4LTAwMi0zNy41fHw8c3BhbiBjbGFzcz0iTWFza2VkSW5TdG9ja0Nzc0NsYXNzIj48c3Bhbj5JIGxhZ2VyPC9zcGFuPjwvc3Bhbj58VHJ1ZXwxfDE=",""],"ProductID":"37127","SpecificationIdList":"","Comments":[],"DiscountId":null},"culture":"sv-SE"

Это то, что я сделал так далеко.

import requests
s = requests.Session()
payload = {"ProductID": "37127", "Quantity": "1"}
get = s.get("https://www.footish.se/sneakers/fila-wmns-disruptor-slide-1010868-1fg")
post = s.post("https://www.footish.se/Services/General.asmx/AddCartItem", data=payload)
print(post.status_code, post.content)
print(get.status_code, get.text)

После попытки добавить я получаю код состояния «500», и он говорит мне, что «имя метода веб-службы AddCartItem недопустимо».

Есть идеи, как добавить предмет?

1 Ответ

1 голос
/ 29 апреля 2020

проблема с вашим кодом выше из-за типа контента, который отправил ваш код. Когда мы проверяем сеть ссылки выше, она показывает что-то вроде фрагмента ниже.

:authority: www.footish.se
:method: POST
:path: /Services/General.asmx/AddCartItem
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7,ko;q=0.6
content-length: 362
content-type: application/json; charset=UTF-8
cookie: ASP.NET_SessionId=5nq3ssbdtc1xfkeyu0ugk2jo; JetShop_CartID=6f46a87d-d445-4149-b0f0-8ccea54ee2a8; SERVERID=cl03n04; _ga=GA1.2.973188721.1588161632; _gid=GA1.2.2048936945.1588161632; country_code=SE; RWuid=1588161634615146663; DV_TRACK=9d70aaa2-6a0c-4e56-88d6-3e86623f6c60; 2c.cId=5ea96c6960b2ac677e09f92b; RwServerDebug=false; _pk_ses.438.8ea7=1; JetShop_NoOfItemsInCart=1; __atuvc=3%7C18; __atuvs=5ea96c5ad286a611002; RWviewTrail=37127%2C37127; jibber-367-visitor-token=eyJ1c2VyX2lkIjoiNDc5MjYyOSIsInR5cGUiOiJjdXN0b21lciJ9.EYr-Gw.jNHbjoGTy97kTcBI5L_-L0WOlBA; _pk_id.438.8ea7=66eea615a6981820.1588161644.1.1588161693.1588161644.
origin: https://www.footish.se
referer: https://www.footish.se/sneakers/nike-wmns-m2k-tekno-ao3108-104bq3378-002
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
x-requested-with: XMLHttpRequest

Веб-сайт использует content-type: application/json; charset=UTF-8, где, если вы сравните запрос, отправленный из вашего кода, добавив:

print(post.request.headers)

, результат будет выглядеть следующим образом.

{'Content-Length': '381', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.18.4', 'Connection': 'keep-alive', 'Cookie': 'SERVERID=cl03n07; JetShop_CartID=51205d52-9a79-4e35-aa7a-b1cae741fabd; ASP.NET_SessionId=urykwfhot2xdccp0suzk3qst', 'Content-Type': 'application/json'}

, чтобы исправить это, вам нужно изменить заголовок и данные, отправляемые на сервер.

  • использовать json вместо данных
import requests
s = requests.Session()
payload = {"item":{"__type":"JetShop.StoreControls.Services.AddToCartItem","Quantity":"1","AttributeData":["EUR 37.5","","MjQwMzA4fDEwOTkuMDB8LTEuMDB8QlEzMzc4LTAwMi0zNy41fHw8c3BhbiBjbGFzcz0iTWFza2VkSW5TdG9ja0Nzc0NsYXNzIj48c3Bhbj5JIGxhZ2VyPC9zcGFuPjwvc3Bhbj58VHJ1ZXwxfDE=",""],"ProductID":"37127","SpecificationIdList":"","Comments":[],"DiscountId":None},"culture":"sv-SE"}
get = s.get("https://www.footish.se/sneakers/fila-wmns-disruptor-slide-1010868-1fg")
post = s.post("https://www.footish.se/Services/General.asmx/AddCartItem", json=payload)
print(post.request.headers)
print(post.request)
print(post.text)
print(post.status_code)

или

  • определить заголовки и добавить 'Content-Type: application/json' и преобразовать dict в json, используя json.dumps(payload)
import json
import requests
s = requests.Session()
headers = {"Content-Type": "application/json"}
payload = {"item":{"__type":"JetShop.StoreControls.Services.AddToCartItem","Quantity":"1","AttributeData":["EUR 37.5","","MjQwMzA4fDEwOTkuMDB8LTEuMDB8QlEzMzc4LTAwMi0zNy41fHw8c3BhbiBjbGFzcz0iTWFza2VkSW5TdG9ja0Nzc0NsYXNzIj48c3Bhbj5JIGxhZ2VyPC9zcGFuPjwvc3Bhbj58VHJ1ZXwxfDE=",""],"ProductID":"37127","SpecificationIdList":"","Comments":[],"DiscountId":None},"culture":"sv-SE"}
get = s.get("https://www.footish.se/sneakers/fila-wmns-disruptor-slide-1010868-1fg")
post = s.post("https://www.footish.se/Services/General.asmx/AddCartItem", data=json.dumps(payload), headers=headers)
print(post.request.headers)
print(post.request)
print(post.text)
print(post.status_code)
...