Почему мой XMLHttpRequest получает ответ robots.txt - PullRequest
0 голосов
/ 05 февраля 2019

Я пишу персональное расширение Chrome (Примечание: они могут отправлять запросы из разных источников. См. https://developer.chrome.com/extensions/xhr).

Я пытаюсь использовать XMLHttpRequest для доступа к определенному веб-сайту, а затем извлечь из него данныеиспользование javascript. Моя проблема в том, что этот сайт часто возвращает мне страницу «роботы» вместо HTML. Конечно, когда я захожу на этот сайт в моем браузере, он работает нормально. Кроме того, если я захожу на сайт с моим браузером, ТОсделайте запрос XHR, он также работает нормально.

Я подумал, что проблема может заключаться в неправильности заголовков моих запросов. Затем я изменил заголовки запросов так, чтобы они были идентичны заголовкам моего браузера (используя chrome.webRequestК сожалению, это тоже не сработало. Одна вещь, которую я заметил, заключается в том, что в моем браузере есть несколько файлов cookie в заголовках запросов, которые я не знаю, как копировать (см. Ниже).

Поэтому мой вопрос: как я могу решить или отладить эту проблему? Есть ли способ узнать, ПОЧЕМУ сайт доставляет мне свою страницу "роботов"?С его файлом robots.txt я не нарушаю никаких очевидных правил.Я довольно новичок в javascript и веб-программировании, поэтому извините, если это основной вопрос.


Вот пример заголовков запросов моего браузера:

GET / XXX/ XXX HTTP / 1.1

Хост: www.example.com

Соединение: keep-alive

Обновление-небезопасные запросы: 1

Пользователь-Агент: Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_13_6)/xml;q=0.9,image/webp,image/apng,/;q=0.8

Referer: https://www.example.com/XXX

Accept-Encoding: gzip, deflate, br

Accept-Language: en-US, en; q = 0,9

Cookie: D_IID = XXX-XXX-XXX-XXX-XXX;D_UID = XXX-XXX-XXX-XXX-XXX;D_ZID = XXX-XXX-XXX-XXX-XXX;D_ZUID = XXX-XXX-XXX-XXX-XXX;D_HID = XXX-XXX-XXX-XXX-XXX;D_SID = XXX / XXX / XXX


ОБНОВЛЕНИЕ

Я также включаю мои общие заголовки, определенные в Chrome:

URL запроса: https://www.example.com/XXX

Метод запроса: GET

Код состояния: 200 OK

Удаленный адрес: XXX

Политика реферера: no-referer-when-downgrade

И мои заголовки ответа:

Cache-Control: приватный, без кеша, без хранилища, должен быть повторно подтвержден

Соединение: сохранить-alive

Content-Encoding: gzip

Content-Type: text / html

Дата: среда, 06 февраля 2019 г. XXX по Гринвичу

Edge-Control: no-store, bypass-cache

Срок действия истека: четверг, 01 января 1970 г. 00:00:01 GMT

Сервер: XXX

Суррогатное управление: no-store,Обходной кэш

Кодировка передачи: chunked

Варьируется: Кодировка принятия

X-DB: 0

X-DW: 0

X-DZ: XXX


ОБНОВЛЕНИЕ 2

После просмотра HTML-кода ответа я не уверен, что это.Первоначально я думал, что это какой-то ответ РОБОТА, потому что там написано META NAME = "ROBOTS", но теперь я менее уверен.Вот общая структура HTML.

<!DOCTYPE html>
<html>
<head>
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 XXX GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="refresh" content="10; url=example.com" />
<script type="text/javascript">
// SOME JAVASCRIPT
</script>
<script type="text/javascript" src="/example.js" defer></script></head>
<body>
<div id="XXX">&nbsp;</div>
</body>
</html>

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

мой вопрос: как я могу решить или отладить эту проблему?

Для отладки попробуйте Fiddler, mitmproxy, Wireshark или любой прокси-сервер отладки http (s) и посмотрите, как ваше расширение отправляетзаголовки XMLHttpRequest.

Также попробуйте эмулировать запрос браузера с помощью Postman или запустите XMLHttpRequest в Chrome devtool.

И я думаю, это потому, что заголовок X-Requested-With: XMLHttpRequest.

0 голосов
/ 09 февраля 2019

Когда я смотрю на вашего пользовательского агента, вы работаете над Mac, Apple.

Немного справочной информации, Chrome использует движок рендеринга Safari, потому что Apple не разрешает использовать другие движки, политику Apple.На самом деле Chrome - это просто графический экран, похожий на Chrome, однако скелет по-прежнему Safari.Вот почему, когда возникают проблемы с Safari, движком, вы не можете решить проблему.Установка другого браузера не помогает, когда есть проблема с ядром.Проблема у вас одна из них, грустная, но истинная. Позвольте мне объяснить.

В прошлом были похожие проблемы с (Luondo) встроенным интернет-магазином (object / iframe) в веб-сайт, также включенным кросс-политикой и т. Д., Однако не будет работать (только!) на устройствах Apple.Только пользователям Apple нужно сначала зайти на домен интернет-магазина , прежде чем смогут разместить заказ (точно так же, как вы описали, проблема с cookie).Это какая-то глупая политика, связанная с безопасностью, существует только с использованием Safari (или с необходимым встроенным ядром).

То, что я сделал (однако в вашем случае, мне кажется, это не помогает), это добавление сообщения на страницу при обнаружении устройства Apple.Сообщение содержит ссылку на домен интернет-магазина, который откроется на другой вкладке.После этого пользователи Apple могут разместить заказ.См. Также это сообщение на голландском языке (перевод ниже):


apple webshop problem


Пользователи Apple, обратите внимание:

Существует проблема безопасности с Safari, сначала вам нужно один раз посетить нашего интернет-магазина, чтобы иметь возможность разместить заказ.

Нажмите на следующеессылку, чтобы открыть веб-сайт нашего провайдера интернет-магазина, и после этого вы можете закрыть его: [ссылка] Активировать функцию заказа на устройстве Apple [/ link]

Извиниться занеудобства.


Не самый лучший перевод, однако, вы понимаете, я думаю.Это (с сегодняшнего дня, 2019) два года назад, и проблема все еще существует, как вы показали нам.

-------------

Решение:

Есть ли решение в любом случае, вероятно, не для пользователей Apple(потому что Apple должна это исправить), пробовали ли вы это на компьютере с Linux / Windows с установленным Chrome?Могу поспорить, что это будет работать, если только не существует каких-либо ограничений сервера безопасности сайта, которые избегают вызовов AJAX, однако, я думаю, что нет никаких проблем.

Другой подход:

1 .Я не знаю ваших навыков, однако вы можете подумать о том, чтобы настроить прокси-сервер, чтобы избежать этих проблем, встраивать (или лучше включать) содержимое сайта в свой вывод (включая файлы cookie).Одно предупреждение, что это может быть незаконно, потому что вы объединили контент другого сайта с чем-то своим:

2 .Спросите у владельца сайта, предоставляют ли они API для своих сервисов.


Личные мысли о вашем методе ajax:

Если вы хотите «объединить» html или извлечь контент (как вы его называете) другого сайта (путемиспользуя javascript), который не является вашим собственным, я сомневаюсь, что вы пытались сделать это законно.Я думаю, что это также причина, по которой вы не хотите упоминать имя / домен «сервиса» (пример, я полагаю, не сервис).Попытайтесь выяснить, что вы хотите сделать, на самом деле законно, если нет, то все это пустая трата времени, если для этого нет API, как я объяснил выше.


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

Хорошей субботы, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...