Skip to content

SantaSpeen/VkApi.Java

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

VkApi

CircleCI License

  • Language: [RU] , [EN]

Navigation:

  1. Features
  2. Use
    1. Базовое представление библиотеки
    2. Работа с LongPoll API
    3. Парсинг LongPool и Сообщений
  3. Links

Features:

  • Простое использование.

  • Встроенный обработчик лонгпула.

  • Встроенный парсинг лонгпула.

  • Встроенный парсинг сообщений.

  • Проект основан на org.json.

Use:

База

Ниже будет пример. паст scr/tests/SimpleUseAPI.java

  1. Скачиваем latest JAR (Скоро выложу в maven)

  2. Инициализируем: final vkApi api = new vkApi("TOKEN");

  3. Выбераем тип:

    1. Если токен группы, можно ничего не делать
    2. Если токен пользывателя: api.setAccountType(vkApi.USER);
  4. Вызываем любой метод по шаблону: String param = api.method("VK_API.METHOD", "PARAM1=some&PARAM2=some&PARAM3=some")

    • Важно!:

      • param - это уже поле response
      • Всё обращение к апи приходит в формате String. Сделано для совместимости.
    • Фаст-методы (самые используемые методы):

      • api.messagesSend(PEER_ID, MESSAGE) - messages.send
      • api.getGroupId() - groups.getById, поле id. Работает только с групповым токеном.
      • api.getLongPollServer() - {messages}/{groups}.getLongPollServer. Имеется доп. поле - URLFix, его обрабатывать не следует.
  5. Понять что вы самый крутой разраб, и скачать мою библиотеку ;)

import santaspeen.vk.api.vkApi;
import santaspeen.vk.api.exceptions.VkApiError;

public class SimpleUseAPI {
    private static final vkApi api = new vkApi("TOKEN");

    public static void main(String[] args) throws VkApiError {

        api.setAccountType(VkAPIAccountTypes.USER); // (!) Если токен юсера
        
        String unixTime = api.method("utils.getServerTime");

        System.out.println(unixTime.get("long"));  
    }
}

Работа с лонгпулом

  • Начиная с 0.9.1:
    • Можно использовать интерфейс @onVkMessage(text = null, startsWith = false, returnLongPoll = false, onlyBy = {})
    • Сообщения сравниваются:
      1. Сообщение.toLowerCase();
      2. Если параметр startsWith true - text.startsWith(command). Если нет -command.equals(text).
import santaspeen.vk.api.features.VkAPIAccountTypes;
import santaspeen.vk.api.exceptions.VkApiError;
import santaspeen.vk.api.VkApi;

public class Main { // Your main class

    public static final VkApi api = new VkApi("TOKEN");

