Я пытаюсь создать приложение rails, которое извлекает данные из нескольких различных API инструментов SEO. Для Bright Local (см. Их документы API здесь - http://apidocs.brightlocal.com/) все примеры API-документов написаны на PHP, и я не могу их прочесть.
Итак, во-первых, чтобы задать конкретный вопрос, как написать этот пакетный запрос в Ruby:
<?php
use BrightLocal\Api;
use BrightLocal\Batches\V4 as BatchApi;
$api = new Api('[INSERT_API_KEY]', '[INSERT_API_SECRET]');
$batchApi = new BatchApi($api);
$result = $batchApi->create();
if ($result['success']) {
$batchId = $result['batch-id'];
}
Кроме того, какие-либо предложения о том, как я могу заставить себя понюхать использование API в моих приложениях rails?
Наши документы в настоящее время показывают только примеры PHP - хотя мы планируем расширить их, а Ruby - один из тех языков, которые мы будем добавлять.
Простой запрос CURL командной строки для вышеуказанного PHP-кода будет выглядеть так:
curl --data "api-key=<YOUR API KEY HERE>" https://tools.brightlocal.com/seo-tools/api/v4/batch
и возвратит ответ вроде этого:
{"success":true,"batch-id":<RETURNED BATCH ID>}
Все наши конечные точки API отвечают либо POST, PUT, GET, либо DELETE. Также важно отметить, что всякий раз, когда данные отправляются с POST или PUT, они передаются как "param1 = value1 & param2 = value2" в теле запроса, а не в кодировке JSON.
Я вообще не знаю Ruby, я боюсь, но что-то вроде этого может сделать запрос, который вы хотите:
params = {"api-key" => "<YOUR API KEY>"}
Net::HTTP::Post.new("https://tools.brightlocal.com/seo-tools/api/v4/batch").set_form_data(params)
Я также выполняю ярлык в моем приложении Rails. Я использую камень HTTParty. это то, что у меня есть до сих пор, и я могу совершать успешные звонки
это для получения идентификатора пакета:
api_key = YOUR_API_KEY
secret_key = YOUR_SECRET_KEY
request_url = "https://tools.brightlocal.com/seo-tools/api/v4/batch?api-key=#{api_key}"
response = HTTParty.post(request_url)
if response.code == 201
batch_id = response['batch-id']
end
это пример запуска одного задания в пакете (параметры запроса входят в тело):
rank_url = "https://tools.brightlocal.com/seo-tools/api/v4/rankings/search"
response = HTTParty.post(rank_url, {
:body => {
"api-key" => api_key,
"batch-id" => batch_id,
"search-engine" => "google",
"country" => "USA",
"search-term" => "restaurant"
}
})
Я не тестировал эту следующую часть, но теоретически именно так вы будете иметь дело с сигнатурами и истечения срока действия
expires = Time.now.to_i + 1800
string_to_sign = "#{api_key}.#{expires}"
binary_signature = OpenSSL::HMAC.digest('sha1', string_to_sign, secret_key)
url_safe_signature = CGI::escape(Base64.encode64(binary_signature).chomp)
Осталось только использовать запрос PUT для фиксации партии и запрос GET для извлечения данных внутри пакета.
РЕДАКТИРОВАТЬ: Понял, как правильно получить пропущенную подпись для заданий, для которых она нужна. (этот пример предназначен для проверки ранга локального поиска http://apidocs.brightlocal.com/#local-search-rank-checker)
expires = Time.now.to_i + 1800
concat = api_key + expires.to_s
sig = OpenSSL::HMAC.digest('sha1', secret_key, concat)
sig = CGI::escape(Base64.encode64(sig).chomp)
local_rank = "https://tools.brightlocal.com/seo-tools/api/v2/lsrc/add?api-key=#{api_key}&sig=#{sig}&expires=#{expires}"
response = HTTParty.post(local_rank, {
:body => {
"name" => "pizza hut",
"search-terms" => "restaurant"
}
})
Поскольку вы используете Ruby, а не PHP, вам придется все реализовать самостоятельно. Пример, который вы даете, показывает пользователя оболочки PHP, созданной BrightLocal (и, похоже, только она есть в PHP).
В основном вам придется совершать вызовы на конечные точки самостоятельно и самостоятельно управлять данными, а не использовать их обертку.