Giter Club home page Giter Club logo

vkontakte_api's Introduction

vkontakte_api Build Status Gem Version Dependency Status Code Climate Gitter

vkontakte_api — ruby-адаптер для ВКонтакте API. Он позволяет вызывать методы API, загружать файлы на сервера ВКонтакте, а также поддерживает все 3 доступных способа авторизации (при этом позволяя использовать стороннее решение).

English version

For English version please go here.

Установка

# Gemfile
gem 'vkontakte_api', '~> 1.4'

или просто

$ gem install vkontakte_api

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

Вызов методов

# создаем клиент
@vk = VkontakteApi::Client.new
# и вызываем методы API
@vk.users.get(user_ids: 1)

# в ruby принято использовать snake_case в названиях методов,
# поэтому likes.getList становится likes.get_list
@vk.likes.get_list
# также названия методов, которые возвращают '1' или '0',
# заканчиваются на '?', а возвращаемые значения приводятся
# к true или false
@vk.is_app_user? # => false

# если ВКонтакте ожидает получить параметр в виде списка,
# разделенного запятыми, то его можно передать массивом
users = @vk.users.get(user_ids: [1, 2, 3])

# большинство методов возвращает структуры Hashie::Mash
# и массивы из них
users.first.uid        # => 1
users.first.first_name # => "Павел"
users.first.last_name  # => "Дуров"

# если метод, возвращающий массив, вызывается с блоком,
# то блок будет выполнен для каждого элемента,
# и метод вернет обработанный массив
fields = [:first_name, :last_name, :screen_name]
@vk.friends.get(user_id: 2, fields: fields) do |friend|
  "#{friend.first_name} '#{friend.screen_name}' #{friend.last_name}"
end
# => ["Павел 'durov' Дуров"]

Загрузка файлов

Загрузка файлов на сервера ВКонтакте осуществляется в несколько этапов: сначала вызывается метод API, возвращающий URL для загрузки, затем происходит сама загрузка файлов, и после этого в некоторых случаях нужно вызвать другой метод API, передав в параметрах данные, возвращенные сервером после предыдущего запроса. Вызываемые методы API зависят от типа загружаемых файлов и описаны в соответствующем разделе документации.

Файлы передаются в формате хэша, где ключом является название параметра в запросе (указано в документации, например для загрузки фото на стену это будет photo), а значением — массив из 2 строк: полный путь к файлу и его MIME-тип:

url = 'http://cs303110.vkontakte.ru/upload.php?act=do_add'
VkontakteApi.upload(url: url, photo: ['/path/to/file.jpg', 'image/jpeg'])

Если загружаемый файл доступен как открытый IO-объект, его можно передать альтернативным синтаксисом — IO-объект, MIME-тип и путь к файлу:

url = 'http://cs303110.vkontakte.ru/upload.php?act=do_add'
VkontakteApi.upload(url: url, photo: [file_io, 'image/jpeg', '/path/to/file.jpg'])

Метод вернет ответ сервера ВКонтакте, преобразованный в Hashie::Mash; его можно использовать при вызове метода API на последнем этапе процесса загрузки.

Авторизация

Для вызова большинства методов требуется токен доступа (access token). Чтобы получить его, можно использовать авторизацию, встроенную в vkontakte_api, либо положиться на какой-то другой механизм (например, OmniAuth). В последнем случае в результате авторизации будет получен токен, который нужно будет передать в VkontakteApi::Client.new.

Для работы с ВКонтакте API предусмотрено 3 типа авторизации: для сайтов, для клиентских приложений (мобильных либо десктопных, имеющих доступ к управлению браузером) и специальный тип авторизации серверов приложений для вызова административных методов без авторизации самого пользователя. Более подробно они описаны тут; рассмотрим, как работать с ними средствами vkontakte_api.

Для авторизации необходимо задать параметры app_id (ID приложения), app_secret (защищенный ключ) и redirect_uri (адрес, куда пользователь будет направлен после предоставления прав приложению) в настройках VkontakteApi.configure. Более подробно о конфигурировании vkontakte_api см. далее в соответствующем разделе.

Сайт

Авторизация сайтов проходит в 2 шага. Сначала пользователь перенаправляется на страницу ВКонтакте для подтверждения запрошенных у него прав сайта на доступ к его данным. Со списком возможных прав можно ознакомиться здесь. Допустим, нужно получить доступ к друзьям (friends) и фотографиям (photos) пользователя.

В соответствии с рекомендациями в протоколе OAuth2 для защиты от CSRF, нужно передать параметр state, содержащий случайное значение.

session[:state] = Digest::MD5.hexdigest(rand.to_s)
redirect_to VkontakteApi.authorization_url(scope: [:notify, :friends, :photos], state: session[:state])

После подтверждения пользователь перенаправляется на указанный в настройках redirect_uri, причем в параметрах будет передан код, по которому можно получить токен доступа, а также переданный ранее state. Если state не совпадает с тем, который был использован при отправлении пользователя на ВКонтакте, то скорее всего это попытка CSRF-атаки — стоит отправить пользователя на повторную авторизацию.

redirect_to login_url, alert: 'Ошибка авторизации' if params[:state] != session[:state]

vkontakte_api предоставляет метод VkontakteApi.authorize, который делает запрос к ВКонтакте, получает токен и создает клиент; нужно лишь передать ему код:

@vk = VkontakteApi.authorize(code: params[:code])
# и теперь можно вызывать методы API на объекте @vk
@vk.is_app_user?

Клиент будет содержать id пользователя, авторизовавшего приложение; его можно получить с помощью метода VkontakteApi::Client#user_id:

@vk.user_id # => 123456

Также в этот момент полезно сохранить полученный токен (и, при необходимости, id пользователя) в БД либо в сессии, чтобы использовать их повторно:

