RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1322738
Accepted
Eugene
Eugene
Asked:2022-08-30 21:57:24 +0000 UTC2022-08-30 21:57:24 +0000 UTC 2022-08-30 21:57:24 +0000 UTC

单击按钮后如何显示响应?

  • 772

出现了以下问题 - 我在电报中编写了一个机器人(没有库),将一个 webhook 连接到它,并在此时卡住了按钮,或者更确切地说,在单击它们后处理请求。理论上,点击后,机器人应该会收到另一条消息,但最终没有任何回应。

机器人可执行代码:

<?php

include 'config.php'; // Токен бота
include 'functions.php'; // Основные функции

// В теле запроса содержится JSON, php://input читает сырой запрос, а json_decode расшифровывает в виде массива
$update = json_decode(file_get_contents('php://input'), JSON_OBJECT_AS_ARRAY);

$chat_id = $update['message']['chat']['id']; // Определяет ID чата
$message = $update['message']['text']; // Определяет текст сообщения
$message_id = ['callback_query']['message']['message_id']; // Определяет ID сообщения

$callback_query = $update['callback_query'];
$callback_query_id = $callback_query['id'];
$callback_data = $callback_query['data'];

// Делается запрос
$method = 'setWebhook';
$url = 'https://api.telegram.org/bot' . BOT_TOKEN . '/' . $method;
$options = [
    'url' => 'https://example.ru/bot.php'
];

// То, что возвращается из запроса
$response = file_get_contents($url . '?' . http_build_query($options));
var_dump($response);

if (strpos($message, "/help") === 0) { // Команда /help
    $post = [
      'chat_id' => $chat_id,
      'text' => 'Эта памятка создана для объяснения различных
терминов, посуды',
        $help_buttons = [
            [['text' => 'Термины 📃', 'callback_data' => 'terms']],
            [['text' => 'Посуда / Штучки 🥄', 'callback_data' => 'dishes']]
        ],
        'reply_markup' => inline_keyboard($help_buttons),
    ];
    sendRequest('sendMessage', $post);
} else {
// Начальное сообщение
    $post = [
        'chat_id' => $chat_id,
        'text' => 'Давай определимся с категорией коктейлей:',
        $main_menu = [
            [['text' => 'Незабываемые', 'callback_data' => 'the_unforgettables']],
            [['text' => 'Современная Классика', 'callback_data' => 'contemporary_classic']],
            [['text' => 'Напитки Новой Эры', 'callback_data' => 'new_era_drinks']]
        ],
        'reply_markup' => inline_keyboard($main_menu)
    ];
    sendRequest('sendMessage', $post);
}

switch ($callback_data) {
    case 'the_unforgettables':
        $post = [
            'chat_id' => $chat_id,
            'text' => 'Отлично, теперь выбери любой коктейль из списка:',
            $InlineTheUnforgettables = [
                [['text' => 'Негрони', 'callback_data' => 'negroni']],
                [['text' => 'Манхэттен', 'callback_data' => 'manhattan']],
                [['text' => 'Американо', 'callback_data' => 'americano']]
            ],
            'reply_markup' => inline_keyboard($InlineTheUnforgettables),
        ];
        sendRequest('sendMessage', $post);
        break;
}

消息发送功能:

function sendRequest($method, $params = [])
{
    if (!empty($params)) {
        $url = BOT_URL . $method . '?' . http_build_query($params);
    } else {
        $url = BOT_URL . $method;
    }
    return json_decode(
        file_get_contents($url),
        JSON_OBJECT_AS_ARRAY
    );
}

同时,webhook 中挂起如下错误:

