Библиотека PHP, чтобы управлять социальными подачами, запутать их магией, библиотека PHP, чтобы собрать их и связать в темноте
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
или используйте docker-compose : Скопируйте docker-compose.yml в docker-compose.test.yml и заполните в нем учетные данные. Затем выполните docker-compose -f docker-compose.test.yml up -d --force-recreate , MixedFeed будет доступен по адресу http: // localhost: 8080
| Имя | Значение по умолчанию | Несколько? (Запятая отделена) |
|---|---|---|
| Mf_cache_provider | множество | |
| Mf_feed_length | 12 | |
| Mf_facebook_page_id | ✅ | |
| Mf_facebook_access_token | ||
| Mf_facebook_fields | Из, ссылка, картинки, полная_Пиктура, сообщение, история, тип, созданий_ времени, источник, status_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 | Используйте тот же заказ, что и в 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+ нуждается не менее чем PHP 7.2 , проверьте конфигурацию вашего сервера.
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 может комбинировать несколько социальных каналов, чтобы вы могли зацикливаться на них и использовать некоторые общие поля данных, такие как feedItemPlatform , normalizedDate и canonicalMessage . MixedFeed сортирует все ваши элементы подачи путем спуска normalizedDate , но вы можете настроить его для сортировки восходящего :
new MixedFeed ([…], MixedFeed:: ASC );Каждый поставщик подачи должен вводить эти три параметра в элементы подачи:
feedItemPlatform : Это ваше имя социальной сети как строка , т.е. «Twitter». Будет важно кэшировать свой канал и для вашего шаблонного двигателя HTML для правильного отображения каждого элемента подачи.Например, если вы используете Twig , вы сможете включить суб-таблицу для каждого социального платформы.
{% for socialItem in mixedFeedItems %}
{% include ‘social-blocks/‘ ~ socialItem . feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}normalizedDate : Это критический параметр, поскольку он позволяет MixedFeed сортировать обратные хронологически множественные подачи с гетерогенными структурами.canonicalMessage : Это полезное поле, которое содержит текстовое содержимое для каждого элемента по всем платформам. Вы можете использовать это для отображения предметов текстов в простом цикле. Если вам нужно снова сериализовать свой смешанный корм на JSON или XML, вам не нужно хотеть, чтобы все необработанные данные содержались в каждом элементе социального канала. Таким образом, вы можете использовать $feed->getAsyncCanonicalItems(12); Метод вместо getItems , чтобы получить более краткий объект с основными данными: RZMixedFeedCanonicalFeedItem . FeedItem предоставит эти поля:
stringstringstringstringstringstring сообщенияint|nullint|null : поделиться, комментарии или подсчет ретвитов в зависимости от платформы.Image[]stringintegerintegerDateTimearray тегов (используется только со MediumFeed )stdClass для доступа к объекту RAW API, если поля канонических элементов недостаточно Когда FeedItem имеет изображения, FeedItem::$images будет иметь массив RZMixedFeedCanonicalImage Objects, чтобы иметь лучший доступ к его url , width и height если они доступны.
Каждый поставщик кормов должен реализовать, как увлажнить FeedItem из метода необработанного переоценки createFeedItemFromObject() .
| Класс поставщиков кормов | Описание | feedItemPlatform |
|---|---|---|
| Средний корм | Позвоните по https://medium.com/username/latest endpoint. Требуется только $username и необязательное $userId для лучшей согласованности по вопросам запросов (средний, похоже, применяет кэш к своим запросам имени пользователя даже после изменения параметра запроса, то есть лимит после публикации). Средний допускает максимум 14 публикаций за запросы. | medium |
| Instagramoembedfeed | Позвоните по https://api.instagram.com/oembed/ endpoint. Ему нужно только массив $embedUrls | instagram_oembed |
| Graphinstagramfeed | Вызовите graph.instagram.com/$userId/media конечная точка с основным дисплеем API. Он нуждается в $userId и $accessToken . ПРЕДУПРЕЖДЕНИЕ : Токен доступа должен обновляться каждые 60 дней, используйте RefreshInstagramAccessToken | instagram |
Установите : вызовите /v1/users/$userId/media/recent/ endpoint. Он нуждается в $userId и $accessToken | instagram | |
| Твиттерфуд | Позвоните по statuses/user_timeline endpoint. Это требует $userId , $consumerKey , a $consumerSecret , $accessToken и $accessTokenSecret . Будьте осторожны, эта конечная точка может вернуть только 3200 из самых последних твитов пользователя , количество ваших предметов может быть меньше, чем ожидалось. Точно так же Твиттер удаляет ретвиты после получения подсчета предметов. | twitter |
| Twittersearchfeed | Позвоните по search/tweets конечной точки. Для этого требуется $queryParams Array, A $consumerKey , A $consumerSecret , $accessToken и $accessTokenSecret . Будьте осторожны, API Twitter не будет получать твиты старше 7 дней , количество товаров может быть меньше, чем ожидалось. $queryParams должен быть ключевым значением с операторами запросов в соответствии с документацией Twitter API. | twitter |
| FacebookPagefeed | Позвоните по https://graph.facebook.com/v3.3/$pageId/posts endpoint по умолчанию. Конечная точка может быть изменена с помощью параметра $apiBaseUrl . Это требует $pageId и $accessToken . Этот поставщик кормов работает только на публичных страницах Facebook. Чтобы получить доступ к Access-token: https://developers.facebook.com/docs/facebook-login/access-tokens. По умолчанию, picture , message , story , created_time , поля status_type запрашиваются, вы можете добавить свой собственный, передав $field Array в качестве последнего параметра. Вы можете добавить since и until параметров запроса с использованием методов setSince(Datetime) и setUntil(Datetime) . Вы можете перезаписать по умолчанию | facebook_page |
| Pinterestboardfeed | Вызовите /v1/boards/$boardId/pins/ endpoint. Это требует $boardId и $accessToken . Чтобы получить доступ к доступу: https://developers.pinterest.com/tools/access_token/ | pinterest_board |
| Githubreleasesfeed | Позвоните по api.github.com/repos/:user/:repo/releases Endpoint. Это требует $repository ( пользователь/репозиторий ) и $accessToken . Вы можете добавить последний параметр $page . Чтобы получить доступ к доступу: https://github.com/settings/tokens | github_release |
| Githubcommitsfeed | Позвоните по api.github.com/repos/:user/:repo/commits Endpoint. Это требует $repository ( пользователь/репозиторий ) и $accessToken . Вы можете добавить последний параметр $page . Чтобы получить доступ к доступу: https://github.com/settings/tokens | github_commit |
| Youtubemostpopularfeed | Позвоните по googleapis.com/youtube/v3/videos endpoint с mostPopular диаграммой (это больше пример корма). Это требует $apiKey с действительной учетной записью Google Cloud Console (без нулевой квоты) и API данных YouTube . | youtube_playlist_items |
| Youtubeplaylistitemfeed | Позвоните в googleapis.com/youtube/v3/playlistItems EndPoint. Это требует $apiKey с действительной учетной записью Google Cloud Console (без нулевой квоты) и API данных YouTube . | youtube_playlist_items |
Каждый провейдер, который наследует от AbstractFeedProvider имеет доступ к методу setTtl() , чтобы изменить время кэша по умолчанию. По умолчанию он установлен на 7200 секунд, поэтому вы можете настроить его, чтобы лишить доктрина кэша более или реже.
В Интернете много API, и этот инструмент не сможет справиться с ними всеми. Но это не проблема, вы можете легко создать своего собственного поставщика кормов в MixedFeed . Вам просто нужно создать новый класс , который будет наследовать от RZMixedFeedAbstractFeedProvider . Тогда вам придется реализовать некоторые методы от FeedProviderInterface :
getRequests($count = 5): Generator , который возвращает генератор Request Guzzle , который будет преобразован в ответ. Это лучший вариант, так как он позволит Async -Preds Pooling .supportsRequestPool(): bool должен вернуться, если ваш поставщик может быть объединен для улучшения характеристик. Если вы используете стороннюю библиотеку для получения ваших данных (например, SDK Platform), вы должны установить их на false .createFeedItemFromObject($item) , который преобразует необработанный объект подачи в канонический RZMixedFeedCanonicalFeedItem и RZMixedFeedCanonicalImagegetDateTime для поиска критического поля DateTime в вашем канале.getFeed , чтобы потреблять конечную точку API с ограничением подсчета и позаботьтесь о кэшировании ваших ответов. Этот метод должен преобразовать ваши собственные элементы подачи в объекты stdClass , а не массивы.getCanonicalMessage , чтобы найти важное текстовое содержание в ваших элементах подачи.getFeedPlatform для получения глобального текстового идентификатора для ваших элементов подачи.Не стесняйтесь проверять наших существующих поставщиков кормов, чтобы увидеть, как они работают. И мы настоятельно рекомендуем вам внедрить систему кэширования, чтобы не вызывать ваши конечные точки API по каждому запросу. По умолчанию мы используем кэширующую систему доктрины , которая имеет много вариантов хранения.
Если вам нужно объединить каналы социальной сети с собственными статьями на веб -сайте, вы можете создать пользовательский FeedProvider, который завершает ваши объекты доктрины в элементы stdClass . Вам нужно будет реализовать свой метод getFeed с помощью 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 ;
}Затем вы можете определить свое время даты и канонические методы сообщений , чтобы изучить этот объект:
/**
* @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 ;
}