current_user.token = @vk.token
current_user.vk_id = @vk.user_id
current_user.save
# позже
@vk = VkontakteApi::Client.new(current_user.token)
Клиентское приложение

Авторизация клиентского приложения несколько проще — не нужно получать токен отдельным запросом, он выдается сразу после редиректа пользователя.

# пользователь направляется на следующий урл
VkontakteApi.authorization_url(type: :client, scope: [:friends, :photos])

Необходимо принимать во внимание, что redirect_uri нужно выставлять на http://api.vkontakte.ru/blank.html, иначе не получится вызывать методы, доступные клиентским приложениям.

Когда пользователь подтвердит права приложения, он будет перенаправлен на redirect_uri, при этом в параметре access_token будет токен, который нужно передать в VkontakteApi::Client.new.

Сервер приложения

Последний тип авторизации — самый простой, т.к. не предполагает участия пользователя.

@vk = VkontakteApi.authorize(type: :app_server)

Прочее

Если клиент API (объект класса VkontakteApi::Client) был создан с помощью метода VkontakteApi.authorize, он будет содержать информацию об id текущего пользователя (user_id) и о времени истечения токена (expires_at). Получить их можно с помощью соответствующих методов:

vk = VkontakteApi.authorize(code: 'c1493e81f69fce1b43')
# => #<VkontakteApi::Client:0x007fa578f00ad0>
vk.user_id    # => 628985
vk.expires_at # => 2012-12-18 23:22:55 +0400
# можно проверить, истекло ли время жизни токена
vk.expired?   # => false

Также можно получить список прав доступа, которые дает данный токен, в виде, аналогичном формату параметра scope в авторизации:

vk.scope # => [:friends, :groups]

Это работает на основе метода getUserSettings, причем результат запоминается после первого обращения.

Чтобы создать короткий синоним VK для модуля VkontakteApi, достаточно вызвать метод VkontakteApi.register_alias:

VkontakteApi.register_alias
VK::Client.new # => #<VkontakteApi::Client:0x007fa578d6d948>

При необходимости можно удалить синоним методом VkontakteApi.unregister_alias:

VK.unregister_alias
VK # => NameError: uninitialized constant VK

Обработка ошибок

Если ВКонтакте API возвращает ошибку, выбрасывается исключение класса VkontakteApi::Error.

vk = VK::Client.new
vk.friends.get(user_id: 1, fields: [:first_name, :last_name, :photo])
# VkontakteApi::Error: VKontakte returned an error 7: 'Permission to perform this action is denied' after calling method 'friends.get' with parameters {"user_id"=>"1", "fields"=>"first_name,last_name,photo"}.

Особый случай ошибки — 14: необходимо ввести код с captcha. В этом случае можно получить параметры капчи методами VkontakteApi::Error#captcha_sid и VkontakteApi::Error#captcha_img — например, так.

Логгирование

vkontakte_api логгирует служебную информацию о запросах при вызове методов. По умолчанию все пишется в STDOUT, но в настройке можно указать любой другой совместимый логгер, например Rails.logger.

Есть возможность логгирования 3 типов информации, каждому соответствует ключ в глобальных настройках.

ключ настройки по умолчанию уровень логгирования
URL запроса log_requests true debug
JSON ответа при ошибке log_errors true warn
JSON удачного ответа log_responses false debug

Таким образом, в rails-приложении с настройками по умолчанию в production записываются только ответы сервера при ошибках; в development также логгируются URL-ы запросов.

Пример использования

Пример использования vkontakte_api совместно с eventmachine можно посмотреть здесь.

Также был написан пример использования с rails, но он больше не работает из-за отсутствия прав на вызов метода newsfeed.get.

Настройка

Глобальные параметры vkontakte_api задаются в блоке VkontakteApi.configure следующим образом:

VkontakteApi.configure do |config|
  # параметры, необходимые для авторизации средствами vkontakte_api
  # (не нужны при использовании сторонней авторизации)
  config.app_id       = '123'
  config.app_secret   = 'AbCdE654'
  config.redirect_uri = 'http://example.com/oauth/callback'

  # faraday-адаптер для сетевых запросов
  config.adapter = :net_http
  # HTTP-метод для вызова методов API (:get или :post)
  config.http_verb = :post
  # параметры для faraday-соединения
  config.faraday_options = {
    ssl: {
      ca_path:  '/usr/lib/ssl/certs'
    },
    proxy: {
      uri:      'http://proxy.example.com',
      user:     'foo',
      password: 'bar'
    }
  }
  # максимальное количество повторов запроса при ошибках
  # работает только если переключить http_verb в :get
  config.max_retries = 2

  # логгер
  config.logger        = Rails.logger
  config.log_requests  = true  # URL-ы запросов
  config.log_errors    = true  # ошибки
  config.log_responses = false # удачные ответы

  # используемая версия API
  config.api_version = '5.21'
end

По умолчанию для HTTP-запросов используется Net::HTTP; можно выбрать любой другой адаптер, поддерживаемый faraday.

ВКонтакте позволяет использовать как GET-, так и POST-запросы при вызове методов API. По умолчанию vkontakte_api использует POST, но в настройке http_verb можно указать :get, чтобы совершать GET-запросы.

При необходимости можно указать параметры для faraday-соединения — например, параметры прокси-сервера или путь к SSL-сертификатам.

Чтобы при каждом вызове API-метода передавалась определенная версия API, можно указать ее в конфигурации в api_version. По умолчанию версия не указана.

Чтобы сгенерировать файл с настройками по умолчанию в rails-приложении, можно воспользоваться генератором vkontakte_api:install:

$ cd /path/to/app
$ rails generate vkontakte_api:install

JSON-парсер

vkontakte_api использует парсер Oj — это единственный парсер, который не показал ошибок при парсинге JSON, генерируемого ВКонтакте.

