Удаление заголовка (User-agent) из make_fetch_call при запросе от GAE
У меня есть приложение Google App Engine(GAE), и я использую Python 2.7. Это приложение получает запрос GET(ajax) от пользовательского портала (скажем, Chrome). После получения запроса я подготавливаю асинхронные соединения для запроса данных с нескольких веб-сайтов (скажем, X1, X2 и т. Д.) За пределами GAE, используя urlfetch.make_fetch_call() - запрос GET.
Это работало нормально для сайта X1, но не для X2. Началось исследование на локальном сервере разработки. После проверки я подозревал, что X2 проверяет тег {'User-Agent':'Python-urllib/2.7'} в заголовке. Это мое лучшее предположение, так как изменение этого поля на {'User-Agent': 'Mozilla/5.0'} возвращает желаемые результаты.
Поэтому я загрузил код в GAE и начал процесс с помощью urlfetch.make_fetch_call(). После перехвата этого вызова я обнаружил, что независимо от того, что я делаю, заголовок по умолчанию, добавленный GAE, не удаляется. Вот заголовок по умолчанию, добавленный GAE.
302 218ms 0kb Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 48.0.2564.103 Safari / 537.36 AppEngine-Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014) module = версия по умолчанию = 1 107.178.194.96 - - [06 / Feb / 2016: 19: 57: 04 -0800] "GET / HTTP / 1.1" 302 383 " http://www.mywebbsite.com/" "Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 48.0.2564.103 Safari / 537.36 AppEngine -Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014)" " 1.usedForIntercepting.appspot.com "ms = 218 cpu_ms = 224 cpm_usd = 0,000043 loading_request=1 app_engine_release=1.9.32 trace_id=fd7b7420e7f8c23371a5b0ea7e9651 instance=00c61b117ce5ebac2a2eba44f26a01d4f2
Это то, что я пытался
for portal in self.searchPortals:
spoofHeader = {
'User-agent':'Mozilla/5.0----------------------',
'Host':portal.getURL(),
'Accept-Encoding': 'identity',
'Connection': 'close',
'Accept': 'application/json, text/plain, */*',
'Origin': 'http://www.mywebsite.com'
}
logging.info(spoofHeader)
rpc = urlfetch.create_rpc(deadline=5)
rpc.callback = lambda: self.handleCallBack(rpc, portal)
#urlfetch.make_fetch_call(rpc, portal.getSearchURL(searchKeyword), headers={'User-agent':'Mozilla/5.0'})
urlfetch.make_fetch_call(rpc, url='http://1.usedforintercepting.appspot.com', headers=spoofHeader)
rpcs.append(rpc)
for rpc in rpcs:
rpc.wait()
Это то, что я получил.
2016-02-07 13: 01: 21.306 / 302 59ms 0kb Mozilla / 5.0 ---------------------- AppEngine-Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014) module = версия по умолчанию = 1 107.178.194.20 - - [06 / Feb / 2016: 23: 31: 21 -0800] "GET / HTTP / 1.1" 302 383 - "Mozilla / 5.0 ---------------------- AppEngine-Google; (+ http://code.google.com/appengine; AppID: S ~ ххх-травление-112014)" "" 1.usedForIntercepting.appspot.com мс =59 cpu_ms=6 cpm_usd=0,000043 app_engine_release=1.9.32 trace_id=a4a1f521c5a6fa65ed0295835dd175 экземпляра = 00c61b117ce5ebac2a2eba44f26a01d4f2
То, что я хочу, это что-то вроде этого.
ПОЛУЧИТЕ http://somelink/search/abc HTTP / 1.1 Accept-Encoding: identity Хост: somelink.com Соединение: закрыть User-Agent: Mozilla/5.0
Я хочу удалить все заголовки формы, кроме User-Agent:Mozilla/5.0??
Примечание - для перехвата запроса, сделанного из GAE с использованием urlfetch, я использую другой экземпляр GAE.
1 ответ
В документации URL Fetch Python API Overview: запрашивать заголовки
Из соображений безопасности приложение не может изменять следующие заголовки:
- Content-Length
- хозяин
- изменяться
- С помощью
- X-Appengine-Inbound-APPID
- X-Forwarded-For
- X-PROXYUSER-IP
Это также говорит:
Следующие заголовки указывают идентификатор приложения запрашивающего приложения:
User-Agent
, Этот заголовок можно изменить, но App Engine добавит строку идентификатора, чтобы серверы могли идентифицировать запросы App Engine. Добавленная строка имеет формат"AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)"
, гдеAPPID
идентификатор вашего приложения.
Если вам нужны пользовательские заголовки, вам придется написать собственный код urlfetch или использовать внешний сервер, который выполняет вызов для вас с вашими заголовками.