This branch contains a wrapper for VK API.
VK's private audio API's can be used only with tokens from official apps or special third party apps (for ex. Kate mobile). User agent of that app must be used when talking to VK when using such tokens.
It's written using Lumen, micro web framework by Laravel
The wrapper searches via API, caches the results. Tries to recover from captchas. Everything else is same as in original datmusic-api.
This is how I was able to get tokens using Kate Mobile app:
-
Use proxy to intercept HTTPS requests made by Kate Mobile app.
Example apps: mitmproxy, Fiddler, Charles proxy, or Wireshark
Personal recommendation: mitmproxy with web module. Easy installation, simple ui, easy SSL root certificate installation etc.
-
Listen for requests to get
refreshToken
After Kate's login, VK will give an access token: this token won't work with Audio API's ("Token confirmation required").
Open Audios screen from the app, and you will see in your network interceptor that Kate will get
Token confirmation required
from VK. After which Kate will register something in Google Cloud Messaging to generatereceipt
field which will it use to getrefreshToken
by sending it to private APIauth.refreshToken
along with current token. After all,auth.refreshToken
will return a new token. This is the token you need to save to be able to use it in this branch.
Note: Try to use same IP's while doing it all.
Search results are cached for 24 hours by default.
https://example.com/search?q={query}&page={page}
In vk-api branch, you can get errors in search responses. Captchas are the only recoverable errors. Example captcha error response:
{
"status": "error",
"error": {
"message": "Captcha!",
"captcha_index": 1,
"captcha_id": 123456789,
"captcha_img": "https://url-to-captcha"
}
}
Client app will need to show captcha_img
to user, and then retry search request with 3 additional queries:
captcha_index
returned captcha index.captcha_id
returned captcha id.captcha_key
user's answer to showncaptcha_img
captcha.
https://example.com/search?q={query}&page={page}&captcha_index={captcha index}&captcha_id={captcha id}&captcha_key={captcha answer}
https://example.com/dl/{search_hash}/{audio_hash}
(force download with proper file name (Artist - Title.mp3
))
https://example.com/stream/{search_hash}/{audio_hash}
(redirects to mp3 file)
https://example.com/bytes/{search_hash}/{audio_hash}
(returns file size of mp3 in bytes)
Default convertable bitrates are: 64
, 128
, 192
You need to install ffmpeg
to your server to make it work and change path to binary in config file.
https://example.com/dl/{search_hash}/{audio_hash}/{bitrate}
https://example.com/stream/{search_hash}/{audio_hash}/{bitrate}
Search hash calculated by request params (query and page).
Audio hash calculated by audio id and owner id.
Default hashing algorithm is crc32
. I chose this because of speed, short length, and I didn't need cryptographic hashing. You can change it in config if you want.
As far as I know, mp3 urls of VK songs are valid only for 24 hours. So we can cache search results only for 24 hours.
By default, when using S3 as storage, mp3 files can be cached forever (as long as mp3 file is present in bucket).
Default caching driver is files
. Thanks to Laravel Cache system, it can be easily configured to different cache drivers.
Redis cache driver is configured. Just change driver and set credentials in .env.
You can enable or disable S3 storage option in config file (enabled by default).
When it's enabled, mp3 files will be downloaded to s3 bucket instead of local disk.
Download/stream links will be redirected to S3 servers.
Follow instructions described in here. or see short version in this comment;
Please browse code or open an issue to understand more.
Open an issue or contact me at [email protected] for help with deployment.
Copyright (C) 2017 Alashov Berkeli
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.