string(64) "{"ok":true,"result":true,"description":"Webhook is already set"}"
Warning: file_get_contents(https://api.telegram.org/bot[BOT_TOKEN]/sendMessage?
text=%D0%94%D0%B0%D0%B2%D0%B0%D0%B9+%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D0%B
C%D1%81%D1%8F+%D1%81+%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B5%D0%B9+%D0%BA%
D0%BE%D0%BA%D1%82%D0%B5%D0%B9%D0%BB%D0%B5%D0%B9%3A&0%5B0%5D%5B0%5D%5Btext%5D=%D0%9D%D0%B5
%D0%B7%D0%B0%D0%B1%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5+%E2%99%BE&0%5B0%5D%5B0%5D%5B
callback_data%5D=the_unforgettables&0%5B1%5D%5B0%5D%5Btext%5D=%D0%A1%D0%BE%D0%B2%D1%80%D0
%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F+%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D0%BA%D0%B0+
%F0%9F%8D%B9&0%5B1%5D%5B0%5D%5Bcallback_data%5D=contemporary_classic&0%5B2%5D%5B0%5D%5Bte
xt%5D=%D0%9D%D0%B0%D0%BF%D0%B8%D1%82%D0%BA%D0%B8+%D0%9D%D0%BE%D0%B2%D0%BE%D0%B9+%D0%AD%D1
%80%D1%8B+%F0%9F%86%95&0%5B2%5D%5B0%5D%5Bcallback_data%5D=new_era_drinks&reply_markup=%7B
%22inline_keyboard%22%3A%5B%5B%7B%22text%22%3A%22%5Cu041d%5Cu0435%5Cu0437%5Cu0430%5Cu0431
% in /home/db_name/public_html/example.ru/functions.php on line 12

也就是说,webhook 抱怨这条线 -file_get_contents($url)

究竟可能是什么错误以及如何纠正?这是单击按钮时未显示另一条机器人消息的原因吗?

php
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Eugene
    2022-09-01T21:27:16Z2022-09-01T21:27:16Z

    首先,我处理了 webhook 中的错误 - 我没有找到它发生的原因,因为文件中没有描述字段,因此很难理解究竟是什么导致了错误。我用另一个替换了发送消息功能:

    function sendRequest($method, $post = '') {
    $ch = curl_init('https://api.telegram.org/bot' . BOT_TOKEN . '/' . $method);
    
    if ($post) {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    }
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
    }
    

    它的工作方式相同,不会导致任何错误。

    然后我处理按钮的处理,或者更确切地说是它们的反向查询(callback_query/callback_data)。我创建了两个文件 - 数据,我在其中获取 chat_id、message、message_id,我需要它来发送主要消息(按问候语类型、命令)。然后我创建了一个 callback_query 文件,在其中放置了以下几行 -

    <?php
    
    $data = json_decode(file_get_contents('php://input'));
    
    
        $callback_query = $data->callback_query;
        $callback_query_id = $callback_query->id;
        $callback_data = $callback_query->data;
    
        $from = $callback_query->from;
    
        $user_id = $from->id;
        $username = $from->username;
    
        $message = $callback_query->message;
        $message_id = $message->message_id;
        $callback_message_text = $message->text;
    
        $chat = $message->chat;
        $chat_id = $chat->id;
    
        $inline_message_id = $callback_query->inline_message_id;
    

    在他们的帮助下,您可以通过单击按钮收到退货请求。我的主要代码现在看起来像这样:

    <?php
    
    include 'config.php'; // Токен бота
    include 'functions.php'; // Основные функции
    include 'data.php'; // Получение данных
    
    // Делается запрос
    $method = 'setWebhook';
    $url = 'https://api.telegram.org/bot' . BOT_TOKEN . '/' . $method;
    $options = [
        'url' => 'https://example.ru/bot.php'
    ];
    
    // То, что возвращается из запроса
    $response = file_get_contents($url . '?' . http_build_query($options));
    var_dump($response);
    
    if (strpos($message, "/help") === 0) { // Команда /help
        $post = [
          'chat_id' => $chat_id,
          'text' => 'Эта памятка создана для объяснения различных барменских
    терминов, посуды',
            $help_buttons = [
                [['text' => 'Термины 📃', 'callback_data' => 'terms']],
                [['text' => 'Посуда / Штучки 🥄', 'callback_data' => 'dishes']]
            ],
            'reply_markup' => inline_keyboard($help_buttons)
        ];
        sendRequest('sendMessage', $post);
    } else {
    // Начальное сообщение
        $post = [
            'chat_id' => $chat_id,
            'text' => 'Давай определимся с категорией коктейлей:',
            $main_menu = [
                [['text' => 'Незабываемые ♾', 'callback_data' => 'the_unforgettables']],
                [['text' => 'Современная Классика 🍹', 'callback_data' => 'contemporary_classic']],
                [['text' => 'Напитки Новой Эры 🆕', 'callback_data' => 'new_era_drinks']]
            ],
            'reply_markup' => inline_keyboard($main_menu)
        ];
        sendRequest('sendMessage', $post);
    }
    
    include 'callback_query.php'; // Получение обратных запросов
    
    switch ($callback_data) {
        case 'the_unforgettables':
            $post = [
                'chat_id' => $chat_id,
                'message_id' => $message_id,
                'text' => 'Отлично, теперь выбери любой коктейль из списка:',
                $InlineTheUnforgettables = [
                    [['text' => 'Negroni', 'callback_data' => 'negroni']],
                    [['text' => 'Manhattan', 'callback_data' => 'manhattan']],
                    [['text' => 'Americano', 'callback_data' => 'americano']],
                    [['text' => 'Daikiri', 'callback_data' => 'daiqiri']],
                    [['text' => 'Old Fashioned', 'callback_data' => 'old_fashioned']],
                    [['text' => 'Ramos Fizz', 'callback_data' => 'ramos_fizz']],
                    [['text' => 'Clover Club', 'callback_data' => 'clover_club']],
                    [['text' => 'Gin Fizz', 'callback_data' => 'gin_fizz']],
                    [['text' => 'Vieux Carre', 'callback_data' => 'vieux_carre']],
                    [['text' => 'Sazerac', 'callback_data' => 'sazerac']]
                ],
                'reply_markup' => inline_keyboard($InlineTheUnforgettables),
            ];
            sendRequest('editMessageText', $post);
            break;
    }
    
    • 0

相关问题

  • mysqli 类的对象无法转换为字符串

  • 您的系统中缺少 ext-http *,您的系统中缺少 ext-mysql_xdevapi *

  • 如何从csv中删除bom?

  • 当我按下 Enter 键时,如何让 PhpStorm 的 Emmet 插件触发,就像 VS Code 一样?

  • 注释在 Symfony5 中不起作用

  • 搜索最近的地理位置点

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5