wp_remote_get() возвращает 403, в то время как file_get_contents() этого не делает

Вопрос или проблема

Мы разрабатываем плагин для WordPress и нам требуется API-вызов.
Мы используем API: http://www.geoplugin.net/json.gp?ip=8.8.8.8

В этом контексте:

     $response = wp_remote_get("http://www.geoplugin.net/json.gp?ip={$ip}",  array(
                'timeout'     => 45,
                'redirection' => 5,
                'user-agent'  => 'Mozilla/5.0 (совместимо; Rigor/1.0.0; http://rigor.com)',
            ));
            $dataArray = json_decode(wp_remote_retrieve_body($response));
            var_dump($response);

Однако, все, что мы получаем – это ошибка 403:

string(162) "
403 Forbidden
nginx 
"

API-вызов работал нормально с использованием этого кода:

file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}")

Тем не менее, WordPress позволяет нам использовать только wp_remote_get().

Мы уже долго пытаемся решить эту проблему, но не можем её исправить или найти решение. Мы даже пытались добавить аргумент user-agent, чтобы сделать запрос похожим на подключение из браузера, но это тоже не помогло.

Кто-нибудь знает, как решить эту проблему?

Спасибо, что уделили время!

Редактировать:

Пример ожидаемого ответа:

{
  "geoplugin_request":"8.8.8.8",
  "geoplugin_status":206,
  "geoplugin_delay":"2ms",
  "geoplugin_credit":"Некоторые возвращенные данные включают данные GeoLite, созданные MaxMind, доступные по <a href="http:\/\/www.maxmind.com">http:\/\/www.maxmind.com<\/a>.",
  "geoplugin_city":"",
  "geoplugin_region":"",
  "geoplugin_regionCode":"",
  "geoplugin_regionName":"",
  "geoplugin_areaCode":"",
  "geoplugin_dmaCode":"",
  "geoplugin_countryCode":"US",
  "geoplugin_countryName":"Соединенные Штаты",
  "geoplugin_inEU":0,
  "geoplugin_euVATrate":false,
  "geoplugin_continentCode":"NA",
  "geoplugin_continentName":"Северная Америка",
  "geoplugin_latitude":"37.751",
  "geoplugin_longitude":"-97.822",
  "geoplugin_locationAccuracyRadius":"1000",
  "geoplugin_timezone":"",
  "geoplugin_currencyCode":"USD",
  "geoplugin_currencySymbol":"$",
  "geoplugin_currencySymbol_UTF8":"$",
  "geoplugin_currencyConverter":1
}

Почему у вас там фигурные скобки?

Возможно, сначала обработайте строку запроса с помощью htmlspecialchars(). Ошибка указывает на нестандартные символы…что и делает ваша фигурная скобка.

Сформируйте строку запроса с значением $ip, преобразуйте с помощью htmlspecialchars(), затем добавьте URL в строку запроса. Передайте эту переменную в функцию wp_remote_get().

Ответ или решение

При использовании функции wp_remote_get() в WordPress для выполнения API-запроса вы столкнулись с ошибкой 403, в то время как функция file_get_contents() работает без проблем. Эта ситуация может возникать по нескольким причинам, и мы можем рассмотреть некоторые решения.

Причины ошибки 403

  1. Проблемы с User-Agent: Некоторые API-сервисы проверяют User-Agent, чтобы разрешить или запретить доступ к своим ресурсам. Ваша попытка указать User-Agent, похожий на браузер, может быть недостаточной.

  2. Куки и сессии: Некоторые API могут требовать наличие определенных куки или сессионных данных, которые могут быть переданы через wp_remote_get().

  3. Формат URL: Обратите внимание на то, как формируется ваш URL. Если происходит какое-либо дополнительное экранирование или кодирование символов, это может привести к неправильному формированию запроса.

Решение проблемы

Вот несколько шагов, которые вы можете предпринять для решения этой проблемы.

  1. Убедитесь, что IP правильно передается:
    Прежде всего, убедитесь, что переменная $ip корректно передается в строку запроса без дополнительных символов или пробелов. Попробуйте использовать функцию esc_url() для экранирования адреса:

    $ip = '8.8.8.8'; // Пример IP, используйте ваше значение
    $url = esc_url("http://www.geoplugin.net/json.gp?ip={$ip}");
  2. Широкий User-Agent:
    Попробуйте использовать более распространенный User-Agent, например, от браузера Chrome:

    $response = wp_remote_get($url, array(
       'timeout' => 45,
       'redirection' => 5,
       'headers' => array(
           'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
       )
    ));
  3. Проверка кэша:
    Возможно, что у вас есть кэширование запросов, которое влияет на ваш ответ. Попробуйте временно отключить кэширование, если оно используется.

  4. Отладка и диагностика:
    Для диагностики вы можете использовать следующие команды для получения детальной информации о запросе:

    if (is_wp_error($response)) {
       $error_message = $response->get_error_message();
       echo "Ошибка: $error_message";
    } else {
       $dataArray = json_decode(wp_remote_retrieve_body($response), true);
       var_dump($dataArray);
    }
  5. Проверка на стороне сервера:
    Если все еще получаете 403, возможно, необходимо обратиться к документации geoplugin или в их службу поддержки, чтобы убедиться, что ваш IP-адрес или интересующий вас ресурс не заблокирован.

  6. Опережающее обращение:
    Попробуйте добавить задержку между запросами или использовать функцию для выполнения запроса только один раз, если это допустимо.

Если все описанные выше шаги не помогли, возможно, стоит вернуться к file_get_contents() или рассмотреть возможность использования сторонней библиотеки (если это возможно в рамках вашего проекта). Однако необходимо помнить, что wp_remote_get() рекомендуется использовать в контексте разработки под WordPress, так как она обеспечивает более высокую совместимость с функционалом платформы.

Надеюсь, эти шаги помогут вам разрешить возникшую проблему с запросами API! Если у вас есть дополнительные вопросы, пожалуйста, дайте знать.

Оцените материал
Добавить комментарий

Капча загружается...