Uma biblioteca PHP para governar as alimentação social, para envolvê-las com magia, uma biblioteca PHP para reuni-las e amarrá-las na escuridão
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
ou use docker-compose : copy docker-compose.yml para docker-compose.test.yml e preencha suas credenciais do provedor nele. Em seguida, execute docker-compose -f docker-compose.test.yml up -d --force-recreate , o mixedfeed estará disponível em http: // localhost: 8080
| Nome | Valor padrão | Múltiplo? (vírgula separada) |
|---|---|---|
| Mf_cache_provider | variedade | |
| Mf_feed_length | 12 | |
| Mf_facebook_page_id | ✅ | |
| Mf_facebook_access_token | ||
| Mf_facebook_fields | de, link, imagem, full_picture, mensagem, história, tipo, criação_time, fonte, 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 | Use a mesma ordem que em 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+ precisa de pelo menos Php 7.2 , verifique a configuração do servidor.
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 ); O MixedFeed pode combinar vários feeds sociais para que você possa atravessar eles e usar alguns campos de dados comuns, como feedItemPlatform , normalizedDate e canonicalMessage . O MixedFeed classificará todos os seus itens de alimentação descendentes normalizedDate , mas você pode configurá -lo para classificar ascendentes :
new MixedFeed ([…], MixedFeed:: ASC );Cada provedor de alimentação deve injetar esses três parâmetros em itens de alimentação:
feedItemPlatform : este é o nome da sua rede social como uma string , ou seja, «Twitter». Será importante armazenar em cache seu feed e para o seu mecanismo de modelo HTML renderizar corretamente cada item de alimentação.Por exemplo, se você estiver usando o Twig , poderá incluir um sub-templado para cada plataforma social.
{% for socialItem in mixedFeedItems %}
{% include ‘social-blocks/‘ ~ socialItem . feedItemPlatform ~ ‘.html.twig’ %}
{% endfor %}normalizedDate : este é um parâmetro crítico, pois permite que o mixedfeed classifique os feeds cronologicamente múltiplos reversos com estruturas heterogêneas.canonicalMessage : Este é um campo útil que contém o conteúdo de texto para cada item em todas as plataformas. Você pode usar isso para exibir textos de itens em um loop simples. Se você precisar serializar seu mixedfeed com JSON ou XML novamente, não deve querer todos os dados brutos contidos em cada item de alimentação social. Assim, você pode usar o $feed->getAsyncCanonicalItems(12); Método em vez de getItems obter um objeto mais conciso com dados essenciais: RZMixedFeedCanonicalFeedItem . O Feeditem fornecerá estes campos:
string idstring da plataformastring de autorstring de linkstring de títulostring de mensagemint|nullint|null : Compartilhe, Comentários ou Retweet Count, dependendo da plataforma.Image[]string URLinteger larguraintegerDateTimearray de tags (usado apenas com MediumFeed )stdClass bruto para acessar o objeto API bruto se os campos de itens canônicos não forem suficientes Quando o FeedItem possui imagens, FeedItem::$images contém uma matriz de objetos RZMixedFeedCanonicalImage para ter melhor acesso ao seu url , width e height se estiverem disponíveis.
Cada provedor de alimentação deve implementar como hidratar um FeedItem do método createFeedItemFromObject() .
| Classe de provedor de alimentação | Descrição | feedItemPlatform |
|---|---|---|
| Mediumfeed | Ligue para https://medium.com/username/latest endpoint. Ele precisa apenas de um $username e um $userId opcional para obter uma melhor consistência sobre as solicitações (o meio parece aplicar o cache em suas solicitações de nome de usuário, mesmo após a alteração de um parâmetro de consulta, ou seja, o limite de postagem). O meio permite máximo 14 postagens por solicitações. | medium |
| Instagramoembedfeed | Ligue para https://api.instagram.com/oembed/ endpoint. Ele só precisa de uma matriz $embedUrls | instagram_oembed |
| GraphInstaGramfeed | Ligue para graph.instagram.com/$userId/media Endpoint com API de exibição básica. Precisa de um $userId e um $accessToken . Aviso : o token de acesso deve ser atualizado a cada 60 dias, use RefreshInstagramAccessToken | instagram |
Desprecado : ligue para /v1/users/$userId/media/recent/ endpoint. Precisa de um $userId e um $accessToken | instagram | |
| Twitterfeed | Ligue para statuses/user_timeline endpoint. Requer um $userId , um $consumerKey , A $consumerSecret , um $accessToken e um $accessTokenSecret . Cuidado, esse terminal pode retornar apenas para 3.200 dos tweets mais recentes de um usuário , a contagem de itens pode ser menor do que o esperado. Da mesma forma, o Twitter remove retweets depois de recuperar a contagem de itens. | twitter |
| TwitterSearchfeed | Ligue para o ponto final search/tweets . Requer uma matriz $queryParams , um $consumerKey , um $consumerSecret , um $accessToken e um $accessTokenSecret . Tenha cuidado, a API do Twitter não recupera tweets com mais de 7 dias , a contagem de itens pode ser menor do que o esperado. $queryParams deve ser uma matriz de valor-chave com operadores de consulta de acordo com a documentação da API do Twitter. | twitter |
| FacebookPageFeed | Ligue para https://graph.facebook.com/v3.3/$pageId/posts Endpoint por padrão. O endpoint pode ser alterado usando o parâmetro $apiBaseUrl . Requer um $pageId e um $accessToken . Este provedor de feeds funciona apenas para páginas públicas do Facebook. Para obter uma visita de acesso ao acesso: https://developers.facebook.com/docs/facebook-login/access-tokens. Por $field , picture , message , story , created_time , status_type FIELDS são consultados. Você pode adicionar since e until os parâmetros de consulta usando os métodos setSince(Datetime) e setUntil(Datetime) . Você pode substituir o padrão | facebook_page |
| Pinterestboardfeed | Ligue para over /v1/boards/$boardId/pins/ endpoint. Requer um $boardId e um $accessToken . Para obter uma visita de acesso ao acesso: https://developers.pinterest.com/tools/access_token/ | pinterest_board |
| Githubreleasesfeed | Ligue para api.github.com/repos/:user/:repo/releases endpoint. Requer um $repository ( usuário/repositório ) e um $accessToken . Você pode adicionar um parâmetro Último $page . Para obter uma visita de acesso ao acesso: https://github.com/settings/tokens | github_release |
| GithubCommitsfeed | Ligue para api.github.com/repos/:user/:repo/commits Endpoint. Requer um $repository ( usuário/repositório ) e um $accessToken . Você pode adicionar um parâmetro Último $page . Para obter uma visita de acesso ao acesso: https://github.com/settings/tokens | github_commit |
| YouTubemostpopularfeed | Ligue para googleapis.com/youtube/v3/videos terminal com gráfico mostPopular (é mais um tipo de feed de exemplo). Requer um $apiKey com uma conta válida do Google Cloud Console (com uma cota NULL) e API de dados do YouTube ativada. | youtube_playlist_items |
| YouTubePlayListItemFeed | Ligue para googleapis.com/youtube/v3/playlistItems Endpoint. Requer um $apiKey com uma conta válida do Google Cloud Console (com uma cota NULL) e API de dados do YouTube ativada. | youtube_playlist_items |
Cada provedor de feed que herda do AbstractFeedProvider tem acesso ao método setTtl() para modificar o tempo de cache padrão. Por padrão, está definido por 7200 segundos, para que você possa ajustá -lo para invalidar o cache da doutrina com mais ou menos frequência.
Existem muitas APIs na internet, e essa ferramenta não será capaz de lidar com todas elas. Mas isso não é um problema, você pode criar facilmente seu próprio provedor de feeds no mixedfeed . Você só precisa criar uma nova classe que herdará a partir RZMixedFeedAbstractFeedProvider . Então você terá que implementar alguns métodos do FeedProviderInterface :
getRequests($count = 5): Generator que retornam um gerador Request de guzes para ser transformado em uma resposta. Esta é a melhor opção, pois permitirá que o ASYNC Solicle Pooling .supportsRequestPool(): bool deve retornar se o seu provedor puder ser agrupado para aprimorar o desempenho. Se você estiver usando uma biblioteca de terceiros para buscar seus dados (como algum SDK da plataforma), você deve configurá -los como false .createFeedItemFromObject($item) que transforma um objeto de alimentação bruto em um RZMixedFeedCanonicalFeedItem e RZMixedFeedCanonicalImagegetDateTime para procurar o campo crítico do datetime em seu feed.getFeed consumia seu endpoint da API com um limite de contagem e cuide do cache de suas respostas. Este método deve converter seus próprios itens de alimentação em objetos stdClass , não matrizes.getCanonicalMessage para procurar o conteúdo importante de texto em seus itens de feed.getFeedPlatform para obter um identificador de texto global para seus itens de feed.Sinta -se à vontade para verificar nossos provedores de feeds existentes para ver como eles funcionam. E aconselhamos fortemente que você implemente um sistema de armazenamento em cache para não ligar para seus pontos de extremidade da API a cada solicitação. Por padrão, usamos o sistema de cache da Doutrina , que possui muitas opções de armazenamento.
Se você precisar mesclar a rede social se alimenta com os artigos do seu próprio site, poderá criar um fornecedor de feeds personalizado que envolva seus objetos de doutrina em itens stdClass . Você precisará implementar seu método getFeed usando um 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 ;
}Em seguida, você pode definir seus métodos de mensagens de data e hora e canônicos para analisar este objeto:
/**
* @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 ;
}