创建了一个模拟在 Sbermarket 中将产品添加到购物车的小脚本。
当请求时,服务器返回:{"status":400,"error":"Bad Request"}
import requests
def send():
'''Функция отправляет POST-запрос с id товара для отображения его
в корзине Сбермаркета
'''
r = requests.post(
"https://sbermarket.ru/api/line_items",
headers={
"Accept": "application/json, text/plain, */*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3",
"Connection": "keep-alive",
"Content-Length": "37",
"Content-Type": "application/json;charset=utf-8",
"Cookie": u"user-id_1.0.5_lr_lruid=pQ8AALZpUGI75zMFATpqTQA%3D; _ga=GA1.2.911227684.1646581779; tmr_reqNum=2966; external_analytics_anonymous_id=0817e773-6e48-4f65-a0ad-f15d2dc24499; _ga_XVJWMHHXNJ=GS1.1.1654069715.61.1.1654069772.0; _ga_9QYWDVGJZ3=GS1.1.1654069715.61.1.1654069772.3; rl_anonymous_id=RudderEncrypt%3AU2FsdGVkX19NEK4wQj43fKrFXyVFpUO8QsjTAinY07gsTGxKN3XWo5koV04QklVBYnRwhYsDbpufosWy%2FRpXQQ%3D%3D; rl_user_id=RudderEncrypt%3AU2FsdGVkX19hv2vUcNsAySl807Eu3ctZTeu4FQOIcUcMYhqdvFRK4k79k7%2FGHNUJ13%2BB07pBa2hXrdI%2…520; t2_sid_7588506=s1.2041514210.1654069713647.1654069806189.2.8.15.1; _ym_isad=1; identified_address=true; identified_user=true; siteEntryTime=Wed%20Jun%2001%202022%2011%3A41%3A26%20GMT%2B0400%20(%D0%A1%D0%B0%D0%BC%D0%B0%D1%80%D1%81%D0%BA%D0%BE%D0%B5%20%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B5%20%D0%B2%D1%80%D0%B5%D0%BC%D1%8F); reachedTimer=1; _pk_ses.6.3ec0=1; sessionId=16540697170634384625-react-catalog; __exponea_time2__=-3607.2170147895813; _ym_visorc=w; _gat_UA-136687175-2=1".encode("cp1252"),
"DNT": "1",
"Host": "sbermarket.ru",
"Origin": "https://sbermarket.ru",
"Referer": "https://sbermarket.ru/metro?sid=21",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"TE": "trailers",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0",
"X-CSRF-Token": "HuZH+C7Wkjg12qWXNSe9CSgz02tazvVFMXdrIZrfb/P9qWRPg+FuGmcf2U/S6DQK9sjCGKNFzXaUpcfhnn+5bw==",
},
data={"line_item":{"offer_id":"2246659337"}}
)
ola = r.status_code
return ola
if __name__ == "__main__":
products = send()
print(products)
如果我通过页面https://sbermarket.ru/metro?sid=21手动执行相同的操作,那么在开发人员工具控制台的响应中,我可以看到以下内容:
{"line_item":{"human_volume":"500 мл","id":1603684517,"image":"/spree/products/55923/mini/60045_1.jpg","name":"Вода питьевая Святой Источник негазированная 0,5 л","offer_id":12378766,"product_permalink":"voda-sviatoi-istochnik-nieghazirovannaia-5","quantity":1,"retailer_id":1,"shipment_id":224403137,"shipment_number":"H01121108787","small_image":"/spree/products/55923/small/60045_1.jpg?1639928321","sku":"60045","assembly_issue":null,"items_per_pack":1,"packs":1,"price":34.92,"price_type":"per_item","total":34.92,"unit_price":34.92,"unit_quantity":1.0,"offer_in_stock":true,"total_diff":0.0,"updated_at":"2022-06-01T10:12:28.000+03:00","uuid":"1c28f363-4718-44ca-8774-6b0d348a63e3","variant_id":55437,"vat_rate":20,"offer":{"active":true,"id":12378766,"uuid":"2d0ee5fd-75e0-4caa-9682-3de40ba48292","name":"0,5Л ВОДА СВЯТОЙ ИСТОЧНИК Б/Г","price":34.92,"discount":0.0,"discounted":false,"instamart_price":34.92,"items_per_pack":1,"product_id":66967,"retailer_id":1,"store_id":21,"retailer_sku":"473978","rsku":"1-60045","stock":3498,"stock_rate":0,"max_stock_rate":4,"discount_ends_at":null,"price_type":"per_item","unit_price":34.92,"original_unit_price":34.92,"grams_per_unit":500,"vat_info":null,"bmpl_info":null,"published":true,"product_name":"Вода питьевая Святой Источник негазированная 0,5 л","pickup_order":0,"product_sku":"60045","retailer_price":34.92,"cost_price":34.92,"offer_price":34.92,"shelf_life":null,"max_stock":0,"vat_rate":20,"updated_at":"2022-06-01T10:09:48.000+03:00","permalink":"voda-sviatoi-istochnik-nieghazirovannaia-5","store":{"id":21,"name":"METRO, Складочная","active":true,"retailer_slug":"metro","retailer_color":"#002d72","time_zone":"Europe/Moscow","uuid":"817e931f-f909-455c-8441-28f560cb446b","has_conveyor":false,"auto_routing":true,"express_delivery":false,"box_scanning":true,"training":false,"min_order_amount":1500.0,"min_first_order_amount":1000.0,"min_first_order_amount_pickup":500.0,"min_order_amount_pickup":500.0,"available_for_pickup":true,"external_assembly":false,"on_demand":false,"on_demand_raw":false,"parallel_assembly":false,"next_delivery":null,"location":{"id":20,"full_address":"Москва, Складочная, 1 стр 1","city":"Москва","street":"Складочная","building":"1 стр 1","block":null,"floor":null,"apartment":null,"entrance":null,"elevator":null,"region":null,"comments":null,"phone":null,"area":null,"settlement":null,"lat":55.800434,"lon":37.594311,"city_kladr_id":null,"street_kladr_id":null,"user_id":null,"door_phone":null,"kind":null,"delivery_to_door":false}},"variant":{"items_per_pack":1,"weight":500.0,"displayed_volume":"500 мл.","sku":"60045","images":[{"mini_url":"https://sbermarket.ru/spree/products/55923/mini/60045_1.jpg?1639928321","small_url":"https://sbermarket.ru/spree/products/55923/small/60045_1.jpg?1639928321","product_url":"https://sbermarket.ru/spree/products/55923/product/60045_1.jpg?1639928321","preview_url":"https://sbermarket.ru/spree/products/55923/preview/60045_1.jpg?1639928321","original_url":"https://sbermarket.ru/spree/products/55923/original/60045_1.jpg?1639928321","is_placeholder":false,"position":1}]}}}}
我已经完全复制了请求标头,但对我没有任何作用。如何获得正确的服务器响应?
PS:我注意到一个奇怪的特性:如果你在请求头中注释掉cookie,服务器响应将是403。
需要转移
JSON。例子: