https://a.storyblok.com/f/270183/57392/e3d1ed73b1/toot-toot_laravel-mastodon.png

Laravel、Vonage、Mastodonを使ったトゥート

最終更新日 March 20, 2023

所要時間:5 分

ここ数カ月、ソーシャルメディアの世界で起きている変化を考えれば、マストドンという名前を耳にしたことがあるかもしれない。

この記事では、Vonage、Laravel、Exposeを使って、携帯電話から送られてくるSMSを受信し、Mastodonアカウントに「送信」してみます。

マストドンとは?

マストドンはオープンソースのソーシャルメディア・プラットフォームです。.動作やUIはツイッターによく似ている(例えば「ツイート」に相当するのは「トゥート」だ)。オープンソースであることは前述したが、「分散型」ネットワークとしても機能する。この側面がユニークな点だ。つまり、自分のマストドン・インスタンスを立ち上げ、それを「Fediverse」(つまり他のすべてのマストドン・サーバー)に接続するというアイデアだ。最終的には、ユーザーとして、サインアップするマストドン・インスタンスを選ぶことができ、プラットフォーム全体で他のすべてのユーザーからのコンテンツを見ることができる。

おそらく誰も驚かないだろうが、マストドンの登録率は驚異的で、2022年11月だけで100万人の新規ユーザーを迎えた。

マストドンのマスコットが象の遠い親戚であるマストドンであることは、とても詩的なことだと思う。私が第一にVonageデベロッパー・リレーション・チームのPHPスペシャリストであり、第二にマストドンの PHPコミュニティ・サーバー.それでは始めましょう:まず最初に、新しい投稿を作成するためにMastodon APIへのリクエストを発行するためのLaravelの足場が必要です。

Laravelの起動

Laravelのインストール方法について一段落書くのはあまり意味がありません。 ドキュメントがかなり充実しているそれでは、Mastodon APIリクエストを実行するコマンドを作成しましょう。コンソールを使って新しいコマンドを作成します:

php artisan make:command PostToMastodonCommand

新しいコマンドで、シグネチャー(コンソールから実行するコマンド名)と説明を編集する。

protected $signature = 'app:post-to-mastodon';
protected $description = 'Post a default message to Mastodon';

実行をテストするために、プレースホルダー文字列を書き、コマンド実行時にそれを吐き出すことにする。以下は handle()メソッドはこうなっている:

public function handle(): void  
{  
    $exampleMessage = "Hey! I'm writing a blog post on integrating Mastodon, Vonage, and Laravel.  
    If you see this, I've just fired an artisan command to the API. Nice.";  
  
    $this->info($exampleMessage);
}

ターミナルでコマンドを実行する:

php artisan app:post-to-mastodon

ターミナルにメッセージが表示された。特別なことは何もないが、いよいよマストドンの設定だ。

マストドン構成

Laravelの慣例に従って、MastodonをLaravel用に設定します。実際にTootを送信するのに必要なのは、アクセストークンのみです。OAuth)。

最初の目的地はアクセスキーの入手だ。マストドンでログインした状態で環境設定パネルに向かいます。すると Developmentタブが表示されているはずです:

スコープに読み取りアクセス権を持つ新規アプリケーションを作成する(これがデフォルト)。作成されたら、探しているものは以下のとおりです。 Your access token:

Screenshot of the Mastodon Application settings

これがアプリで必要な値だ。これをコピーして、コードに戻ってください。

Laravelの設定ファイルに mastodon.phpという名前の新しいファイルを作成し、以下のコードを記述します:

<?php  
  
return [  
  
    /*  
    |----------------------------------------------------------------
    | Mastodon    
    |----------------------------------------------------------------
    |
    |
    */    
    
    'access_token' => env('MASTODON_ACCESS_TOKEN')  
];

