Una biblioteca de PHP para gobernar los alimentos sociales, enredarlos con magia, una biblioteca de PHP para reunirlos y unirlos en la oscuridad
docker pull rezozero/mixedfeed
docker run -p 8080:80
-e MF_FACEBOOK_PAGE_ID="xxx"
-e MF_FACEBOOK_ACCESS_TOKEN="xxxx"
-e MF_INSTAGRAM_USER_ID="xxx"
-e MF_INSTAGRAM_ACCESS_TOKEN="xxxx"
-e MF_CACHE_PROVIDER="apcu"
-e MF_FEED_LENGTH="30"
rezozero/mixedfeed
O use docker-compose : Copie docker-compose.yml a docker-compose.test.yml y llene las credenciales de su proveedor en él. Luego ejecute docker-compose -f docker-compose.test.yml up -d --force-recreate , mixedfeed estará disponible en http: // localhost: 8080
| Nombre | Valor predeterminado | ¿Múltiple? (coma separada) |
|---|---|---|
| Mf_cache_provider | formación | |
| Mf_feed_length | 12 | |
| Mf_facebook_page_id | ✅ | |
| Mf_facebook_access_token | ||
| Mf_facebook_fields | Desde, enlace, imagen, full_picture, mensaje, historia, tipo, creado_time, fuente, status_type | ✅ |
| Mf_facebook_endpoint | https://graph.facebook.com/v2.12/ | |
| Mf_graph_instagram_user_id | ✅ | |
| Mf_graph_instagram_access_token | ✅ | |
| MF_GITHUB_RELEASES_REPOSTORY | ✅ | |
| Mf_github_commits_repository | ✅ | |
| Mf_github_access_token | ||
| Mf_medium_username | ✅ | |
| Mf_medium_user_id | Use el mismo orden que en MF_MEDIUM_USERNAME | ✅ |
| Mf_pinterest_board_id | ✅ | |
| Mf_pinterest_access_token | ||
| Mf_instagram_oembed_id | ✅ | |
| Mf_twitter_search_query | ||
| Mf_twitter_user_id | ✅ | |
| Mf_twitter_access_token | ||
| Mf_twitter_access_token_secret | ||
| Mf_twitter_consumer_key | ||
| Mf_twitter_consumer_secret | ||
| Mf_twitter_extended_mode | 0 | |
| Mf_youtube_playlist_id | ✅ | |
| Mf_youtube_api_key |
MixedFeed V3+ necesita al menos PHP 7.2 , verifique la configuración de su servidor.
composer require rezozero/mixedfeed use RZ MixedFeed MixedFeed ;
use RZ MixedFeed GraphInstagramFeed ;
use RZ MixedFeed TwitterFeed ;
use RZ MixedFeed TwitterSearchFeed ;
use RZ MixedFeed FacebookPageFeed ;
use RZ MixedFeed GithubReleasesFeed ;
use RZ MixedFeed GithubCommitsFeed ;
$ feed = new MixedFeed ([
new GraphInstagramFeed (
' instagram_user_id ' ,
' instagram_access_token ' ,
null , // you can add a doctrine cache provider
[] // And a fields array to retrieve too
),
new TwitterFeed (
' twitter_user_id ' ,
' twitter_consumer_key ' ,
' twitter_consumer_secret ' ,
' twitter_access_token ' ,
' twitter_access_token_secret ' ,
null , // you can add a doctrine cache provider
true , // exclude replies true/false
false , // include retweets true/false
false // extended mode true/false
),
new TwitterSearchFeed (
[
' #art ' , // do not specify a key for string searchs
' from ' => ' rezo_zero ' ,
' since ' => ' 2015-11-01 ' ,
' until ' => ' 2015-11-30 ' ,
],
' twitter_consumer_key ' ,
' twitter_consumer_secret ' ,
' twitter_access_token ' ,
' twitter_access_token_secret ' ,
null , // you can add a doctrine cache provider
false // extended mode true/false
),
new FacebookPageFeed (
' page-id ' ,
' app_access_token ' ,
null , // you can add a doctrine cache provider
[], // And a fields array to retrieve too
null // A specific Graph API Endpoint URL
),
new GithubCommitsFeed (
' symfony/symfony ' ,
' access_token ' ,
null // you can add a doctrine cache provider
),
new GithubReleasesFeed (
' roadiz/roadiz ' ,
' access_token ' ,
null // you can add a doctrine cache provider
),
new RZ MixedFeed YoutubePlaylistItemFeed (
' your_playlist_id ' ,
' api_key ' ,
null // you can add a doctrine cache provider
),
]);
return $ feed -> getItems ( 12 );
// Or use canonical RZMixedFeedCanonicalFeedItem objects
// for a better compatibility and easier templating with multiple
// social platforms.
return $ feed -> getAsyncCanonicalItems ( 12 ); Mixedfeed puede combinar múltiples alimentos sociales para que pueda pasar sobre ellas y usar algunos campos de datos comunes como feedItemPlatform , normalizedDate y canonicalMessage . MixedFeed ordenará todos sus elementos de alimentación descendiendo normalizedDate , pero puede configurarlo para ordenar Ascender :
new MixedFeed ([…], MixedFeed:: ASC );Cada proveedor de alimentación debe inyectar estos tres parámetros en los elementos de alimentación:
feedItemPlatform : Este es el nombre de su red social como una cadena , es decir, «Twitter». Será importante almacenar en caché su alimentación y para que su motor de plantilla HTML rinde correctamente cada elemento de alimentación.Por ejemplo, si está utilizando Twig , podrá incluir una subplaz para cada plataforma social.
{% for socialItem in mixedFeedItems %}
{% include ‘social-blocks/‘ ~ socialItem . feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}normalizedDate : este es un parámetro crítico, ya que permite la alimentación mixta clasificar cronológicamente múltiples alimentos cronológicamente con estructuras heterogéneas.canonicalMessage : este es un campo útil que contiene el contenido de texto para cada elemento en todas las plataformas. Puede usar esto para mostrar los textos de elementos dentro de un bucle simple. Si necesita serializar su tarjeta mixta a JSON o XML nuevamente, no debe querer todos los datos sin procesar contenidos en cada elemento de alimentación social. Para que pueda usar los $feed->getAsyncCanonicalItems(12); Método en lugar de getItems para obtener un objeto más conciso con datos esenciales: RZMixedFeedCanonicalFeedItem . FeedItem proporcionará estos campos:
string de identificaciónstring de plataformastring de autorstring de enlacestring de títulostring de mensajesint|nullint|null : Acción, comentarios o recuento de retweet dependiendo de la plataforma.Image[]string urlintegerinteger de alturaDateTimearray de etiquetas (solo se usa con MediumFeed )stdClass sin procesar para acceder al objeto API sin procesar si los campos de elementos canónicos no son suficientes Cuando FeedItem tiene imágenes, FeedItem::$images contendrá una variedad de objetos RZMixedFeedCanonicalImage para tener un mejor acceso a su url , width y height si están disponibles.
Cada proveedor de alimentación debe implementar cómo hidratar un FeedItem del método createFeedItemFromObject() en bruto.
| Clase de proveedor de alimentación | Descripción | feedItemPlatform |
|---|---|---|
| Almohadilla | Llame a https://medium.com/username/latest Endpoint. Solo necesita un $username y $userId para una mejor consistencia sobre las solicitudes (el medio parece aplicar caché en sus solicitudes de nombre de usuario incluso después de cambiar un parámetro de consulta, es decir, el límite de publicación). El medio permite el máximo 14 publicaciones por solicitudes. | medium |
| InstagramoembedFeed | Llame a https://api.instagram.com/oembed/ endpoint. Solo necesita una matriz $embedUrls | instagram_oembed |
| Grafinstagramfeed | Llame a graph.instagram.com/$userId/media Endpoint con API de pantalla básica. Necesita A $userId y un $accessToken . ADVERTENCIA : El token de acceso debe actualizarse cada 60 días, use RefreshInstagramAccessToken | instagram |
Deprecido : Llame a /v1/users/$userId/media/recent/ endpoint. Necesita A $userId y un $accessToken | instagram | |
| Twitterfeed | Llame a statuses/user_timeline Endpoint. Requiere A $userId , $consumerKey , $consumerSecret , un $accessToken y un $accessTokenSecret . Tenga cuidado, este punto final solo puede regresar a 3.200 de los tweets más recientes de un usuario , su recuento de elementos podría ser menor de lo esperado. De la misma manera, Twitter elimina los retweets después de recuperar el recuento de elementos. | twitter |
| TwitterSearchFeed | Llame al punto final search/tweets . Requiere una matriz de $queryParams , A $consumerKey , A $consumerSecret , un $accessToken y un $accessTokenSecret . Tenga cuidado, la API de Twitter no recuperará tweets mayores de 7 días , su recuento de artículos podría ser menor de lo esperado. $queryParams debe ser una matriz de valor clave con los operadores de consultas de acuerdo con la documentación de la API de Twitter. | twitter |
| FacebookPageFeed | Llame a https://graph.facebook.com/v3.3/$pageId/posts endpoint de forma predeterminada. El punto final se puede cambiar usando el parámetro $apiBaseUrl . Requiere un $pageId y un $accessToken . Este proveedor de feed solo funciona para páginas públicas de Facebook. Para obtener una visita de acceso de acceso: https://developers.facebook.com/docs/facebook-login/access-tokens. Por defecto, se consultan picture , el message , story , created_time , los campos status_type , puede agregar el suyo al pasar la matriz $field como último parámetro. Puede agregar since y until los parámetros de consulta utilizando los métodos setSince(Datetime) y setUntil(Datetime) . Puedes sobrescribir el valor predeterminado | facebook_page |
| Pinterestboardfeed | Llame a /v1/boards/$boardId/pins/ endpoint. Requiere un $boardId y un $accessToken . Para obtener una visita de acceso de acceso: https://developers.pinterest.com/tools/access_token/ | pinterest_board |
| Githubreleasesfeed | Llame a api.github.com/repos/:user/:repo/releases Endpoint. Requiere un $repository ( usuario/repositorio ) y un $accessToken . Puede agregar un último parámetro $page . Para obtener una visita de acceso de acceso: https://github.com/settings/tokens | github_release |
| Githubcommitsfeed | Llame a api.github.com/repos/:user/:repo/commits Endpoint. Requiere un $repository ( usuario/repositorio ) y un $accessToken . Puede agregar un último parámetro $page . Para obtener una visita de acceso de acceso: https://github.com/settings/tokens | github_commit |
| Youtubemostpopularfeed | Llame a googleapis.com/youtube/v3/videos endpoint con el gráfico mostPopular (es más un tipo de alimento). Requiere un $apiKey con una cuenta válida de la consola de Google Cloud (con cuota no nula) y la API de datos de YouTube habilitada. | youtube_playlist_items |
| YouTubeplayListitemFeed | Llame a googleapis.com/youtube/v3/playlistItems endpoint. Requiere un $apiKey con una cuenta válida de la consola de Google Cloud (con cuota no nula) y la API de datos de YouTube habilitada. | youtube_playlist_items |
Cada proveedor de alimentación que hereda de AbstractFeedProvider tiene acceso al método setTtl() para modificar el tiempo de caché predeterminado. Por defecto, se establece durante 7200 segundos, por lo que puede ajustarlo para invalidar el caché de doctrina con más o menos frecuencia.
Hay muchas API en Internet, y esta herramienta no podrá manejarlas todas. Pero esto no es un problema, puede crear fácilmente su propio proveedor de alimentación en la alimentación mixta . Solo tiene que crear una nueva clase que heredará de RZMixedFeedAbstractFeedProvider . Luego tendrá que implementar algunos métodos de FeedProviderInterface :
getRequests($count = 5): Generator Método que devuelve un generador Request de Guzzle para transformarse a una respuesta. Esta es la mejor opción, ya que habilitará la agrupación de solicitudes de async .supportsRequestPool(): bool debe regresar si su proveedor se puede agrupar para mejorar el rendimiento. Si está utilizando una biblioteca de terceros para obtener sus datos (como algún SDK de plataforma), debe configurarlo en false .createFeedItemFromObject($item) que transforma un objeto de alimentación en bruto en una RZMixedFeedCanonicalFeedItem y RZMixedFeedCanonicalImagegetDateTime para buscar el campo crítico de fecha y hora en su feed.getFeed para consumir su punto final API con un límite de recuento y cuidar en caché de sus respuestas. Este método debe convertir sus propios elementos de alimentación en objetos stdClass , no matrices.getCanonicalMessage Method para buscar el contenido de texto importante en sus elementos de alimentación.getFeedPlatform para obtener un identificador de texto global para sus elementos de alimentación.No dude en consultar a nuestros proveedores de alimentos existentes para ver cómo funcionan. Y le recomendamos encarecidamente que implemente un sistema de almacenamiento en caché que no llame a los puntos finales de su API en cada solicitud. Por defecto, utilizamos el sistema de almacenamiento de caché de doctrina que tiene muchas opciones de almacenamiento.
Si necesita fusionar los alimentos de las redes sociales con los artículos de su propio sitio web, puede crear un FeedProvider personalizado que envuelva sus objetos de doctrina en los elementos stdClass . Deberá implementar su método getFeed utilizando un EntityManager:
protected $ entityManager ;
public function __construct ( Doctrine ORM EntityManagerInterface $ entityManager )
{
$ this -> entityManager = $ entityManager ;
}
protected function getFeed ( $ count = 5 )
{
return array_map (
function ( Article $ article ) {
$ object = new stdClass ();
$ object -> native = $ article ;
return $ object ;
},
$ this -> entityManager -> getRepository (Article::class)-> findBy (
[],
[ ' datetime ' => ' DESC ' ],
$ count
)
);
}
protected function createFeedItemFromObject( $ item )
{
$ feedItem = new RZ MixedFeed Canonical FeedItem ();
$ feedItem -> setDateTime ( $ this -> getDateTime ( $ item ));
$ feedItem -> setMessage ( $ this -> getCanonicalMessage ( $ item ));
$ feedItem -> setPlatform ( $ this -> getFeedPlatform ());
for ( $ item -> images as $ image ) {
$ feedItemImage = new RZ MixedFeed Canonical Image ();
$ feedItemImage -> setUrl ( $ image -> url );
$ feedItem -> addImage ( $ feedItemImage );
}
return $ feedItem ;
}Luego puede definir los métodos de mensajes de fecha y hora de fecha para investigar este objeto:
/**
* @inheritDoc
*/
public function getDateTime ( $ item )
{
if ( $ item -> native instanceof Article) {
return $ item -> native -> getDatetime ();
}
return null ;
}
/**
* @inheritDoc
*/
public function getCanonicalMessage ( stdClass $ item )
{
if ( $ item -> native instanceof Article) {
return $ item -> native -> getExcerpt ();
}
return null ;
}