Laravel中使用webhook开发Telegram机器人自定义指令
Laravel使用Dingo API+JWT实现认证机制 无痛刷新Token
- 一、操作Telegram
- 1. 创建Telegram机器人
- 2. 创建command指令
- 二、安装[Telegram-Bot-SDK](https://github.com/irazasyed/telegram-bot-sdk)
- 1. 执行composer命令
- 2. 修改config/app.php添加配置
- 3. 执行命令发布配置
- 4. 添加.env配置
- 三、使用[Telegram-Bot-API](https://telegram-bot-sdk.readme.io/reference)
- 四、设置Webhook
- 1. web应用添加路由
- 2. API添加路由
- 3. 请求setWebhook接口,url参数必须支持https
- 4. 通过getWebhookInfo接口查看Webhook信息
- 五、自定义指令开发
- 1. 修改config/telegram.php添加指令
- 2. 修改默认start指令
- 3. 修改默认help指令
- 4. 添加自定义article指令
一、操作Telegram
1. 创建Telegram机器人
- 与@BotFather交谈,或者点击链接 : https://telegram.me/BotFather
- 点击Start
- 点击 /newbot
- 输入机器人名称 name,设置后可以修改
- 输入机器人用户名 username,必须以bot结尾,被@和搜索的名字,设置后无法修改
- 得到API Token
2. 创建command指令
- 点击/mybot
- 点击Edit Bot
- 点击Edit Commands
- 输入命令列表:
command1 - 描述
command2 - 描述
例如:article - 查看或搜索文章
二、安装Telegram-Bot-SDK
1. 执行composer命令
composer require irazasyed/telegram-bot-sdk ^2.0
2. 修改config/app.php添加配置
'providers' => [Telegram\Bot\Laravel\TelegramServiceProvider::class
]
'aliases' => ['Telegram' => Telegram\Bot\Laravel\Facades\Telegram::class
]
3. 执行命令发布配置
php artisan vendor:publish --provider="Telegram\Bot\Laravel\TelegramServiceProvider"
4. 添加.env配置
TELEGRAM_BOT_TOKEN=API TOKEN
TELEGRAM_ASYNC_REQUESTS=false
三、使用Telegram-Bot-API
以Laravel-admin自定义行操作为例
<?php
namespace App\Admin\Actions\Article;use Encore\Admin\Actions\RowAction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use Telegram\Bot\Laravel\Facades\Telegram;class SendToTGChannel extends RowAction
{public $name = '发送文章到TG频道';public $chat_id = '@xxxxx'; //@channelusernamepublic function handle(Model $model){$title = "<a href={https://domin/article/$model->id}>{$model->title}</a>";if ($model->cover) { //有封面 发图片$response = Telegram::sendPhoto(['chat_id' => $this->chat_id,'photo' => Storage::disk(config('admin.upload.disk'))->path($model->cover),'caption' => $title,'parse_model' => 'html', //支持html和markdown]);} else {$response = Telegram::sendMessage(['chat_id' => $this->chat_id,'text' => $title,'parse_model' => 'html',]);}$messageId = $response->getMessageId();if ($messageId) {return $this->response()->success('发送成功')->refresh();} else {return $this->response()->error('发送失败')->refresh();}}public function dialog(){$this->confirm('确定发送文章到TG频道?');}
}
四、设置Webhook
1. web应用添加路由
- 修改routes/web.php,添加Webhook URI到路由中,不能有需要授权的中间件
Route::post('/API TOKEN/webhook', function () {Telegram\Bot\Laravel\Facades\Telegram::commandsHandler(true);
});
- 修改app\Http\Middleware\VerifyCsrfToken.php,将webhook URI添加到$except数组
protected $except = ['/API TOKEN/webhook',];
2. API添加路由
- 修改routes/api.php
//dingo api
$api->post('v1/API TOKEN/webhook', function () {Telegram\Bot\Laravel\Facades\Telegram::commandsHandler(true);
});
3. 请求setWebhook接口,url参数必须支持https
curl https://api.telegram.org/botAPI TOKEN/setWebhook --data url=https://domain/API TOKEN/webhook
4. 通过getWebhookInfo接口查看Webhook信息
curl https://api.telegram.org/botAPI TOKEN/getWebhookInfo
五、自定义指令开发
1. 修改config/telegram.php添加指令
'commands' => [//Telegram\Bot\Commands\HelpCommand::class,App\Console\Telegram\Start::class,App\Console\Telegram\Help::class,App\Console\Telegram\Article::class,
],
2. 修改默认start指令
<?phpnamespace App\Console\Telegram;use Telegram\Bot\Actions;
use Telegram\Bot\Commands\Command;class Start extends Command
{/*** @var string Command Name*/protected $name = 'start';/*** @var string Command Description*/protected $description = '开始';/*** {@inheritdoc}*/public function handle($arguments){//回复消息$this->replyWithMessage(['text' => '你好!欢迎使用机器人,以下是我们可以用的指令:']);//切换到输入状态$this->replyWithChatAction(['action' => Actions::TYPING]);//触发帮助指令$this->triggerCommand('help');$this->replyWithMessage(['text' => '以下是热门文章:']);$this->replyWithChatAction(['action' => Actions::TYPING]);$this->triggerCommand('article');}
}
3. 修改默认help指令
<?phpnamespace App\Console\Telegram;use Telegram\Bot\Commands\Command;class Help extends Command
{/*** @var string Command Name*/protected $name = 'help';/*** @var string Command Description*/protected $description = '帮助';/*** {@inheritdoc}*/public function handle($arguments){$commands = $this->telegram->getCommands();$text = '';foreach ($commands as $name => $handler) {$text .= sprintf('/%s - %s'.PHP_EOL, $name, $handler->getDescription());}$this->replyWithMessage(compact('text'));}
}
4. 添加自定义article指令
<?phpnamespace App\Console\Telegram;use App\Models\ArticleModel;
use Telegram\Bot\Commands\Command;class Article extends Command
{/*** @var string Command Name*/protected $name = 'Article';/*** @var string Command Description*/protected $description = '查看或搜索文章';/*** {@inheritdoc}*/public function handle($arguments){if ($arguments) {//搜索 /article 新冠肺炎 回复标题包含“新冠肺炎”的10篇文章$article = ArticleModel::where('title', 'LIKE', "%{$arguments}%")->take(10)->get();} else {$article = ArticleModel::orderBy('created_at', 'DESC')->take(10)->get();}$return = ['text' => '','parse_mode' => 'html' //支持html和markdown];foreach ($article as $item) {$return['text'] .= "
<a href={https://domin/article/$item->id}>{$item->title}</a>";}$this->replyWithMessage($return);}
}
Laravel中使用webhook开发Telegram机器人自定义指令相关推荐
- php调用nexmo发送短信,在 Laravel 中 “规范” 的开发短信验证码发送功能
Laravel简介 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行 ...
- 如何在 Laravel 中 “规范” 的开发验证码发送功能
需求场景 发送「验证码」或者「消息通知」,可发送到手机或邮箱中. 完成 首先,在 Laravel 中的规范就是使用 Laravel 的「消息通知」,这里基于场景为「验证码」.这个需求几乎所有软件系统都 ...
- php开发telegram机器人接收机器人收到的消息
首先需要有一个机器人拿到机器人token token:68xxxx88:AAG5xxxxxxxx 想收到机器人的消息需要给bot设置一个回调地址 // 向telegram bot指定域名 public ...
- Java开发Telegram机器人
基于springboot在[pom]中添加 <dependency><groupId>org.telegram</groupId><artifactId> ...
- Angularjs进阶笔记(2)—自定义指令中的数据绑定
[摘要]有关自定义指令的scope参数,网上很多文章都在讲这3种绑定方式实现的效果是什么,但几乎没有人讲到底怎么使用,本篇希望聊聊到底怎么用这个话题. 一. 自定义指令 自定义指令,是Angularj ...
- Vue中directives用法--自定义指令控制按钮权限
1. 新建 hasPermission.js文件 const hasPermission = {install (Vue, options) {Vue.directive('has', {insert ...
- 自定义指令与自定义指令的回调函数inserted和componentUpdated
之前在项目中做了一个自定义指令,随着项目的开发前期的自定义指令并不能满足后期的需求,所以今天给大家介绍一下vue的自定义指令以及我的一些理解,希望可以帮到大家. 那么废话不多说,直接上代码.有疑问欢迎 ...
- 自定义指令监听多个div_Vue 3 | 自定义指令的新玩法
开门见山 按照惯例,从上帝视角看一下自定义指令在 Vue 3 中发生了哪些改变: 自定义指令的 API 改了名字,名字更贴近组件的生命周期 自定义指令可以通过子组件的 v-bind="$a ...
- [Vue]自定义指令
前言 系列文章目录: [Vue]目录 老师的课件笔记,不含视频 https://www.aliyundrive.com/s/B8sDe5u56BU 笔记在线版: https://note.youdao ...
最新文章
- JAVA如何判断两个字符串是否相等(亲测第二种方式)
- 超酷的OpenSource的Javascript Calendar控件
- daemon进程(转)
- [webpack]手写一个mvp版本的webpack
- 【渝粤题库】陕西师范大学800008 综合自然地理
- 百度服务器保存信息多久,百度识图会保存图片在服务器上吗?
- 软件需求功能测试用例,软件测试用例与需求的对应关系
- python多变量相关性分析_两个变量与因变量相关性分析_spss多变量相关性分析
- python序列类型映射_python学习笔记(基础:变量,序列,映射) | 学步园
- 解决微信扫码下载的两个方法
- 图解海康威视摄像头和硬盘录像机的网络连接与端口映射
- 2 路 FULL Cameralink 视觉检测 BOX
- win7计算机怎么远程桌面连接不上,Win7系统连接不上远程桌面的解决方法
- 2021InfoComm|钉钉会议 Rooms 的 “全场景“ 智能化解决方案
- 计算机英语总结250字,英语作文范文 250字
- [科幻]一堂宇宙生物课
- 三年级计算机课教案文档,三年级下册信息技术教案(1-4课)
- C语言·输入身份证号码,给出年月日。
- 高版本CUDA 在算力低的显卡上不执行核函数如no kernel image is available for execution on the device
- PC机与交换机通信的原理描述