Также в библиотеке multi_json (обертка для различных JSON-парсеров, которая выбирает самый быстрый из установленных в системе и парсит им) Oj поддерживается и имеет наивысший приоритет; поэтому если он установлен в системе, multi_json будет использовать именно его.

Roadmap

  • CLI-интерфейс с автоматической авторизацией

Участие в разработке

Если вы хотите поучаствовать в разработке проекта, форкните репозиторий, положите свои изменения в отдельную ветку, покройте их спеками и отправьте мне pull request.

vkontakte_api тестируется под MRI 2.1, 2.2, 2.3 и 2.4, а также JRuby 9.x. Если в одной из этих сред что-то работает неправильно, либо вообще не работает, то это следует считать багом, и написать об этом в issues на Github.

vkontakte_api's People

Contributors

7even avatar alexandermint avatar batizhevsky avatar dzjuck avatar gekh avatar gkopylov avatar got2be avatar harrykiselev avatar incubus avatar moklokov avatar targence avatar umka avatar undr avatar zubkonst avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vkontakte_api's Issues

Method namespace conflict

Hello. I have an issue in v1.2. Adding the "search" method to the namespace.yml list prevent to work methods with a "search" prefix [method_name].search(params).
For example:

   @client.newsfeed.search(q: "hello", count: 1).first

form this query:

DEBUG -- : POST https://api.vk.com/method/newsfeed.first

Faraday::Error::ConnectionFailed

При использовании VkontakteApi.authorize в контроллере вылетает ошибка
Faraday::Error::ConnectionFailed (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed).
Все делал по инструкции.
Ruby 1.9, Rails 4.0.0

Help with secure methods

Not a bug, just wondering if you can help me understand vk's documentation. I'm trying to use some of the sms methods located at http://vk.com/developers.php?oid=-17680044&p=secure.sendSMSNotification

VkontakteApi::Client.new(vk_token).secure.getSMS(uid: 41526347)
VkontakteApi::Error: VKontakte returned an error 5: 'User authorization failed: you should pass client_secret param to use secure methods' after calling method 'secure.getSMS' with parameters {"uid"=>"41526347"}.

i have my app secret in config, but it's still throwing an error. Any suggestions?

VkontakteApi.configure do |config|
  # Authorization parameters (not needed when using an external authorization):
  config.app_id       = 'blah'
  config.app_secret   = 'blahblah'
end

Yajl::ParseError: lexical error: invalid character inside string.

Hi

I'm trying to perform this request @app.groups.getById(gids:"23201, 23202, 23203",fields:"country,city")

It's returning error.

Yajl::ParseError: lexical error: invalid character inside string.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!","screen_name":"club23202","
(right here) ------^

