Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Java SDK for VK API

Build Status

Java library for VK API interaction, includes OAuth 2.0 authorization and API methods. Full VK API features documentation can be found here.

This library has been created using the VK API JSON Schema. It can be found here. It uses VK API version 5.199.

1. Prerequisites

2. Dependencies

VK Java SDK uses:

3. Latest release

Latest version: Maven

To add a dependency on VK Java SDK using Maven, use the following:

<dependency>
<groupId>com.vk.api</groupId>
<artifactId>sdk</artifactId>
<version>LATEST_VERSION</version>
</dependency>

To add a dependency using Gradle:

dependencies {
compile 'com.vk.api:sdk:LATEST_VERSION'
}

4. Prepare for using

Create a new VK application here to use VK Java SDK. Please choose an application type depending on which authorization pattern you need. It should be "Standalone" for Direct Authorization, "Web site" for Authorization Code Flow for server side requests and any of them for Client Credentials Flow.

Fill in the title, confirm the action via SMS and you will be redirected to the application settings page.

You will need your application ID (referenced as API_ID in the documentation), secure key (CLIENT_SECRET) and authorized redirect URI (REDIRECT_URI).

5. Logging

VK Java SDK uses SLF4J for logging. If you want to turn on logging, you must include a plugin that bridges SLF4J with a concrete logging framework. See SLF4J documentation.

JDK Logger

Maven:

<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>

Gradle:

dependencies {
compile group: 'org.slf4j', name: 'slf4j-api', version: '2.0.9'
}

Add logging.properties file with configuration (located at your src/main/resources path):

.level=INFO
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Set java.util.logging.config.file system property:

-Djava.util.logging.config.file=logging.properties

log4j2

Maven:

<dependencies>
<!-- Binding for Log4J -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j API and Core implementation required for binding -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>

Gradle:

dependencies {
//Binding for Log4J -->
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.20.0'
//Log4j API and Core implementation required for binding
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.20.0'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.20.0'
}

Add log4j2.xml file with configuration (located at your src/main/resources path):

<?xml version="1.0" encoding="UTF-8" ?>
<Configurationstatus="info">
<Appenders>
<Consolename="Console"target="SYSTEM_OUT">
<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Rootlevel="info">
<AppenderRefref="Console"/>
</Root>
</Loggers>
</Configuration>

6. Initialization

Create VkApiClient object using the following code:

TransportClienttransportClient = newHttpTransportClient();
VkApiClientvk = newVkApiClient(transportClient);

Note that you can use your own transport client. We use Apache Http Client.

7. Authorization

The library provides several authorization flows based on OAuth 2.0 protocol implementation in vk.com API. Please read the full documentation before you start.

7.1. Authorization Code Flow for User

OAuth 2.0 Authorization Code Flow allows calling methods from the server side.

This flow includes two steps — obtaining an authorization code and exchanging the code for an access token. Primarily you should obtain the "code" (manual) and then use this method to complete the flow:

UserAuthResponseauthResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

This takes your application ID, secure key, redirect URI, enumerated scopes and code obtained on the previous step of the flow.

When succeed, a UserActor object is created. You can call VK API methods on behalf of a user.

7.2. Authorization Code Flow for Community

The difference from the previous flow is that you send the groupId parameter to obtain the community's access token. Please read the full manual.

GroupAuthResponseauthResponse = vk.oAuth()
.groupAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
GroupActoractor = newGroupActor(groupId, authResponse.getAccessTokens().get(groupId));

When succeed, a GroupActor object is created. You can call VK API methods on behalf of a community.

7.3. Handling need_validation error

Proceeding each of previous authorization flows you can receive a "need_validation" error. Use the following code to handle the error:

UserAuthResponseauthResponse;
try {
authResponse = vk.oAuth()
.userAuthorizationCodeFlow(APP_ID, CLIENT_SECRET, REDIRECT_URI, code)
.execute();
} catch (OAuthExceptione) {
e.getRedirectUri();
}
UserActoractor = newUserActor(authResponse.getUserId(), authResponse.getAccessToken());

7.4. Client Credentials Flow

This flow allows to interact with API service methods with "secure" prefix. Use this method:

ServiceClientCredentialsFlowResponseauthResponse = vk.oAuth()
.serviceClientCredentialsFlow(APP_ID, CLIENT_SECRET)
.execute();
ServiceActoractor = newServiceActor(APP_ID, authResponse.getAccessToken());

When succeed, a ServiceActor object is created. You can call VK API methods on behalf of an app.

8. API Requests

You can find the full list of VK API methods here.

Request sample

GetResponsegetResponse = vk.wall().get(actor)
.ownerId(1)
.count(100)
.offset(5)
.filter("owner")
.execute();

Request sample with common method parameters:

List<UserXtrCounters> users = vk.users().get(actor)
.userIds("1")
.fields(UserField.VERIFIED, UserField.SEX)
.lang(Lang.EN)
.execute();

The full list of common parameters is available on this page.

Request sample for uploading and posting photos on user wall.

