Publier facilement un post sur Pixelfed en PHP

10 février 2025 - 583 mots - php

Pixelfed est un réseau social décentralisé conçu pour le partage de photos et d’images, offrant une alternative éthique et respectueuse de la vie privée à des plateformes comme Instagram. Basé sur le protocole ActivityPub, il permet aux utilisateurs de créer ou de rejoindre des instances indépendantes, tout en interagissant avec l’ensemble de la fédération. Avec une approche sans publicités, un respect total des données personnelles et des fonctionnalités familières comme les albums, les stories et les interactions, Pixelfed propose une expérience communautaire axée sur la transparence et la créativité.

Logo Pixelfed

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

Pré-Requis

Il faut tout d’abord un compte sur une instance Pixelfed. Dans mon cas, j’utilise l’instance pixelfed.social.

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

Pour cela :

  • Se connecter sur votre instance Pixelfed
  • Cliquer en haut à droite sur votre avatar
  • Cliquer sur “Profile”
  • Cliquer sur le bouton “Edit profile”
  • Cliquer sur l’onglet “Applications”
  • Cliquer sur le lien “Create New Token”
  • Définir le nom de l’application : dans notre cas, je l’appellerais “PixelBot”
  • Cocher les étendues write
  • Cliquer sur le bouton “Create”
  • Récupérer votre token d’accès personnel (ou personal access token in 🇬🇧)

Théorie

Pixelfed utilise (plus ou moins) les mêmes endpoints que Mastodon dont la documentation en disponible en ligne.

Dans notre cas, on va utiliser :

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php

const PIXELFED_ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXX';
const PIXELFED_INSTANCE = 'https://pixelfed.social';

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

function fnPostPixelfed(
  string $pathMedia,
  string $descriptionMedia,
  string $status,
  string $language = 'en',
  PixelfedStatusVisibility $visibility = PixelfedStatusVisibility::Public
  
) {
  // Upload the media
  $hCurl = curl_init();
  curl_setopt_array($hCurl, [
    CURLOPT_URL => PIXELFED_INSTANCE . '/api/v1/media',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
      'Authorization: Bearer '.PIXELFED_ACCESS_TOKEN,
      'Accept-Charset: utf-8'
    ],
    CURLOPT_POSTFIELDS => [
      'file' => curl_file_create($pathMedia, 'image/jpg', $pathMedia),
      'description' => $descriptionMedia,
    ],
    CURLOPT_TIMEOUT => 20
  ]);
  $response1 = curl_exec($hCurl);
  curl_close($hCurl);
  $mediaResponse = json_decode($response1, true);

  // Post the status
  $hCurl = curl_init();
  curl_setopt_array($hCurl, [
    CURLOPT_URL => PIXELFED_INSTANCE . '/api/v1/statuses',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
      'Authorization: Bearer '.PIXELFED_ACCESS_TOKEN,
      'Content-Type: application/json',
      'Accept: application/json',
      'Accept-Charset: utf-8'
    ],
    CURLOPT_POSTFIELDS => json_encode([
      'status' => $status,
      'language' => $language,
      'visibility' => $visibility->value,
      'media_ids' => [
        $mediaResponse['id'],
      ],
    ]),
    CURLOPT_TIMEOUT => 20
  ]);
  $response2 = curl_exec($hCurl);
  curl_close($hCurl);

  return json_decode($response2, true);
}

// Use a generated image for testing
$dataImage = file_get_contents('https://picsum.photos/400/600');
file_put_contents('generated.jpg', $dataImage);

$response = fnPostPixelfed(
  'generated.jpg',
  'Generated Media',
  '🚧 Ceci est un test 🚧',
  'fr'
);

var_dump($response['url']);

@unlink('generated.jpg');

Comme on peut le voir, l’upload se fait en deux appels : upload de media dans un premier temps, suivi de la création du post dans un second temps.

Conclusion

Après une simple exécution du code, voici le rendu :

Résultat

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

  • que le nom de l’application n’est pas affichée
  • que l’on peut aussi utiliser des emojis, facilement dans le code.

Laisser un commentaire

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