from /Users/.rvm/gems/ruby-1.9.3-p0/gems/yajl-ruby-1.1.0/lib/yajl.rb:36:in `parse'
from /Users/.rvm/gems/ruby-1.9.3-p0/gems/yajl-ruby-1.1.0/lib/yajl.rb:36:in `parse'
from /Users/.rvm/gems/ruby-1.9.3-p0/gems/vkontakte_api-0.2.1/lib/vkontakte_api/api.rb:22:in `call'
from /Users/.rvm/gems/ruby-1.9.3-p0/gems/vkontakte_api-0.2.1/lib/vkontakte_api/resolver.rb:48:in `method_missing'
from (irb):11
from /Users/.rvm/rubies/ruby-1.9.3-p0/bin/irb:16:in `<main>'

Any idea to fix it?

Клиентские токены больше не работают

С 6 июня VK проверяет IP адрес при запросах с указанием токена, полученного извне (например, через клиенский OAuth или тот, что передаётся в IFrame).

Возвращается ошибка: "error_code":5,"error_msg":"User authorization failed: access_token was given to another ip address."

Нужно либо добавить возможность передать заголовок с пользовательским IP, либо поддержать этот метод: https://vk.com/pages?oid=-1&p=%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BE%D0%B4%D0%B5%D0%B9%D1%81%D1%82%D0%B2%D0%B8%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81_API

@vk.ads.get_targeting_stats - неверно преобразовывает имя метода для запроса

Делаем запрос @vk.ads.get_targeting_stats...
DEBUG -- : POST https://api.vk.com/method/ads?access_token=...

А должно быть.
https://api.vk.com/method/ads.getTargetingStats?

Вообще эта игра с переименованиями методов оч. странна, да это ruby way, но было бы круто иметь опцию отключить переименование.

И писать просто @vk.ads.getTargetingStats, или вообще @VK(method: "ads.getTargetingStats") - тогда бы вообще ну нужно было бы ничего переименовывать, ну так уж повелось, что vk не на руби писали =)

Для VkontakteApi.authorize нужен доп параметр redirect_uri

У ВК немного поменялись правила авторизации, точнее стали проверять наличие redirect_uri в запросе на токен, раньше не просили.

Вот доказательства,

http://vk.com/topic-1_21972169?post=52899
http://xsave.ru/topic-1_21972158?post=52679

Причем все хитро у них для старых приложений (правда не всегда) остается совместимость.
На новых без redirect_uri работать не будет.

audio.search

Довольно интересная складывается ситуация при вызове этого метода.
Поскольку они оба есть в namespaces.yml, то возвращается VkontakteApi::Namespace, вместо ожидаемого результата.

То же самое и с video.search.
Ошибка появилась в версии 1.2, после добавления "search".
Спасибо!)

NoMethodError, когда VK валится с HTTP 5XX

Время от времени VK отвечает кодом 5XX и валится весь код вообще, потому что ответ пустой и env[:body] == nil, что вызывает ошибку, когда в коде происходят вызовы вроде env[:body].error?. Боюсь лезть и исправлять что-то, так как не умею и не знаю точно всех мест, где еще могут быть подобные ошибки.

app server authorization

1.9.3-p327-perf :059 > VkontakteApi.configure{|c| c.app_id = VK_APP_ID; c.app_secret=VK_APP_SECRET; }
 => VkontakteApi 
1.9.3-p327-perf :060 > vk = VkontakteApi.authorize(type: :app_server)
OAuth2::Error: invalid_client: client_secret is undefined
{"error":"invalid_client","error_description":"client_secret is undefined"}
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perf/gems/oauth2-0.8.0/lib/oauth2/client.rb:108:in `request'
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perf/gems/oauth2-0.8.0/lib/oauth2/client.rb:131:in `get_token'
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perf/gems/oauth2-0.8.0/lib/oauth2/strategy/client_credentials.rb:24:in `get_token'
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perf/gems/vkontakte_api-1.1/lib/vkontakte_api/authorization.rb:55:in `authorize'
    from (irb):60
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perf/gems/railties-3.2.12/lib/rails/commands/console.rb:47:in `start'
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perf/gems/railties-3.2.12/lib/rails/commands/console.rb:8:in `start'
    from /home/proton/.rvm/gems/ruby-1.9.3-p327-perfgems/railties-3.2.12/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

VK_APP_ID и VK_APP_SECRET верные, если вручную (curl'ом) вызывать ссылку https://oauth.vk.com/access_token, то нормально отдаёт access_token.

Ошибка в logger.rb

Иногда при частой отправке запросов в ВК встречал следующую ошибку

Запрос был: @vk.wall.get({owner_id: 26515827, count: 1, filter: [:owner]})
ruby 2.1.5p273 (2014-11-13 revision 48405) [i686-linux]

WARN: undefined method error?' for nil:NilClass WARN: ruby/2.1.0/bundler/gems/vkontakte_api-1287b4f90216/lib/vkontakte_api/logger.rb:27:inon_complete'
ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/response.rb:9:in block in call' ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/response.rb:57:inon_complete'
ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/response.rb:8:in call' ruby/2.1.0/bundler/gems/vkontakte_api-1287b4f90216/lib/vkontakte_api/logger.rb:21:incall'
ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/request/retry.rb:87:in call' ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/request/url_encoded.rb:15:incall'
ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/request/multipart.rb:14:in call' ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/rack_builder.rb:139:inbuild_response'
ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/connection.rb:377:in run_request' ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/connection.rb:177:inpost'
ruby/2.1.0/bundler/gems/vkontakte_api-1287b4f90216/lib/vkontakte_api/api.rb:18:in call' ruby/2.1.0/bundler/gems/vkontakte_api-1287b4f90216/lib/vkontakte_api/method.rb:13:incall'
ruby/2.1.0/bundler/gems/vkontakte_api-1287b4f90216/lib/vkontakte_api/resolver.rb:20:in call_method' ruby/2.1.0/bundler/gems/vkontakte_api-1287b4f90216/lib/vkontakte_api/namespace.rb:12:inmethod_missing'

При повторной отправке этого же запроса, ошибок нет.

Faraday's `method_missing`: undefined method `register_middleware`

While trying to use this gem have an Faraday's error:

user@user_pc:~/path_to_project$ ruby vkapi.rb/home/user/.rvm/gems/ruby-2.1.0@vkapi/gems/faraday-0.9.0.rc7/lib/faraday.rb:99:in `method_missing': undefined method `register_middleware' for #<Faraday::Connection:0x00000002288eb0> (NoMethodError)
    from /home/user/.rvm/gems/ruby-2.1.0@vkapi/gems/faraday_middleware-parse_oj-0.2.1/lib/faraday_middleware/parse_oj.rb:15:in `<top (required)>'
    from /home/user/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/user/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/user/.rvm/gems/ruby-2.1.0@vkapi/gems/vkontakte_api-1.3.1/lib/vkontakte_api.rb:3:in `<top (required)>'
    from /home/user/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:135:in `require'
    from /home/user/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:135:in `rescue in require'
    from /home/user/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:144:in `require'
    from vkapi.rb:1:in `<main>'

Could somebody help with this issue?

Exception handling

Периодически при работе с Вконтакте возникают разные ошибки:
Проблемы с сетью (аля getaddrinfo: Name or service not known (SocketError))
Превышение лимита api (Too many requests per second)
И т.д.

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

Dynamic method calling

В 1.2 отвалился динамический вызов методов:

2.0.0p247 :049 > vk.photos
 => #<VkontakteApi::Namespace:0x000000091339c8 @name="photos", @previous_resolver=#<Hashie::Mash name=nil token="728de16c8494909187a16487c550e58e802b70c176278ffefb201c132f533a330e718296d572f511e2e8b">> 
2.0.0p247 :050 > vk.send('photos')
NoMethodError: undefined method `inject' for "photos":String
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/vkontakte_api-1.2/lib/vkontakte_api/utils.rb:9:in `flatten_arguments'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/vkontakte_api-1.2/lib/vkontakte_api/api.rb:16:in `call'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/vkontakte_api-1.2/lib/vkontakte_api/method.rb:13:in `call'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/vkontakte_api-1.2/lib/vkontakte_api/resolver.rb:16:in `method_missing'
        from (irb):50
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.14/lib/rails/commands/console.rb:47:in `start'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.14/lib/rails/commands/console.rb:8:in `start'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247/gems/railties-3.2.14/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'

В 1.1 это работало

Сейчас временно заменил send на method_missing

Upgrade faraday version

I can't use the gem together with koala

Bundler could not find compatible versions for gem "faraday":
  In Gemfile:
    vkontakte_api (~> 1.3) ruby depends on
      faraday (< 0.9, >= 0.7.4) ruby

    koala (~> 1.8.0rc1) ruby depends on
      faraday (0.9.0)

Push new version, please

@7even push new version, please, так как в #54 мы изменили зависимости... Хочется использовать новую версию.

