Почему Python запрос возвращает ошибку 403, в то время как при использовании Burp Suite или cURL ответом является 200?

У меня есть запрос, который я пытаюсь отправить различными способами, и он выглядит следующим образом: 

```http
POST /finder/search HTTP/2
Host: api.leboncoin.fr
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Content-Type: application/json
Accept: */*
Origin: https://www.leboncoin.fr
Referer: https://www.leboncoin.fr/ordinateurs/offres?shippable=1
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9

{"filters":{"category":{"id":"15"},"enums":{"ad_type":["offer"]},"location":{"shippable":true}},"limit":0,"limit_alu":0,"sort_by":"relevance","sort_order":"desc"}
```

Это стандартный запрос к API для получения информации о товарах. Хотя я не очень опытен в этом, запрос возвращает корректный ответ без каких-либо токенов или куков.

Я получаю код состояния 200, когда использую Burp Suite [Repeater] и консольную утилиту cURL на MacOS, но когда пытаюсь сделать такой же запрос через библиотеки requests, httpx или aiohttp, получаю ответ с кодом 443, который включает следующую информацию:

```json
{"url":"https://geo.captcha-delivery.com/captcha/?initialCid=AHrlqAAAAAMAIahg-Q_Ny2oAWH5XNA==&cid=sFjkuux_GIDceGTddH76UUtxvSybykVu51pTzyn109f8_E_C~3vrgkJpNGdfr63btAOEvZKJzibYhTlmwYrZqZyH68cK0x8MCJQ~EWVhy~_0dGswq_s68JFAY6P7KRup&referer=http%3A%2F%2Fapi.leboncoin.fr%2Ffinder%2Fsearch&hash=05B30BD9055986BD2EE8F5A199D973&t=fe&s=7501&e=f1e123da68b5d063bcac8bb6d932d1335093ea7d43cb1559ce70a96bd45c0193"}
```

Кажется, система распознает, что запрос был отправлен ботом. Также стоит отметить, что при использовании Python-обертки pycurl работает все нормально. Каковы возможные причины такого поведения и как можно решить эту проблему?
  • 11 октября 2024 г. 10:46
Ответы на вопрос 1
Ошибка 403 обычно означает, что доступ к запрашиваемому ресурсу запрещен. В вашем случае, веб-сервер может определять, что запрос был отправлен ботом, и соответственно запрещает его.

Есть несколько факторов, которые могут повлиять на это:

1. **Заголовки Request**: Убедитесь, что вы отправляете все необходимые заголовки, как в примере с cURL или Burp Suite. Некоторые API могут проверять наличие определенных заголовков. Ваша реализация должна копировать все заголовки, особенно собственные заголовки, такие как `User-Agent`, `Referer`, `Origin` и т.д.

2. **Cookies**: Некоторые API могут использовать Cookies для аутентификации или проверки подлинности. Если запрос проходит с помощью cURL или Burp Suite, вероятно, в этих инструментах автоматически отправляются необходимые Cookies. Убедитесь, что вы передаете необходимые Cookies при отправке запроса через Python.

3. **Сложность обработки CAPTCHA**: Ваша API может использовать систему CAPTCHA или другие механизмы защиты, чтобы отличать настоящие запросы от ботовых. Если ваша библиотека `requests` или `httpx` не отправляет определенные данные (или их не хватает), сервер может заблокировать запрос.

4. **Настройки прокси**: Если вы используете прокси с cURL или Burp Suite, убедитесь, что вы также используете тот же прокси в ваших Python-запросах.

5. **HTTP/2 vs HTTP/1.1**: Возможно, у вас настроена библиотека `requests` на использование HTTP/1.1, что может отличаться от того, как Burp Suite и cURL обрабатывают запросы с использованием HTTP/2. Рассмотрите возможность использования библиотек, поддерживающих HTTP/2.

**Решения**:

1. Проверьте и сравните все заголовки, отправляемые в cURL и Burp Suite, с заголовками, которые вы отправляете через `requests`. Обязательно добавьте недостающие заголовки.

   ```python
   import requests

   url = "https://api.leboncoin.fr/finder/search"
   headers = {
       "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
       "Content-Type": "application/json",
       "Accept": "*/*",
       "Origin": "https://www.leboncoin.fr",
       "Referer": "https://www.leboncoin.fr/ordinateurs/offres",
   }
   data = {
       "filters": {
           "category": {"id": "15"},
           "enums": {"ad_type": ["offer"]},
           "location": {"shippable": True}
       },
       "limit": 0,
       "limit_alu": 0,
       "sort_by": "relevance",
       "sort_order": "desc"
   }

   response = requests.post(url, json=data, headers=headers)
   print(response.status_code)
   print(response.json())
   ```

2. Если вы получили Cookies при выполнении запроса через cURL или Burp Suite, попробуйте добавить их в Requests:

   ```python
   headers['Cookie'] = 'your_cookie_here'
   ```

3. Проверьте, нужно ли использовать прокси:

   ```python
   proxies = {
       'http': 'http://your_proxy_here',
       'https': 'http://your_proxy_here',
   }
   response = requests.post(url, json=data, headers=headers, proxies=proxies)
   ```

Если вы сделаете все эти шаги, это должно помочь вам в Diagnosing and potentially resolving the 403 error you are encountering.
Похожие вопросы