ycs77/laravel-line-bot

此包已被弃用且不再维护。未建议替代包。

Laravel 的 LINE 消息 API SDK。

v0.3.0 2020-01-16 06:09 UTC

This package is auto-updated.

Last update: 2020-08-16 08:17:03 UTC


README

Latest Version on Packagist Software License CI Build Status Style CI Build Status Codecov Status Total Downloads

开发中

在 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 网址:

LINE Bot 回應設定

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(): 用户 ID
  • name(): 用户显示名称 (昵称)
  • 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.