Como fazer um bot para o Telegram em Java

Como fazer um bot para o Telegram em Java

Este é um exemplo básico de como fazer um bot do Telegram em Java. Bots do Telegram são robôs que se comportam como uma conversa no Telegram, porém respondem a comando definidos pelo programador, neste exemplo nosso programa ficará fazendo um pooling de requisições e processará cada requisição, invertendo a frase que é enviado para ele.

Este exemplo criei a partir de um artigo do Nicola Malizia, que pode ser conferido aqui. Confira também toda a documentação no site do Telegram.

Temos que tratar requisições HTTP, para isso usei a biblioteca unirest para facilitar a implementação. Todo o exemplo a seguir foi feito no netbeans, mas pode ser facilmente realizado em outras IDEs.

Solicitando uma chave de acesso ao Telegram

Como todas as requisições serão feitas por uma conexão HTTP, é necessário ter uma chave de acesso privada para o seu bot, para isso, inicie uma conversa com o BotFather e digite /newbot ele irá te perguntar o nome do seu bot e gerar uma chave de acesso no final, guarde ela, usaremos mais adiante.

Criando um bot no BotFather
Criando um bot no BotFather

Criando o projeto e tratando as dependências

Vamos criar um projeto Maven no Netbeans para resolver as dependências da biblioteca unirest. Em novo projeto, Maven, Aplicação Java, defina as suas configurações, e salve. Edite o arquivo Pom.xml em Arquivos do Projeto, e adicione as dependências do unirest:

 <dependencies>
        <dependency>
            <groupId>com.mashape.unirest</groupId>
            <artifactId>unirest-java</artifactId>
            <version>1.4.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpasyncclient</artifactId>
            <version>4.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.6</version>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20140107</version>
        </dependency>
    </dependencies>

Clique com o botão direito em Dependências e depois em Fazer download de dependências declaradas, isso fará com que o Maven baixe as dependências informadas do Pom.xml.

Uma vez que já temos todas as dependências, vamos ao código, precisaremos de apenas duas classes, TelegramBot.java (será a classe que tratara as requisições do bot) e Main.java (apenas uma classe principal para iniciar a aplicação).

TelegramBot.java

package br.com.paulocollares.telegrambot;

import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import org.json.JSONArray;
import org.json.JSONObject;

public final class TelegramBot {

    private final String endpoint = "https://api.telegram.org/";
    private final String token;

    public TelegramBot(String token) {
        this.token = token;
    }

    public HttpResponse<JsonNode> sendMessage(Integer chatId, String text) throws UnirestException {
        return Unirest.post(endpoint + "bot" + token + "/sendMessage")
                .field("chat_id", chatId)
                .field("text", text)
                .asJson();
    }

    public HttpResponse<JsonNode> getUpdates(Integer offset) throws UnirestException {
        return Unirest.post(endpoint + "bot" + token + "/getUpdates")
                .field("offset", offset)
                .asJson();
    }

    public void run() throws UnirestException {
        int last_update_id = 0; // controle das mensagens processadas
        HttpResponse<JsonNode> response;
        while (true) {
            response = getUpdates(last_update_id++);
            if (response.getStatus() == 200) {
                JSONArray responses = response.getBody().getObject().getJSONArray("result");
                if (responses.isNull(0)) {
                    continue;
                } else {
                    last_update_id = responses
                            .getJSONObject(responses.length() - 1)
                            .getInt("update_id") + 1;
                }

                for (int i = 0; i < responses.length(); i++) {
                    JSONObject message = responses
                            .getJSONObject(i)
                            .getJSONObject("message");
                    int chat_id = message
                            .getJSONObject("chat")
                            .getInt("id");
                    String usuario = message
                            .getJSONObject("chat")
                            .getString("username");
                    String texto = message
                            .getString("text");
                    String textoInvertido = "";

                    for (int j = texto.length() - 1; j >= 0; j--) {
                        textoInvertido += texto.charAt(j);
                    }

                    sendMessage(chat_id, textoInvertido);
                }
            }
        }
    }
}

Main.java

package br.com.paulocollares.telegrambot;

import com.mashape.unirest.http.exceptions.UnirestException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

    public static void main(String[] args) {
        TelegramBot tb = new TelegramBot("cole aqui a chave gerada pelo BotFather");
        try {
            tb.run();
        } catch (UnirestException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

O método run(), depois de ser iniciado, ficará requisitando constantemente ao Telegram as requisições do seu bot, que serão obtidas por um JSON, será tratada e enviada de volta.

Exemplo de uso do bot
Exemplo de uso do bot

Vale ressaltar que este bot só irá funcionar se a aplicação java estiver rodando, uma vez que é que responsabilidade do programa obter as requisições e enviar de volta. É um exemplo simples que apenas demonstra o uso do recurso de bots do Telegram. Postei também um exemplo em PHP, confira aqui.

Um abraço, e fiquem na Paz.

Paulo Collares

Servo de Jesus Cristo, Analista de Sistemas, com especialidade em Engenharia de Software

Saiba mais sobre mim

  • Marco A. Pereira

    Meu amigo! Perfeito! Necessitei desenvolver um bot para o trabalho e deu a calhar! Parabéns

  • Wellington Kéltren

    Saudações caro, eu executo ele no netbeans, mas o bot não responde, o que pode ser?

  • Fábio S. Paixão

    Oi bom dia… eu fiz e deu certinho, mas eu preciso que o meu servidor do BOT fique rodando sempre, mas vez por outra para de funcionar, e eu tenho que fechar a aplicação e abrir novamente para funcionar, sabe me dizer o porque disso??

    A memória do java tá tranquila e a net também, outra coisa poderia fazer parar de buscar os updates do telegram??