Publier facilement un post sur Bluesky en PHP

20 janvier 2025 - 507 mots - php

Bluesky est un réseau social décentralisé qui repose sur un protocole ouvert appelé AT Protocol, permettant aux utilisateurs de contrôler leurs données et interactions. Contrairement aux plateformes centralisées, Bluesky permet à différentes instances (serveurs) de se connecter, offrant ainsi une plus grande liberté et personnalisation. L’objectif est de créer un environnement plus transparent, où les utilisateurs peuvent partager des informations et interagir sans les contraintes des réseaux traditionnels. Chaque instance a ses propres règles, permettant une diversité d’opinions et de communautés.

Logo Bluesky

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

Pré-Requis

Il vous faut aussi récupérer un mot de passe d’application.

Pour cela :

  • Se connecter sur votre instance Bluesky
  • Aller dans le menu “Paramètres”
  • Aller dans le menu “Confidentialité et sécurité”
  • Aller dans le menu “Mots de passe d’application”
  • Cliquer sur le bouton “Ajouter un mot de passe d’application”
  • Définir le nom de l’application : dans notre cas, je l’appellerais “BlueskyBot”
  • Cliquer sur le bouton “Suivant”
  • Récupérer votre mot de passe d’application

Théorie

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

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
<?php

const BLUESKY_USERNAME = 'xxxxx.bsky.social';
const BLUESKY_APP_PASSWORD = 'xxxx-xxxx-xxxx-xxxx';

function fnPostBluesky(
  string $status,
  string $language = 'en'
  
) {
  $hCurl = curl_init();

  // com.atproto.server.createSession : Fetch the Bearer token
  curl_setopt_array($hCurl, array(
    CURLOPT_URL => 'https://bsky.social/xrpc/com.atproto.server.createSession',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS =>'{
      "identifier":"'.BLUESKY_USERNAME.'",
      "password":"'.BLUESKY_APP_PASSWORD.'"
    }',
    CURLOPT_HTTPHEADER => array(
      'Content-Type: application/json'
    ),
  ));
  $resSession = curl_exec($hCurl);
  $arrSession = json_decode($resSession,TRUE);

  // com.atproto.repo.createRecord : Create the post
  curl_setopt_array($hCurl, array(
    CURLOPT_URL => 'https://bsky.social/xrpc/com.atproto.repo.createRecord',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_POSTFIELDS =>'{
      "repo":"'.$arrSession['did'].'",
      "collection":"app.bsky.feed.post",
      "record":{
          "$type":"app.bsky.feed.post",
          "createdAt":"'.date("c").'",
          "text":"'.$status.'",
          "langs":["'.$language.'"]
      }
    }',
    CURLOPT_HTTPHEADER => array(
      'Content-Type: application/json',
      'Authorization: Bearer '.$arrSession['accessJwt']
    ),
  ));
  
  $response = curl_exec($hCurl);
  curl_close($hCurl);
  return json_decode($response, true);
}

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

var_dump($response);

echo 'URL : https://bsky.app/profile/' . BLUESKY_USERNAME. '/post/' . substr($response['uri'], strrpos($response['uri'], '/') + 1) . PHP_EOL;

Ce code est le plus simple que l’on peut réaliser et comme vous pouvez le voir sans utiliser de librairie et avec un minimum d’extension.

Conclusion

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

Résultat

Avec la documentation, il y a plusieurs améliorations possibles à faire :

  • détection des mentions/URLs dans le texte et implémentation dans le code
  • possibilité de citer un post
  • ajout d’images à un post
  • ajout d’une social card à un post

Laisser un commentaire

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