Telegram Bot部署和配置

By | 2017年11月1日

Telegram是国外一款比较流行的聊天软件,国内由于某些原因(你懂的)无法直接使用,需要f-q后才能连接。

在Telegram有个非常好玩实用的功能就是bot,聊天机器人。我们可以对机器人自定义开发,设置好指令和任务,需要时发送指令给它,它会完成设置的任务,然后给出反馈。

另外可以直接做一个消息通知的功能,直接通过api接口,让机器人给我们指定的某个用户ID发送信息(这个功能测试下来手机网络是不需要f-q的)。

一、首先我们要先创建一个自己的机器人

在telegram中搜索机器人之父帐号【BotFather】,它是我们的机器人管家,可以创建、修改、获取APIToken。

点击右上角头像,可以查看它的帐号信息:

点击Start,开始进入菜单:

点击/newbot,开始创建bot:

输入Bot名称:

创建完成后,会得到一串token值,这就是我们要进行开发用的apitoken值。

如何在Chats列表中找到我们创建的机器人呢,只需要在上方的搜索框中输入自己创建的机器人的名称。

给自己的机器人发送消息,发现没有任何回应。

二、利用php-telegram-bot框架开发自己的机器人

网上也有python框架的,看个人喜好,我用php框架来开发。

我们下载example-bot项目,里面帮我们定义好了一些常用指令,可以开箱即用。

初次下载,需要先使用composer安装下:

composer install

在开始正式配置代码前,有几个前提:

1、部署代码的服务器要在墙外(或者你有fq代理帐号可以使用),如果你用的阿里云的国内ECS,是无法使用的
2、web server需要开启https,并且所用的证书必须是互联网上广泛认可的证书,推荐使用阿里云免费的Symantec证书,或者使用Certbot申请LetEncry证书

1)设置set.php,即设置webhook

<?php
/**
 * README
 * This file is intended to set the webhook.
 * Uncommented parameters must be filled
 */

// Load composer
require_once __DIR__ . '/vendor/autoload.php';

// Add you bot's API key and name
$bot_api_key  = 'Change Here';
$bot_username = 'Change Her';

// Define the URL to your hook.php file
$hook_url     = 'Change Here';

try {
    // Create Telegram API object
    $telegram = new Longman\TelegramBot\Telegram($bot_api_key, $bot_username);

    // Set webhook
    $result = $telegram->setWebhook($hook_url);
	
    // To use a self-signed certificate, use this line instead
    //$result = $telegram->setWebhook($hook_url, ['certificate' => '']);

    if ($result->isOk()) {
        echo $result->getDescription();
    }
} catch (Longman\TelegramBot\Exception\TelegramException $e) {
    echo $e->getMessage();
}

修改三处Change Here,然后通过浏览器访问set.php文件,如果成功执行,会返回Webhook was set

检查下设置,通过浏览器直接访问如下地址:

https://api.telegram.org/bot改为token值/getWebHookInfo

得到如下信息,如果ok为true,后面也没什么异常描述,说明https证书是可以用的,配置也没问题:

{"ok":true,"result":{"url":"https://xxx/hook.php","has_custom_certificate":false,"pending_update_count":0,"max_connections":40}}

2)设置hook.php,

<?php
/**
 * README
 * This configuration file is intended to run the bot with the webhook method.
 * Uncommented parameters must be filled
 *
 * Please note that if you open this file with your browser you'll get the "Input is empty!" Exception.
 * This is a normal behaviour because this address has to be reached only by the Telegram servers.
 */

// Load composer
require_once __DIR__ . '/vendor/autoload.php';

// Add you bot's API key and name
$bot_api_key  = 'Change here';
$bot_username = 'Change here';

// Define all IDs of admin users in this array (leave as empty array if not used)
$admin_users = [
    
];

// Define all paths for your custom commands in this array (leave as empty array if not used)
$commands_paths = [
    __DIR__ . '/Commands/',
];

// Enter your MySQL database credentials
//$mysql_credentials = [
//    'host'     => 'localhost',
//    'user'     => 'root',
//    'password' => '',
//    'database' => 'telegram',
//];