Thanks!

'users.search' not working

Hi!
The following code execution:

client = ... # authorization
result = client.users.search(search_params)
count = result.first

leads to exception:

VkontakteApi::Error (VKontakte returned an error 3: 'Unknown method passed' after calling method 'search.first' without parameters.):
... some app trace here (skipped)

This caused by last commit ('new namespaces added') - there is 'search' namespace added. So client.users.search.first calls unexisting 'search.first' method. Was it added intentionally? I don't see any 'search.*' at the VK API page.

Unknown method passed Загрузка файлов

При попытке загрузки файла
@vk.upload(url: upload_url, photo: [file_path, 'image/jpeg'])

VKontakte returned an error 3: 'Unknown method passed' after calling method 'upload' with parameters {"photo"=>"././public/images/79101.jpg,image/jpeg", "url"=>"http://cs625324.vk.com/upload.php?act=do_add&amp;mid=123092886&amp;aid=-14&amp;gid=-101666480&amp;hash=bc00851a9c3a57770622c6d94ed044fa&amp;rhash=ccb4c6b8600439c8c7ec684d8553c9a2&amp;swfupload=1&amp;api=1&amp;wallphoto=1"}.

Проблемы с photos.save

Вероятно проблемы только у меня, но возможно поможете разобраться?

Пытаюсь загрузить фото в альбом. Список альбомов получаю. Всё проходит нормально (авторизация пользователя, получение ссылки на загрузку, загрузка) до того самого момента как надо вызвать photos.save

us = vk.photos.get_upload_server(aid: 11111111)
=> #<Hashie::Mash ..........>

up = VkontakteApi.upload(url: us.upload_url, file1: ['z:/375.jpg', 'image/jpeg'])
=> #<Hashie::Mash ..........>
photos_list не пустой (видел у многих из-за пустого проблемы возникают)

save = vk.photos.save(aid: up.aid, server: up.server, photos_list: up.photos_list, hash: up.hash, caption: "Test...")
=>VkontakteApi::Error: VkontakteApi::Error
from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/result.rb:31:in extract_result' from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/result.rb:14:inprocess'
from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/method.rb:14:in call' from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/resolver.rb:16:inmethod_missing'

Что это может быть?

PS. Кстати при создании альбома такая же ошибка...

Поддержка двух VK приложений одновременно

Добрый день.

Могу ли я настроить поддержку двух VK App ID одновременно? Сейчас я вижу, что настройки задаются глобально для класса VkontakteApi. Мне это нужно, так как у меня есть два App ID — одно для VK Iframe, другое для Standalone приложения в iOS.

Спасибо.

Dependencies conflict with omniauth oauth2-0.9.3

Bundler could not find compatible versions for gem "faraday":

  In Gemfile:
    vkontakte_api (~> 1.3) ruby depends on
      faraday (< 0.9, >= 0.7.4) ruby

    vkontakte_api (~> 1.3) ruby depends on
      faraday (0.9.0)
gem 'omniauth'
gem 'omniauth-github'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-vkontakte'
gem 'omniauth-odnoklassniki'
gem 'vkontakte_api'
Using oauth (0.4.7)
Using oauth2 (0.9.3)
Using omniauth (1.2.1)
Using omniauth-oauth2 (1.1.2)
Using omniauth-facebook (1.6.0)
Using omniauth-github (1.1.1)
Using omniauth-google-oauth2 (0.2.2)
Using omniauth-oauth (1.0.1)
Using omniauth-odnoklassniki (0.0.4)
Using omniauth-twitter (1.0.1)
Using omniauth-vkontakte (1.3.2)

invalid_grant: Code is invalid or expired.

Сделал все по Вашим докам, но в ответ получаю след. ошибку:

invalid_grant: Code is invalid or expired. {"error":"invalid_grant","error_description":"Code is invalid or expired."}

на вот этой строчке: @VK = VkontakteApi.authorize(code: params[:code])

Set API version for all requests

Насколько я понял из документации для использования определённой версии API ко всем запросам нужно добавлять номер версии (?v=5.3).

Можно ли как-то это автоматизировать (чтобы где-то в начале задать параметр, а он автоматически бы добавлялся ко всем запросам)?

OJ JSON Parsing Error

Проблема с парсингом JSON, когда встречаются подобные названия в группах - ^it is MerRiLy^

Вот список gid таких групп

27590266
27590308
30731395
40720500
25636833
21162495
6424028
5264005
27593445

https://api.vk.com/method/groups.getById?gids=27590308&fields=members_count

{
"response": [
{
"gid": 27590308,
"name": "^it is MerRiLy^",
"screen_name": "club27590308",
"is_closed": 0,
"type": "page",
"photo": "http://cs9622.vk.me/g27590308/e_5e8febcb.jpg",
"photo_medium": "http://cs9622.vk.me/g27590308/d_f03b4da2.jpg",
"photo_big": "http://cs9622.vk.me/g27590308/a_45b896f7.jpg"
}
]
}

Через гем

@vk.groups.getById(gid: 27590308)


Faraday::Error::ParsingError: Not a valid ID number at line 1, column 54 [load.c:225]

    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-parse_oj-0.1/lib/faraday_middleware/parse_oj.rb:8:in `load'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-parse_oj-0.1/lib/faraday_middleware/parse_oj.rb:8:in `block in <class:ParseOj>'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/faraday_middleware/response_middleware.rb:48:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/faraday_middleware/response_middleware.rb:48:in `parse'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/faraday_middleware/response_middleware.rb:39:in `process_response'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/faraday_middleware/response_middleware.rb:32:in `block in call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/response.rb:63:in `on_complete'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/faraday_middleware/response_middleware.rb:30:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/response.rb:8:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/response.rb:8:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/logger.rb:21:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/request/url_encoded.rb:14:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/request/multipart.rb:13:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/faraday_middleware/request/oauth2.rb:40:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/connection.rb:247:in `run_request'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/faraday-0.8.6/lib/faraday/connection.rb:112:in `post'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/api.rb:17:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/method.rb:13:in `call'
    from /Users/x/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1/gems/vkontakte_api-1.1/lib/vkontakte_api/resolver.rb:16:in `method_missing'
    from (irb):22
    from /Users/x/.rbenv/versions/1.9.3-p125/bin/irb:12:in `<main>'irb(main):023:0>

Accessing API as app server

I've trying to execute VK Api methods without user.
So, I get an access token and all works fine.
But when I try to execute one of the methods(users.get or wall.get), I get an error.
Here is example:

1.9.3p125 :001 > token=VkWrapper.get_token
=> "d7ff51c9d7ff51c9d74d0f9364d7cb5f05dd7ffd7ff51c986e0d797d70740239e08994e"
1.9.3p125 :002 > vk = VkontakteApi::Client.new(token)
=> #<VkontakteApi::Client:0x00000002dc1818 @token="d7ff51c9d7ff51c9d74d0f9364d7cb5f05dd7ffd7ff51c986e0d797d70740239e08994e">
1.9.3p125 :003 > user = vk.users.get(uid: '6113239').first
VkontakteApi::Error: VkontakteApi::Error
from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/vkontakte_api-1.1/lib/vkontakte_api/result.rb:31:in extract_result' from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/vkontakte_api-1.1/lib/vkontakte_api/result.rb:14:inprocess'
from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/vkontakte_api-1.1/lib/vkontakte_api/method.rb:14:in call' from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/vkontakte_api-1.1/lib/vkontakte_api/resolver.rb:16:inmethod_missing'
from (irb):3
from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in start' from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands/console.rb:8:instart'
from /home/alex/.rvm/gems/ruby-1.9.3-p125/gems/railties-3.2.11/lib/rails/commands.rb:41:in <top (required)>' from script/rails:6:inrequire'
from script/rails:6:in `

'

friends.get и авторизация через OmniAuth

Привет,

Я использую авторизацию через OmniAuth + Devise, пользователь успешно авторизуется, получая access_token вида:

{
       "provider" => "vkontakte",
            "uid" => 11111,
           "info" => {
              "name" => "Иван Петров",
          "nickname" => "лолка",
        "first_name" => "Иван",
         "last_name" => "Петров",
             "image" => "http://cs9641.userapi.com/u11111/e_204f2538.jpg",
          "location" => "Russia, ",
              "urls" => {
            "Vkontakte" => "http://vk.com/asdf"
        }
    },
    "credentials" => {
             "token" => "2e1263aa122aae2342e112886050242c802dfaee759655574f21021920294a88c5010b3db02b62afc42",
        "expires_at" => 1359197000,
           "expires" => true
    },
          "extra" => {
        "raw_info" => {
                    "uid" => 11111,
             "first_name" => "Иван",
              "last_name" => "Петров",
               "nickname" => "лолка",
            "screen_name" => "asdf",
                    "sex" => 2,
                   "city" => "0",
                "country" => "1",
                 "online" => 0,
                  "photo" => "http://cs9641.userapi.com/u11111/e_204f2538.jpg",
              "photo_big" => "http://cs9641.userapi.com/u11111/a_748e6381.jpg"
        }
    }
}

После чего создаю клиент для ВК, передавая этот токен:

@vk = VkontakteApi::Client.new(access_token)

При попытке получить список друзей

@friends = @vk.friends.get(fields: [:first_name, :last_name, :screen_name])

Получаю ошибку

VKontakte returned an error 113: 'Invalid user id' after calling method 'friends.get' with parameters {"fields"=>"first_name,last_name,screen_name"}.

Понятно, что не передается uid. Если передать его вот так

@friends = @vk.friends.get(uid: current_user.uid, fields: [:first_name, :last_name, :screen_name])

То получаю ошибку

VKontakte returned an error 7: 'Permission to perform this action is denied' after calling method 'friends.get' with parameters {"uid"=>"13610681", "fields"=>"first_name,last_name,screen_name"}.

В настройках приложения запрашиваю через scope права на 'friends'. Согласно VK API uid параметр вообще не обязателен (тогда будет список друзей авторизованного юзера). Мне кажется, какая-то проблема с access_token при инициализации клиента.... Подскажите, как исправить?

scope=email игнорируется

При авторизации есть недокументированная возможность запрашивать емейл пользователя, путём добавления значения email его в scope.

Сейчас емейл урезается (судя по всему тут lib/vkontakte_api/client.rb ) при ответе и возвращается только token, user_id и expires_at.

Непонятная ошибка (Invalid album id)

Вот такой код:

