rezozero / mixedfeed
一个用于获取社交网络动态并将其合并的PHP库
Requires
- php: >=7.4
- ext-json: *
- abraham/twitteroauth: ^3.0
- guzzlehttp/guzzle: ^7.0
- guzzlehttp/promises: ^1.5
- guzzlehttp/psr7: ^2.1
- psr/cache: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- jms/serializer: ^2.1 || ^3.5
- phpstan/phpstan: ^1.0
- squizlabs/php_codesniffer: ^3.3
- symfony/cache: ^5.0
- symfony/dotenv: ^5.0
- symfony/stopwatch: ^5.0
- dev-master
- v4.0.1
- v4.0.0
- v3.x-dev
- v3.2.1
- v3.2.0
- 3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.0
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.9
- v0.2.8
- v0.2.7
- v0.2.6
- v0.2.5
- v0.2.4.1
- v0.2.4
- v0.2.3
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.0
- dev-develop
- dev-feature/linkedin
- dev-feature/yelp
This package is auto-updated.
Last update: 2024-09-25 12:48:56 UTC
README
一个可以统治社交动态、用魔法交织它们、将它们聚集并融入黑暗中的PHP库
使用独立的Docker服务器
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将在https://:8080可用
可用的环境变量
作为库安装
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 \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将按降序对所有动态项进行排序,但您可以配置它按升序排序
new MixedFeed([…], MixedFeed::ASC);
每个动态提供者必须在动态项中注入这三个参数
feedItemPlatform
:这是您的社交网络名称作为一个字符串,例如“twitter”。这对于缓存您的动态并确保您的HTML模板引擎正确渲染每个动态项非常重要。
例如,如果您正在使用Twig,您将能够包含每个社交平台的子模板。
{% for socialItem in mixedFeedItems %} {% include ‘social-blocks/‘ ~ socialItem.feedItemPlatform ~ ‘.html.twig’ %} {% endfor %}
normalizedDate
:这是一个关键参数,因为它允许mixedfeed对具有不同结构的多个动态进行逆时间顺序排序。canonicalMessage
:这是一个有用的字段,它包含每个项在所有平台上的文本内容。您可以使用此功能在简单的循环中显示项目文本。
使用FeedItem代替原始动态
如果您需要再次将MixedFeed序列化为JSON或XML,您可能不希望包含在各个社交动态项中的所有原始数据。因此,您可以使用$feed->getAsyncCanonicalItems(12);
方法代替getItems
来获取一个更简洁的对象,其中包含基本数据:RZ\MixedFeed\Canonical\FeedItem
。FeedItem将提供这些字段
- id
string
- platform
string
- author
string
- link
string
- title
string
- message
string
- likeCount
int|null
- shareCount
int|null
:根据平台,分享、评论或转发次数。 - images
Image[]
- url
string
- width
integer
- height
integer
- url
- dateTime
DateTime
- tags
array
(仅用于MediumFeed
) - raw
stdClass
以访问如果规范项字段不足的原始API对象
当FeedItem包含图片时,FeedItem::$images
将包含一个RZ\MixedFeed\Canonical\Image
对象的数组,以便更好地访问其url
、width
和height
(如果它们可用)。
每个动态提供者必须实现如何从原始动态中填充一个FeedItem
的机制,通过覆盖createFeedItemFromObject()
方法。
动态提供者
修改缓存TTL
继承自AbstractFeedProvider
的每个动态提供者都可以访问setTtl()
方法以修改默认的缓存时间。默认设置为7200
秒,因此您可以调整它以更频繁或更少地使Doctrine缓存失效。
创建您自己的动态提供者
互联网上有大量的API,这个工具无法处理所有这些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
方法用于查找数据源中的关键时间字段。getFeed
方法用于使用计数限制消耗API端点并处理响应缓存。此方法必须将您自己的数据源项目转换为\stdClass
对象,而不是数组。getCanonicalMessage
方法用于查找数据源项目中的重要文本内容。getFeedPlatform
方法用于获取数据源项目的全局文本标识符。- 然后是一个构造函数,它将在MixedFeed初始化中直接使用。
请随意检查我们现有的数据源提供者以了解它们的工作方式。我们强烈建议您实现一个缓存系统,以免在每次请求时调用API端点。默认情况下,我们使用Doctrine的缓存系统,它具有许多存储选项。
从Doctrine仓库创建动态提供者
如果您需要将社交网络数据源与您自己的网站文章合并,您可以创建一个自定义的FeedProvider,它将Doctrine对象包装成\stdClass
项目。您需要使用EntityManager实现您的getFeed
方法。
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; }