https://d226lax1qjow5r.cloudfront.net/blog/blogposts/toot-with-laravel-vonage-and-mastodon/toot-toot_laravel-mastodon.png

Toot mit Laravel, Vonage und Mastodon

Zuletzt aktualisiert am March 20, 2023

Lesedauer: 11 Minuten

Angesichts der Veränderungen in der Welt der sozialen Medien haben Sie in den letzten Monaten vielleicht schon von Mastodon gehört, aber was ist es und was kann ich damit machen?

In diesem Artikel werde ich Vonage, Laravel und Expose verwenden, um eine eingehende SMS, die von Ihrem Telefon gesendet wird, zu empfangen und auf einem Mastodon-Account zu "tuten".

Was ist Mastodon?

Mastodon ist eine quelloffene Social Media Plattform. Vom Verhalten und der Benutzeroberfläche her ist sie Twitter sehr ähnlich (das Äquivalent zu einem "Tweet" ist z. B. ein "Toot"). Es gibt jedoch große Unterschiede: Ich habe bereits erwähnt, dass es quelloffen ist, aber es funktioniert auch als "dezentrales" Netzwerk. Dieser Aspekt macht es einzigartig: Die Idee ist, dass Sie Ihre eigene Mastodon-Instanz aufsetzen können, die mit dem "Fediverse" (d. h. allen anderen Mastodon-Servern) verbunden ist. Das Endergebnis ist, dass Sie als Nutzer eine Mastodon-Instanz wählen können, bei der Sie sich anmelden, aber Inhalte von allen anderen Nutzern auf der gesamten Plattform sehen können.

Zur Überraschung von wahrscheinlich niemandem ist die Anmeldequote von Mastodon phänomenal: Allein im November 2022 konnte es eine Million neue Nutzer begrüßen.

Ich nehme an, es ist ziemlich poetisch, dass das Maskottchen von Mastodon ein Mastodon ist, ein entfernter Verwandter des Elefanten, wenn man bedenkt, dass ich erstens der PHP-Spezialist im Vonage Developer Relations Team bin und zweitens ein Benutzer auf dem Mastodon PHP-Gemeinschaftsserver. Fangen wir also an: Zunächst wollen wir ein Laravel-Gerüst, um eine Anfrage an die Mastodon-API abzufeuern, um einen neuen Beitrag zu erstellen.

Hochfahren von Laravel

Es macht nicht viel Sinn, einen ganzen Absatz darüber zu schreiben, wie man Laravel installiert, wenn die Dokumentation ziemlich umfassend istLassen Sie uns also daran arbeiten, einen Befehl zu erstellen, um eine Mastodon-API-Anfrage auszulösen. Verwenden Sie die Konsole, um einen neuen Befehl zu erstellen:

php artisan make:command PostToMastodonCommand

Im neuen Befehl bearbeite ich die Signatur (das ist der Name des Befehls, der von der Konsole aus ausgeführt wird) und die Beschreibung.

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

Um die Ausführung zu testen, schreibe ich eine Platzhalterzeichenkette und gebe sie dann aus, wenn ein Befehl ausgeführt wird. So sieht die handle() Methode aussieht:

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);
}

Führen Sie den Befehl in Ihrem Terminal aus:

php artisan app:post-to-mastodon

Im Terminal erscheint die Meldung. Das ist nichts Besonderes, aber jetzt ist es an der Zeit, Mastodon zu konfigurieren.

Mastodon Konfiguration

Wir werden Mastodon für Laravel unter Verwendung der Laravel-Konventionen konfigurieren: Das Einzige, was wir tatsächlich benötigen, um einen Toot zu senden, ist ein Zugriffstoken (API-Schlüssel für fortgeschrittenere Operationen erfordern vollständige Schlüsselpaare oder eine Schlüsselrotation, da der Zugriff über. OAuth).

Unser erster Halt ist die Beschaffung des Zugangsschlüssels. In Ihrem Mastodon. Gehen Sie zu Ihren Einstellungen, während Sie eingeloggt sind. Sie sollten dort einen Development Registerkarte:

Erstellen Sie eine neue Anwendung mit Lesezugriff im Bereich (dies ist die Standardeinstellung). Nach der Erstellung finden Sie die gesuchte Anwendung unter Your access token:

Screenshot of the Mastodon Application settings