2.0.0p247 :003 > api.photos.get(:gid=>22731510, :aid=>180128624, :extended=>1)
POST https://api.vk.com/method/photos.get?access_token=b832071ec84e01aab0d8cbf0273070985e699436effce3f50dcd88fc930877620765cda606ab8411da7bf
body: "gid=22731510&aid=180128624&extended=1"
POST https://api.vk.com/method/photos.get?access_token=b832071ec84e01aab0d8cbf0273070985e699436effce3f50dcd88fc930877620765cda606ab8411da7bf
body: "ERROR"
{"error":{"error_code":114,"error_msg":"Invalid album id","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"photos.get"},{"key":"access_token","value":"b832071ec84e01aab0d8cbf0273070985e699436effce3f50dcd88fc930877620765cda606ab8411da7bf"},{"key":"ERROR","value":""}]}}
VkontakteApi::Error: VkontakteApi::Error
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/vkontakte_api-1.2/lib/vkontakte_api/result.rb:31:in `extract_result'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/vkontakte_api-1.2/lib/vkontakte_api/result.rb:14:in `process'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/vkontakte_api-1.2/lib/vkontakte_api/method.rb:14:in `call'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/vkontakte_api-1.2/lib/vkontakte_api/resolver.rb:16:in `method_missing'
        from (irb):3
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/railties-3.2.15/lib/rails/commands/console.rb:47:in `start'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/railties-3.2.15/lib/rails/commands/console.rb:8:in `start'
        from /home/proton/.rvm/gems/ruby-2.0.0-p247@test/gems/railties-3.2.15/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
2.0.0p247 :004 > 

При этом иногда всё работает отлично, а иногда - падает, как в примере. Это проблема на стороне vk или в геме?

License missing from gemspec

Some companies will only use gems with a certain license.
The canonical and easy way to check is via the gemspec
via e.g.

spec.license = 'MIT'
# or
spec.licenses = ['MIT', 'GPL-2']

There is even a License Finder to help companies ensure all gems they use
meet their licensing needs. This tool depends on license information being available in the gemspec.
Including a license in your gemspec is a good practice, in any case.

How did I find you?

I'm using a script to collect stats on gems, originally looking for download data, but decided to collect licenses too,
and make issues for missing ones as a public service :)
https://gist.github.com/bf4/5952053#file-license_issue-rb-L13 So far it's going pretty well

Метод send

vk.messages.send(message: 'message')

Выдаёт

TypeError: {:message=>"message"} is not a symbol

Так понимаю, что проблема в том, что вызывается стандартный метод send, а не метод 'send' из api vkontakte

Прошу подсказать простой хак)

NoMethodError: undefined method `b' for nil:NilClass

Вот такая вот штука. -((
upload_url = @vk.photos.get_wall_upload_server(group_id: 78348415, access_token: access_token).upload_url
I, [2015-10-10T12:26:22.568994 #26978] INFO -- : {:method=>"photos.getWallUploadServer", :params=>"access_token=c32086257ebe95227dfefd18c378f3992773e035c6606991017178d68a80bba80710d01e3d8fac4472fe1bb971e24&group_id=78348415"}
E, [2015-10-10T12:26:22.797936 #26978] ERROR -- : #<NoMethodError: undefined method b' for nil:NilClass> NoMethodError: undefined method b' for nil:NilClass
from /usr/local/rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/cgi/util.rb:18:inunescape' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/bundler/gems/vk-ruby-b8f51956c91b/lib/vk-ruby/middlewares/vk_logger.rb:41:in call'
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/faraday-0.9.2/lib/faraday/request/retry.rb:116:incall' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb:15:in call'
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/faraday-0.9.2/lib/faraday/request/multipart.rb:14:incall' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/faraday-0.9.2/lib/faraday/rack_builder.rb:139:in build_response'
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/faraday-0.9.2/lib/faraday/connection.rb:377:inrun_request' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/faraday-0.9.2/lib/faraday/connection.rb:177:in post'
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/vkontakte_api-1.4.2/lib/vkontakte_api/api.rb:18:incall' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/vkontakte_api-1.4.2/lib/vkontakte_api/method.rb:13:in call'
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/vkontakte_api-1.4.2/lib/vkontakte_api/resolver.rb:20:incall_method' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/vkontakte_api-1.4.2/lib/vkontakte_api/namespace.rb:12:in method_missing'
from (irb):7
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/railties-4.0.5/lib/rails/commands/console.rb:90:instart' from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/railties-4.0.5/lib/rails/commands/console.rb:9:in start'
from /var/www/moscoweveryday.com/vendor/bundle/ruby/2.1.0/gems/railties-4.0.5/lib/rails/commands.rb:62:in<top (required)>' from bin/rails:4:in require'
from bin/rails:4:in`

'2.1.0 :008 >

Как указать версию VK API?

Как указать версию VK API?
а то используется старая версия по умолчанию, хотелось бы 5.16 установить для всех методов а то каждый раз передавать v: 5.16 не круто

Feature request: request timeout option

Клиент может огромное время ждать ответ на запрос, хотелось бы иметь возможность установить таймаут. В Faraday давно убрали возможность передать некоторые параметры при инициализации соединения (они оставили что-то похожее, но в любом случае провернуть это с данным клиентом не получается), так что единственный верный способ сейчас установить таймауты — это в блоке инициализации соединения.

Загрузка файлов (Hashie::Mash errcode=1 height=65 width=90)

Пытаюсь загрузить изображение:
VkontakteApi.upload(url: url_for_upload, photo: ['/path/to/image.jpg', 'image/jpeg'])

url_for_upload - получен через метод ads.getUploadURL (ad_format: 1)

получаю ответ от Вк:
Hashie::Mash errcode=1 height=65 width=90
но изображение именно нужного размера (90х65)

Error handling

Привет, столкнулся с необходимостью обрабатывать ответы от api.vk.com, даже если они они вернули ошибку. В иделае хотелось бы иметь возможность всегда получить данные которые возвращает api.vk.com в независимости от того каким был ответ.

генерит не верные ссылки

после поиска аудиозаписей

VkontakteApi::Client.new(session[:token]).audio.get(uid: 167270710)

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

вот что нашел в постах:
"Для каждого пользователя ссылка на файл является уникальной. Прежде, чем получить ссылку, вы должны представится системе. Естественно, браузер и php это разные пользователи. Либо вы должны имитировать через headers/curl браузер."

взято от сюда:
http://hashcode.ru/questions/161857/php-404-not-found-%D0%BF%D1%80%D0%B8-%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B5-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-get_headers-vk

Audiofile upload

Доброго дня.
Есть ли опыт загрузки аудиофайлов на сервер?
Я делаю так:

vk = VkontakteApi::Client.new(Rails.application.secrets.vkontakte_token)
audio = '/var/www/flat.fm/1.mp3'
# получить адрес сервера для загрузки аудиофайла
audio_upload_url = vk.audio.get_upload_server.upload_url
# загрузить на сервер
upload_audio = VkontakteApi.upload(url: audio_upload_url, audio: [audio, MIME::Types.type_for(audio).first.content_type])

