【Laravel】無料でできる位置情報を使ったセールス手法

こんにちは。フリーランス・コンサルタント&エンジニアの 九保すこひ です。

さてさて、16本のマーケティング講義をすでに3周してますが、量をこなすためいろいろ調べたら「これは自分もやられてたな😂」という手法を見つけました。

それは・・・・・・

位置情報マーケティング

です。例えば、

  • 裕福なエリアに住んでいれば、高額な商品を買いやすい
  • 地方エリアなら移動手段を考えてクルマ関連の商品
  • 家族が多いエリアならキッズ商品

などなど、いろんなパターンが存在するわけ。

そして、実はIPアドレスがあれば(だいたい)アクセス位置が分かるサービスがあったりします。

そこで❗
今回は以下のような人のために記事をお届けします。

  • Laravelと位置情報を絡めた機能をつくりたい
  • Laravelでマーケティングの機能をつくってみたい
  • Laravelの知識をとにかく貯めておきたい

ぜひ最後まで読んでください😊✨

「マーケティングも領域が広いから
学ぶこといっぱい!」

前提として

Laravelにログイン機能がインストールされていることが前提です。
以下のページを参考にして先に用意しておいて下さい。

📝 参照ページ: Laravel Breezeで「シンプルな」ログイン機能をインストール

IPinfoのトークンを取得する

IPinfoIPアドレスからその場所を取得することが出来るサービスで月50,000回まで無料で使用することができます。(2024.5.9現在)

※ ただし取得出来る情報は最低限のものだけです。詳しくはこちら

では、まずは IPinfo へ移動し、 右上の「Sing up」ボタンをクリックします。

すると、フォームが表示されるので、名前とメールアドレス、パスワードを入力して送信します。

すると、認証メールが届くので「Verify email address」ボタンをクリック。

これで、本登録が完了し自動ログインされます。
すると、移動後のページ下部にトークンが表示されています。

これをLaravelでいつでも使えるように.envにセットしておきましょう。

.env

IPINFO_TOKEN=(ここにトークン)

※ 本来はconfigに入れておくべきですが、今回は省略します。

DB周りをつくる

では、まずはモデルとマイグレーションをつくりましょう。
以下のコマンドを実行して下さい。

php artisan make:model UserLocation -m

すると、ファイルが作成されるので中身を以下のように変更します。

app/Models/UserLocation.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class UserLocation extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'city',
        'region',
        'country',
    ];
}

database/migrations/****_**_**_******_create_user_locations_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('user_locations', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id')->comment('ユーザー ID');
            $table->string('city')->comment('市区町村');
            $table->string('region')->comment('都道府県');
            $table->string('country')->comment('国');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('user_locations');
    }
};

今回は「市区町村、都道府県、国」での判別ですがIPinfoでは無料版でも以下のような情報を取得することができます。

  • 市区町村(都市名)
  • 都道府県(地方名)
  • 緯度経度(GPS)
  • 組織(プロバイダー)
  • 郵便番号
  • タイムゾーン

では、この状態でマイグレーションを実行してみましょう。
以下のコマンドを実行して下さい。

php artisan migrate

すると、実際のテーブルはこうなりました。

ログインをキャッチするイベントリスナーをつくる

では、ログインしたときに自動で実行されるコード(リスナー)をつくっておきましょう。

app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

use App\Models\UserLocation;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Event;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Event::listen(
            Login::class,
            [$this, 'onLogin']
        );
    }

    public function onLogin(Login $event): void
    {
        $ip = request()->ip();
        $token = env('IPINFO_TOKEN');
        $url = 'https://ipinfo.io/'. $ip .'?token='. $token;
        $response = Http::get($url);

        if($response->ok()) {

            $user = $event->user;
            $ip_data = $response->json();

            if(Arr::has($ip_data, 'city')
                && Arr::has($ip_data, 'region')
                && Arr::has($ip_data, 'country')) {

                UserLocation::firstOrCreate([
                    'user_id' => $user->id,
                    'city' => $ip_data['city'],
                    'region' => $ip_data['region'],
                    'country' => $ip_data['country'],
                ]);

            }

        }
    }
}

※ なお、Illuminate\Support\Facades\Httpを使っておくと、ユニットテストのときにフェイクのレスポンスとかを指定できて便利ですよ❗

テストしてみる

では、今回はテスト用のIPアドレス8.8.8.4を使いたいので少しだけコードを変更します。

app/Providers/AppServiceProvider.php

//        $ip = request()->ip();
        $ip = '8.8.8.4'; // 👈 これに置き換えました

では、「https://******/login」へブラウザでアクセスしてログインします。

すると・・・・・・

ログインできました。

では、テーブルを確認してみましょう。

はい❗
IPアドレスから場所の情報が取得できました。

これは、GoogleのIPアドレスでした。

では、年のためもうひとつIPinfoが用意してくれていた1.1.1.14へ変更してログインしなおしてみましょう。

どうなるでしょうか・・・・・・

はい❗
またひとつ増えましたね。

成功です😊✨

企業様へのご提案

今回のように、ユーザーの位置情報を取得することができますので、もしクライアント様が位置情報に関連が高い商品をお持ちでしたら、きっとお力になれるかと思います。

もしそういったご相談がございましたら、いつでもお気軽にお問い合わせからご連絡下さい。

お待ちしております。😊✨

開発のご依頼お待ちしております
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします! by 九保すこひ

おわりに

ということで、今回は位置情報をIPアドレスから取得してみました。

ホントにデータは使い方次第でゴミにもお宝にもなるわけで、こういうデータ処理を考える人も賢いんだろうなという印象です。

皆さんも自社やクライアントさんのために「位置情報」を使った提案をしてみてはいかがでしょうか。

ではでは〜❗

「次はライティング勉強すっか❗」

このエントリーをはてなブックマークに追加       follow us in feedly