#python #google-app-engine #safe-browsing
#python #google-app-engine #безопасный просмотр
Вопрос:
Я пытаюсь отправить запрос в Google Safe Browsing Lookup API. Он запрашивает у пользователя URL, для которого он хочет выполнить поиск. Однако есть некоторая проблема с тем, как я отправляю запрос, потому что он продолжает отвечать с кодом ошибки 400. Пожалуйста, помогите.
import urllib
import urllib2
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.api import urlfetch
req_url = "https://sb-ssl.google.com/safebrowsing/api/lookup"
class MainHandler(webapp.RequestHandler):
def get(self):
self.response.out.write("""<html>
<body>
<form action='' method='POST'>
<input type='text' name='url'>
<input type='submit' value='submit!!'>
</form>
</body>
</html>""")
def post(self):
post_data = {'client':'api',
'apikey':'My-API-Key',
'appver':'1.5.2',
'pver':'3.0',
'url':"%s"% self.request.get('url') }
data = urllib.urlencode(post_data)
try:
req = urlfetch.fetch(url = req_url,
payload = data,
method = urlfetch.POST,
headers = {'Content-Type': 'application/x-www-form-urlencoded'})
if req.status_code == '200':
self.response.out.write("success")
self.response.out.write(req.content)
else:
self.response.out.write("Error code %s!!!"% req.status_code)
except urllib2.URLError, e:
self.response.out.write("Exception Raised")
handleError(e)
def main():
application = webapp.WSGIApplication([
('/', MainHandler)
],debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
Ответ №1:
Похоже, вы не соблюдаете протокол ни для метода GET, ни для метода POST, но делаете что-то промежуточное, передавая то, что должно быть параметрами GET через POST.
Попробуйте этот метод:
import urllib
from google.appengine.api import urlfetch
def safe_browsing(url):
"""Returns True if url is safe or False is it is suspect"""
params = urllib.urlencode({
'client':'api',
'apikey':'yourkey',
'appver':'1.5.2',
'pver':'3.0',
'url': url })
url = "https://sb-ssl.google.com/safebrowsing/api/lookup?%s" % params
res = urlfetch.fetch(url, method=urlfetch.GET)
if res.status_code >= 400:
raise Exception("Status: %s" % res.status_code)
return res.status_code == 204
Который будет работать как:
>>> safe_browsing('http://www.yahoo.com/')
True
Комментарии:
1. Спасибо, Крис. Теперь это работает как шарм. Я думаю, мне нужно углубиться в Http-запросы.