Dies ist der Wert, den wir in der App benötigen. Kopieren Sie ihn und gehen Sie dann zurück zu Ihrem Code.

Erstellen Sie in Ihrer Laravel-Konfigurationsdatei eine neue Datei namens mastodon.php und schreiben Sie den folgenden Code:

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

Die Konfiguration liest nun Ihr Zugriffs-Token aus Ihrer .env Datei lesen, also kopieren Sie Ihr eingebundenes Laravel .env.example (falls noch nicht geschehen) und erstellen Sie Ihre .env Datei. Fügen Sie dort unsere neue Umgebungsvariable hinzu:

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

Schießen Sie einen Schuss mit dem Befehl

Unser letzter Teil besteht darin, die Konfigurationsvariable in den Befehl einzuhängen und an unsere Mastodon-Instanz zu senden. In der PostToMastodonCommand Handler fügen Sie den folgenden Code ein:

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

Die Http-Fassade von Laravel gibt uns eine ziemlich flüssige Möglichkeit, die Anfrage abzuschicken, ohne dass wir uns mit der Konfiguration eines Clients wie Guzzle direkt herumschlagen müssen. Wenn wir die Anfrage aufschlüsseln, haben wir die folgenden Komponenten:

  • asForm(): Die Mastodon-API für diesen Endpunkt erfordert, dass die Daten in der Anfrage als multipart/form-data.

  • withToken() ist eine nette Funktion, die automatisch ein Bearer Token an den Authorization der Anfrage hinzuzufügen.

  • config(mastodon.access_token) ruft unser Token aus der neu erstellten Konfigurationsdatei ab

  • post() ist die Art der HTTP-Anfrage, die wir stellen müssen

Geben Sie den Befehl in die Konsole ein:

php artisan app:post-to-mastodon

und hoffentlich erhalten Sie eine HTTP200-Antwort zurück, und Ihr Toot sollte in Mastodon erscheinen.

Was wäre, wenn wir... stattdessen eine SMS an Toot schicken würden?

Dafür gibt es keinerlei Begründung, abgesehen von "warum nicht?". Wir könnten einen Text an eine Nummer senden und den Inhalt ausposaunen lassen, wenn wir das wollen... also, machen wir das!

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

Dazu benötigen Sie zwei Dinge: erstens eine neue Anwendung, die im Dashboard erstellt wurde, und zweitens eine Vonage-Nummer, die mit der Anwendung verknüpft ist.

Gehen Sie auf die Registerkarte Applications in Ihrem Vonage Dashboard und klicken Sie auf Anwendung erstellen:

Screenshot of the Vonage Dashboard when logged in

Unsere neue Anwendung wird die Messages API verwenden, um SMS-Nachrichten zu empfangen, die dann Webhooks auslösen, die unsere Laravel-Anwendung abhören kann. Schalten Sie die Messages Fähigkeit und füllen Sie die Inbound URL/StatusURL vorerst mit einem Platzhalter; wir werden uns diese in Kürze noch einmal ansehen.

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

Wir brauchen eine Nummer, um eingehende Nachrichten mit den Webhooks der Anwendung zu verbinden. Erstellen Sie Ihre Anwendung, und dann sollten Sie die Option Buy more Numbers. In diesem Prozess können Sie eine Nummer auswählen, sie kaufen und dann mit der Anwendung verknüpfen. Das Endergebnis im Dashboard der Anwendung sollte wie folgt aussehen:

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

Routing unserer Laravel-Anwendung

Die im Feld "InboundURL" auf dem Dashboard angegebene URL ist die Adresse, an die unser Webhook gesendet werden soll, aber wir haben noch keine Route in unserer Laravel-Anwendung geöffnet.

Der Webhook ist für die Interaktion mit unserer Anwendung auf API-Ebene konzipiert und nicht für das Web-Routing (zum Laden von Seiten, Dashboards usw.). Aus diesem Grund wollen wir unsere neue Route in routes/api.php. Öffnen Sie diese, und fügen Sie die Route hinzu:

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

Bleiben Sie dran, IncomingSMSController gibt es noch nicht! Sie haben recht: Erstellen wir es im Terminal:

php artisan make:controller IncomingSMSController

Unser neuer Controller wird die eingehende Webhook-Anfrage verarbeiten und dann den vorhandenen Code verwenden, den wir zum Abfeuern eines Toot an Mastodon verwendet haben. Der Controller sieht wie folgt aus:

