V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
killerzhangsan
V2EX  ›  Telegram

100 人民币或等值 USDT-解决 telegram bot 开发问题

  •  
  •   killerzhangsan · 307 天前 · 2316 次点击
    这是一个创建于 307 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 api 要怎么发消息,才能够知道输入的内容是上一次点击的按钮触发的?

    pFYojIJ.png

    第 1 条附言  ·  307 天前
    基于我这实际情况,比如不能 redis<极端情况内存很小>,不能内存队列<极端情况要分布式部署>,采用 15 楼的方案是可行的。

    @mu666 加我,我给你付款。

    tg: richerzhangsan

    也感谢其他朋友们的建议。

    [![pFtiMZQ.png]( https://s11.ax1x.com/2024/02/20/pFtiMZQ.png)]( https://imgse.com/i/pFtiMZQ)
    [![pFtiuqg.png]( https://s11.ax1x.com/2024/02/20/pFtiuqg.png)]( https://imgse.com/i/pFtiuqg)
    31 条回复    2024-02-20 20:34:17 +08:00
    iBugOne
        1
    iBugOne  
       307 天前 via Android
    这个功能叫 Inline Keyboard [1](不知道 TG 怎么起的这么个名字),你提供一系列 buttons ,每个 button 带上不同的 callback_data ,用户点击某个按钮的时候,你的 bot 就会收到一条 callback query [2]

    [1]: https://core.telegram.org/bots/features#inline-keyboards
    [2]: https://core.telegram.org/bots/api#callbackquery

    P.S. 可以邮件发我支付宝口令红包的口令
    forQ
        2
    forQ  
       307 天前
    button1 = Button.url('1', 'https://www.baidu.com')
    button2 = Button.url('2', 'https://www.google.com')
    button3 = Button.url('3', 'https://www.facebook.com')
    button = [[button1, button2], [button3]]
    coinbase
        3
    coinbase  
       307 天前
    可以个用户加个状态
    mapleisaac
        4
    mapleisaac  
       307 天前
    用中国手机好像收不到验证码了.
    killerzhangsan
        5
    killerzhangsan  
    OP
       307 天前 via Android
    @iBugOne 这个我知道。最后一步,用户输入信息后,怎样知道他点击的是哪个按钮?
    SingeeKing
        6
    SingeeKing  
       307 天前
    @killerzhangsan 那就得自己维护上下文了
    drymonfidelia
        7
    drymonfidelia  
       307 天前
    @killerzhangsan 你发消息的时候给每个按钮起个名字,点击事件里就会带上用户点的按钮的这个名字,你就可以知道是哪个按钮了
    iBugOne
        8
    iBugOne  
       307 天前 via Android
    @killerzhangsan Telegram 没有提供这个功能,你需要自己搞个数据库记录这个状态。反正每个用户就一个对话,而且私聊的 chat_id 就是 user_id ,也不会太麻烦
    killerzhangsan
        9
    killerzhangsan  
    OP
       307 天前 via Android
    @drymonfidelia 没有懂我的意思。callback query 都实现完了。现在是我不知道他更改的是点击编辑 name 或者编辑 about 后,用户输入内容,到底是修改 name 还是 about,没有找到怎么关联上下文
    vacuitym
        10
    vacuitym  
       307 天前
    @killerzhangsan 点之后去后台发个请求标识下他要改什么?然后准备接收那个数据
    446ENzu91KZ73A33
        11
    446ENzu91KZ73A33  
       307 天前
    @killerzhangsan 点编辑 name 返回一个提示比如"请输入新名称",然后强制用户自动回复这个提示,bot 收到消息可能根据 replay_message 里面内容匹配,如果匹配到是"请输入新名称",就是修改名称
    killerzhangsan
        12
    killerzhangsan  
    OP
       307 天前 via Android
    @iBugOne 只能自己做么,每个用户维护一个操作集合。每次用户给 bot 发送消息的时候,都要先去数据库查询一下?好低效。
    killerzhangsan
        13
    killerzhangsan  
    OP
       307 天前 via Android
    @mu666 怎么个强制法?
    killerzhangsan
        14
    killerzhangsan  
    OP
       307 天前 via Android
    @mu666 强制它必须使用消息转发? bot father 这也没有强制哦
    446ENzu91KZ73A33
        15
    446ENzu91KZ73A33  
       307 天前
    @killerzhangsan python 的 telegram 库里面 send_message 有个 reply_markup 等于 ForceReply(selective=True)),这样收到消息就会自动引用(回复),你可以试下。之前是这样,不知道现在还能不能了
    446ENzu91KZ73A33
        16
    446ENzu91KZ73A33  
       307 天前
    @killerzhangsan 强制回复你的提示信息,才能知道他回的是哪个消息,点的哪个选项啊
    446ENzu91KZ73A33
        17
    446ENzu91KZ73A33  
       307 天前
    @killerzhangsan 也不能说是强制,就是用 bot 发消息给用户,会自动 replay 那条消息。用户要是自己主动点叉掉,就是没了,
    446ENzu91KZ73A33
        18
    446ENzu91KZ73A33  
       307 天前
    @mu666 也不能说是强制,就是加了那个之后用 bot 发消息给用户,用户那边会自动 replay 那条消息。用户要是自己主动点叉掉,就是没了,
    killerzhangsan
        19
    killerzhangsan  
    OP
       307 天前 via Android
    @mu666 嗯。你这应该是最接近 bot father 功能的实现。虽然 bot father 这里没有所谓的强制回复。
    等我晚上回去试试,成功后就兑现,不白嫖。
    446ENzu91KZ73A33
        20
    446ENzu91KZ73A33  
       307 天前
    @killerzhangsan 可以,大佬要是需要 bot 开发,也可以留 tg 号我加你
    GooMS
        21
    GooMS  
       307 天前 via Android
    这个做个会话就好了,热门库看文档基本都有
    killerzhangsan
        22
    killerzhangsan  
    OP
       307 天前 via Android
    @GooMS 比如说那个库来做会话? java 有么?会话怎么关联到对应的按钮?
    drymonfidelia
        23
    drymonfidelia  
       307 天前
    @killerzhangsan 我知道你的意思了,在数据库里存用户最后一次点的按钮名字啊,不想用数据库就用 redis
    微信公众号也是这么开发的
    WordTian
        24
    WordTian  
       307 天前
    @killerzhangsan CallbackQuery 里面有个 data 字段,这个字段的值就是你自定义按钮时写的 callback_data 的值
    https://docs.python-telegram-bot.org/en/v13.2/telegram.callbackquery.html#telegram.CallbackQuery.data
    killerzhangsan
        25
    killerzhangsan  
    OP
       307 天前 via Android
    @WordTian 不是这个问题。看上面回复。
    drymonfidelia
        26
    drymonfidelia  
       307 天前
    @killerzhangsan botfather 100%也是这么做的,每次点击按钮的时候把用户 id 字段和 callback_data 随便找个地方存起来,每次收到文字消息的时候检查是否有存起来的 callback_data ,有就进行对应操作,然后把存起来的 callback_data 删掉。为了防止用户很久以前点的按钮忘记了,通常还要存一个点击时间,超过一段时间就废弃。
    y1y1
        27
    y1y1  
       307 天前
    难道是我理解能力有问题,看不懂你的描述
    devliu1
        28
    devliu1  
       307 天前 via Android
    从 im 的角度,没必要帮你管理上下文。自己管理是正解,存个 redis 或者内存,带 ttl ,没那么麻烦
    icoming
        29
    icoming  
       307 天前
    确实要靠自己维护当前输入的状态。比如用户绑定 uuid ,点击"绑定"按钮后,服务端保存当前操作为"waiting_for_uuid",接下来的输入就是绑定 uuid 。

    对应的 golang 代码如下:
    ```go
    var (
    // 在状态管理中跟踪用户的操作状态。 以 chatID 为键,存储用户状态
    usersState = make(map[int64]string)
    )

    // 用户状态的值
    const (
    stateWaitUUID = "waiting_for_uuid"
    )


    // ...

    for update := range updates {
    if update.Message == nil {
    continue
    }

    logger.Info.Printf("%s [%s] %s", tag, update.Message.From.UserName, update.Message.Text)

    switch update.Message.Text {
    case "/bind":
    // 处理用户绑定逻辑
    // 更新用户操作状态为“等待 UUID”
    usersState[update.Message.Chat.ID] = stateWaitUUID
    reply := "😘 请输入您的 UUID"
    sendMessage(reply, update.Message.Chat.ID)
    case "/queryflow":
    // 处理查询流量逻辑
    handleQuery(update.Message)
    default:
    // 如果用户状态为等待 UUID ,则获取输入文本作为 UUID
    if state, ok := usersState[update.Message.Chat.ID]; ok && state == stateWaitUUID {
    // 在这里处理绑定逻辑,将 uuid 存储到数据库或进行其他操作
    handleBinding(update.Message)
    // 清除用户状态
    delete(usersState, update.Message.Chat.ID)
    break
    }

    // 处理其他文本消息
    msg := "😪 请通过菜单选择操作"
    sendMessage(msg, update.Message.Chat.ID)
    }
    }

    ```
    icoming
        30
    icoming  
       307 天前
    @killerzhangsan "bot father 这里没有所谓的强制回复",是因为你执行了其它命令,服务端更新了新的状态。详细可以看我上面的代码
    icoming
        31
    icoming  
       307 天前
    另外,这玩意用 GPT4 会非常容易实现。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:43 · PVG 03:43 · LAX 11:43 · JFK 14:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.