RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1418208
Accepted
Alex Stassov
Alex Stassov
Asked:2022-08-08 20:21:22 +0000 UTC2022-08-08 20:21:22 +0000 UTC 2022-08-08 20:21:22 +0000 UTC

在 PHP 中从电报机器人发送“下一条”消息

  • 772

这个问题听起来很愚蠢,请不要责骂太多。我以前从未处理过机器人。实际上,订购水的机器人是可以接受的。开始后,机器人会询问您是否要订购,如果答案是肯定的,机器人会说发送您的联系人。如果用户发送他的联系人,那么在发送联系人之后,机器人应该发送下一条带有问题的消息,输入你的全名,在全名之后还有另一个问题,等等。但是在发送联系人之后,我又问了一遍如果您想订购并且不进一步。请帮帮我。这是实际的代码。

<?php

$data = json_decode(file_get_contents('php://input'), TRUE);
file_put_contents('file.txt', '$data: '.print_r($data, 1)."\n", FILE_APPEND);

$data = $data['callback_query'] ? $data['callback_query'] : $data['message'];   

define('TOKEN', '0000000000:собственно сам токен полученный у bot father');

$message = mb_strtolower(($data['text'] ? $data['text'] : $data['data']),'utf-8');

$method = 'sendMessage';
    $send_data = [
        'text' => 'Хотите ли вы заказать?',
        'reply_markup'  => [
            'resize_keyboard' => true,
            'keyboard' => [
                    [
                        ['text' => 'Да'],
                        ['text' => 'Нет'],
                    ]
                ]
            ]
        ];
if ($message=='да') 
{
$method = 'sendMessage';
    $send_data = [
        'text' => 'Пожалуйста нажмите на кнопку отправить контакт',
        'reply_markup'  => [
            'resize_keyboard' => true,
            'keyboard' => [
                    [
                        ['text' => 'Отправить контакт','request_contact'=>true],

                    ]
                    
                    ]
                   

            ]
        ];
        
     $contact=$data['contact']['phone_number'];
    
}
elseif (isset($contact)) {
$method = 'sendMessage';
$send_data = ['text' => 'Напишите ФИО'];
}
elseif ($message=='нет')
{
$method = 'sendMessage';
$send_data = ['text' => 'Спасибо, приходите еще'];
}


$send_data['chat_id'] = $data['chat'] ['id'];

$res = sendTelegram($method, $send_data);

function sendTelegram($method, $data, $headers = [])
{
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://api.telegram.org/bot' . TOKEN . '/' . $method,
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => array_merge(array("Content-Type: application/json"))
]);
$result = curl_exec($curl);
curl_close($curl);
return (json_decode($result, 1) ? json_decode($result, 1) : $result);
}

?>
php telegram
  • 1 1 个回答
  • 114 Views

1 个回答

  • Voted
  1. Best Answer
    Егор Банин
    2022-08-09T19:01:45Z2022-08-09T19:01:45Z

    我认为您需要熟悉OOP。这是一种将程序视为对象交互的方式。这是人们思考的一种非常自然的方式,因此它有助于组织代码。

    你有一个机器人(对象)。机器人可以发送消息(对象),用户(也是一个对象)可以对这些消息给出答案(对象),取决于哪个,机器人将发送新消息。事实证明,机器人是一组消息和关于哪个消息是当前消息的知识;消息是文本和响应选项;响应选项是文本和下一条消息的链接。

    如果您还没有研究过php 中的 OOP 工具,那么您可以使用关联数组。

    <?php
    
    $bot = [
        'currentMessage' => null,
        'messages' => [
            0 => [
                'text' => 'Хотите ли вы заказать?',
                'answers' => [
                    [
                        'text' => 'Да',
                        'next' => 1,
                    ],
                    [
                        'text' => 'Нет',
                        'next' => 3,
                    ],
                     
                ],
            ],
            1 => [
                'text' => 'Пожалуйста нажмите на кнопку отправить контакт',
                'answers' => [
                    [
                        'text' => 'Отправить контакт',
                        'next' => 2
                    ],
                ],
            ],
            2 => [
                'text' => 'Напишите ФИО',
                'answers' => [],
            ],
            3 => [
                'text' => 'Спасибо, приходите еще',
                'answers' => [],
            ],
        ],
    ];
    
    

    虽然没有逻辑代码。但是我认为看这个结构,你已经可以理解这个逻辑是如何工作的了。重点是相同类型的对象具有相同的结构并且可以以相同的方式进行处理。

    让我们用文字来谈谈逻辑:

    1. 找出当前消息

    在您的示例中,您是间接进行的。如果答案是“否”,则假定当前问题是“您想订购吗?”。你可以这样,但最好显式发送当前消息(电报机器人 API 可能支持一些消息标识符)。

    2.在当前消息中查找用户的回复

    您可以简单地匹配响应文本或使用标识符。

    3. 转到下一个帖子

    下一个消息在下一个响应中指示。如果消息没有提供答案,则对话结束。

    function messages_getMessage(array $messages, int $messageId): ?array {
        return $messages[$messageId]?? null;
    }
    
    function answers_getAnswer(array $answers, string $answerId): ?array {
        $result = null;
        foreach ($answers as $answer) {
            if ($answer['text'] === $answerId) {
                $result = $answer;
                break;
            }
        }
    
        return $result;
    }
    
    function bot_init(array &$bot, int $messageId) {
        $message = messages_getMessage($bot['messages'], $messageId);
        if ($message) {
            $bot['currentMessage'] = $message;
        } else {
            // тут можно как-то обработать ошибку, я просто начну с начала
            $bot['currentMessage'] = $bot['messages'][0];
        }
    }
    
    function bot_reply(array &$bot, string $answerId): array {
        $answer = answers_getAnswer($bot['currentMessage']['answers'], $answerId);
        if ($answer) {
            $bot['currentMessage'] = $bot['messages'][$answer['next']];
        }
    
        return $bot['currentMessage'];
    }
    
    // например
    bot_init($bot, 0);
    $message = bot_reply($bot, ''); // начинаем диалог
    echo $message['text'] . "\n";
    $answer = readline( implode("/", array_column($message['answers'], 'text')) . ":\n");
    $message2 = bot_reply($bot, $answer);
    echo $message2['text'] . "\n";
    
    

    剩下的只是将它与电报联系起来。我认为你可以做到。把程序想象成对象的交互,那么代码就不再神秘了。首先,重要的是谁做什么,他们如何做——这是第二个问题。

    • 1

相关问题

Sidebar

Stats

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

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 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