<?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);  
    }}

Wir ersetzen hier also die Platzhalter-Nachricht, die wir ursprünglich im Befehl an Mastodon gesendet haben, durch den Inhalt der eingehenden SMS.

Hier fehlt noch ein wichtiger Teil: Vonage benötigt eine Live-URL, an die der Webhook gesendet wird. Wie machen wir das also?

In früheren Beispielen, die ich geschrieben habe, habe ich mich an ngrok als exzellente Tunnelanwendung, um Ihren lokalen Stack dem Internet auszusetzen. Kürzlich habe ich jedoch begonnen, etwas anderes zu verwenden

Expose zur Rettung!

Expose von Beyond Code verhält sich im Wesentlichen genauso wie ngrok; es ist eine Tunnelanwendung, die es Ihrer lokalen Webanwendung ermöglicht, im Internet sichtbar zu sein. Sie können es auf verschiedene Arten installierenaber der einfachste Weg ist wohl der über. composer require global:

composer global require beyondcode/expose

Sie müssen die ausführbare Datei in den Pfad Ihres Betriebssystems aufnehmen - Wie das geht, erfahren Sie in den Dokumenten hier.

Expose muss mit einem Zugriffstoken konfiguriert werden - Sie können die Schritte hier ausführen, um ein Token zu erstellen und es Ihrer Kopie zuzuweisen.

Es sind zwei Schritte erforderlich: Erstens muss der lokale Server in Ihrer Laravel-Anwendung gestartet werden:

php artisan serve

Und zweitens starten wir Expose, das uns eine Domain für unsere App gibt (Laravel's eingebauter Server gibt 8000 als Port vor):

expose share http://127.0.0.1:8000

Wenn alles in Ordnung ist, sollten Sie nun das Expose-Dashboard sehen:

Screenshot of Expose running on the command line

Sie können sehen, dass es eine Dashboard-URL gibt: Expose führt eine Benutzeroberfläche auf Port 4040 aus. Wenn Sie dorthin navigieren, erhalten Sie eine Reihe nützlicher Tools für die Fehlersuche:

Screenshot of the Expose GUI waiting for connections

Wir behalten dieses Fenster bei, damit wir sehen können, wie unser Webhook ankommt. Zum Abschluss der Konfiguration nehmen wir unsere neue öffentliche HTTPS-URL und fügen sie wieder in die Anwendungseinstellungen im Vonage Dashboard ein:

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

Für unseren Anwendungsfall ist hier nur wichtig, dass die Eingangs-URL mit der von uns definierten Laravel-Route übereinstimmt. Die Status-URL ist hier nicht wichtig, da sie für tiefergehende Integrationen gedacht ist, die auf Änderungen, Lieferfehler und Netzwerkprobleme achten.

Txt me!

Alles ist miteinander verdrahtet: Senden Sie eine SMS mit dem, was Sie in Mastodon anzeigen möchten, und sehen Sie zu, wie unser Setup seine Arbeit macht!

Screenshot of Expose with the incoming webhook recorded in the dashboard

Und hier ist unser Trinkspruch!

Screenshot of the resulting Mastodon Toot sent out from our Application

Schlussfolgerung

Die API von Mastodon ist von vornherein völlig offen, ohne "Premium-Funktionen", da die Software FOSS-first ist. In Anbetracht dessen gibt es so gut wie keine Grenzen für das, was Sie hier tun können - ich wollte, dass dies eine kurze Einführung ist, aber als Proof-of-Concept habe ich bereits Sprachtranskriptionen, die die Vonage Voice API verwenden, um auch Aufnahmen auszutricksen.

Fällt Ihnen noch etwas ein, was Sie mit Laravel, Mastodon und Vonage machen könnten? Melden Sie sich bei mir, ich bin immer für Experimente zu haben. Beteiligen Sie sich an der Unterhaltung auf unserem Vonage Gemeinschaft Slack oder besuchen Sie uns auf Twitter.

Teilen Sie:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondeSenior PHP Entwickler Advocate

Als ausgebildeter Schauspieler mit einer Dissertation in Standup-Comedy bin ich über die Meetup-Szene zur PHP-Entwicklung gekommen. Man findet mich, wenn ich über Technik spreche oder schreibe, oder wenn ich seltsame Platten aus meiner Vinylsammlung spiele oder kaufe.