If I have seen further, it is by standing on the shoulders of giants. I know not what I appear to the world, but to myself I seem to have been only like a boy playing on the sea-shore, and diverting myself in now and then finding a smoother pebble or a prettier shell, whilest the great ocean of truth lay all undiscovered before me. –Isaac Newton

在前一段时间,随着**(巨头)的打压,市场体系的变更,第三方的QQ机器人开发者们相继提高了警惕。QRSpeed暂停了对免费用户的支持,SQ(SQv6,SQv7,SQv8,SQv9)、Medic等相继和谐,纷纷跑路,许多开发者开始了对聊天机器人开发市场的转移,例如钉钉机器人开发,Telegram机器人(电报机器人)开发等。

于是我也蹭着新鲜感从QQ机器人开发转到Telegram机器人开发,在开发初期,我首先面临的问题是我现有的服务器没有能够访问中国大陆以外被墙的网站,我曾尝试借用别人的服务器转发数据,然而这样做面临着很多棘手的问题,例如延迟高,post类请求的发送和接收存在问题,webhook链接不上,转发的数据接收后发送端SSL存在问题,数据反射处理问题……

后来,我在**云发现了轻量应用服务器这个产品,它比正常的云服务器便宜的多,且带宽高,并且有海外区域的云服务器售卖,于是我就心动的买下了,最低配置的价格仅24人民币,性价比相对比普通的服务器高,之后便把我的博客及其它网站从我那性能瓶颈很大的腾讯云学生机迁移到了这个轻量应用服务器中,并配合宝塔(https://www.bt.cn)实现Linux服务器的高效运维,(前面我一直没接触宝塔,用的还是Apache和落后的IIS,我还是从这次的轻量应用服务器中得知了宝塔这个服务器运维工具)。

从我使用宝塔后,常规的服务器运维的各种特殊问题大都迎刃而解了,例如扩展的安装配置问题。并且它集成了LAMP(Linux+Apache+MySQL+PHP)/LNMP(Linux+Nginx+MySQL+PHP)的Linux网站运行环境安装管理,这正让还愁着数据库该如何搭建的我有了新的想法,于是我就借我的短网址生成项目改造成使用数据库的短网址生成,这个项目是我正式学习MySQL入手的第一个项目,随后便出现了使用数据库的聊天的回答匹配词库(问题==>回答,一对一),这些项目都存在这一些严重的问题,例如数据数据冗余,数据库安全,低效的数据处理方式等。

总之,前例的实践为telegram-bot的开发奠定了基础,政治等因素为此开发提供了可能。

这个telegram项目目前采用面向过程写法,说白了就是我不太擅长使用面向对象写法,index.php大概是这样写的(显然我的技术不到位):

<?php
//引入文件
include_once './config.php';
include_once './function.php';
//获取反射信息
$php_input = @file_get_contents('php://input');
$update = json_decode($php_input,true);
//解析反射信息
//……略
//简单的开关控制
if($msg == "/on" && $username == $administrator){@file_put_contents('./switch.txt','enabled');
$text = "Bot is enabled.";
}
//开关
if(@file_get_contents('./switch.txt') == 'disabled'){
die;
}
include './tgtext.php';
//開啟繁體(測試中)
//include './tgtext2.php';
include './tgphoto.php';
include './tgdocument.php';
?>

在这可以发现一些问题,例如config.php没有放置在Web文档树之外,这会有安全隐患,而后面一些tg.+.php则是将telegram分消息类型处理,这时如果把这些封装类可能会方便许多,一个“懒”字便成为了我不想这么做的理由,然后tg.+.php混用了正则表达式和字符串截取等方式判断$text消息,这还是显得有些烦琐。

<?php
//……略
$text = @rawurlencode($text);
$url = "https://api.telegram.org/bot{$token}/sendmessage?chat_id={$chat_id}&text={$text}";
if(strlen($url) <= $getdatamax){
getHttps($url);
}
else{
post($url);
}
?>

最后面采用了分get和post方法发送回复,(多数时候向telegram发送的post请求相对比get请求慢一些,原因待考究),getHttps和post都是在function.php中定义的。

webhook.php用于自己的服务器与telegram建立钩子(hook),说白了就是http的回调(不懂的可以多问问神奇的搜索引擎,常用的搜索引擎有Google,Bing,百度等)

<?php
include_once './config.php';
include_once './function.php';
if(@file_get_contents('./webhook.lck') =='true'){
$url = "https://api.telegram.org/bot{$token}/getWebhookInfo";
getHttps($url,1);
die('<hr/>To change this setting, change or delete the "webhook.lck" file to unlock the settings.');
}
//deletehook
$url = "https://api.telegram.org/bot{$token}/deleteWebhook";
getHttps($url);
//sethook
$url = "https://api.telegram.org/bot{$token}/setWebhook?url={$hookurl}";
getHttps($url,1);
@file_put_contents('./webhook.lck','true');
?>

其它的杂项我就不多说了,telegram-bot项目地址:

https://github.com/xiwangly2/telegram-bot