try {
    // Create Telegram API object
    $telegram = new Longman\TelegramBot\Telegram($bot_api_key, $bot_username);

    // Add commands paths containing your custom commands
    $telegram->addCommandsPaths($commands_paths);

    // Enable admin users
    //$telegram->enableAdmins($admin_users);

    // Enable MySQL
    //$telegram->enableMySql($mysql_credentials);

    // Logging (Error, Debug and Raw Updates)
    Longman\TelegramBot\TelegramLog::initErrorLog(__DIR__ . "/{$bot_username}_error.log");
    Longman\TelegramBot\TelegramLog::initDebugLog(__DIR__ . "/{$bot_username}_debug.log");
    Longman\TelegramBot\TelegramLog::initUpdateLog(__DIR__ . "/{$bot_username}_update.log");

    // If you are using a custom Monolog instance for logging, use this instead of the above
    //Longman\TelegramBot\TelegramLog::initialize($your_external_monolog_instance);

    // Set custom Upload and Download paths
    $telegram->setDownloadPath(__DIR__ . '/Download');
    $telegram->setUploadPath(__DIR__ . '/Upload');

    // Here you can set some command specific parameters
    // e.g. Google geocode/timezone api key for /date command
    //$telegram->setCommandConfig('date', ['google_api_key' => 'your_google_api_key_here']);

    // Botan.io integration
    //$telegram->enableBotan('');

    // Requests Limiter (tries to prevent reaching Telegram API limits)
    $telegram->enableLimiter();

    // Handle telegram webhook request
    $telegram->handle();

} catch (Longman\TelegramBot\Exception\TelegramException $e) {
    // Silence is golden!
    echo $e;
    // Log telegram errors
    Longman\TelegramBot\TelegramLog::error($e);
} catch (Longman\TelegramBot\Exception\TelegramLogException $e) {
    // Silence is golden!
    // Uncomment this to catch log initialisation errors
    echo $e;
}

同样只要修改三个地方就能开始使用了,其中有几个附加功能,可以开启mysql数据库、开启管理员功能。

3)创建自己的Command命令

在Commands目录下有很多现成的,这里我创建一个简单的获取用户ID然后返回的command。

<?php
namespace Longman\TelegramBot\Commands\UserCommands;

use Longman\TelegramBot\Commands\UserCommand;
use Longman\TelegramBot\Request;

class MyidCommand extends UserCommand{
    protected $name = 'myid';                      // Your command's name
    protected $description = 'Get my user id'; // Your command description
    protected $usage = '/myid';                    // Usage of your command
    protected $version = '1.0.0';                  // Version of your command
	
    public function execute()
    {
        $message = $this->getMessage();            // Get Message object

        $chat_id = $message->getChat()->getId();   // Get the current Chat ID
        $user_id = $message->getFrom()->getId();
		
        $data = [                                  // Set up the new message data
            'chat_id' => $chat_id,                 // Set Chat ID to send the message to
            'text'    => 'Your id = '.$user_id, // Set message to send
        ];

        return Request::sendMessage($data);        // Send message!
    }
	
}
?>

现在我们可以开始实测了,在telegram对话框中对自己的机器人输入/myid,看是否能返回自己的ID:

文末彩蛋:

1)如果服务器在国内,但是有代理帐号,可以修改源码实现f-q访问

打开文件:vendor/longman/telegram-bot/src/Request.php

搜索function execute,添加内容如下:

    public static function execute($action, array $data = [])
    {
        //Fix so that the keyboard markup is a string, not an object
        if (isset($data['reply_markup'])) {
            $data['reply_markup'] = json_encode($data['reply_markup']);
        }

        $result                  = null;
        $request_params          = self::setUpRequestParams($data);
        $request_params['debug'] = TelegramLog::getDebugLogTempStream();
	$request_params['proxy'] = "tcp://127.0.0.1:8118";                  //add this line

这里示例用的是在本地创建的client,具体内容请看我的零网blog文章

2)如果服务器是Windows的,那可能会遇到curl检查ssl证书的报错

修改Request.php第215行:

self::setClient(new Client(['base_uri' => self::$api_base_uri,'verify' => false]));

添加了个verify参数,不要让程序检查ssl。

发表评论

电子邮件地址不会被公开。 必填项已用*标注