Skip to content

Instantly share code, notes, and snippets.

@nviz
Last active June 22, 2021 21:49
Show Gist options
  • Save nviz/25cb215441839367638529c84e1b4c01 to your computer and use it in GitHub Desktop.
Save nviz/25cb215441839367638529c84e1b4c01 to your computer and use it in GitHub Desktop.
<?php
use Atymic\Twitter\Facade\Twitter;
use Atymic\Twitter\Twitter as TwitterContract;
class GetUserTweets
{
public int $user = '';
public function getLatest()
{
$response = (array) json_decode(
Twitter::userTweets($this->user, array_merge(
$this->params(),
[TwitterContract::KEY_RESPONSE_FORMAT => TwitterContract::RESPONSE_FORMAT_JSON]
)), true
);
$tweets = array();
// remap messy twitter response
foreach($response['data'] as $key => $tweet)
{
$tweets[] = array_merge_recursive(
$this->addTweet($tweet, $response),
['referenced_tweets' => $this->addChildTweets($tweet, $response)]
);
}
return $tweets;
}
/**
* @param $tweet
* @param $allTweets
* @return bool|array
*/
private function addChildTweets($tweet, $allTweets): bool|array
{
$returnTweets = array();
if(isset($tweet['referenced_tweets']))
{
foreach($tweet['referenced_tweets'] as $refTweets) {
$key = array_search($refTweets['id'], array_column($allTweets['includes']['tweets'], 'id'));
$returnTweets[] = $this->addTweet($allTweets['includes']['tweets'][$key], $allTweets);
}
return $returnTweets;
}
return false;
}
/**
* @param $tweet
* @param $allTweets
* @return array
*/
private function addTweet($tweet, $allTweets): array {
return [
'text' => $tweet['text'],
'author' => $this->addAuthor($tweet, $allTweets),
'metrics' => [
'retweet_count' => $tweet['public_metrics']['retweet_count'],
'reply_count' => $tweet['public_metrics']['reply_count'],
'like_count' => $tweet['public_metrics']['like_count'],
'quote_count' => $tweet['public_metrics']['quote_count']
],
'attachments' => $this->addAttachment($tweet, $allTweets),
'created_at' => $tweet['created_at']
];
}
/**
* @param $tweet
* @param $allTweets
* @return array
*/
private function addAuthor($tweet, $allTweets): array {
$key = array_search($tweet['author_id'], array_column($allTweets['includes']['users'], 'id'));
return [
'name' => $allTweets['includes']['users'][$key]['name'],
'username' => $allTweets['includes']['users'][$key]['username'],
'verified' => $allTweets['includes']['users'][$key]['verified'],
'protected' => $allTweets['includes']['users'][$key]['protected'],
'url' => $allTweets['includes']['users'][$key]['url'],
'profile_image' => $allTweets['includes']['users'][$key]['profile_image_url'],
'twitter_id' => $allTweets['includes']['users'][$key]['id']
];
}
/**
* @param $tweet
* @param $allTweets
* @return bool|array
*/
private function addAttachment($tweet, $allTweets): bool|array
{
if(isset($tweet['attachments'])) {
$keys = array_search($tweet['attachments']['media_keys'], array_column($allTweets['includes']['media'], 'media_key'));
$attachments = [];
foreach( (array) $keys as $key )
{
$attachments[] = [
'url' => $allTweets['includes']['media'][$key]['url'],
'type' => $allTweets['includes']['media'][$key]['type'],
'height' => $allTweets['includes']['media'][$key]['height'],
'width' => $allTweets['includes']['media'][$key]['width']
];
}
return $attachments;
}
return false;
}
/**
* Twitter query params
* @return string[]
*/
private function params() {
return [
'expansions' => 'author_id,attachments.media_keys,referenced_tweets.id,referenced_tweets.id.author_id',
'tweet.fields' => 'attachments,author_id,public_metrics,created_at,id,in_reply_to_user_id,referenced_tweets,text',
'user.fields' => 'id,name,profile_image_url,protected,url,username,verified',
'media.fields' => 'duration_ms,height,media_key,preview_image_url,type,url,width,public_metrics'
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment