6

Tôi có một ứng dụng của Google App Engine (GAE) và tôi đang sử dụng Python 2.7. Ứng dụng này nhận được yêu cầu GET (ajax) từ cổng thông tin người dùng (nói Chrome). Khi nhận được yêu cầu, tôi chuẩn bị các kết nối Không đồng bộ để yêu cầu dữ liệu từ nhiều trang web (nói X1, X2, vv) bên ngoài GAE bằng cách sử dụng urlfetch.make_fetch_call() - GET request.Xóa tiêu đề (Tác nhân người dùng) khỏi make_fetch_call trong khi yêu cầu từ GAE

Điều này làm việc tốt cho trang web X1 nhưng không hoạt động đối với X2. Bắt đầu thăm dò trên máy chủ dev cục bộ. Khi thăm dò tôi nghi ngờ rằng X2 đang kiểm tra thẻ '' User-Agent ':' Python-urllib/2.7 '} trong tiêu đề. Đây là dự đoán tốt nhất của tôi kể từ khi thay đổi trường này thành {'User-Agent': 'Mozilla/5.0'} trả về kết quả mong muốn.

Vì vậy, tôi đã tải mã lên GAE và bắt đầu quá trình với urlfetch.make_fetch_call(). Khi chặn cuộc gọi này, tôi thấy rằng bất kể tôi làm gì, tiêu đề mặc định được GAE thêm vào sẽ không bị xóa. Đây là tiêu đề mặc định được GAE thêm vào.

302 218ms 0kb Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, như Gecko) Chrome/48.0.2564.103 Safari/537.36 AppEngine-Google; (+ http://code.google.com/appengine; appid: s ~ xxx-etching-112014) module = phiên bản mặc định = 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, như 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 dụ = 00c61b117ce5ebac2a2eba44f26a01d4f2

Đây là những gì tôi đã cố gắng

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() 

Đây là những gì tôi nhận được.

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 = phiên bản mặc định = 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 ~ xxx-etching-112014)" "1.usedForIntercepting .appspot.com" ms = 59 cpu_ms = 6 cpm_usd = 0,000043 app_engine_release = 1.9.32 trace_id = a4a1f521c5a6fa65ed0295835dd175 dụ = 00c61b117ce5ebac2a2eba44f26a01d4f2

gì tôi muốn là một cái gì đó như thế này.

GET http://somelink/search/abc HTTP/1.1 Accept-Encoding: sắc Host: somelink.com kết nối: gần User-Agent: Mozilla/5.0

Tôi muốn loại bỏ hình thức tiêu đề tất cả mọi thứ khác hơn là tài -Agent: Mozilla/5.0 ??

Lưu ý - để chặn yêu cầu được tạo từ GAE bằng urlfetch tôi đang sử dụng một phiên bản GAE khác.

Trả lời

3

Trong tài liệu, URL Fetch Python API Overview: Request Headers, nó nói

Vì lý do an ninh, các tiêu đề sau đây không thể được sửa đổi bởi ứng dụng:

  • Content-Length
  • chủ
  • Vary
  • Via
  • X-AppEngine-Inbound-AppID
  • X-Forwarded-For
  • X-ProxyUser-IP

Nó cũng nói:

Các tiêu đề sau đây cho thấy ID ứng dụng của ứng dụng yêu cầu:

User-Agent. Tiêu đề này có thể được sửa đổi nhưng App Engine sẽ thêm một chuỗi định danh để cho phép các máy chủ xác định các yêu cầu của App Engine. Chuỗi được nối thêm có định dạng "AppEngine-Google; (+http://code.google.com/appengine; appid: APPID)", trong đó APPID là số nhận dạng của ứng dụng của bạn.

Nếu bạn muốn tiêu đề tùy chỉnh, bạn sẽ phải viết mã url của riêng bạn hoặc sử dụng máy chủ bên ngoài thực hiện cuộc gọi cho bạn với tiêu đề của bạn.

Các vấn đề liên quan