Una implementación de peso ligero del protocolo AtProto para divertirse con Bluesky
Después de investigar las bibliotecas ya disponibles para comunicarme con AtProto, decidí seguir mi propio camino. De alguna manera me abstengo del uso de bibliotecas que incluyen una docena de otras bibliotecas en su compositor. Json, mientras que la funcionalidad de comunicación real se puede cubrir en menos componentes de terceros.
Actualmente (lo llamaría pre-alfa) incluyo solo una biblioteca de terceros, a saber
Tal vez se volverá más en el futuro.
Para que todo sea menos un desastre, renombré casi todas las funciones ... puedes encontrar una lista de las funciones que implementé aquí:
Funciones implementadas ordenadas por Endpoint.md
Funciones implementadas ordenadas por el nombre de la función.md
Puede instalar la biblioteca con el compositor ejecutando
composer require schnoog/php_atproto
Esto instalará la biblioteca en el directorio de proveedores habitual. Ahora copie el archivo /vendor/schnoog/php_atproto/src/config.dist.php a su directorio de instalación y cambie el nombre de config.php
O use el siguiente comando desde su directorio de instalación para copiar el archivo automáticamente (si hay un nombre de archivo config.php en el directorio de instalación, no se sobrescribirá.
php -r 'if(!file_exists(__DIR__ . "/config.php")) copy (__DIR__ . "/vendor/schnoog/php_atproto/src/config.dist.php", __DIR__ . "/config.php");'
Cambie el contenido de config.php e ingrese sus credenciales
Este es el camino a seguir si no tiene un compositor instalado.
Creé un segundo repositorio que incluye todos los archivos necesarios para ejecutar esto.
Descargue la versión con excitación desde aquí: Versión PHP_ATPROTO llena
Simplemente descompite, configure sus credenciales en config.php y estará listo para comenzar. Si, es realmente tan fácil
Esto significa que tiene una copia de todo el repositorio, ya sea por
o
Después de tener los archivos en su directorio deseado, copie el archivo config.dist.php en su directorio de instalación y cambie el nombre de config.php
No olvide instalar la dependencia ejecutando composer install
Cambie el contenido de config.php e ingrese sus credenciales
Tengo (actualmente) solo unos pocos:
No soy el mayor fanático de OOP. No todo en mi mundo digital tiene que ser una clase. Así que mantendré la interfaz de forma exclusiva (evidente que, especialmente, crear una publicación sería más fácil de encapsular en una clase)
Ok, revisemos lo que está disponible
Este pequeño ejemplo simplemente se autentifica contra el servidor y almacena el token localmente. Si hay un token almacenado local disponible y la última verificación de validez se realizó más de lo especificado en $config['atproto']['storedsession_validity'] hace segundos, la validez se verificará contra el backend (en mi caso Bluesky)
Y aquí un recordatorio para mí: pegar if (!atp_session_get())return false; Al comienzo de las funciones de interfaz (POST, Get Timeline ...).
<?php
require_once(__DIR__ . "/src/includer.php");
if (!atp_session_get()){
echo "UNABLE TO ESTABLISH SESSION" . PHP_EOL;
print_r($config['error']);
}else{
echo "Session estalished and checked" . PHP_EOL;
}
Sí, esto en realidad puede publicar en la propia línea de tiempo. Todo lo que necesita hacer (después de incluir incluido.php) es llamar a la función.
Pero esto viene con limitaciones (como todo en la tierra):
Aquí hay un poco sobre los parámetros para la función principal ATP_CREATE_POST
$text = "This is the text to post, n containing mentioning @develobot.bsky.social and a link https://github.com/schnoog/php_atproto";
$lang = ['de','en'];
$add_link_facets = true;
$add_mentions_facets = true;
$images = [ __DIR__ . "/pic01.jpg" , __DIR__ . "/pic02.jpg"];
$images_alts = [ '', 'Alt text for second image'];
Como se mencionó anteriormente, puede tener imágenes o una tarjeta web. Si definió ambos (y proporciona la función con ellos;)), solo se mostrará la tarjeta web
$website_uri = "https://github.com/schnoog/php_atproto";
$website_title = "My user defined title";
$website_description = "My user defined description";
$website_image = __DIR__ . "/website_image.png";
Ok, veamos cómo te llaman algunas llamadas
<?php
require_once(__DIR__ . "/src/includer.php");
/*
Let's define some variables
*/
$text = "This is the text to post, n containing mentioning @develobot.bsky.social and a link https://github.com/schnoog/php_atproto";
$lang = ['de','en'];
$add_link_facets = true;
$add_mentions_facets = true;
$images = [ __DIR__ . "/pic01.jpg" , __DIR__ . "/pic02.jpg"];
$images_alts = [ '', 'Alt text for second image'];
$website_uri = "https://github.com/schnoog/php_atproto";
$website_title = "My user defined title";
$website_description = "My user defined description";
$website_image = __DIR__ . "/website_image.png";
//The most simple text post - parsing of mentions and links is ENABLED by default
$answer = atp_create_post($text);
//Now a post, just like above, but this time with the 2 defined images attached, and the $lang keys
$answer = atp_create_post($text,$lang,true,true,$images,$images_alts);
//And now a post which includes a webcard, for which we only provide the URL
$answer = atp_create_post($text,$lang,true,true,[],[],$website_uri);
//Why not a post with a full user defined webcard? Own title, description and image
$answer = atp_create_post($text,null,true,true,[],[],$website_uri,$website_title,$website_description,$website_image);
Sí, también leer la propia línea de tiempo (o alimentación o, sin embargo, se llama) también es bastante fácil. Tbh, lo más fácil disponible
<?php
require_once(__DIR__ . "/src/includer.php");
//Get 27 entries of the own timeline and print it by DebugOut
$timeline = atp_get_own_timeline(27);
DebugOut($timeline);
Esta función es de alguna manera limitada. Actualmente no puedo recibir ningún resultado válido de app.bsky.feed.searchPosts . Entonces, en su lugar, estoy leyendo https://search.bsky.social/search/posts
No es agradable, pero funciona sin embargo
<?php
require_once(__DIR__ . "/src/includer.php");
//Search for posts containing "Arduino" and print the result
$answer = atp_search_posts_by_term("Arduino");
DebugOut($answer);
Crearé una lista con las funciones y puntos finales implementados e intentaré mantenerla actualizada.
Implemented_sorted_by_endpoint.md
ImplementD_sorted_by_funtions.md