Хороший запрос от браузера, но плохой запрос от ruby?
Я использую API пользовательского поиска Google и пытаюсь получить к нему доступ через некоторый код ruby:
Вот фрагмент кода
req = Typhoeus::Request.new("https://www.googleapis.com/customsearch/v1?key={my_key}&cx=017576662512468239146:omuauf_lfve&q=" + keyword, followlocation: true)
res = req.run
Похоже, что тело ответа это:
<p>Your client has issued a malformed or illegal request. <ins>That’s all we know.</ins>
'
from /usr/local/lib/ruby/2.1.0/json/common.rb:155:in `parse'
from main.rb:20:in `initialize'
from main.rb:41:in `new'
from main.rb:41:in `<main>'
Когда я пытаюсь сделать то же самое из браузера, это работает как шарм. Еще более запутанным является то, что этот код работал 12 часов назад. Я только изменил ключевое слово, которое оно должно искать, однако оно начало возвращать ошибку.
Какие-либо предложения? Я уверен, что у меня достаточно кредитов для большего количества запросов
1 ответ
Возможно, у вас есть проблемы со специальными символами в вашем параметре get keyword
, Если вы введете URL в вашем браузере, браузер настроит их. Однако для ruby вам необходимо экранировать эти символы таким образом, чтобы строка "sky line"
становится "sky+line"
и так далее. Существует служебная функция CGI:: escape, которая используется так:
require 'cgi'
CGI::escape("sky line")
=> "sky+line"
Ваш фиксированный код будет выглядеть примерно так:
req = Typhoeus::Request.new("https://www.googleapis.com/customsearch/v1?key={my_key}&cx=017576662512468239146:omuauf_lfve&q=" + CGI::escape(keyword), followlocation: true)
res = req.run
Тем не менее, поскольку вы в любом случае используете Typhoeus, вы должны иметь возможность использовать его params
параметр и пусть Typhoeus обработает выход:
req = Typhoeus::Request.new(
"https://www.googleapis.com/customsearch/v1?&cx=017576662512468239146:omuauf_lfve",
followlocation: true,
params: {q: keyword, key: my_key}
)
res = req.run
Больше примеров на странице GitHub Typhoeus.