Une bibliothèque PHP pour gouverner les aliments sociaux, pour les enchevêtrer avec de la magie, une bibliothèque PHP pour les rassembler et les lier dans l'obscurité
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
ou utilisez docker-compose : copy docker-compose.yml vers docker-compose.test.yml et remplissez vos informations d'identification du fournisseur. Puis exécutez docker-compose -f docker-compose.test.yml up -d --force-recreate , mixtesfeed sera disponible sur http: // localhost: 8080
| Nom | Valeur par défaut | Multiple? (Comma séparé) |
|---|---|---|
| Mf_cache_provider | tableau | |
| Mf_feed_length | 12 | |
| Mf_facebook_page_id | ✅ | |
| Mf_facebook_access_token | ||
| Mf_facebook_fields | From, link, image, full_picture, message, histoire, type, créé_time, source, statut_type | ✅ |
| Mf_facebook_endpoint | https://graph.facebook.com/v2.12/ | |
| Mf_graph_instagram_user_id | ✅ | |
| Mf_graph_instagram_access_token | ✅ | |
| Mf_github_releases_repository | ✅ | |
| Mf_github_commits_repository | ✅ | |
| Mf_github_access_token | ||
| Mf_medium_username | ✅ | |
| Mf_medium_user_id | Utilisez le même ordre que dans 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 + a besoin au moins PHP 7.2 , vérifiez la configuration de votre serveur.
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 ); L'alimentation mixte peut combiner plusieurs flux sociaux afin que vous puissiez les boucler et utiliser certains champs de données courants tels que feedItemPlatform , normalizedDate et canonicalMessage . mixtesfeed triera tous vos éléments de flux en descendant normalizedDate , mais vous pouvez le configurer pour trier l'ascension :
new MixedFeed ([…], MixedFeed:: ASC );Chaque fournisseur d'alimentation doit injecter ces trois paramètres dans les éléments d'alimentation:
feedItemPlatform : Ceci est votre nom de réseau social en tant que chaîne , c'est-à-dire «Twitter». Il sera important de mettre en cache votre flux et pour que votre moteur de modèle HTML rende correctement chaque élément de flux.Par exemple, si vous utilisez des brindilles , vous pourrez inclure un sous-modèle pour chaque plate-forme sociale.
{% for socialItem in mixedFeedItems %}
{% include ‘social-blocks/‘ ~ socialItem . feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}normalizedDate : Il s'agit d'un paramètre critique car il permet à des aliments mixtes de trier les flux multiples chronologiquement avec des structures hétérogènes.canonicalMessage : Il s'agit d'un champ utile qui contient le contenu texte pour chaque élément sur toutes les plates-formes. Vous pouvez l'utiliser pour afficher les textes des éléments dans une boucle simple. Si vous devez à nouveau sérialiser votre aventure mixte en JSON ou XML, vous ne devez pas vouloir toutes les données brutes contenues dans chaque élément de flux social. Vous pouvez donc utiliser le $feed->getAsyncCanonicalItems(12); Méthode au lieu de getItems pour obtenir un objet plus concis avec des données essentielles: RZMixedFeedCanonicalFeedItem . FeedItem fournira ces champs:
stringstringstring d'auteurstring de liaisonstring de titrestring de messageint|nullint|null : partage, commentaires ou retweet décompte en fonction de la plate-forme.Image[]string d'URLintegerinteger de hauteurDateTimearray (uniquement utilisé avec MediumFeed )stdClass brut pour accéder à l'objet API brut si les champs d'objets canoniques ne sont pas suffisants Lorsque FeedItem a des images, FeedItem::$images tiendra un tableau d'objets RZMixedFeedCanonicalImage pour avoir un meilleur accès à son url , width et height s'ils sont disponibles.
Chaque fournisseur d'alimentation doit implémenter comment hydrater un FeedItem à partir de la méthode de création de flux brut createFeedItemFromObject() .
| Classe du fournisseur de nourriture | Description | feedItemPlatform |
|---|---|---|
| Alimentation moyenne | Appelez https://medium.com/username/latest Endpoint. Il n'a besoin que d'un $username et d'un $userId en option pour une meilleure cohérence sur les demandes (le support semble appliquer du cache sur leurs demandes de nom d'utilisateur même après avoir modifié un paramètre de requête, c'est-à-dire la limite de post). Le milieu permet un maximum de 14 postes par demandes. | medium |
| Instagramoembedfeed | Appelez https://api.instagram.com/oembed/ Endpoint. Il n'a besoin que d'un tableau $embedUrls | instagram_oembed |
| Graphinstagramfeed | Appelez graph.instagram.com/$userId/media Endpoint avec API d'affichage de base. Il a besoin d'un $userId et d'un $accessToken . AVERTISSEMENT : Le jeton d'accès doit être rafraîchi tous les 60 jours, utilisez RefreshInstagramAccessToken | instagram |
Débroupillé : Appelez Over /v1/users/$userId/media/recent/ Endpoint. Il a besoin d'un $userId et d'un $accessToken | instagram | |
| Twitterfeed | Appelez statuses/user_timeline . Il nécessite un $userId , un $consumerKey , un $consumerSecret , un $accessToken et un $accessTokenSecret . Soyez prudent, ce point de terminaison ne peut revenir jusqu'à 3200 des tweets les plus récents d'un utilisateur , votre nombre d'articles pourrait être moindre que prévu. De la même manière, Twitter supprime les retweets après la récupération du nombre d'articles. | twitter |
| Twittersearchfeed | Appelez le point de terminaison search/tweets . Il nécessite un billet $queryParams , un $consumerKey , un $consumerSecret , un $accessToken et un $accessTokenSecret . Soyez prudent, l'API Twitter ne récupérera pas les tweets de plus de 7 jours , votre nombre d'articles pourrait être moindre que prévu. $queryParams doit être un tableau à valeur clé avec les opérateurs de requête en fonction de la documentation de l'API Twitter. | twitter |
| FacebookPageFeed | Appelez https://graph.facebook.com/v3.3/$pageId/posts Endpoint par défaut. Le point de terminaison peut être modifié à l'aide du paramètre $apiBaseUrl . Il nécessite un $pageId et un $accessToken . Ce fournisseur de flux ne fonctionne que pour des pages Facebook publiques. Pour obtenir une visite d'accès: https://developers.facebook.com/docs/facebook-login/access-tokens. Par défaut, les champs picture , message , story , created_time , status_type sont interrogés, vous pouvez ajouter le vôtre en passant le tableau $field en dernier paramètre. Vous pouvez ajouter since et until des paramètres de requête à l'aide de méthodes setSince(Datetime) et setUntil(Datetime) . Vous pouvez écraser la valeur par défaut | facebook_page |
| Pinterestboardfeed | Appelez Over /v1/boards/$boardId/pins/ Endpoint. Il nécessite un $boardId et un $accessToken . Pour obtenir une visite d'accès: https://developers.pinterest.com/tools/access_token/ | pinterest_board |
| Githubreleasesfeed | Appelez api.github.com/repos/:user/:repo/releases :user/:repo/releases. Il nécessite un $repository ( utilisateur / référentiel ) et un $accessToken . Vous pouvez ajouter un dernier paramètre $page . Pour obtenir une visite d'accès: https://github.com/settings/tokens | github_release |
| Githubcomtsfeed | Appelez api.github.com/repos/:user/:repo/commits Endpoint. Il nécessite un $repository ( utilisateur / référentiel ) et un $accessToken . Vous pouvez ajouter un dernier paramètre $page . Pour obtenir une visite d'accès: https://github.com/settings/tokens | github_commit |
| Youtubemostpopularfeed | Appelez googleapis.com/youtube/v3/videos Endpoint avec le graphique mostPopular (c'est plus une sorte d'exemple de flux). Il nécessite un $apiKey avec un compte de console Google Cloud valide (avec un quota non nul) et une API de données YouTube activée. | youtube_playlist_items |
| YoutubeplayListItemfeed | Appelez sur googleapis.com/youtube/v3/playlistItems Endpoint. Il nécessite un $apiKey avec un compte de console Google Cloud valide (avec un quota non nul) et une API de données YouTube activée. | youtube_playlist_items |
Chaque Feed-Provider qui hérite de AbstractFeedProvider a accès à la méthode setTtl() afin de modifier le temps de cache par défaut. Par défaut, il est défini pendant 7200 secondes, vous pouvez donc l'ajuster pour invalider le cache de doctrine plus ou moins souvent.
Il y a beaucoup d'API sur Internet, et cet outil ne pourra pas les gérer tous. Mais ce n'est pas un problème, vous pouvez facilement créer votre propre fournisseur de flux en mixtes . Il vous suffit de créer une nouvelle classe qui héritera de RZMixedFeedAbstractFeedProvider . Ensuite, vous devrez implémenter certaines méthodes de FeedProviderInterface :
getRequests($count = 5): Generator qui renvoie un générateur Request de Guzzle à transformer en réponse. Il s'agit de la meilleure option car elle permettra la mise en commun des demandes asynchrones .supportsRequestPool(): bool doit revenir si votre fournisseur peut être regroupé pour améliorer les performances. Si vous utilisez une bibliothèque tierce pour récupérer vos données (comme un SDK de la plate-forme), vous devez le définir sur false .createFeedItemFromObject($item) Méthode qui transforme un objet d'alimentation brut en un RZMixedFeedCanonicalFeedItem et RZMixedFeedCanonicalImagegetDateTime pour rechercher le champ DateTime critique dans votre flux.getFeed pour consommer votre point de terminaison de l'API avec une limite de décompte et prendre soin de la mise en cache de vos réponses. Cette méthode doit convertir vos propres éléments de flux en objets stdClass , pas des tableaux.getCanonicalMessage pour rechercher le contenu texte important dans vos éléments de flux.getFeedPlatform pour obtenir un identifiant de texte global pour vos éléments de flux.N'hésitez pas à vérifier nos fournisseurs de flux existants pour voir comment ils fonctionnent. Et nous vous conseillons fortement d'implémenter un système de mise en cache pour ne pas appeler vos points de terminaison API à chaque demande. Par défaut, nous utilisons le système de mise en cache de Doctrine qui a de nombreuses options de stockage.
Si vous devez fusionner les flux de réseaux sociaux avec vos propres articles de site Web, vous pouvez créer un FeedProvider personnalisé qui enveloppe vos objets de doctrine en éléments stdClass . Vous devrez implémenter votre méthode getFeed à l'aide d'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 ;
}Ensuite, vous pouvez définir vos méthodes de message et de message canonique pour examiner cet objet:
/**
* @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 ;
}