rezozero/mixedfeed

一个用于获取社交网络动态并将其合并的PHP库

v4.0.1 2023-09-25 10:38 UTC

README

一个可以统治社交动态、用魔法交织它们、将它们聚集并融入黑暗中的PHP库

SensioLabsInsight License Packagist Build Status

使用独立的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-recreateMixedfeed将在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可以合并多个社交动态,因此您可以遍历它们并使用一些公共数据字段,如feedItemPlatformnormalizedDatecanonicalMessagemixedfeed将按降序对所有动态项进行排序,但您可以配置它按升序排序

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\FeedItemFeedItem将提供这些字段

  • 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
  • dateTime DateTime
  • tags array(仅用于MediumFeed
  • raw stdClass 以访问如果规范项字段不足的原始API对象

当FeedItem包含图片时,FeedItem::$images将包含一个RZ\MixedFeed\Canonical\Image对象的数组,以便更好地访问其urlwidthheight(如果它们可用)。

每个动态提供者必须实现如何从原始动态中填充一个FeedItem的机制,通过覆盖createFeedItemFromObject()方法。

动态提供者

修改缓存TTL

继承自AbstractFeedProvider的每个动态提供者都可以访问setTtl()方法以修改默认的缓存时间。默认设置为7200秒,因此您可以调整它以更频繁或更少地使Doctrine缓存失效。

创建您自己的动态提供者

互联网上有大量的API,这个工具无法处理所有这些API。但这不是问题,您可以在mixedfeed中轻松创建自己的数据源提供者。您只需要创建一个新,使其继承自RZ\MixedFeed\AbstractFeedProvider。然后您需要实现一些来自FeedProviderInterface的方法。

  • getRequests($count = 5): \Generator 方法返回一个Guzzle Request生成器,将其转换为响应。这是最佳选择,因为它将启用异步请求池
  • supportsRequestPool(): bool 方法应返回您的提供者是否可以被池化以增强性能。如果您正在使用第三方库来获取您的数据(例如某些平台SDK),您应将其设置为false
  • createFeedItemFromObject($item) 方法将原始数据源对象转换为规范的RZ\MixedFeed\Canonical\FeedItemRZ\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;
}