    public static void main(String[] args) throws VkApiError {

        api.setAccountType(VkAPIAccountTypes.GROUP); // (!) Если токен группы, не обязательно.

        api.bindCommands(new messages());

        Thread thread = api.startWithThread();
        System.out.println(thread.getName());

        System.out.println("This code be print");

        api.start();
        
        System.out.println("This code not be print");

    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
import org.json.JSONObject;
import santaspeen.vk.api.features.onVkMessage;
import santaspeen.vk.api.parsers.parseMessage;
import santaspeen.vk.api.exceptions.VkApiError;
import santaspeen.vk.api.VkApi;

public class messages{ // Your class with messages

    @onVkMessage(text = "hi", startsWith = true, returnLongPoll = true)
    public void newMessage(parseMessage msg, VkApi api, JSONObject longPoll) throws VkApiError {

        System.out.println("Текст: "+msg.text+"\nОт: @id"+msg.fromId+"\nВ: "+msg.peerId);
        System.out.println(longPoll);

        if (api.userId != msg.fromId)
            api.messagesSend(msg.peerId, "hi");
    }

    @onVkMessage(text = "java")
    public void newMessage(parseMessage msg, VkApi api) throws VkApiError {

        System.out.println("Текст: "+msg.text+"\nОт: @id"+msg.fromId+"\nВ: "+msg.peerId);

        api.messagesSend(msg.peerId, "Yes, I'm on Java");
    }
}

Ниже будет пример. паст scr/tests/LongPollAPI.java

  • Все ивенты приходят в классе org.json.JSONObject
  1. Следуем по схеме выше.
  2. Получаем лонгпул:
    • Если нужно получить 1 ивент используйте: JSONObject event = api.oneLongPollEvent(WAIT);
    • Для получения ивентов по схеме:
      1. Получите настройки лонгпул сервер: api.getLongPollServer();, нужно для инициализации настроек, передавать параметр никуда не нужно.
      2. Создаём цикл:
        while (true){
          JSONObject longPoll = api.listenLongPoll(25);
          System.out.println(longPoll);
        }
  • Итого у нас получилось:
import org.json.JSONObject;
import santaspeen.vk.api.exceptions.VkApiError;
import santaspeen.vk.api.vkApi;

public class LongPollAPI {
    private static final vkApi api = new vkApi("TOKEN");

    public static void main(String[] args) {
        api.getLongPollServer();

        long lastTs = 0;
        while (true){
            JSONObject longPoll = api.listenLongPoll(25);
            System.out.println(longPoll);
        }
    }
}

Парсинг

Ниже будет пример. паст scr/tests/LongPollAPIAndParse.java

Прочитав и запустив предыдущую часть, вы, наверное, выключили, пожалев консоль. Я помогу её уберечь от таких рейдов.

  1. Прочитать предыдущую часть.
  2. Создать парсер: parseLongPoll parse = api.parse( longPoll );
    • Мы уже имеем поля: failed, ts, type, updates
    • Если токен групповой: eventId, groupId, lastGroupUpdate, groupObject, groupMessage. Не указанные поля будут всегда null.
    • Если токен страницы: pts, lastUserUpdate, userObject, userMessage. Не указанные поля будут всегда null.
  3. Смотря в документацию, можем сразу сделать обработку failed:
    if (parse.failed > 0)
        api.getLongPollServer();
  4. Теперь можно убрать бесконечный лонгпул из консоли, я это делаю с помощью ts:
    if (lastTs != parse.ts) {
        lastTs = parse.ts;
        // Ваш код..
    }
  5. Заворачиваем:
    JSONObject longPoll = api.listenLongPoll(25);
    parseLongPoll parse = api.parse( longPoll );
    
    if (lastTs != parse.ts) {
        lastTs = parse.ts;
        if (parse.failed > 0)
            api.getLongPollServer();
            // Ваш код..
    }
  6. На этом всё, вы наверное, уже, успели подумать, а нееет, ещё есть парсинг сообщений. (Group LongPoll version >= 5.107)
    • Парсинг сообщений очень прост, используя, уже созданный parseLongPoll parse, берём из него метод message(), т.е. parse.message().

      • Поля метода: date, important, fromId, groupAttachments, userAttachments, isHidden, fwdMessages, id, text, randomId, out, peerId, conversationMessageId
    • Рекомендую parse.message() обернуть в if (parse.isMessage()).

  7. Иии в итоге? У нас готовый чат-бот
import org.json.JSONObject;
import santaspeen.vk.api.exceptions.VkApiError;
import santaspeen.vk.api.parsers.parseLongPoll;
import santaspeen.vk.api.vkApi;

public class LongPollAPIAndParse {
    private static final vkApi api = new vkApi("TOKEN");

    public static void main(String[] args) throws VkApiError {

        api.setAccountType(vkApi.GROUP); // (!) Если токен группы, не обязательно.

        api.getLongPollServer();

        long lastTs = 0;
        while (true){

            JSONObject longPoll = api.listenLongPoll(25);
            parseLongPoll parse = api.parse(longPoll);

            if (lastTs != parse.ts) {
                lastTs = parse.ts;

                if (parse.failed > 0)
                    api.getLongPollServer();

                if (parse.isMessage()) {
                    String text = parse.message().text;
                    long peerId = parse.message().peerId;
                    long fromId = parse.message().fromId;

                    String message = "Текст: "+text+"\nОт: @id"+fromId;

                    System.out.println(message);
                    api.messagesSend(peerId, message);

                }
            }
        }
    }
}

Links