Provides access to Vkontakte social network via public API http://github.com/grwlf/vkhs

Latest on Hackage:1.7.2

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD3 licensed by Sergey Mironov
Maintained by grrwlf@gmail.com


VKHS provides access to Vkontakte social network, popular mainly in Russia. Library can be used to login into the network as a standalone application (OAuth implicit flow as they call it). Having the access token, it is possible to call various API methods to query audio files or retrieve wall messages. For now, vkhs offers limited error detection and no captcha support.


In order to install VKHS, type:

$ cabal update
$ cabal install VKHS

Note, that VKHS uses curlhs and should be linked with libcurl.so. Normally, cabal handles it without problems.


VKQ is a command line tool which demonstrates API usage. It can be used for logging in, downloading music and reading wall messages.

Log in

Here is an example session: Login first

]$ vkq login user@mail.org pass123

VKQ returns three values. First is a access token which is required to execute future API requests. VKQ reads it from VKQ_ACCESS_TOKEN environment variable so we have to set it up

$ export VKQ_ACCESS_TOKEN=d785932b871f096bd73aac6a35d7a7c469dd788d796463a871e5beb5c61bc6c96788ec2

Download audio

Now, lets list first 10 audio files I have:

$ vkq music -l | head -n 10
910727_456939044 http://cs1-29v4.vk-cdn.net/p36/d36d0fac4baf0d.mp3 Алёнушка 1989 муз Никиты Богословского - ст Александра Коваленкова
910727_456939043 http://cs1-35v4.vk-cdn.net/p7/2629cc1c9e82d7.mp3 Первое апреля
910727_456939042 http://cs5078.vk.me/u39450508/audios/b65093a7caea.mp3 Травы травы травы не успели от росы серебрянной согнуться и такие нежные напевы почему-то прямо в сердце льются
910727_456939041 http://cs1-35v4.vk-cdn.net/p12/423bca91340edc.mp3 Moving On
910727_456939038 http://cs1-37v4.vk-cdn.net/p5/23c658ff1d9a43.mp3  Не для меня придёт весна
910727_456939037 http://cs1-17v4.vk-cdn.net/p4/e67571789b026e.mp3 Каждый выбирает для себя
910727_456939034 http://cs536114.vk.me/u262757964/audios/8b0e36ee4ad5.mp3 Black Fortress Kings Bounty Dark Side OST
910727_456939031 http://cs613118.vk.me/u911727/audios/7bd0a650905e.mp3 Вокализ минус пример
910727_456939040 http://cs611628.vk.me/u911727/audios/d5a8eff365aa.mp3  Без названия
910727_456939028 http://cs536217.vk.me/u64604046/audios/a4ab2075af94.mp3 The Extasy of Gold

Ok, the link can be used to download the file using wget, but vkq offers some renaming options, so lets use the latter instead:

$ vkq music -o . 910727_456939043 910727_456939031
Polite Dance Song
./The Bird And The Bee - Polite Dance Song.mp3
L'estasi Dell'oro (The Ecstasy Of Gold)
./Ennio Morricone - Lestasi Delloro The Ecstasy Of Gold.mp3

Polite dance song and Ecstasy of gold mp3s will appear in the current folder.

Custom API calls

vkq allows user to call arbitrary API method. The format is as follows:

Usage: vkq call [--verbose] [--req-per-sec N] [--interactive] [--appid APPID]
                [--user USER] [--pass PASS] [-a ACCESS_TOKEN] METHOD PARAMS

For example, lets call ausio.search method to get some Beatles records:

$ vkq call audio.search q=Beatles --pretty

  { "response": [
        "lyrics_id": "6604412",
        "url": "http://cs1-36v4.vk-cdn.net/p16/59674dd8717db2.mp3?extra=k0s2ja3l6pq6aIDOEW5y5XUCs2--JLX9wZpzOT3iuSnZPR-DNhJSF075NUhICB_szMOKKlVJFFlqLlg691q6cKhwiGZgTRU1oAimXzXY396cfNAHnotc8--7w-0xnvoPK6qVoI8",
        "aid": 85031440,
        "title": "Twist and Shout  ",
        "genre": 1,
        "owner_id": 9559206,
        "duration": 156,
        "artist": "The Beatles"

VKHS library/Runhaskell mode

Starting from 1.7.2 there are initial support for RunHaskell-mode. Consider the following example:

#!/usr/bin/env runhaskell
{-# LANGUAGE RecordWildCards #-}

import Prelude ()
import Web.VKHS
import Web.VKHS.Imports

main :: IO ()
main = runVK_ defaultOptions $ do
  Sized cnt cs <- getCountries
  forM_ cs $ \Country{..} -> do
    liftIO $ putStrLn co_title

When executed, the program should ask for login and password and output list of countries known to VK. Consider reviewing Web.VKHS.API.Simple where getCountries and several other methods are defined. Also, check the source code of the vkq application for more elaborated usage example.


RepatedForm message means that VKHS tries to fill the web form with available data, but the form appears again. Typically, that means that the password wa invalid or captcha is required.



BSD3 license

Copyright (c) 2014, Sergey Mironov



  • Decrypt 'RepeatedForm' errors
  • Show capchas to users if required
  • Re-implement VK monad as a Free monad special case
  • Runhaskell: handle some standard command line arguments
  • Support storing access-tokens in a temp file

Version 1.7.2

  • Initial support for runhaskell mode

Version 1.7.1

  • Support setting IDv2 tags for downloaded audio files
  • CLI: Fix 'call' command output
  • CLI: Fix 'music' command naming

Version 1.6.0

  • Use coroutine-based engine, offering smooth error handling
  • Use pipes-http as network backend
comments powered byDisqus