Skip to content

Instantly share code, notes, and snippets.

@PhilKershaw
Last active December 30, 2015 18:49
Show Gist options
  • Save PhilKershaw/7870533 to your computer and use it in GitHub Desktop.
Save PhilKershaw/7870533 to your computer and use it in GitHub Desktop.
A helper class which uses Zend Service to fetch Twitter status' - can be used in any project. See comments for Zend Framework dependencies.
<?php
/**
* Twitter status class
*
* Helper Class to fetch status' for a Twitter account via Zend Service.
*
* @package PKLib
* @subpackage Twitter
* @author Phil Kershaw
*/
require_once 'Zend/Service/Twitter.php';
require_once 'Zend/Service/Twitter/Exception.php';
require_once 'Zend/Oauth/Token/Access.php';
class PKLib_Twitter_Status
{
/**
* The auth token for connecting to the Twitter API
*
* @var string
*/
private $_twitter = NULL;
/**
* The results from Twitter
*
* @var array
*/
private $_result = NULL;
/**
* The oauth configuration details
*
* @var array
*/
private $_config = NULL;
/**
* The path to the file where tweets are cached
*
* @var string
*/
private $_cacheFilePath = NULL;
/**
* The type of feed to request
*
* @var string
*/
private $_timeline = NULL;
/**
* Available status types
*
* @var array
*/
private $_status_types = array( 'Home', 'Mentions', 'User', );
/**
* Constructor
* @param array $config
* @param string $timeline Home|Mentions|User|
* @return void
*/
public function __construct($config, $timeline)
{
$this->_config = $config;
$this->_timeline = $timeline;
// set up cache
$this->_setCacheFile();
}
/**
* Authenticate with Twitter to obtain an auth token using OAuth
*
* @return object PKLib_Twitter_Status
*/
public function authenticate()
{
$token = new Zend_Oauth_Token_Access();
$token->setToken($this->_config['accessToken'])
->setTokenSecret($this->_config['accessTokenSecret']);
$this->_twitter = new Zend_Service_Twitter(
array(
'userName' => $this->_config['userName'],
'accessToken' => $token,
'oauthOptions' => array(
'consumerKey' => $this->_config['key'],
'consumerSecret' => $this->_config['secret'],
)
)
);
return $this;
}
/**
* Fetch the timeline specified in $this->_timeline
*
* @param boolean $clickableLinks
* @param integer $limit
* @param boolean $cache
*
* @throws Zend_Service_Twitter_Exception
*
* @return array
*/
public function fetch($clickableLinks, $limit, $cache = TRUE)
{
try {
if ((filesize($this->_cacheFilePath) <= 0)
|| (time() - filemtime($this->_cacheFilePath) > 3600)) { // if cache file is empty or the cache is stale
// Make sure the type of tweets requested is valid
if (!in_array($this->_timeline, $this->_status_types)) {
throw new Zend_Service_Twitter_Exception("Invalid timeline type. Options include: Home, Mentions or User. Please check the functions.php");
}
// fetch tweets from twitter
$timeline = $this->_timeline;
$timeline .= 'Timeline';
$this->_result = $this->_twitter->statuses->$timeline()->toValue();
// Make URLs clickable
if ($clickableLinks) {
self::_applyUrlEntities($this->_result);
}
// cache our all tweets
if ($cache) {
$this->_cacheTweets();
}
} else {
// fetch our cached tweets
$this->_result = unserialize(
file_get_contents($this->_cacheFilePath)
);
}
// apply the limit to the result set
if (NULL !== $limit && $limit < 20) {
$this->_result = array_slice($this->_result, 0, $limit);
}
} catch (Exception $e) {
error_log($e->getMessage());
}
return $this->_result;
}
/**
* Sets the cache file up
*
* @return void
*/
private function _setCacheFile()
{
// Create cache directory
$path = __DIR__ . '/cache';
if (!is_dir($path)) {
$oldumask = umask(0);
mkdir($path, 0775);
umask($oldumask);
}
// create cache file
$filename = preg_replace('/[^a-zA-Z0-9_]/', '', $this->_config['userName']) . '_' . $this->_timeline;
$this->_cacheFilePath = $path . '/' . $filename;
if (!file_exists($this->_cacheFilePath)) {
touch($this->_cacheFilePath);
}
}
/**
* Serialises and saves the Tweets to a file
*
* @return void
*/
private function _cacheTweets()
{
if (!file_put_contents($this->_cacheFilePath, serialize($this->_result))) {
throw new Zend_Service_Twitter_Exception("Failed to save to Tweets to cache. File path: {$this->_cacheFilePath}");
}
}
/**
* Converts URLs into hyperlinks
* @param array $feed
* @return void
*/
private static function _applyUrlEntities(&$feed)
{
if ($feed !== NULL) {
foreach($feed as &$item) {
if ($item->entities->urls !== NULL) {
$urls = array_reverse($item->entities->urls);
$content = &$item->text;
foreach ($urls as $url) {
$content = substr_replace($content, '</a>', $url->indices[1], 0);
$content = substr_replace($content, '<a href="'.$url->url.'" target="_blank">', $url->indices[0], 0);
}
unset($content);
}
}
unset($item);
}
}
}
@PhilKershaw
Copy link
Author

The dependencies from Zend Framework 1.12 need for this class:

Crypt/
Crypt.php
Exception.php
Http/
Json/
Json.php
Loader.php
Oauth/
Oauth.php
Rest/
Service/
Service/Abstract.php
Service/Exception.php
Service/Twitter/
Serivce/Twitter.php
Uri/
Uri.php
Validate/
Validate.php

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment