九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、このところはLINEに関するマーケティング話をしてきましたが、今日も同じくLINE
マーケティングの話です(笑)
LINE
は「開封率が高い」「到達率も高い」という大きなメリットが
あるのでマーケターさんは好んで使ってます。
しかし、その反面大きなデメリットがあるのをご存知でしょうか。
それは・・・・・・
アカウント凍結されやすい
というものです。
人気であるがゆえにいろんな人が「やっちゃいけない事」をするんでしょうね。
LINE
としても凍結しやすくせざるを得ないようです。
しかし、アカウント凍結されるとどうなるでしょうか・・・・・・
そう❗
これまでゲットした全リストを失う
わけです。😨
例えば、これまで10,000
見込み客とお友達になっていたとしても
アカウント凍結されたら、そのリストは全て失われます。ゼロ!
※ ウェブフックでユーザーデータを保存しておいても結局友達登録しないとメッセージが送れないのでLINE ID
があっても意味がないんです…。
これが大きなデメリットと言われているんですね。
そこで❗
今回はLaravel
でこの「LINE アカウント凍結」の
リスクヘッジをする(保険をかけておく)機能をつくってみます。
ぜひ何かの参考になりましたら嬉しいです。😄✨
「たしかにX(旧Twitter)に
LINEへ誘導しようとする
日本語の怪しいアカウントあるね…」
開発環境: Laravel 11.x
目次
リスクヘッジする方法
LINE
へ登録してもらったら、一番はじめに
メルマガへ誘導するようにします。
そのために、「メルマガ限定のクーポンをお届けします😄」としておきましょう。(これで更に集客したお客さんを「育てる」こともできます!)
そして、DB
の方ではLINE
ユーザーと、メルマガのユーザーが紐づくように(名寄せ)しておきましょう。
そうすることでリスクに対応することができます。
例えば、アカウント凍結後に別アカウントをつくり、そこに友達追加された場合、LINE ID
からデータを紐付けて過去データを呼び出すことができるわけです。
また、シンプルにメールアドレスを取得しているのでメールでセールスすることもできるわけですね!
前提として
参考ページを見て、以下の作業を完了させておいてください。
- LINE Messaging API を有効にする
- ウェブフックを有効にする
- パッケージ「linecorp/line-bot-sdk」をインストールする
- CSRFトークンのチェックを解除
📝 参考ページ1: Line Messaging API で画像つき通報システムをつくる(神戸市に影響されて)
📝 参考ページ2: おまけ: ngrok について
📝 参考ページ3: CSRFトークンのチェックを解除する
※なお、Laravel 11.x
からCSRF
トークン解除の設定方法が変わっていますので注意してください。
では今回も楽しんでやっていきましょう❗
DBまわりをつくる
まずはデータベース周りです。
以下のコマンドを実行してください。
php artisan make:model LineUser -m php artisan make:model NewsletterUser -m
そして、作成されたファイルを以下のように変更します。
database/migrations/****_**_**_******_create_line_users_table.php
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('line_users', function (Blueprint $table) { $table->id(); $table->uuid()->unique()->comment('UUID'); $table->string('line_id')->comment('LINEのID'); $table->string('mode')->comment('チャネルの状態'); $table->string('display_name')->comment('LINEの名前'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('line_users'); } };
database/migrations/****_**_**_******_create_newsletter_users_table.php
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('newsletter_users', function (Blueprint $table) { $table->id(); $table->uuid()->unique()->comment('UUID'); $table->string('email')->unique()->comment('メールアドレス'); $table->boolean('is_agreed')->default(false)->comment('受け取り許可'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('newsletter_users'); } };
では、以下のコマンドでDB
を初期化しておきましょう。
php artisan migrate:fresh --seed
すると、実際のテーブルはこうなりました。
ウェブフック用のコントローラーをつくる
次に、お友達登録されたときやメッセージが
送信されたときにデータ受信する「ウェブフック」をつくります。
以下のコマンドを実行してください。
php artisan make:controller LineMarketingWebhookController
そして、作成されたファイルを以下のように変更してください。
app/Http/Controllers/LineMarketingWebhookController.php
<?php namespace App\Http\Controllers; use App\Models\LineUser; use GuzzleHttp\Client as GuzzleClient; use Illuminate\Http\Request; use Illuminate\Support\Str; use LINE\Clients\MessagingApi\Configuration; use LINE\Clients\MessagingApi\Api\MessagingApiApi; use LINE\Clients\MessagingApi\Model\ReplyMessageRequest; use LINE\Clients\MessagingApi\Model\TextMessage; use LINE\Parser\EventRequestParser; use LINE\Webhook\Model\FollowEvent; class LineMarketingWebhookController extends Controller { private $channel_secret, $access_token; public function __construct() { $this->channel_secret = env('LINE_CHANNEL_SECRET'); // 本来は config から取得すべきです $this->access_token = env('LINE_ACCESS_TOKEN'); // 本来は config から取得すべきです } public function receive(Request $request) { $request_body = $request->getContent(); $hash = hash_hmac('sha256', $request_body, $this->channel_secret, true); $signature = base64_encode($hash); if($signature === $request->header('X-Line-Signature')) { $client = new GuzzleClient; $config = new Configuration(); $config->setAccessToken($this->access_token); $this->api = new MessagingApiApi( client: $client, config: $config, ); try { $event_parser = EventRequestParser::parseEventRequest($request_body, $this->channel_secret, $signature); foreach($event_parser->getEvents() as $event) { if($event instanceof FollowEvent) { // お友達の登録したとき $reply_token = $event->getReplyToken(); $line_id = $event->getSource()->getUserId(); $mode = $event->getMode(); $profile = $this->api->getProfile($line_id); $display_name = $profile->getDisplayName(); if(is_null($line_id) || is_null($mode)) { continue; } $line_user = LineUser::where('line_id', $line_id)->first(); if(is_null($line_user)) { $line_user = new LineUser; $line_user->uuid = Str::uuid(); $line_user->line_id = $line_id; } $line_user->mode = $mode; // チャネルの状態 $line_user->display_name = $display_name; // LINEの表示名 $line_user->save(); $text = view('line_webhook.thanks_text', [ 'line_user' => $line_user, ])->render(); $this->replyText($reply_token, $text); } } } catch (\Exception $e) {} } else { abort(404); } } private function replyText(string $reply_token, string $text) { $message = new TextMessage([ 'type' => 'text', 'text' => $text, ]); $request = new ReplyMessageRequest([ 'replyToken' => $reply_token, 'messages' => [$message], ]); $this->api->replyMessage($request); } }
メッセージ用のビューをつくる
続いて、先ほどのコントローラーの中でセットした
「メッセージ用」のビューをつくります。
以下のコマンドを実行してください。
php artisan make:view line_webhook.thanks_text
そして、作成されたファイルは以下のようにします。
resources/views/line_webhook/thanks_text.blade.php
{{ $line_user->display_name }}さん、こんにちは! Console dot Log のすこひです。 お友達追加ありがとうございます。 これから、毎月 26日 にお得なクーポン情報をお届けします。 ぜひ、お楽しみに! ※ 通知が気になる方は、「トーク設定 → 通知」を OFF にしてください。 なお、メルマガに登録すると「メルマガ限定クーポン」もお届けします。 ぜひ、登録してくださいね! {{ route('newsletter.create', $line_user->uuid) }}
メルマガ登録用コントローラーをつくる
そして、「メルマガ登録用」のコントローラーです。
以下のコマンドを実行してください。
php artisan make:controller NewsletterController
作成されたファイルを以下のようにします。
app/Http/Controllers/NewsletterController.php
<?php namespace App\Http\Controllers; use App\Models\LineUser; use App\Models\NewsletterUser; use Illuminate\Http\Request; class NewsletterController extends Controller { public function create(string $uuid) { $line_user = $this->getLineUserByUuid($uuid); return view('newsletter.create', [ 'line_user' => $line_user, ]); } public function store(Request $request) { // バリデーションは省略しています $line_user = $this->getLineUserByUuid($request->uuid); $newsletter_user = new NewsletterUser(); $newsletter_user->uuid = $line_user->uuid; $newsletter_user->email = $request->email; $newsletter_user->is_agreed = $request->is_agreed; $newsletter_user->save(); return 'メルマガの登録が完了しました。'; } private function getLineUserByUuid(string $uuid) { $line_user = LineUser::where('uuid', $uuid)->first(); if(is_null($line_user)) { // お友達登録していない場合 abort(404); } return $line_user; } }
メルマガ登録フォーム用のビューをつくる
続いて先ほどNewsletterController.php
内でセットしたフォーム用のビューをつくります。
以下のコマンドを実行してください。
php artisan make:view newsletter.create
そして、中身を以下のようにします。
resources/views/newsletter/create.blade.php
<html> <head> <script src="https://cdn.tailwindcss.com/3.4.1"></script> </head> <body> <div class="p-5"> <h1 class="text-2xl font-bold text-center">メルマガ登録フォーム</h1> <form method="POST" action="{{ route('newsletter.store') }}" class="flex flex-col space-y-2 w-full max-w-md mx-auto"> @csrf <input type="hidden" name="uuid" value="{{ $line_user->uuid }}"> <label> メールアドレス <input type="email" name="email" class="px-4 py-2 border border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-transparent rounded-md shadow-sm w-full"> </label> <label> <div class="p-2"> <input type="checkbox" name="is_agreed" value="1" class="mr-2"> メルマガでお得な情報の配信を希望する </div> </label> <button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50 w-full">登録する</button> </form> </div> </body> </html>
これで作業は完了です❗
お疲れ様でした😄✨
テストしてみる
では、実際にテストしてみましょう❗
まずはLINE
で友達登録してみます。
すると・・・・・・
はい❗
登録完了のメッセージと
メルマガ登録フォームのURLが届きました。
※ ここにUUID
が入っているわけですね。
では、このURL
をクリックしてみましょう。
どうなるでしょうか・・・・・・
フォームが表示されました。
ということで以下のようにして送信してみましょう。
うまくいくでしょうか・・・・・・
はい❗
登録完了メッセージが表示されました。
成功です😄
では、データベースの方がちゃんと名寄せできているか確認しておきましょう。
はい❗
UUID
が同じなので名寄せができていることがわかります。
今後はUUIDを使って相互のデータにアクセスすることができますね👍
すべて成功です。😄✨
企業様へのご提案
集客&セールスをするためには見込み客リストはとても重要な資産
といってもいいでしょう。
もしそれらが一瞬にして消えてしまったとしたら・・・・
しかし、今回のように「保険」をかけておけば安心です。
今ならLINE
構築&メルマガによるリスクヘッジのご相談を承っています。
ぜひお気軽にお問い合わせからご相談ください。
お待ちしております。😄✨
おわりに
ということで、今回は「LINEユーザーのアカウント凍結対策」をお届けしました。
とって集客は「マーケティングファネル」の
一番最初の部分になりますので、
ここの母数が多いほうがより成約数も多くなるわけです。
さらに、見込み客が多いということは
「より質の高い顧客」と巡り合う可能性も高くなるので、
リストを守っておくに越したことはありません。
ぜひ皆さんも「リストマーケティング」を利用した
「稼ぐプログラム」を作ってみてくださいね。
ではでは〜❗
「半数は見終わりましたが、
YouTube の『後で見る』が
150本を超えてました。知恵熱出る…😂」