Иногда возникает необходимость автоматизировать некоторые действия в какой-нибудь абстрактной, или не совсем абстрактной, социальной сети, такой как vk.com. Например, в последнее время были популярны обсуждения на тему скачивания своей аудиоколлекции на постоянные носители.
Здесь будем рассматривать только один частный случай - API для vk.com.
Итак, задача - собирать сообщения из интересующей группы, чтобы не загромождать кодом этот пост, построим лишь простой "скелет", для возможных будущих наработок.
Кратко о принципе работы интерфейса, предоставляемого разработчиками этой небезызвестной социальной сети :
Здесь будем рассматривать только один частный случай - API для vk.com.
Итак, задача - собирать сообщения из интересующей группы, чтобы не загромождать кодом этот пост, построим лишь простой "скелет", для возможных будущих наработок.
Кратко о принципе работы интерфейса, предоставляемого разработчиками этой небезызвестной социальной сети :
- Для работы через API вам потребуется stand-alone приложение, создать его можно вот здесь. Там все довольно просто, выбираете название и тип. Вообще говоря, создавать свое приложение вовсе не обязательно, можете и мое использовать - дело в том, что при дальнейшем запросе определенных прав для данного приложения, мы получим токен, и этот токен самому приложению известен не будет, следовательно, даже если вы используете мое приложение, я не смогу получить доступ к вашей конфиденциальной информации.
- Дальше, для авторизации будет использоваться протокол OAuth, все что нужно сделать на этом шаге - создать правильную строку запроса, об этом расписано вот тут.
APP_ID - идентификатор приложения, которое вы создали на предыдущем шаге.https://oauth.vk.com/authorize? client_id=APP_ID& scope=PERMISSIONS& redirect_uri=REDIRECT_URI& display=DISPLAY& v=API_VERSION& response_type=token
PERMISSONS - те права, которые вы хотел бы предоставить вашему приложению, их список можно найти вот тут, там же есть и пример.
REDIRECT_URI - страничка, на которую вас перенаправит, после предоставления прав, для нашего случая можно использовать :
В адресной строке будет токен, который, в общем, и является конечной целью.https://oauth.vk.com/blank.html
Остальный опции сейчас не представляют для нас интереса, по-этому просто перечислю выбранные для них значения :
DISPLAY - page
API_VERSION - 5.0
В response_type указываем, что нам нужен только токен. - На этом шаге у нас уже есть необходимый токен, все что теперь осталось сделать - открыть документацию на интересующий нас метод API и составить верный запрос.
Итак, мы планируем запросить все записи со стены в определенной группе, для этого идеально подойдет wall.get, сам запрос должен выглядеть следующим образом :
METHOD_NAME = WALL.GEThttps://api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN
Перечислю нужные параметры :
domain - краткое название группы, сейчас все пытаются "выделиться" и заменюят ID группы в адресной строке, на что-то более-менее читабельное. (если же к целевой группе нужно обратиться по идентификатору, то тут вам возможно подойдет owner_id)
count - количество возвращаемых записей
access_token - тот самый токен, что мы уже получили. Тут есть некоторая тонкость, к стене открытой группы можно получить доступ и без указания уникального токена, но для того, чтобы получить записи из закрытой группы, в которой состоим, нужно обязательно указать токен, рассматривайте его как пропуск. - Вот в общем и все. Можно приступить к написанию кода.
Получаемый ответ будет в формате JSON, перечислю библиотеки, которые будем использовать :
Из HttpClient нам понадобятся - httpcore, httpclient, commons-logging
Ниже приведу непосредственно код, он прост и думаю всем будет понятен.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
Комментариев нет:
Отправить комментарий