效果演示:

  • 输入/help
    机器人自动回复支持的功能:
    <1> /help 帮助文档
    <2> /getUser 获取用户信息
    <3> /getChatId 获取chatId

在这里插入图片描述

  • 输入/getUser
    机器人:返回发送消息用户的基本信息

自动回复

要实现机器人的自动回复,首先要创建一个机器人,并获取机器人TOKEN。

1. 创建 Telegram 机器人

创建步骤:

  • 找到BotFather:打开你的Telegram 应用:在 Telegram 上搜索 BotFather,它是官方用于创建和管理 Telegram 机器人的机器人。
  • 创建新机器人: 向 BotFather 发送 /newbot 命令。
    按照指示输入机器人名称(可以随便取名)和用户名(必须以 bot 结尾,例如:my_example_bot)。
  • 获取 API 密钥: 创建完机器人后,BotFather 会返回一个 API 密钥(token),格式类似:123456789:ABCDEFghijklmnopQRstuvWXYz1234567890.
    记下这个 API 密钥,因为它将用于后续与 Telegram 服务器的交互。

创建机器人

获取机器人token

2. 机器人自动回复服务端开发

有了机器人Token我们就可以进行后台服务开发了。

  • 首先我们在项目中引入telegram的maven依赖
<dependencies>
    <dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots</artifactId>
        <version>6.3.0</version>
    </dependency>
</dependencies>
  • 机器人初始化: 编写一个继承自 TelegramLongPollingBot 的类来实现你的机器人。
    **onUpdateReceived()方法:**这个是自动回复的关键方法,该方法可以收到机器人所在群组的消息,我们可以通过这个方法知道群组里面发了什么消息,并对应的回复。
    **sendMsg()方法:**发送消息,参数text为你需要发送的内容,chatId为发送内容到所在的群组。
import com.wds.codebook.common.utils.JacksonUtils;
import lombok.extern.slf4j.Slf4j;
import org.telegram.telegrambots.bots.DefaultBotOptions;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Message;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.User;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

/**
 * telegram机器人初始化
 * @author: wds
 * @DateTime: 2024/11/22 10:13
 */
@Slf4j
public class TelegramBot extends TelegramLongPollingBot {
    private String mToken;
    private String mUsername;

    public TelegramBot(String token, String username, DefaultBotOptions options) {
        super(options);
        mToken = token;
        mUsername = username;
    }
    @Override
    public String getBotUsername() {
        return mUsername;
    }
    @Override
    public String getBotToken() {
        return mToken;
    }

    @Override
    public void onUpdateReceived(Update update) {
        // 检查是否是消息更新
        if (update.hasMessage() && update.getMessage().hasText()) {
            Message message = update.getMessage();
            log.info("message:" + JacksonUtils.toJson(message));
            Long chatId = message.getChatId();
            String text = message.getText();
            String autoReplyMsg = "自动回复消息";
            if (text.startsWith("/help")) {
                autoReplyMsg = "<1> /help 帮助文档 \n"
                        + "<2> /getUser 获取用户信息 \n"
                        + "<3> /getChatId 获取chatId \n";
            }
            if (text.startsWith("/getChatId")) {
                autoReplyMsg = "ChatId:" + chatId;
            }

            if (text.startsWith("/getUser")) {
                User user = update.getMessage().getFrom();
                autoReplyMsg = JacksonUtils.toJson(user);
            }
            sendMsg(autoReplyMsg, chatId);
        }
    }

    //发送消息
    public void sendMsg(String text, Long chatId) {
        if (null == mUsername || null == mToken) {
            log.error("TelegramInit sendMsg no set token or username!");
            return;
        }
        SendMessage response = new SendMessage();
        response.setChatId(String.valueOf(chatId));
        response.setText(text);
        try {
            execute(response);
        } catch (TelegramApiException e) {
            log.debug("TelegramInit sendMsg error:" + e.getLocalizedMessage());
        }
    }
}
  • 启动机器人: 实现springboot的InitializingBean接口来启动
    还可以设置代理的方式在本地IDEA启动该服务。可以将本地代理设置DefaultBotOptions对应参数,代理支持 HTTP 或 SOCKS5两种模式。
import com.wds.codebook.telegram.config.TelegramBot;
import com.wds.codebook.telegram.config.TelegramConfig;
import com.wds.codebook.telegram.config.TelegramProxyConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.bots.DefaultBotOptions;
import org.telegram.telegrambots.meta.TelegramBotsApi;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * telegram 发送消息
 * @author: wds
 * @DateTime: 2024/11/22 10:12
 */

@Slf4j
@Component
public class TelegramSender implements InitializingBean {

    private TelegramBot mTelegramBot;
    @Resource
    TelegramConfig telegramConfig;
    @Resource
    TelegramProxyConfig telegramProxyConfig;

    @Override
    public void afterPropertiesSet(){
        
        // 配置代理
        DefaultBotOptions botOptions = new DefaultBotOptions();
        // 设置代理类型和地址
        botOptions.setProxyHost(telegramProxyConfig.getHost()); // 替换为您的代理地址
        botOptions.setProxyPort(telegramProxyConfig.getPort());        // 替换为您的代理端口
        botOptions.setProxyType(DefaultBotOptions.ProxyType.SOCKS5); // 支持 HTTP 或 SOCKS5

        try {
            log.debug("TelegramInit afterPropertiesSet start!");
            TelegramBotsApi telegramBotsApi = new TelegramBotsApi(DefaultBotSession.class);
            mTelegramBot = new TelegramBot(telegramConfig.getToken(), telegramConfig.getUsername(),botOptions);
            telegramBotsApi.registerBot(mTelegramBot);
            log.debug("TelegramInit afterPropertiesSet start!");
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
}

@Data
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "telegram.config.proxy")
public class TelegramProxyConfig {
    private String host = "127.0.0.1";
    private Integer port = 21881}

@Data
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "telegram.config")
public class TelegramConfig {

    private String token = "xxx:xxxxx";
    private String username ="xxx_bot";
}
Logo

更多推荐