Драгоценный камень Ruby Curb — Ubiquiti mPower HTTP API

Я пытаюсь воспроизвести этот HTTP API для блоков mPower Ubiquiti с использованием Curb gem и хранилища вывод из этого в файл CSV.

Использование cURL:

curl -X POST -d "username=user&password=pass" -b "AIROS_SESSIONID=01234567890123456789012345678901" 192.168.1.75/login.cgi

curl -b "AIROS_SESSIONID=01234567890123456789012345678901" 192.168.1.75/sensors/1/power

Возвращает:

{"sensors":[{"power":2.740736961}],"status":"success"}


Моя попытка использовать Curb:

require 'curb'    

cookie = rand(36**32).to_s(36)

curl = Curl::Easy.new('http://192.168.1.75/login.cgi')

curl.http_post(
  Curl::PostField.content('username', 'user'),
  Curl::PostField.content('password', 'pass'))

curl = Curl::Easy.new('http://192.168.1.75/sensors/1/power')
curl.cookies = cookie
curl.perform

Добавление puts curl.perform в конец скрипта напечатает true.

Используя cURL, я обычно могу получить данные с задержкой от 1 до 3 секунд с момента выполнения curl -b... из командной строки до появления ответа. Как добиться тех же результатов с помощью Curb и сохранить только данные о мощности в локальной переменной? Есть ли лучший инструмент для выполнения этой задачи, кроме Curb?


person atwalsh    schedule 12.03.2016    source источник


Ответы (1)


Я бы проанализировал результаты, используя модуль JSON.

require 'curb'
require 'json'

curl = Curl::Easy.new('http://192.168.1.75/login.cgi')
curl.cookies = "AIROS_SESSIONID=#{rand(36**32).to_s(36)}"

curl.http_post(
  Curl::PostField.content('username', 'user'),
  Curl::PostField.content('password', 'pass'))

curl.url = 'http://192.168.1.75/sensors/1/power'
curl.perform

result_hash = JSON.parse(curl.body_str)
power = result_hash["sensors"][0]["power"] #=> should get 2.740736961

Не могу проверить это, потому что у меня нет вашего API, но это должно работать, если ответ точно такой, как вы там показали.

person cozyconemotel    schedule 12.03.2016
comment
Я получаю сообщение об ошибке неопределенного метода undefined method [] . Также, когда я помещаю содержимое curl.body_str, я получаю {"status":"fail"}. Любая идея, что может вызвать это? - person atwalsh; 13.03.2016
comment
Хм, не уверен... что, если заменить строку cookie на curl.cookies = "AIROS_SESSIONID=01234567890123456789012345678901"? - person cozyconemotel; 13.03.2016