Publier facilement un post sur Mastodon en PHP

13 janvier 2025 - 540 mots - php

Mastodon est un réseau social décentralisé, open source et fédéré qui offre une alternative éthique aux plateformes traditionnelles de médias sociaux. Contrairement à Twitter ou Facebook, Mastodon n’est pas contrôlé par une seule entité centrale.

La décentralisation de Mastodon repose sur le concept d’instances (ou serveurs) interconnectées. Chaque instance est gérée de manière indépendante, avec ses propres règles et sa propre communauté, tout en permettant aux utilisateurs d’interagir avec les membres d’autres instances. Cette architecture, basée sur le protocole ActivityPub, crée ce qu’on appelle le “Fediverse” - un réseau social véritablement distribué.

Les avantages de cette approche décentralisée sont nombreux :

  • Pas de publicité ni de tracking des utilisateurs
  • Contrôle accru sur ses données personnelles
  • Modération locale plus efficace et adaptée à chaque communauté
  • Résistance à la censure grâce à la distribution du réseau
Logo Mastodon

Après cette belle présentation du réseau Mastodon, on va publier un post sur le réseau Mastodon en PHP.

Pré-Requis

Il faut tout d’abord un compte sur une instance Mastodon. Dans mon cas, j’utilise l’instance piaille.fr.

Il vous faut aussi récupérer un access_token.

Pour cela :

  • Se connecter sur votre instance Mastodon
  • Aller dans la page “Préférences”
  • Aller dans le menu “Développement”
  • Cliquer sur le bouton “Nouvelle application”
  • Définir le nom de l’application : dans notre cas, je l’appellerais “MastoBot”
  • Cocher les étendues write:media et write:statuses
  • Sauvegarder : vous arrivez sur la liste des applications
  • Cliquer sur votre application
  • Récupérer votre jeton d’accès (ou access token in 🇬🇧)

Théorie

On va utiliser l’API de Mastodon dont la documentation en disponible en ligne.

Si vous souhaitez utiliser des images, il vous faudra d’abord uploader les media via le endpoint POST /api/v2/media. La réponse vous retournera des identifiants pour les media (id) que vous pourrez utiliser lors de la création du statut (media_ids[]).

Implémentation

L’implémentation se fera en PHP 8.4 avec l’extension Curl installée et activée.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php

const MASTODON_ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
const MASTODON_INSTANCE = 'https://piaille.fr';

enum MastodonStatusVisibility: string
{
  case Direct = 'direct';
  case Private = 'private';
  case Public = 'public';
  case Unlisted = 'unlisted';
}

function fnPostMastodon(
  string $status,
  string $language = 'en',
  bool $isSensitive = false,
  string $spoilerText = '',
  MastodonStatusVisibility $visibility = MastodonStatusVisibility::Public
  
) {
  $hCurl = curl_init();
  curl_setopt_array($hCurl, [
    CURLOPT_URL => MASTODON_INSTANCE . '/api/v1/statuses',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
      'Authorization: Bearer '.MASTODON_ACCESS_TOKEN,
      'Content-Type: application/json',
      'Accept: application/json',
      'Accept-Charset: utf-8'
    ],
    CURLOPT_POSTFIELDS => json_encode([
      'status' => $status,
      'sensitive' => $isSensitive,
      'spoiler_text' => $spoilerText,
      'visibility' => $visibility->value,
    ]),
    CURLOPT_TIMEOUT => 20
  ]);
  $response = curl_exec($hCurl);
  curl_close($hCurl);

  return json_decode($response, true);
}

$response = fnPostMastodon(
  '🚧 Ceci est un test 🚧',
  'fr'
);

var_dump($response);

Comme vous pouvez le voir dans le code, on n’utilise aucune librairie et on travaille directement avec curl, ce qui simplifie le code.

La réponse retournée est aussi documentée sur la documentation de Mastodon.

Après exécution du code, on peut remarquer :

  • que le nom de l’application est affichée en bas à droite
  • que l’on peut aussi utiliser des emojis.
Résultat

Laisser un commentaire

Merci. Votre message a bien été enregistré.