VK API (Java 8)

  1. public class VkApi {
  2.  
  3.     private static final String AUTH_URL = "https://oauth.vk.com/authorize?client_id={APP_ID}&scope={PERMISSIONS}&redirect_uri={REDIRECT_URI}&display={DISPLAY}&v={API_VERSION}&response_type=token";
  4.  
  5.     private static final String API_REQUEST = "https://api.vk.com/method/{METHOD}?{PARAMS}&access_token={TOKEN}&v=5.21";
  6.  
  7.     public static VkApi with(String appId, String accessToken) throws IOException {
  8.         return new VkApi(appId, accessToken);
  9.     }
  10.  
  11.     private final String accessToken;
  12.  
  13.     private VkApi(String appId, String accessToken) throws IOException {
  14.         this.accessToken = accessToken;
  15.         if (accessToken == null || accessToken.isEmpty()) {
  16.             auth(appId);
  17.             throw new Error("Need access token");
  18.         }
  19.     }
  20.  
  21.     private void auth(String appId) throws IOException {
  22.         String reqUrl = AUTH_URL
  23.             .replace("{APP_ID}", appId)
  24.             .replace("{PERMISSIONS}", "photos,messages")
  25.             .replace("{REDIRECT_URI}", "https://oauth.vk.com/blank.html")
  26.             .replace("{DISPLAY}", "page")
  27.             .replace("{API_VERSION}", "5.21");
  28.         try {
  29.             Desktop.getDesktop().browse(new URL(reqUrl).toURI());
  30.         } catch (URISyntaxException ex) {
  31.             throw new IOException(ex);
  32.         }
  33.     }
  34.  
  35.     public String getDialogs() throws IOException {
  36.         return invokeApi("messages.getDialogs", null);
  37.     }
  38.  
  39.     public String getHistory(String userId, int offset, int count, boolean rev) throws IOException {
  40.         return invokeApi("messages.getHistory", Params.create()
  41.             .add("user_id", userId)
  42.             .add("offset", String.valueOf(offset))
  43.             .add("count", String.valueOf(count))
  44.             .add("rev", rev ? "1" : "0"));
  45.     }
  46.  
  47.     public String getAlbums(String userId) throws IOException {
  48.         return invokeApi("photos.getAlbums", Params.create()
  49.             .add("owner_id", userId)
  50.             .add("photo_sizes", "1")
  51.             .add("thumb_src", "1"));
  52.     }
  53.  
  54.     private String invokeApi(String method, Params params) throws IOException {
  55.         final String parameters = (params == null) ? "" : params.build();
  56.         String reqUrl = API_REQUEST
  57.             .replace("{METHOD}", method)
  58.             .replace("{TOKEN}", accessToken)
  59.             .replace("{PARAMS}&", parameters);
  60.         final StringBuilder result = new StringBuilder();
  61.         final URL url = new URL(reqUrl);
  62.         try (InputStream is = url.openStream()) {
  63.             BufferedReader reader = new BufferedReader(new InputStreamReader(is));
  64.             reader.lines().forEach(result::append);
  65.         }
  66.         return result.toString();
  67.     }
  68.  
  69.     private static class Params {
  70.  
  71.         public static Params create() {
  72.             return new Params();
  73.         }
  74.  
  75.         private final Map<String, String> params;
  76.  
  77.         private Params() {
  78.             params = new HashMap<>();
  79.         }
  80.  
  81.         public Params add(String key, String value) {
  82.             params.put(key, value);
  83.             return this;
  84.         }
  85.  
  86.         public String build() {
  87.             if (params.isEmpty()) return "";
  88.             final StringBuilder out = new StringBuilder();
  89.             params.keySet().stream().forEach(key -> {
  90.                 out.append(key).append('=').append(params.get(key)).append('&');
  91.             });
  92.             return out.toString();
  93.         }
  94.     }
  95. }
Для работы нужно создать Standalone-приложение и при первом запуске подтвердить запрос приложения и скопировать access_token из адресной строки.
При желании можно добавить свои методы, которые описаны в документации.
Пример:
  1. VkApi vkApi = VkApi.with(APP_ID, ACCESS_TOKEN);
  2. System.out.println(vkApi.getAlbums("140381946"));
Формат полученных данных - JSON. Распарсить можно библиотекой org.json

Ссылка на последнюю версию кода: https://gist.github.com/aNNiMON/483434f042fadb397eaa

Реклама

Мы в соцсетях

tw tg yt gt