PhotoUploadserverResponse = vk.photos().getWallUploadServer(actor).execute();
WallUploadResponseuploadResponse = vk.upload().photoWall(serverResponse.getUploadUrl(), file).execute();
List<Photo> photoList = vk.photos().saveWallPhoto(actor, uploadResponse.getPhoto())
.server(uploadResponse.getServer())
.hash(uploadResponse.getHash())
.execute();
Photophoto = photoList.get(0); StringattachId = "photo" + photo.getOwnerId() + "_" + photo.getId();
GetResponsegetResponse = vk.wall().post(actor)
.attachments(attachId)
.execute();

9. Execute requests

You can find more information about execute method here.

Code

JsonElementresponse = vk.execute().code(actor, "return API.wall.get({\"count\": 1})")
.execute();

Storage function

JsonElementresponse = vk.execute().storageFunction(actor, "foo")
.funcV(2) // set storage function version
.unsafeParam("user_id", 1) // set storage function argument
.execute();

Batch requests

JsonElementresponse = vk.execute().batch(actor,
vk.database().getChairs(1).count(10),
vk.database().getCities(1),
vk.groups().getMembers(actor).groupId(groupId)
).execute();

10. Error Handling

Common Example

try {
vk.wall().post(actor)
.message("Hello world")
.execute();
} catch (ApiWallLinksForbiddenExceptione) {
// Links posting is prohibited
} catch (ApiExceptione) {
// Business logic error
} catch (ClientExceptione) {
// Transport layer error
}

Captcha error handling

StringcaptchaSid = null;
StringcaptchaImg = null;
try {
vk.wall().post(actor).message("Hello world").execute();
} catch (ApiCaptchaExceptione) {
captchaSid = e.getCaptchaSid();
captchaImg = e.getCaptchaImg();
}
//Showing captcha image...if (captchaImg != null) {
vk.wall().post(actor)
.message("Hello world")
.captchaSid(captchaSid)
.captchaKey(captchaKey)
.execute();
}

11. Callback API handler

Override methods from CallbackApi class for handling events

publicclassCallbackApiHandlerextendsCallbackApi {
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println(message.getText());
}
}

12. Callback API Long Poll handler

Enable Callback API Long Poll for needed group and specify which events should be tracked

HttpTransportClienthttpClient = HttpTransportClient.getInstance();
VkApiClientvk = newVkApiClient(httpClient);
vk.groups().setLongPollSettings(groupActor).enabled(true)
.wallPostNew(true)
.messageNew(true)
.execute();

(WIP) Override methods from CallbackApiLongPoll class for handling events and create needed constructors

publicclassCallbackApiLongPollHandlerextendsCallbackApiLongPoll {
publicCallbackApiLongPollHandler(VkApiClientclient, UserActoractor, IntegergroupId) {
super(client, actor, groupId);
}
publicCallbackApiLongPollHandler(VkApiClientclient, GroupActoractor) {
super(client, actor);
}
@OverridepublicvoidmessageNew(IntegergroupId, Messagemessage) {
System.out.println("messageNew: " + message.toString());
}
@OverridepublicvoidwallPostNew(IntegergroupId, WallPostwallPost) {
System.out.println("wallPostNew: " + wallPost.toString());
}
}

In order to use the created CallbackApiLongPollHandler which overrides methods from CallBackApiLongPoll, the instance of it needs to be created and method run called

CallbackApiLongPollHandlerhandler = newCallbackApiLongPollHandler(vk, groupActor);
handler.run();

13. Streaming API

Initialization

//Init clientsTransportClienttransportClient = newHttpTransportClient();
VkApiClientvkClient = newVkApiClient(transportClient);
VkStreamingApiClientstreamingClient = newVkStreamingApiClient(transportClient);
//Create service actorIntegerappId = 4123123;
StringaccessToken = "sadf0asdf0asdfsadfassadf0asdf0asdfsadfassadf0asdf0asdfsadfas";
ServiceActoractor = newServiceActor(appId, accessToken);
//Get streaming actorGetServerUrlResponsegetServerUrlResponse = vkClient.streaming().getServerUrl(actor).execute();
StreamingActoractor = newStreamingActor(getServerUrlResponse.getEndpoint(), getServerUrlResponse.getKey());

Add rule

//Create ruleStringtag = "1";
Stringvalue = "ok";
StreamingResponseresponse = streamingClient.rules().add(actor, tag, value).execute();

Get rules

//Get rulesStreamingGetRulesResponseresponse = streamingClient.rules().get(actor).execute();

Delete rule

//Delete ruleStringtag = "1";
streamingClient.rules().delete(actor, tag).execute();

Stream handler

Implement handle method from StreamingEventHandler class for handling stream events

streamingClient.stream().get(actor, newStreamingEventHandler() {
@Overridepublicvoidhandle(StreamingCallbackMessagemessage) {
System.out.println(message);
}
}).execute();

14. Usage Example

As an SDK usage example we have released the YouTrack bot. The documentation can be found here.

About

Java library for working with VK API

Topics

Resources

Contributing

Stars

297 stars

Watchers

40 watching

Forks

Releases

Packages

Used by

Contributors

Languages