【问题标题】:How To define command from server for telegram BOT如何从服务器为电报 BOT 定义命令
【发布时间】:2015-07-22 19:26:47
【问题描述】:

我用@botfather 创建了一个机器人,一切正常。现在我想将我的主机的命令设置为电报。我在我的根目录中创建了一个 Bot.php

Bot.php

$string = json_decode(file_get_contents('php://input'));

    function objectToArray( $object )
    {
        if( !is_object( $object ) && !is_array( $object ) )
        {
            return $object;
        }
        if( is_object( $object ) )
        {
            $object = get_object_vars( $object );
        }
        return array_map( 'objectToArray', $object );
    }

    $result = objectToArray($string);
    $user_id = $result['message']['from']['id'];
    $text = $result['message']['text'];
    if($text == 'Hi')
    $text_reply = 'Hi';
if($text == 'Your name')
    $text_reply = 'jJoe';

    $token = '';
    $text_reply = 'Got you Buddy.';

    $url = 'https://api.telegram.org/bot'.tokenNumber.'/sendMessage?chat_id='.$user_id;
    $url .= '&text=' .$text_reply;


    $res = file_get_contents($url);  

现在当我浏览这个时:https://api.telegram.org/bot112186325:tokenNumber/setWebhook?url=https://partamsms.ir/bot.php

我明白了:{"ok":true,"result":true,"description":"Webhook was set"}

但我无法在我的电报帐户中运行这些命令。

如何从我的服务器运行命令?

谢谢一百万

【问题讨论】:

  • 您能否澄清一下您所说的“命令”是什么意思?您的意思是您没有收到“Got you Buddy”消息,还是您想发送消息而不是对收到的消息的响应?
  • 是的,例如,当我在电报@ChrisBrand 中写 /Yourname 时,我想得到“jJoe”,提前致谢

标签: php telegram telegram-bot


【解决方案1】:

根据您的评论,您需要根据用户输入的消息做出不同响应的内容。因此,使用您的示例代码,您可以将其更改为:

// NOTE: you can pass 'true' as the second argument to decode as array
$result= json_decode(file_get_contents('php://input'), true);
error_log(print_r($result, 1), 3, '/path/to/logfile.log');

$user_id = $result['message']['from']['id'];
$text = $result['message']['text'];

// TODO: use something like strpos() or strcmp() for more flexibility
switch (true)
{
    case $text == '/hi':
        $text_reply = 'Hello';
        break;

    case $text == '/yourname':
        // TODO: use the getMe API call to get the bot information
        $text_reply = 'jJoe';
        break;

    default:
        $text_reply = 'not sure what you want?';
        break;
}

$token = '';
$url = 'https://api.telegram.org/bot'.tokenNumber.'/sendMessage?chat_id='.$user_id;
$url .= '&text=' .$text_reply;
$res = file_get_contents($url);  

所以,这几乎是对您已经拥有的内容的轻微重构...如果问题是您的 Bot.php 脚本未触发,则可能是因为该页面未公开.您指定给 Telegram 的 webhook 必须是可公开访问的 URL。我试过打https://partamsms.ir/bot.php,但打不通。

另一种方法是改用getUpdates 方法,并让脚本每隔 5 秒左右运行一次。

【讨论】:

  • 谢谢,一个菜鸟问题:所以如果我在电报中输入 hi 应该得到 Hello ?
  • 是的,如果您的 webhook 工作正常。我用一些错误日志信息更新了我的脚本。如果指定的文件包含消息信息,则意味着您的 webhook 正在从电报接收数据,然后如果消息是“hi”...您应该收到“Hello”。如果日志文件为空,则表示您的脚本无法通过互联网访问。
  • 查看示例代码的第二行以了解添加的调试日志记录。
  • 现在当我在我的电报机器人中输入 hi 时,我什么也得不到,而且 webhook 工作正常
  • 你是在群聊还是私聊,你在 Telegram 中给机器人输入什么?如果这是您的前缀,您可能需要包含“/”,调试 $text 变量以查看 Telegram 传递给您的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2018-08-10
相关资源
最近更新 更多