前提

导入依赖

        <dependency>
            <groupId>org.telegram</groupId>
            <artifactId>telegrambots</artifactId>
            <version>4.9</version>
        </dependency>

开发教程

首先我们在application.properties中添加

bot.api-key=机器人token,请找BotFather获取
bot.username=机器人昵称

接着,我们创建一个服务层继承TelegramWebhookBot(由于我设置了WebHook,由官方POST数据过来),调用properties里的数据

    @Value("${bot.api-key}")
    private String botToken;

    @Value("${bot.username}")
    private String userName;

并实现

public BotApiMethod onWebhookUpdateReceived(Update update)

public String getBotUsername()

public String getBotToken()

public String getBotPath()

底下三个没什么好说的,直接返回

    @Override
    public String getBotUsername() {
        return userName;
    }

    @Override
    public String getBotToken() {
        return botToken;
    }

    @Override
    public String getBotPath() {
        return userName;
    }

重点讲讲onWebhookUpdateReceived这个方法

public BotApiMethod onWebhookUpdateReceived

这个方法只能返回BotApiMethod里的对象

请输入图片描述请输入图片描述

发送消息直接用SendMessage方法即可,而发送图片你仔细观察会发现没有这个方法,那么它藏在哪里?

逛了一晚上Github的相关项目,在TelegramBotsExample中发现

e x e c u t e ()

方法频繁出现(这里出现空格是因为我防火墙限制了这个单词)

请输入图片描述

一输入首当其冲的就是SendPhoto方法,那么事情就简单了

            SendPhoto sendPhoto = new SendPhoto();
            sendPhoto.setChatId(update.getMessage().getChat().getId());
            sendPhoto.setPhoto(title,getPicBytes(uri));
            e x e c u t e(sendPhoto);

WebHook

由于我设置了Webhook,得有能够接收telegram官方Post过来的Controller层才行

@RestController
@RequestMapping("public")
public class PublicController {
    @Autowired
    private WebHook webhook;

    @RequestMapping(method = RequestMethod.POST, value = "msg", produces = MediaType.APPLICATION_JSON_VALUE)
    public BotApiMethod getMsg(@RequestBody Update update) {
        return webhook.onWebhookUpdateReceived(update);
    }

}

这里的webhook其实就是之前继承了TelegramWebhookBot的类

那么我的连接就是https://domin.com/public/msg

注意这里的域名必须得有SSL证书,这是官方限制的

附加

如果你想根据命令来调用不同方法,在onWebhookUpdateReceived匹配就行了

    @SneakyThrows
    @Override
    public BotApiMethod onWebhookUpdateReceived(Update update) {
        if ("xxx".contains(update.getMessage().getText())){
            xxx(update);
        }
        return null;
    }

案例

ReadMe Card

我的文章对您有帮助吗?
我很可爱 请给我钱
扫一扫拿红包 → 扫商家收款码 → 花呗支付比红包多1分钱的金额
既可免费赞赏,又可完成支付宝支付任务!
最后修改:2020 年 07 月 30 日
如果觉得我的文章对你有用,请随意赞赏