• 使用telegram机器人发送通知


    背景

    在训练深度学习模型时,除了粗略估计外,很难预测训练何时结束。此外,我们可能还想随时随地查看训练情况,如果每次都需要登录回服务器的话并不方便。因此,为我们的训练设置自动通知会大有裨益。

    相关的插件和库其实很多,例如而knockknockdinglingling,但是存在着以下缺点:

    • 依赖第三方服务,dinglingling依赖于ServerChan在微信端发送通知,是需要付费订阅会员的。
    • 需要添加装饰器,代码可读性下降。
    • 自定义能力差,仅仅起到通知作用。

    基于此,个人认为比较好的方式是直接能使用免费的服务给自己发送消息,我比较推荐使用telegram(电报),因为飞书、钉钉、企业微信等都或多或少在逐步限缩个人版的机器人使用,以后可能会成为付费专属功能。

    可以正常使用telegram的情况下,可以按照下面的步骤操作。

    1 创建机器人

    电报的机器人是我们可以自己创建的一个聊天对象,表现形式和添加的好友一样,只是名字需要以 bot 结尾,不区分大小写。

    要使用机器人发消息给自己或群组,先得有一个机器人,创建一个属于自己的机器人很简单,添加BotFather这个账号,依次发送以下内容即可:

    /start
    
    /newbot
    
    YourNameBot (给机器人取名字,以 bot 结尾,不区分大小写,直接发送过去即可,如果重名了会提示重新输入)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建成功后BotFather会返回一个token,这是用来调用API接口的,后面会用到。

    2 与机器人的会话

    上面我们创建了“YourNameBot”这个机器人,要与之对话,在任意聊天窗口发送 “@YourNameBot” 然后点击这条消息即可打开与YourNameBot的聊天。

    如果你需要机器人发送消息给群组,还需要把机器人拉入到群组中。

    特别注意:我们需要先与机器人之间创建会话,主动给它发一次消息,机器人才能给我们发消息,否则机器人无法主动发送消息。

    通过发送第一条消息,我们可以访问

    https://api.telegram.org/bot/getUpdates
    
    • 1

    这个链接,把token替换成刚刚我们获得的机器人的token,就可以查看机器人的会话信息,因为我们向机器人主动发了消息,所以我们可以获取以message为key下面的[‘chat’][‘id’],这就是我们需要的chat_id(消息室的标识)。

    3 调用API让机器人发送消息

    现在,我们有了token、chat_id,接下来我们只需要组建我们的message就可以发送了,这个接口是:

    https://api.telegram.org/bot/sendMessage
    
    • 1

    我们可以使用python的requests库来发送post请求。写了个简易的代码,大家可以根据自己的需求进行修改。

    import requests
    import json
    
    def telegram_notification(epoch, avg_test_scalars):
        """
        Send notification to telegram
    
        params
        epoch: int
        avg_test_scalars: dict
    
        return: None
        """
        # chat id of user
        CHAT_ID: int = 1234567
        # telegram bot token
        TOKEN="1234567"
    
        url = 'https://api.telegram.org/bot{}/sendMessage'.format(TOKEN)
        headers = {
            'Content-Type': 'application/json'
        }
        # main text
        text = "Epoch: {} has completed!\n".format(epoch)
        text += json.dumps(avg_test_scalars)
        # pack data
        data = {
            'chat_id': '{}'.format(CHAT_ID),
            'text': text
        }
        # send request
        response = requests.post(url=url, headers=headers, json=data)
        
        return
    
    
    if __name__ == "__main__":
        telegram_notification(1, {'a': '1', 'b': '2'})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    效果如图:
    在这里插入图片描述

  • 相关阅读:
    【论文简述及翻译】MVSNet:Depth Inference for Unstructured Multi-view Stereo(ECCV 2018)
    中断 NVIC的概念和原理
    207. 课程表
    C++:AVL树
    【算法日志】图论 并查集及其简单应用
    [2022安恒夏令营] 5个小题
    轻松掌握组件启动之MongoDB:快速入门、Linux安装和Docker配置指南
    字符串哈希
    【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023
    PowerCLI 通过vCenter批量更改所有的esxi主机名称和DNS
  • 原文地址:https://blog.csdn.net/YuhsiHu/article/details/133953185