mixedfeed
统治社交喂养的PHP库,将它们与魔术纠缠,一个PHP库来收集它们并在黑暗中束缚它们
使用独立的Docker服务器
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 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 | 来自,链接,图片,full_picture,消息,故事,类型,创建_time,source,status_type | ✅ |
| mf_facebook_endpoint | https://graph.*fa*ce*book.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_EXTEDDEND_MODE | 0 | |
| mf_youtube_playlist_id | ✅ | |
| mf_youtube_api_key |
作为库安装
mixedfeed V3+至少需要PHP 7.2 ,检查服务器配置。
composer require rezozero/ 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 \\RZ\\ mixedfeed \\Canonical\\FeedItem objects
// for a better compatibility and easier templating with multiple
// social platforms.
return $feed->getAsyncCanonicalItems(12);\”>
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 \\RZ\\ mixedfeed \\Canonical\\FeedItem objects // for a better compatibility and easier templating with multiple // social platforms. return $ feed -> getAsyncCanonicalItems ( 12 );
结合进料
mixedfeed可以结合多个社交供稿,因此您可以循环循环它们,并使用一些常见的数据字段,例如feedItemPlatform , normalizedDate和canonicalMessage 。 mixedfeed将通过降低normalizedDate来对所有提要项目进行排序,但是您可以将其配置为排序以上:
mixedfeed ::ASC);\”>
new mixedfeed ([…], mixedfeed :: ASC );
每个饲料提供商都必须在提要项目中注入这三个参数:
-
feedItemPlatform:这是您的社交网络名称,即字符串,即«twitter»。缓存提要和HTML模板引擎以正确渲染每个进料项目非常重要。
例如,如果您使用的是树枝,则可以为每个社交平台包含一个子网站。
mixedfeedItems %}
{% include ‘social-blocks/‘ ~ socialItem.feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}\”>
{% for socialItem in mixedfeed Items %}
{% include ‘social-blocks/‘ ~ socialItem . feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}
-
normalizedDate:这是一个关键参数,因为它允许mixedfeed喂养用异质结构对逆时态进行逆转表。 -
canonicalMessage:这是一个有用的字段,其中包含所有平台上每个项目的文本内容。您可以使用它在简单的循环中显示项目文本。
使用进料而不是原始饲料
如果您需要再次将mixedfeed序列化为JSON或XML,则不应希望每个社交供稿项目中包含的所有原始数据。因此,您可以使用$feed->getAsyncCanonicalItems(12);方法不是getItems获得具有基本数据的更简洁的对象: RZ\\ mixedfeed \\Canonical\\FeedItem 。进料将提供这些领域:
- ID
string - 平台
string - 作者
string - 链接
string - 标题
string - 消息
string - LeakeCount
int|null - ShareCount
int|null:分享,评论或转发计数,具体取决于平台。 - 图像
Image[]- URL
string - 宽度
integer - 高度
integer
- URL
- DateTime
DateTime - 标签
array(仅与MediumFeed一起使用) - 如果规范项目
stdClass还不够
当FeffItem具有图像时, FeedItem::$images将容纳RZ\\ mixedfeed \\Canonical\\Image对象的阵列,如果可用的话,可以更好地访问其url , width和height 。
每个饲料提供商都必须实现如何从原始饲料覆盖createFeedItemFromObject()方法中进行进FeedItem水合。
饲料提供商
| 饲料提供商课程 | 描述 | feedItemPlatform |
|---|---|---|
| 中型 | 通过https://*m*ed*ium.com/username/latest端点致电。它只需要一个$username和可选的$userId即可更好地一致性(介质似乎在更改查询参数后,即使在其用户名请求上都应用缓存,即邮政限制)。每个请求最多允许14个帖子。 |
medium
|
| InstagramoembedFeed | 致电https://api.in**s*tagram.com/oembed/ endpoint。它只需要$embedUrls阵列 |
instagram_oembed |
| GraphinstagramFeed | 通过基本显示API致电graph.instagram.com/$userId/media端点。它需要$userId和$accessToken 。警告:访问令牌必须每60天刷新一次,使用RefreshInstagramAccessToken
|
instagram
|
弃用:呼叫/v1/users/$userId/media/recent/端点。它需要$userId和$accessToken
|
instagram
|
|
| Twitterfeed | 调用statuses/user_timeline端点。它需要一个$userId , $consumerKey ,a $consumerSecret , $accessToken和$accessTokenSecret 。请小心,此端点最多只能返回3,200个用户最近的推文,您的项目数量可能比预期的要小。以同样的方式,Twitter在检索项目计数后删除了转发。 |
twitter
|
| TwittersearchFeed | 致电search/tweets端点。它需要一个$queryParams阵列, $consumerKey ,a $consumerSecret , $accessToken和$accessTokenSecret 。请小心,Twitter API不会检索比7天大的推文,您的物品数量可能比预期的要小。根据Twitter API文档, $queryParams必须是带有查询操作员的键值值阵列。 |
twitter
|
| FacebookpageFeed | 通过https://graph.*faceboo**k.com/v3.3/$pageId/posts eendpoint in默认情况下致电。可以使用$apiBaseUrl参数更改端点。它需要$pageId和$accessToken 。该饲料提供商仅适用于公共Facebook页面。要获取访问访问:https://developers.facebook.com/docs/facebook-login/access-tokens。默认情况下,查询了status_type字段,您可以通过将$field picture作为最后created_time message story status_type字段。您可以使用setSince(\\Datetime)和setUntil(\\Datetime)方法来添加和until查询参数since 。您可以覆盖默认值 |
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 | 通过mostPopular图表拨打googleapis.com/youtube/v3/videos端点(这是一个示例提要)。它需要有一个有效的Google Cloud Console帐户(不带空配额)的$apiKey ,并启用了YouTube数据API 。 |
youtube_playlist_items
|
| YouTubePlayListItemFeed | 致电googleapis.com/youtube/v3/playlistItems端点。它需要有一个有效的Google Cloud Console帐户(不带空配额)的$apiKey ,并启用了YouTube数据API 。 |
youtube_playlist_items |
修改缓存TTL
从AbstractFeedProvider继承的每个进纸产品都可以访问setTtl()方法,以修改默认的缓存时间。默认情况下,它设置为7200秒,因此您可以将其调整为无效的学说缓存或多或少。
创建自己的饲料提供商
互联网上有很多API,此工具将无法全部处理。但这不是问题,您可以轻松地在mixedfeed中创建自己的饲料提供商。您只需要创建一个新类,该类将从RZ\\ mixedfeed \\AbstractFeedProvider继承。然后,您将必须从FeedProviderInterface实现一些方法:
-
getRequests($count = 5): \\Generator方法,将GuzzleRequest生成器转换为响应。这是最佳选择,因为它将启用异步请求池。 -
supportsRequestPool(): bool方法。如果您使用第三方库来获取数据(例如某些平台SDK),则应将其设置为false。 -
createFeedItemFromObject($item)方法将原始的进料对象转换为规范的RZ\\ mixedfeed \\Canonical\\FeedItem和RZ\\ mixedfeed \\Canonical\\Image -
getDateTime方法在提要中查找关键的DateTime字段。 -
getFeed方法可以使用计数限制消耗API端点并照顾您的响应。此方法必须将您自己的饲料项目转换为\\stdClass对象,而不是数组。 -
getCanonicalMessage方法可以在提要项目中寻找重要的文本内容。 -
getFeedPlatform方法可以为您的提要项目获取全局文本标识符。 - 然后,可以直接在mixedfeed初始化中使用的构造函数。
随时检查我们现有的饲料提供商,以了解其工作原理。我们强烈建议您实施一个缓存系统,不要按每个请求调用API端点。默认情况下,我们使用具有许多存储选项的学说的缓存系统。
从学说存储库中创建饲料提供商
如果您需要将社交网络供稿与自己的网站文章合并,则可以创建一个自定义的FeedProvider,将您的学说对象包裹在\\stdClass项目中。您需要使用EntityManager实现getFeed方法:
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;
}\”>
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 ; }
