ycs77 / laravel-line-bot
Laravel 的 LINE 消息 API SDK。
Requires
- php: ^7.1
- facade/ignition-contracts: ^1.0
- illuminate/console: ~5.7|~5.8|^6.0
- illuminate/contracts: ~5.7|~5.8|^6.0
- illuminate/database: ~5.7|~5.8|^6.0
- illuminate/http: ~5.7|~5.8|^6.0
- illuminate/support: ~5.7|~5.8|^6.0
- linecorp/line-bot-sdk: ^4.1
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ~3.7|~3.8|^4.0
- phpunit/phpunit: ^7.0|^8.0
This package is auto-updated.
Last update: 2020-08-16 08:17:03 UTC
README
开发中
在 Laravel 中快速开发 Line Bot
安装前准备
- 创建一个 Laravel (或 Lumen) 项目
- 在 Line Developers 中设置新的 Messaging API
- 准备一个 HTTPS 网址,开发时建议使用 ngrok 来建立临时网址。
安装
使用 Composer 安装:
composer require ycs77/laravel-line-bot
发布设置文件(可选):
php artisan vendor:publish --provider=Ycs77\\LaravelLineBot\\LineBotServiceProvider
将 Line Bot 密钥设置到 .env
文件中(在刚才新增的 Messaging API 中生成):
LINE_BOT_CHANNEL_ACCESS_TOKEN=xxx...
LINE_BOT_CHANNEL_SECRET=123...
执行安装命令,生成 Laravel LineBot 所需的文件:
php artisan linebot:install
将 webhook 路径添加到 Laravel 的 VerifyCsrfToken
中间件中的 except
数组中,以禁用 CSRF 检查:
app/Http/Middleware/VerifyCsrfToken.php
class VerifyCsrfToken extends Middleware { protected $except = [ 'webhook', ]; }
最后,打开 Line Developers,关闭“欢迎消息”和“自动回复消息”,并开启和设置 Webhook 网址:
Lumen
如果使用 Lumen,则需要另外一种注册方式。使用 Composer 安装完套件后,首先将 config 文件复制到 config/linebot.php
(如果 config 文件夹不存在,请自行创建),然后打开 bootstrap/app.php
,添加以下代码进行注册。
bootstrap/app.php
$app->configure('app'); $app->configure('linebot'); /* |-------------------------------------------------------------------------- | Register Service Providers |-------------------------------------------------------------------------- | | ... | */ $app->register(Ycs77\LaravelLineBot\LineBotLumenServiceProvider::class);
最后,执行 php artisan linebot:install
并在 Line Developers 中设置 webhook 网址即可。
使用
首先打开 routes/linebot.php
,在 Laravel LineBot 中所有的监听消息及回传消息的程序,都是在这个文件中:
routes/linebot.php
<?php use Ycs77\LaravelLineBot\Facades\LineBot; LineBot::on()->text('嗨', function () { LineBot::text('你好')->reply(); }); LineBot::on()->fallback(function () { LineBot::text('我不大了解您的意思...')->reply(); });
在这个例子中,如果用户发送 嗨
,则会自动回复 你好
。
监听事件 (Event)
最基本的事件是监听文字消息事件,当然也可以使用 {name}
的替代文字来提取用户发送的部分文字,并转换成变量:
用法参考自 Botman
LineBot::on()->text('我叫{name}', function ($name) { LineBot::text("你好{$name}")->reply(); });
如果没有匹配成功任何消息,将会回复默认回复:
LineBot::on()->fallback(function () { LineBot::text('我不大了解您的意思...')->reply(); });
除了文字消息事件,也可以监听图片消息事件、关注事件等:
这些功能目前尚未完成
LineBot::on()->image(function () { LineBot::text('圖片')->reply(); }); LineBot::on()->follow(function () { LineBot::text('加為好友')->reply(); });
可以监听的所有事件:
text()
: 文字消息事件image()
: (未完成) 图片消息事件video()
: (未完成) 视频消息事件audio()
: (未完成) 音频消息事件file()
: (未完成) 文件消息事件location()
: (未完成) 位置消息事件sticker()
: (未完成) 贴图消息事件follow()
: (未完成) 关注事件unfollow()
: (未完成) 取消关注事件join()
: (未完成) 加入聊天室事件leave()
: (未完成) 退出聊天室事件memberJoin()
: (未完成) 其他人员加入聊天室事件memberLeave()
: (未完成) 其他人员退出聊天室事件postback()
: (未完成) Postback 事件accountLink()
: (未完成) 用户链接事件fallback()
: 默认回复
回复 (Reply)
文字消息:
LineBot::on()->text('嗨', function () { LineBot::text('你好')->reply(); });
按钮菜单:
行动按钮的使用方式请参考 行动按钮 (Action)
use Ycs77\LaravelLineBot\ActionBuilder; use Ycs77\LaravelLineBot\Message\TemplateBuilder; LineBot::on()->text('選單', function () { LineBot::template('這是我的選單', function (TemplateBuilder $template) { $template->button('選單', '請選擇', 'https://example.test/image/path...', function (ActionBuilder $action) { $action->message('購買'); $action->message('加到購物車'); $action->url('瀏覽網站', 'https://developers.line.biz/zh-hant/'); }); })->reply(); }); LineBot::on()->text('購買', function () { LineBot::text('購買成功!')->reply(); }); LineBot::on()->text('加到購物車', function () { LineBot::text('加到購物車成功!')->reply(); });
可以使用的所有回复消息类型:
text()
: 文字sticker()
: (未完成) 贴图image()
: (未完成) 图片video()
: (未完成) 视频audio()
: (未完成) 音频location()
: (未完成) 位置imagemap()
: (未完成) 图像映射template()
: 模板消息flex()
: (未完成) Flex
所有可用的模板消息类型:
buttons()
: 按钮菜单confirm()
: 确认carousel()
: (未完成) 轮播imageCarousel()
: (未完成) 图片轮播
快速回复 (Quick Reply)
行动按钮的使用方式请参考 行动按钮 (Action)
快速回复无法使用 URL Action
use Ycs77\LaravelLineBot\QuickReplyBuilder; LineBot::on()->text('哈囉', function () { LineBot::text('請問有什麼能為您服務?') ->quickReply(function (QuickReplyBuilder $action) { $action->message('商品清單'); $action->message('聯絡資訊'); }) ->reply(); }); LineBot::on()->text('商品清單', function () { LineBot::text('商品清單...')->reply(); }); LineBot::on()->text('聯絡資訊', function () { LineBot::text('聯絡資訊...')->reply(); });
行動按鈕 (Action)
行動按鈕需搭配 Quick Reply 和 Template 訊息使用。以下為使用範例:
$action->message('購買'); $action->message('加到購物車'); $action->url('瀏覽網站', 'https://example.test/');
所有可用的行動按鈕:
message()
: 文字消息url()
: 網址postback()
: 回调location()
: 选择位置datetimePicker()
: 日期camera()
: 相機cameraRoll()
: 图片库
用户信息
取得 Line 用戶資料
使用 LineBot::profile()
即可取得當前用戶的資訊:
LineBot::on()->text('profile', function () { $profile = LineBot::profile(); LineBot::text("你好 {$profile->name()}")->reply(); });
可以取得的用戶資訊:
id()
: 用户 IDname()
: 用户显示名称 (昵称)picture()
: 用户大頭貼網址status()
: 用户状态消息文字
整合 Eloquent
这个功能默认是关闭的,需要先把 LineBot 设置中的 user.enabled
改成 true
,才可以开始使用 Eloquent:
还可以依需求调整
model
(用户模型) 及id
(辨識用戶的欄位名稱)。
config/linebot.php
'user' => [ 'enabled' => true, 'model' => App\User::class, 'id' => 'line_user_id', ],
在 Lumen 中需要開啟
bootstrap/app.php
取消$app->withEloquent();
的註釋
然后將 users
資料表修改成以下欄位,和运行 php artisan migrate
:
database/migrations/2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('line_user_id')->unique(); $table->timestamps(); });
修改 User Model:
app/User.php
<?php namespace App; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Ycs77\LaravelLineBot\CanStoreLineBotUser; use Ycs77\LaravelLineBot\Contracts\User as UserContract; class User extends Authenticatable implements UserContract { use Notifiable, CanStoreLineBotUser; protected $fillable = [ 'name', 'line_user_id', ]; }
最后,就可以使用 LineBot::user()
来取得用戶模型了:
LineBot::on()->text('user', function () { $user = LineBot::user(); LineBot::text("你好:{$user->name}")->reply(); });
Rich Menu
新增 Rich Menu 和上传图片
详细配置请参考 Line 官方说明:Using rich menus
准备一张 Rich Menu 的图片
在 config/linebot.php
中设置 rich_menu
的设置 (建议可以使用 LINE Bot Designer 來产生)。每个 Rich Menu 都要设定对应的 key (跟 Line 官方没有关系,只是用来辨认 Rich Menu 而已),例如範例将 key 设定为 rich_menu_1
:
routes/linebot.php
'rich_menus' => [ 'rich_menu_1' => [ 'size' => [ 'width' => 2500, 'height' => 1686, ], 'selected' => false, 'name' => '我的 Rich Menu', 'chatBarText' => '開啟選單', 'areas' => [ [ 'bounds' => [ 'x' => 0, 'y' => 0, 'width' => 2500, 'height' => 1686, ], 'action' => [ 'type' => 'message', 'label' => 'Rich Menu', 'text' => 'Rich Menu', ], ], ], ], ],
执行 linebot:richmenu:create
命令新增 Rich Menu 和上传图片,参数需要 Rich Menu 的 key (上方 config 设置) 和图片路径 (範例图片路径为 "public/image.jpg"
):
php artisan linebot:richmenu:create rich_menu_1 "public/image.jpg"
查看 Rich Menu
查看全部 Rich Menu ID:
php artisan linebot:richmenu:list
查看全部 Rich Menu 的原始資料:
php artisan linebot:richmenu:list --raw
刪除 Rich Menu
刪除指定 Rich Menu ID:
php artisan linebot:richmenu:clear richmenuid-sdg24sd56gf...
刪除全部 Rich Menu:
php artisan linebot:richmenu:clear --all
调用 LINE 官方 SDK 的 API
使用 LineBot::base()
即可调用 LINE 官方 SDK 的 API:
LineBot::on()->text('LINE SDK', function () { $token = LineBot::getEvent()->getReplyToken(); LineBot::base()->replyText($token, '回傳文字...'); });
参考
测试
运行测试:
composer test
运行指令产生测试覆盖率报告,报告产生在 build/coverage-report
:
composer coverage
License
Under the MIT license.