Eine PHP-Bibliothek, um soziale Feeds zu regieren, sie mit Magie zu verwickeln, eine PHP-Bibliothek, um sie zu sammeln und in der Dunkelheit zu binden
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
Oder verwenden Sie docker-compose : Kopieren Sie docker-compose.yml auf docker-compose.test.yml und füllen Sie Ihre Anmeldeinformationen für Anbieter darin. Führen Sie dann docker-compose -f docker-compose.test.yml up -d --force-recreate , MixedFeed wird unter http: // localhost: 8080 verfügbar sein
| Name | Standardwert | Mehrere? (Komma getrennt) |
|---|---|---|
| Mf_cache_provider | Array | |
| Mf_feed_length | 12 | |
| Mf_facebook_page_id | ✅ | |
| Mf_facebook_access_token | ||
| Mf_facebook_fields | Von, Link, Bild, full_picture, meldung, Geschichte, Typ, erstellt_time, Quelle, status_type | ✅ |
| Mf_facebook_endpoint | https://graph.facebook.com/v2.12/ | |
| MF_GRAPH_INSTAGRAM_USER_ID | ✅ | |
| MF_GRAPH_INSTAGRAM_ACCESS_TOKE | ✅ | |
| Mf_github_releases_repository | ✅ | |
| Mf_github_commits_repository | ✅ | |
| Mf_github_access_token | ||
| Mf_medium_username | ✅ | |
| Mf_medium_user_id | Verwenden Sie die gleiche Reihenfolge wie in 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+ benötigt mindestens PHP 7.2 , überprüfen Sie Ihre Serverkonfiguration.
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 kann mehrere soziale Feeds kombinieren, sodass Sie sie überfliegen und einige gängige Datenfelder wie feedItemPlatform , normalizedDate und canonicalMessage verwenden können. MixedFeed sortiert alle Ihre Feed -Elemente durch Abstieg von normalizedDate , aber Sie können es so konfigurieren, dass Sie aufsteigend sortieren:
new MixedFeed ([…], MixedFeed:: ASC );Jeder Futteranbieter muss diese drei Parameter in Feed -Elemente injizieren:
feedItemPlatform : Dies ist Ihr sozialer Netzwerkname als Zeichenfolge , dh «Twitter». Es wird wichtig sein, Ihren Feed zu speichern und Ihre HTML -Vorlagenmotor, um jedes Futtermittel ordnungsgemäß zu rendern.Wenn Sie beispielsweise Twig verwenden, können Sie für jede soziale Plattform eine Unter-Template einfügen.
{% for socialItem in mixedFeedItems %}
{% include ‘social-blocks/‘ ~ socialItem . feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}normalizedDate : Dies ist ein kritischer Parameter, da MixedFeed umgekehrte chronologisch mehrere Feeds mit heterogenen Strukturen sortiert werden kann.canonicalMessage : Dies ist ein nützliches Feld, das den Textinhalt für jedes Element über allen Plattformen enthält. Sie können diese verwenden, um Elementextexte in einer einfachen Schleife anzuzeigen. Wenn Sie Ihr MixedFeed erneut mit JSON oder XML serialisieren müssen, sollten Sie nicht alle in jedem sozialen Feedelement enthaltenen Rohdaten möchten. Sie können also die $feed->getAsyncCanonicalItems(12); Methode anstelle von getItems , um ein prägnanteres Objekt mit wesentlichen Daten zu erhalten: RZMixedFeedCanonicalFeedItem . FeedItem liefert diese Felder:
stringstringstringstringstringstringint|nullint|null : Teilen, Kommentare oder Retweet -Zählung abhängig von der Plattform.Image[]stringintegerintegerDateTimearray (nur mit MediumFeed verwendet)stdClass zum Zugriff auf RAW -API -Objekt, wenn kanonische Elementfelder nicht genug sind Wenn FeedItem Bilder hat, enthält FeedItem::$images ein Array von RZMixedFeedCanonicalImage um einen besseren Zugriff auf url , width und height zu erhalten, wenn sie verfügbar sind.
Jeder Futteranbieter muss implementieren, wie ein FeedItem aus der Methode "RAW Feed Overriding createFeedItemFromObject() hydratisiert werden kann.
| Futteranbieterklasse | Beschreibung | feedItemPlatform |
|---|---|---|
| Mediumfeed | Rufen Sie über https://medium.com/username/latest Endpoint an. Es benötigt nur einen $username und einen optionalen $userId für eine bessere Konsistenz gegenüber Anfragen (Medium scheint Cache auf ihre Benutzernamenanfragen zu wenden, auch nach der Änderung eines Abfrageparameters, dh Post -Limit). Medium ermöglicht maximal 14 Beiträge pro Anfragen. | medium |
| Instagramoembedfeed | Rufen Sie über https://api.instagram.com/oembed/ Endpoint an. Es braucht nur ein $embedUrls -Array | instagram_oembed |
| GraphinStagramfeed | Rufen Sie mit grundlegender Anzeige -API über graph.instagram.com/$userId/media -Endpunkt an. Es benötigt eine $userId und eine $accessToken . WARNUNG : Zugangs -Token muss alle 60 Tage RefreshInstagramAccessToken werden, verwenden | instagram |
Veraltet : Rufen Sie Over /v1/users/$userId/media/recent/ Endpunkt an. Es benötigt eine $userId und eine $accessToken | instagram | |
| TwitterFeed | Rufen Sie statuses/user_timeline -Endpunkt an. Es erfordert eine $userId , einen $consumerKey , einen $consumerSecret , einen $accessToken und einen $accessTokenSecret . Seien Sie vorsichtig, dieser Endpunkt kann nur bis zu 3.200 der neuesten Tweets eines Benutzers zurückkehren . Ihre Artikelanzahl kann geringer sein als erwartet. Auf die gleiche Weise entfernt Twitter Retweets nach dem Abrufen der Elemente. | twitter |
| Twitterssearchfeed | Rufen Sie den Endpunkt search/tweets an. Es erfordert ein $queryParams -Array, einen $consumerKey , einen $consumerSecret , einen $accessToken und einen $accessTokenSecret . Seien Sie vorsichtig, Twitter -API wird keine Tweets älter als 7 Tage abrufen , Ihre Artikelanzahl kann geringer sein als erwartet. $queryParams müssen ein wesentlicher Wertes Array mit Abfragebetreibern gemäß der Twitter-API-Dokumentation sein. | twitter |
| FacebookPageFeed | Rufen Sie standardmäßig unter https://graph.facebook.com/v3.3/$pageId/posts -Endpunkt an. Der Endpunkt kann mit $apiBaseUrl -Parameter geändert werden. Es erfordert eine $pageId und eine $accessToken . Dieser Feed -Anbieter arbeitet nur für öffentliche Facebook -Seiten . Um einen Access-Token zu erhalten, besuchen Sie: https://developers.facebook.com/docs/facebook-login/access-tokens. Standardmäßig werden picture , message , story , created_time , status_type -Felder abgefragt. Sie können Ihr eigenes $field -Array als letzter Parameter hinzufügen. Sie können since und until Abfrageparameter mit den Methoden setSince(Datetime) und setUntil(Datetime) hinzufügen. Sie können den Standard überschreiben | facebook_page |
| Pinterestboardfeed | Rufen Sie Over /v1/boards/$boardId/pins/ Endpunkt an. Es erfordert ein $boardId und ein $accessToken . Um einen Access-Token-Besuch zu erhalten: https://developers.pinterest.com/tools/access_token/ | pinterest_board |
| Githubreleasesfeed | Rufen Sie über api.github.com/repos/:user/:repo/releases Endpoint an. Es erfordert ein $repository ( Benutzer/Repository ) und ein $accessToken . Sie können einen letzten $page -Parameter hinzufügen. Um einen Access-Token-Besuch zu erhalten: https://github.com/setings/tokens | github_release |
| Githubcommitsfeed | Rufen Sie api.github.com/repos/:user/:repo/commits Endpoint an. Es erfordert ein $repository ( Benutzer/Repository ) und ein $accessToken . Sie können einen letzten $page -Parameter hinzufügen. Um einen Access-Token-Besuch zu erhalten: https://github.com/setings/tokens | github_commit |
| Youtubemostpopularfeed | Rufen Sie über googleapis.com/youtube/v3/videos endpoint mit mostPopular Diagramm an (es handelt sich um eine Art Beispiel -Feed). Es erfordert ein $apiKey mit einem gültigen Google Cloud Console -Konto (mit nicht Null -Kontingent) und YouTube -Daten -API aktiviert. | youtube_playlist_items |
| YouTubePlayListItemFeed | Rufen Sie über googleapis.com/youtube/v3/playlistItems Endpoint an. Es erfordert ein $apiKey mit einem gültigen Google Cloud Console -Konto (mit nicht Null -Kontingent) und YouTube -Daten -API aktiviert. | youtube_playlist_items |
Jeder Feed-Provider, der von AbstractFeedProvider erbt, hat Zugriff auf die Methode setTtl() , um die Standard-Cache-Zeit zu ändern. Standardmäßig ist es für 7200 Sekunden festgelegt, sodass Sie es mehr oder seltener anpassen können, um den Lehre -Cache zu ungültig zu machen.
Es gibt viele APIs im Internet, und dieses Tool kann nicht in der Lage sein, alle zu handhaben. Dies ist jedoch kein Problem, Sie können problemlos Ihren eigenen Feed -Anbieter in MixedFeed erstellen. Sie müssen nur eine neue Klasse erstellen, die von RZMixedFeedAbstractFeedProvider erben wird. Anschließend müssen Sie einige Methoden von FeedProviderInterface implementieren:
getRequests($count = 5): Generator , die einen Guzzle Request -Generator zurückgibt, der in eine Antwort umgewandelt werden soll. Dies ist die beste Option, da das Pooling von Async Request ermöglicht wird.supportsRequestPool(): bool -Methode sollte zurückkehren, wenn Ihr Anbieter zusammengefasst werden kann, um die Leistungen zu verbessern. Wenn Sie eine Bibliothek von Drittanbietern verwenden, um Ihre Daten zu holen (z. B. einige Plattform -SDK), sollten Sie sie auf false festlegen.createFeedItemFromObject($item) -Methode, die ein Rohvorschubobjekt in ein kanonisches RZMixedFeedCanonicalFeedItem und RZMixedFeedCanonicalImage umwandeltgetDateTime -Methode, um nach dem Feld Critical DateTime in Ihrem Feed zu suchen.getFeed -Methode, um Ihren API -Endpunkt mit einer Zählgrenze zu konsumieren und Ihre Antworten zwischenzuspeichern. Diese Methode muss Ihre eigenen Feed -Elemente in stdClass -Objekte umwandeln, nicht in Arrays.getCanonicalMessage -Methode, um nach dem wichtigen Textinhalt in Ihren Feed -Elementen zu suchen.getFeedPlatform -Methode, um eine globale Textkennung für Ihre Feed -Elemente zu erhalten.Überprüfen Sie unsere vorhandenen Feed -Anbieter, um zu sehen, wie sie funktionieren. Und wir raten Ihnen dringend, ein Caching -System zu implementieren, um Ihre API -Endpunkte nicht auf jede Anfrage anzurufen. Standardmäßig verwenden wir das Caching -System von Doktrin mit vielen Speicheroptionen.
Wenn Sie soziale Netzwerk -Feeds mit Ihren eigenen Website -Artikeln zusammenführen müssen, können Sie einen benutzerdefinierten FeedProvider erstellen, der Ihre Doktrinobjekte in Elemente stdClass um einfließt. Sie müssen Ihre getFeed -Methode mit einem EntityManager implementieren:
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 ;
}Anschließend können Sie Ihre Datumszeit- und kanonischen Nachrichtenmethoden definieren, um dieses Objekt zu untersuchen:
/**
* @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 ;
}