VKHS
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 VK API methods.
Features
- Provides access to VK API via
VKT
monad and vkq
command line tool.
- Supports HTTPS protocol.
- Supports
http_proxy
variables.
- Handles interaction with VK Login form.
VKT
monad is designed to handle long-running tasks and allows programs to recover
from errors like network errors or token expirations.
- Web.VKHS.API.Simple module defines handy API wrappers.
See example
runhaskell
scripts.
TODO
Decrypt 'RepeatedForm' errors
Support storing access-tokens in a temp file
Still no support for captchas, one probably should hack defaultSupervisor
and add them.
File uploading still not functioning.
- Preserve cookies between sessions
- Make user-friendly multy-platform captcha display.
- Fix login automata behaviour regarding captcha failures.
- Re-test existing captcha-related functionality
- Re-implement VK monad as a Free monad special case.
- Runhaskell: handle some standard command line arguments.
- Network connection timeout is not handled by the coroutine supervisor.
- Enhance the way
vkq
accepts arguments, support multy-line messages.
- Fix grammatical mistakes here and there. Any corrections will be kindly accepted.
- Minor issues here and there. Use
git grep FIXME
to find them.
- Write simple RSS-feeder server, see specs
Installing
TODO: Drop a note about Stack
Installing from Hackage
In order to install VKHS, one typically should do the following
$ cabal update
$ cabal install VKHS
Installing from source
$ git clone https://github.com/grwlf/vkhs
$ cd vkhs
$ cabal install
Developing using Nix
The author of this project uses Nix as a main development
platform. The default.nix
file contain Nix expression describing the environment
Developing via Nix shell environment
TODO: Check and document the usage of cabal repl
with this package
$ git clone https://github.com/grwlf/vkhs
$ cd vkhs
$ nix-shell # Entering NIX development shell
# ./ghci.sh # GHCI wrapper script
> :lo Main # Usual development
> ^D
# cabal install # Shell provides access to cabal
# cabal sdist
# ^D
$ ...
Usual development
$ ghci -isrc:app/vkq:app/common
$ ^D
$ cabal install
./mktags.sh
script may be used to build ctags tags
file supported by many
text editors. The script uses hasktags
via haskdogs
tools, available on
Hackage.
$ haskdogs
VKQ command line application
vkq
is a command line tool which demonstrates API usage. It can be used for
logging in, -downloading music- and reading wall messages. Call vkq --help
or
vkq command --help
to read online help.
Logging in to VK
In order to send API requests, the VK client typically needs an access token.
vkq
receives it as a result of signing in. Once received, the token may be
saved to VKQ_ACCESS_TOKEN
environment variable, into .vkhs-access-token
file or passed to future instances directly using -a
argument.
Saving access token in the environment variable
$ vkq login user@mail.org pass123
d8a41221616ef5ba19537125dc0349bad9d529fa15314ad765911726fe98b15185ac41a7ca2c62f3bf4b9
$ export VKQ_ACCESS_TOKEN=d785932b871f096bd73aac6a35d7a7c469dd788d796463a871e5beb5c61bc6c96788ec2
Alternatively, result may be achieved using --eval
option
$ eval `vkq login user@mail.org pass123 --eval`
Saving access token to file
VKQ will cache the access token into a file. Newer versions of VKHS have
--access-token-flag
option enabled by default. Set it to empty value to
disable the caching.
vkq
allows user to call arbitrary API method. The generic interface is as follows:
$ vkq api --help
Usage: vkq api [--verbose] [--req-per-sec N] [--interactive] [--appid APPID]
[--user USER] [--pass PASS] [-a ACCESS_TOKEN]
[--access-token-file FILE] METHOD [PARAMS] [--pretty]
Call VK API method
Available options:
--verbose Be verbose
--req-per-sec N Max number of requests per second
--interactive Allow interactive queries
--appid APPID Application ID, defaults to VKHS
--user USER User name or email
--pass PASS User password
-a ACCESS_TOKEN Access token. Honores VKQ_ACCESS_TOKEN environment
variable
--access-token-file FILE Filename to store actual access token, should be used
to pass its value between sessions
METHOD Method name
PARAMS Method arguments, KEY=VALUE[,KEY2=VALUE2[,,,]]
--pretty Pretty print resulting JSON
-h,--help Show this help text
The session may look like the following:
$ vkq api 'users.get'
{"response":[{"first_name":"Сергей","uid":222222,"last_name":"Миронов"}]}
$ vkq api 'messages.send' 'user_id=333333' 'message="Hi there!!!"'
{"response":57505}
$ vkq api 'groups.search' 'q=Haskell'
{
"response": [
30,
{
"screen_name": "ml_mat_asm",
"photo": "https://pp.userapi.com/c638217/v638217626/54113/v5Ib71-dDzo.jpg",
"is_closed": 0,
"photo_medium": "https://pp.userapi.com/c638217/v638217626/54112/Nu_si987vOc.jpg",
"name": "Matlab | Assembler | MathCAD | Haskell | Prolog",
"photo_big": "https://pp.userapi.com/c638217/v638217626/54111/HGnUbgUorVU.jpg",
"gid": 78651325,
"is_admin": 0,
"is_member": 0,
"type": "page"
},
...
}
VKHS library/runhaskell mode
Starting from 1.7.2 the library supports runhaskell-mode.
#!/usr/bin/env runhaskell
{-# LANGUAGE RecordWildCards #-}
import Web.VKHS
import Web.VKHS.Imports
main :: IO ()
main = runVK_ defaultOptions $ do
Sized cnt cs <- getCountries
forM_ cs $ \Country{..} -> do
liftIO $ tputStrLn co_title
When executed, the program asks for login/password and outputs list of countries
known to VK. getCountries
and several other methods are defined in
Web.VKHS.API.Simple
.
The distribuption contains ./app/runhaskell
folder with a couple of examples.
Debugging
Verbosity may be increased using --verbose
flag or o_verbose
field of
GenericOptions
. Login automata saves latest.html
file during operation.
References
License
BSD3 license
Copyright (c) 2018, Sergey Mironov grrwlf@gmail.com