Вывод:

POST https://pu.vk.com/c613726/upload.php?act=add_audio&aid=0&api=1&gid=0&hash=0831f52f49516064cc4ce9b98fbc935d&mid=62703936&rhash=1b644f4030f359093033f2dca1efab04
body: #<Faraday::CompositeReadIO:0x000000054513c0 @parts=[#<Parts::FilePart:0x00000005451de8 @head="-------------RubyMultipartPost\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"1.mp3\"\r\nContent-Length: 4931272\r\nContent-Type: application/octet-stream\r\nContent-Transfer-Encoding: binary\r\n\r\n", @foot="\r\n", @length=4931472, @io=#<CompositeReadIO:0x00000005451640 @ios=[#<StringIO:0x00000005451730>, #<UploadIO:0x00000005433a78 @content_type="application/octet-stream", @original_filename="1.mp3", @local_path="/var/www/flat.fm/1.mp3", @io=#<File:/var/www/flat.fm/1.mp3>, @opts={}>, #<StringIO:0x00000005451690>], @index=0>>, #<Parts::EpiloguePart:0x00000005451500 @part="-------------RubyMultipartPost--\r\n\r\n", @io=#<StringIO:0x00000005451460>>], @ios=[#<CompositeReadIO:0x00000005451640 @ios=[#<StringIO:0x00000005451730>, #<UploadIO:0x00000005433a78 @content_type="application/octet-stream", @original_filename="1.mp3", @local_path="/var/www/flat.fm/1.mp3", @io=#<File:/var/www/flat.fm/1.mp3>, @opts={}>, #<StringIO:0x00000005451690>], @index=0>, #<StringIO:0x00000005451460>], @index=0>

Ответ:

#<Hashie::Mash audio="%7B%22error%22%3A-2%7D" hash="e1b4451767363d0599fdc913df64c274" redirect="http://vk.com/audio.php?act=done_add&mid=62703936&aid=0&gid=0&server=613726&audio=%7B%22error%22%3A-2%7D&hash=e1b4451767363d0599fdc913df64c274" server=613726>

Сохранение:

save_audio = vk.audio.save(
    server: upload_audio.server, audio: upload_audio.audio, 
    hash: upload_audio['hash'], artist: "1", title: '1'
)

Ответ:

POST https://api.vk.com/method/audio.save?access_token=d...8
body: "artist=1&audio=%257B%2522error%2522%253A-2%257D&hash=e1b4451767363d0599fdc913df64c274&server=613726&title=1"
{"error":{"error_code":301,"error_msg":"Invalid filename","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"audio.save"},{"key":"artist","value":"1"},{"key":"audio","value":"%7B%22error%22%3A-2%7D"},{"key":"hash","value":"e1b4451767363d0599fdc913df64c274"},{"key":"server","value":"613726"},{"key":"title","value":"1"}]}}
VkontakteApi::Error: VkontakteApi::Error

Ошибка имени файла, оно и понятно %7B%22error%22%3A-2%7D что так быть не должно.
Но вот вопрос: в чём дело?

Пробовал с различными файлами, различных кодеков всевозможных (и lame в том числе), размером от 4 до 125 мегабайт. Причину не могу установть, помогите кто знает в чём проблема, спасибо.

Прошу добавить вывод в консоле запросов к ВК для POST

Прошу добавить вывод в консоле для POST запросов. Мне кажется это было бы оч. удобно, тем более для GET все нормально работает.

А для POST все параметры после токена обрезаются.

POST https://api.vk.com/method/execute?access_token=g77f8gfg8gr8f8g7g7fgahjklesh97g8ffgg868fg6

Заранее спасибо

Invalid hash' after calling method 'photos.saveWallPhoto

Пытаюсь загрузить фото на стену группы

us = app.photos.get_wall_upload_server(gid: 53285720)
up = VkontakteApi.upload(url: us.upload_url, file1: ['quetzal.jpg', 'image/jpeg'])
save = app.photos.save_wall_photo(up)

На save_wall_photo ловлю ошибку

VKontakte returned an error 121: 'Invalid hash' after calling method 'photos.saveWallPhoto' with parameters {"server"=>"323530", "photo"=>"[{\"photo\":\"92404378b6:x\",\"sizes\":[[\"s\",\"323530165\",\"68fd\",\"s4sK_5tIHgE\",67,75],[\"m\",\"323530165\",\"68fe\",\"uVeQeZnIuI8\",116,130],[\"x\",\"323530165\",\"68ff\",\"NIaCeLJVK2g\",540,604],[\"o\",\"323530165\",\"6900\",\"yTYAtgnvOrM\",130,145],[\"p\",\"323530165\",\"6901\",\"RCGA3ZJD2lo\",200,224],[\"q\",\"323530165\",\"6902\",\"m28tR-Zv0kM\",320,358],[\"r\",\"323530165\",\"6903\",\"twGnd3KvNPs\",510,570]],\"kid\":\"9ff2190c02218d9283e776b0496d7b67\"}]", "hash"=>"5d43c84fbf54b52ba6435d318061d875"}.

Можно конечно сохранять фотографии в какой нибудь альбом а потом аттачментом отправлять на стену, но это не то.

Ошибка демо приложения

Демо приложение запросило права на доступ, и после этого выдало ошибку:

We're sorry, but something went wrong.

POST http method

Как с помощью гема можно сделать POST запрос к API VK?
Насколько я понимаю есть только GET запросы. Никаких опций нет.

Тогда как POST запросы очень полезны, есть ситуации при которых запрос не убирается в ограничения GET запроса на длину URL.

Лучше все запросы делать POST по умолчанию.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.