コンフィグは、アクセストークンを .envファイルからアクセストークンを読み取ります。 .env.example(をコピーして .envファイルを作成します。そこに新しい環境変数を追加します:

MASTODON_ACCESS_TOKEN=2sd09g-0h9hs-09ts-0risd-f9j4-s9d0g9s-0h8

コマンドでトゥートを発射

最後のパートは、config変数をコマンドにフックして、Mastodonインスタンスに送信することだ。ハンドラに PostToMastodonCommandハンドラに以下のコードを追加する:

$response = Http::asForm()->withToken(config('mastodon.access_token'))->post('https://mymastodon.social/api/v1/statuses', [  
    'status' => $exampleMessage  
]);  
  
$this->info($response->body());

LaravelのHttpファサードは、GuzzleのようなClientを直接設定することなく、かなり流動的にリクエストを送信する方法を提供してくれます。リクエストを分解すると、以下のコンポーネントがあります:

  • asForm():マストドンのこのエンドポイントのAPIでは、リクエストのデータを multipart/form-data.

  • withToken()を自動的に Bearerトークンを自動的に Authorizationを自動的に追加する関数です。

  • config(mastodon.access_token) は、新しく作成された設定ファイルからトークンを取り出す。

  • post()はHTTPリクエストのタイプです。

コンソールにコマンドを打ち込む:

php artisan app:post-to-mastodon

うまくいけば、HTTP200のレスポンスが返ってきて、TootがMastodonに表示されるはずだ。

代わりにトゥートにSMSを送ったら?

なぜダメなのか」ということを除けば、これにはまったく理由がない。私たちは 私たちは番号にテキストを送り、その内容を送信させることができる!

まず、ダッシュボードで作成した新しいアプリケーションと、そのアプリケーションに結びついたVonage番号です。

Vonageダッシュボードの Applicationsタブに移動し、アプリケーションの作成をクリックします:

Screenshot of the Vonage Dashboard when logged in

新しいアプリケーションは、Messages APIを使ってSMSメッセージを受信し、LaravelアプリケーションがリッスンできるようにWebhookを起動します。この Messages機能を切り替え、Inbound URL/StatusURLにプレースホルダーを記入します。

Screenshot of a Vonage Application in the Dashboard, highlighting the webhook settings for Messages

受信メッセージをアプリケーションのウェブフックに接続するための番号が必要です。アプリケーションを作成すると、以下のオプションが表示されます。 Buy more Numbers.このプロセスで番号を選択し、購入し、アプリケーションにリンクさせることができます。アプリケーションダッシュボードの最終結果はこのようになるはずです:

Screenshot of the Numbers configuration for a Vonage Application on the Dashboard

Laravelアプリケーションのルーティング

ダッシュボードの'InboundURL'フィールドに指定されたURLは、ウェブフックの送信先ですが、Laravelアプリケーションではまだルートを開いていません。

Webhookは、Webルーティング(ページやダッシュボードなどをロードする)ではなく、APIレベルでアプリとやりとりするように設計されています。このため、新しいルートを routes/api.php.それを開いて、ルートを追加します:

Route::post('/incoming', IncomingSMSController::class);

ちょっと待て、 IncomingSMSControllerまだ存在しない!ターミナルで作ってみよう:

php artisan make:controller IncomingSMSController

新しいコントローラは、Webhookリクエストの受信を処理し、MastodonにTootを送信するために使用した既存のコードを使用します。コントローラは次のようになる:

<?php  
  
namespace App\Http\Controllers;  
  
use Illuminate\Http\Request;  
use Illuminate\Support\Facades\Http;  
use Symfony\Component\HttpFoundation\Response;  
  
class IncomingSMSController extends Controller  
{  
    public function __invoke(Request $request)  
    {        $body = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);  
        $message = $body['text'];  
  
        $response = Http::asForm()->withToken(config('mastodon.access_token'))->post('https://mymastodon.social/api/v1/statuses', [  
            'status' => $message  
        ]);  
  
        return response($response->body(), Response::HTTP_CREATED);  
    }}

つまり、ここでやっているのは、マストドンに送信したプレースホルダー・メッセージを、SMSのテキスト・コンテンツに置き換えることだ。

ここで1つ大きな欠落がある:Vonageは、そのウェブフックを送信するためのライブURLが必要です。では、どうすればいいのか?

これまで書いた例では、私は ngrokを、ローカル・スタックをインターネットに公開するための優れたトンネル・アプリケーションとして使ってきた。しかし最近、別のものを使い始めた。

エクスポーズ・トゥ・レスキュー

Beyond CodeのExposeは、基本的にngrokと同じ動作をします。これは、ローカルのウェブアプリケーションをインターネットに公開するためのトンネルアプリケーションです。 いくつかの方法でインストールできますがしかし、間違いなく最もシンプルな方法は、次の方法だろう。 composer require global:

composer global require beyondcode/expose

実行ファイルをオペレーティング・システムのパスに追加してください。 その方法はこちらのドキュメントをご覧ください。

Exposeにはアクセストークンを設定する必要があります。こちらの手順に従ってトークンを作成し、コピーに割り当ててください。

まず、Laravelアプリでローカルサーバーを立ち上げます:

php artisan serve

次に、Exposeを起動し、アプリのドメインを取得する(Laravelのビルトインサーバーのデフォルトはポートとして8000):

expose share http://127.0.0.1:8000

これでExposeダッシュボードが表示されます:

Screenshot of Expose running on the command line

ダッシュボードのURLがあることがわかる:Exposeはポート4040でUIを実行する。そこにナビゲートすると、デバッグのためのかなり良いツールセットが表示されます:

Screenshot of the Expose GUI waiting for connections

Webhook が入ってくるのを確認できるように、このウィンドウは残しておきます。最後の設定は、新しいパブリックHTTPS URLをVonage Dashboardのアプリケーション設定に貼り付けることです:

Screenshot inputting the Expose web URL into the Vonage Application message webhook settings

私たちのユースケースで重要なのは、Inbound URLが定義したLaravelルートと一致することです。ステータスのURLは、変更、配信の失敗、ネットワークの問題をリッスンする深い統合のためのものなので、ここでは重要ではありません。

メールをくれ!

マストドンに表示したい内容をSMSで送信すると、セットアップが実行されます!

Screenshot of Expose with the incoming webhook recorded in the dashboard

そして、これが私たちのトゥートだ!

Screenshot of the resulting Mastodon Toot sent out from our Application

結論

MastodonのAPIは、FOSSファーストのソフトウェアの性質上、「プレミアム機能」はなく、完全にオープンな設計になっている。このことを念頭に置くと、ここでできることにほとんど制限はありません。私はこれを簡単な紹介にしたかったのですが、概念実証という意味で、私はすでにVonage Voice APIを使って音声トランスクリプションを行い、録音をToot outすることもできました。

Laravel、Mastodon、そしてVonageを使って何かできることはないでしょうか?いつでも実験しますよ。私たちの VonageコミュニティSlackまたは ツイッター.

シェア:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondeシニアPHPデベロッパー

スタンダップ・コメディーの学位論文を持つ俳優の訓練を受け、ミートアップ・シーンを経てPHP開発に携わるようになった。技術について話したり書いたり、レコード・コレクションから変わったレコードを再生したり買ったりしています。