среда, 8 января 2014 г.

Java работа с API VK

Иногда возникает необходимость автоматизировать некоторые действия в какой-нибудь абстрактной, или не совсем абстрактной, социальной сети, такой как vk.com. Например, в последнее время были популярны обсуждения на тему скачивания своей аудиоколлекции на постоянные носители.
Здесь будем рассматривать только один частный случай - API для vk.com.
Итак, задача - собирать сообщения из интересующей группы, чтобы не загромождать кодом этот пост, построим лишь простой "скелет", для возможных будущих наработок.

Кратко о принципе работы интерфейса, предоставляемого разработчиками этой небезызвестной социальной сети :
  • Для работы через API вам потребуется stand-alone приложение, создать его можно вот здесь. Там все довольно просто, выбираете название и тип. Вообще говоря, создавать свое приложение вовсе не обязательно, можете и мое использовать - дело в том, что при дальнейшем запросе определенных прав для данного приложения, мы получим токен, и этот токен самому приложению известен не будет, следовательно, даже если вы используете мое приложение, я не смогу получить доступ к вашей конфиденциальной информации. 
  • Дальше, для авторизации будет использоваться протокол OAuth, все что нужно сделать на этом шаге - создать правильную строку запроса, об этом расписано вот тут.
    https://oauth.vk.com/authorize? 
     client_id=APP_ID& 
     scope=PERMISSIONS& 
     redirect_uri=REDIRECT_URI& 
     display=DISPLAY& 
     v=API_VERSION& 
     response_type=token 
    APP_ID - идентификатор приложения, которое вы создали на предыдущем шаге.
    PERMISSONS - те права, которые вы хотел бы предоставить вашему приложению, их список можно найти вот тут, там же есть и пример.
    REDIRECT_URI - страничка, на которую вас перенаправит, после предоставления прав, для нашего случая можно использовать :
    https://oauth.vk.com/blank.html
    
    В адресной строке будет токен, который, в общем, и является конечной целью.
    Остальный опции сейчас не представляют для нас интереса, по-этому просто перечислю выбранные для них значения :
    DISPLAY - page
    API_VERSION - 5.0
    В response_type указываем, что нам нужен только токен.
  • На этом шаге у нас уже есть необходимый токен, все что теперь осталось сделать - открыть документацию на интересующий нас метод API и составить верный запрос.
    Итак, мы планируем запросить все записи со стены в определенной группе, для этого идеально подойдет wall.get, сам запрос должен выглядеть следующим образом :
    https://api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN
    
    METHOD_NAME = WALL.GET
    Перечислю нужные параметры :
    domain - краткое название группы, сейчас все пытаются "выделиться" и заменюят ID группы в адресной строке, на что-то более-менее читабельное. (если же к целевой группе нужно обратиться по идентификатору, то тут вам возможно подойдет owner_id)
    count - количество возвращаемых записей
    access_token - тот самый токен, что мы уже получили. Тут есть некоторая тонкость, к стене открытой группы можно получить доступ и без указания уникального токена, но для того, чтобы получить записи из закрытой группы, в которой состоим, нужно обязательно указать токен, рассматривайте его как пропуск.
  • Вот в общем и все. Можно приступить к написанию кода.
Получаемый ответ будет в формате JSON, перечислю библиотеки, которые будем использовать :
  1. json-simple
  2. commons-io
  3. HttpClient
Из HttpClient нам понадобятся - httpcore, httpclient, commons-logging
Ниже приведу непосредственно код, он прост и думаю всем будет понятен.

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.utils.URIBuilder;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.IOException;
import java.io.StringWriter;
public class VKScribe {
public VKScribe() {
URIBuilder uriBuilder = new URIBuilder();
uriBuilder.setScheme("https").setHost("api.vk.com").setPath("/method/wall.get")
.setParameter("domain", GROUP_DOMAIN)
.setParameter("access_token", ACCESS_TOKEN)
.setParameter("count", "10");
HttpResponse response = HttpConnectionAgent.connectResponse(uriBuilder);
Integer status = response.getStatusLine().getStatusCode();
if (status == 200) {
StringWriter content = new StringWriter();
try {
IOUtils.copy(response.getEntity().getContent(), content);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
JSONParser parser = new JSONParser();
try {
JSONObject jsonResp = (JSONObject) parser.parse(content.toString());
JSONArray postsList = (JSONArray) jsonResp.get("response");
JSONObject unicPost = null;
for (int i=1; i < postsList.size(); i++) {
unicPost = (JSONObject) postsList.get(i);
System.out.println(unicPost.get("text"));
}
} catch (ParseException e) {
e.printStackTrace();
System.exit(-1);
}
}
}
}
view raw gistfile1.java hosted with ❤ by GitHub

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public abstract class HttpConnectionAgent {
public static HttpResponse connectResponse(URIBuilder uriBuilder) {
URI uri = null;
try {
uri = uriBuilder.build();
} catch (URISyntaxException e) {
e.printStackTrace();
System.exit(-1);
}
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(uri);
HttpResponse response = null;
try {
response = client.execute(request);
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
return response;
}
}
view raw gistfile1.java hosted with ❤ by GitHub

Комментариев нет:

Отправить комментарий