Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/helpers/twitter.helper.php
<?php
/**
* @version        $Id: twitter.helper.php 1839 2016-06-12 18:36:39Z sannosi $
* @package        Elxis
* @subpackage    Helpers / Twitter
* @copyright    Copyright (c) 2006-2016 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
elxisTwitterHelper {

    private
$options = array('key' => '', 'secret' => '', 'cachetime' => 0);
    private
$token = null;
    private
$uagent = '';
    private
$errormsg = '';


   
/***************/
    /* CONSTRUCTOR */
    /***************/
   
public function __construct($key='', $secret='') {
       
$this->options['key'] = trim($key);
       
$this->options['secret'] = trim($secret);
         
$this->uagent = (isset($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0';
        if (
$this->uagent == '') { $this->uagent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0'; }
    }


   
/***********************/
    /* SET API 1.1 OPTIONS */
    /***********************/
   
public function setOption($name, $value) {
       
$this->options[$name] = $value;
    }


   
/**************************/
    /* GENERIC TWITTER SEARCH */
    /**************************/
   
public function search($query, $params=array()) {
       
$eCache = eFactory::getCache();

        if (
trim($query) == '') {
           
$this->errormsg = 'Query parameter is required to search Twitter!';
            return
false;
        }

       
$this->errormsg = '';
       
$response = '';
       
$cachetime = (int)$this->options['cachetime'];
       
$cache_state = 0;
       
$path = 'search/tweets.json?q='.urlencode(trim($query));
        if (
$params) {
            foreach (
$params as $key => $val) { $path .= '&'.$key.'='.$val; }
        }
        if (
$cachetime > 0) {
           
$cacheid = md5($path);
           
$cache_state = $eCache->begin('search', $cacheid, 'twitter', $cachetime, false, true, 'txt');
            if (
$cache_state == 1) {
               
$response = $eCache->fetchContents();
            }
        }

        if (
$response == '') {
            if (!
$this->token) {
               
$token = $this->getTwitterToken();
                if (!
$token) { return false; }
               
$this->token = $token;
            }

           
$response = $this->request($path);
        }

        if (
$cache_state == 2) {
           
$eCache->store($response);
        }

        return
$response;
    }


   
/**************************/
    /* GENERIC TITTER REQUEST */
    /**************************/
   
public function get($path, $params=array()) {
       
$eCache = eFactory::getCache();

       
$this->errormsg = '';
       
$response = '';
       
$cachetime = (int)$this->options['cachetime'];
       
$cache_state = 0;
       
$path = trim($path);
       
$path = ltrim($path, '/');
        if (
$params) {
           
$path .= '?'.http_build_query($params);
        }
        if (
$cachetime > 0) {
           
$cacheid = md5($path);
           
$cache_state = $eCache->begin('search', $cacheid, 'twitter', $cachetime, false, true, 'txt');
            if (
$cache_state == 1) {
               
$response = $eCache->fetchContents();
            }
        }

        if (
$response == '') {
            if (!
$this->token) {
               
$token = $this->getTwitterToken();
                if (!
$token) { return false; }
               
$this->token = $token;
            }

           
$response = $this->request($path);
        }

        if (
$cache_state == 2) {
           
$eCache->store($response);
        }

        return
$response;
    }


   
/********************************/
    /* GET USER TWEETS FROM TWITTER */
    /********************************/
   
public function getTweets($username, $limit=10, $include_retweets=false, $convert_links=true, $convert_hashtags=true) {
       
$eCache = eFactory::getCache();

       
$username  = trim($username);
       
$limit = (int)$limit;
        if (
$limit < 1) { $limit = 15; }
        if (
$username == '') {
           
$this->errormsg = 'Twitter username can not be empty!';
            return
false;
        }

       
$this->errormsg = '';
       
$json_str = '';
       
$cachetime = (int)$this->options['cachetime'];
       
$cache_state = 0;
        if (
$cachetime > 0) {
           
$cacheid = md5($username);
           
$cache_state = $eCache->begin('tweets', $cacheid, 'twitter', $cachetime, false, true, 'txt');
            if (
$cache_state == 1) {
               
$json_str = $eCache->fetchContents();
            }
        }

        if (
$json_str == '') {
            if (!
$this->token) {
               
$token = $this->getTwitterToken();
                if (!
$token) { return false; }
               
$this->token = $token;
            }

           
$rts = ($include_retweets) ? 'true' : 'false';
           
$path = 'statuses/user_timeline.json?screen_name='.$username.'&count='.$limit.'&include_rts='.$rts.'&exclude_replies=true';
           
$json_str = $this->request($path);
        }

        if (!
$json_str) { return false; }

       
$timeline = json_decode($json_str);
        if (!
$timeline) {
           
$this->errormsg = 'Twitter response was not a JSON string!';
            return
false;
        }
        if (!
is_array($timeline) || (count($timeline) == 0)) {
           
$this->errormsg = 'No tweets found!';
            return
false;
        }
        if (
$cache_state == 2) {
           
$eCache->store($json_str);
        }
        unset(
$json_str);

       
$rows = array();
        foreach (
$timeline as $tweet) {
           
$ts = strtotime($tweet->created_at);
           
$created = gmdate('Y-m-d H:i:s', $ts);
           
$row = new stdClass();
           
$row->id = $tweet->id_str;
           
$row->created = $created;
           
$row->created_ts = $ts;
            if (
$convert_links) {
               
$row->text = preg_replace("~[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]~", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $tweet->text);
            } else {
               
$row->text = $tweet->text;
            }

            if (
$convert_hashtags) {
               
$row->text = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a target=\"_blank\" href=\"https://twitter.com/search?q=$1\">#$1</a>", $row->text);
            }

           
$row->source = $tweet->source;
           
$row->retweet_count = (isset($tweet->retweet_count)) ? (int)$tweet->retweet_count : 0;
           
$row->favourites_count = (isset($tweet->favourites_count)) ? (int)$tweet->favourites_count : 0;
           
$row->in_reply_to_status_id_str = $tweet->in_reply_to_status_id_str;
           
$row->in_reply_to_user_id_str = $tweet->in_reply_to_user_id_str;
           
$row->in_reply_to_screen_name = $tweet->in_reply_to_screen_name;
           
$row->link = 'https://twitter.com/'.$tweet->user->screen_name.'/status/'.$tweet->id_str;
           
$rows[] = $row;
        }

        return
$rows;
    }


   
/******************************/
    /* GET USER INFO FROM TWITTER */
    /******************************/
   
public function getInfo($username) { //old method
       
return $this->getUser($username);
    }


   
/*********************************/
    /* GET USER PROFILE FROM TWITTER */
    /*********************************/
   
public function getProfile($username) {
       
$eCache = eFactory::getCache();

       
$username  = trim($username);
        if (
$username == '') {
           
$this->errormsg = 'Twitter username can not be empty!';
            return
false;
        }

       
$this->errormsg = '';
       
$json_str = '';
       
$cachetime = (int)$this->options['cachetime'];
       
$cache_state = 0;
        if (
$cachetime > 0) {
           
$cacheid = md5($username);
           
$cache_state = $eCache->begin('profile', $cacheid, 'twitter', $cachetime, false, true, 'txt');
            if (
$cache_state == 1) {
               
$json_str = $eCache->fetchContents();
            }
        }

        if (
$json_str == '') {
            if (!
$this->token) {
               
$token = $this->getTwitterToken();
                if (!
$token) { return false; }
               
$this->token = $token;
            }

           
$path = 'users/lookup.json?screen_name='.$username.'&include_entities=false';
           
$json_str = $this->request($path);
        }

        if (!
$json_str) { return false; }

       
$infos = json_decode($json_str);
        if (!
$infos) {
           
$this->errormsg = 'Twitter response was not a JSON string!';
            return
false;
        }
        if (!
is_array($infos) || (count($infos) == 0)) {
           
$this->errormsg = 'User not found!';
            return
false;
        }

        if (
$cache_state == 2) {
           
$eCache->store($json_str);
        }
        unset(
$json_str);
       
$info = $infos[0];
        unset(
$infos);

       
$row = new stdClass();
       
$row->id = $info->id_str;
       
$row->name = $info->name;
       
$row->screen_name = $info->screen_name;
       
$row->location = $info->location;
       
$row->description = $info->description;
       
$row->url = $info->url;
       
$row->url_title = '';
        if (isset(
$info->entities->url->urls)) {
            if (
$info->entities->url->urls) {
                foreach (
$info->entities->url->urls as $url) {
                    if (
trim($url->expanded_url) != '') { $row->url = $url->expanded_url; }
                   
$row->url_title = $url->display_url;
                    break;
                }
            }
        }
       
$row->followers_count = (int)$info->followers_count;
       
$row->friends_count = (int)$info->friends_count;
       
$row->listed_count = (int)$info->listed_count;
       
$row->statuses_count = (int)$info->statuses_count;
       
$row->created_at = $info->created_at;
       
$row->favourites_count = (isset($info->favourites_count)) ? (int)$info->favourites_count : 0;
       
$row->utc_offset = (int)$info->utc_offset;
       
$row->time_zone = $info->time_zone;
       
$row->profile_image_url = $info->profile_image_url_https;
       
$row->profile_banner_url = $info->profile_banner_url;

        return
$row;
    }


   
/********************************/
    /* GET THE LAST GENERATED ERROR */
    /********************************/
   
public function getError() {
        return
$this->errormsg;
    }


   
/*********************************/
    /* GET BEARER TOKEN FROM TWITTER */
    /*********************************/
   
private function getTwitterToken() {
        if (!
function_exists('curl_init')) {
           
$this->errormsg = 'There is no support for CURL in your PHP installation!';
            return
false;
        }
        if (
trim($this->options['key']) == '') {
           
$this->errormsg = 'Twitter Consumer Key can not be empty!';
            return
false;
        }
        if (
trim($this->options['secret']) == '') {
           
$this->errormsg = 'Twitter Consumer Secret can not be empty!';
            return
false;
        }

       
$enc_key = urlencode($this->options['key']);
       
$enc_secret = urlencode($this->options['secret']);
       
$base64_enc = base64_encode($enc_key.':'.$enc_secret);

       
$headers = array(
           
'POST /oauth2/token HTTP/1.1',
           
'Host: api.twitter.com',
           
'User-Agent: '.$this->uagent,
           
'Authorization: Basic '.$base64_enc,
           
'Content-Type: application/x-www-form-urlencoded;charset=UTF-8',
           
'Content-Length: 29'
       
);

       
$ch = curl_init();
       
curl_setopt($ch, CURLOPT_URL, 'https://api.twitter.com/oauth2/token');
       
curl_setopt($ch, CURLOPT_POST, true);
       
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       
curl_setopt($ch, CURLOPT_FAILONERROR, true);
       
curl_setopt($ch, CURLOPT_REFERER, eFactory::getElxis()->getConfig('URL'));
       
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
       
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
       
curl_setopt($ch, CURLOPT_USERAGENT, $this->uagent);
       
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8);
       
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
       
curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=client_credentials');
       
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
       
curl_setopt($ch, CURLOPT_HEADER, false);
       
//$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); //set CURLOPT_HEADER to true if you want to use this
       
$result = curl_exec($ch);
        if (
curl_errno($ch) == 0) {
           
curl_close($ch);
        } else {
           
$this->errormsg = curl_error($ch);
           
curl_close($ch);
            return
false;
        }

        if (
trim($result) == '') { $this->errormsg = 'Bearer token failed! Empty response from Twitter.'; return false; }

       
$output = explode("\n", $result);
       
$bearer_token = '';
        foreach (
$output as $line) {
            if (
trim($line) != '') { $bearer_token = $line; break; }
        }
        if (
$bearer_token == '') { $this->errormsg = 'Getting Bearer token for Twitter failed!'; return false; }

       
$jObj = json_decode($bearer_token);

        return
$jObj->{'access_token'};
    }


   
/***************************/
    /* INVALIDATE BEARER TOKEN */
    /***************************/
   
public function destroyToken() {
        if (!
$this->token) { return true; }
       
$enc_key = urlencode($this->options['key']);
       
$enc_secret = urlencode($this->options['secret']);
       
$base64_enc = base64_encode($enc_key.':'.$enc_secret);

       
$headers = array(
           
'POST /oauth2/invalidate_token HTTP/1.1',
           
'Host: api.twitter.com',
           
'User-Agent: '.$this->uagent,
           
'Authorization: Basic '.$base64_enc,
           
'Accept: */*',
           
'Content-Type: application/x-www-form-urlencoded',
           
'Content-Length: '.(strlen($this->token)+13)
        );

       
$ch = curl_init();
       
curl_setopt($ch, CURLOPT_URL, 'https://api.twitter.com/oauth2/invalidate_token');
       
curl_setopt($ch, CURLOPT_POST, true);
       
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       
curl_setopt($ch, CURLOPT_FAILONERROR, true);
       
curl_setopt($ch, CURLOPT_REFERER, eFactory::getElxis()->getConfig('URL'));
       
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
       
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
       
curl_setopt($ch, CURLOPT_USERAGENT, $this->uagent);
       
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8);
       
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
       
curl_setopt($ch, CURLOPT_POSTFIELDS, 'access_token='.$this->token);
       
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
       
curl_setopt($ch, CURLOPT_HEADER, false);
       
$result = curl_exec($ch);
        if (
curl_errno($ch) == 0) {
           
curl_close($ch);
           
$this->token = null;
            return
true;
        } else {
           
$this->errormsg = curl_error($ch);
           
curl_close($ch);
            return
false;
        }
    }


   
/*************************/
    /* EXECUTE A GET REQUEST */
    /*************************/
   
private function request($path) {
       
$headers = array(
           
'GET /1.1/'.$path.' HTTP/1.1',
           
'Host: api.twitter.com',
           
'User-Agent: jonhurlock Twitter Application-only OAuth App v.1',
           
'Authorization: Bearer '.$this->token
       
);

       
$ch = curl_init();
       
curl_setopt($ch, CURLOPT_URL, 'https://api.twitter.com/1.1/'.$path);
       
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
       
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       
curl_setopt($ch, CURLOPT_FAILONERROR, true);
       
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
       
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
       
curl_setopt($ch, CURLOPT_USERAGENT, $this->uagent);
       
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8);
       
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
       
curl_setopt($ch, CURLOPT_HEADER, false);
       
curl_setopt($ch, CURLOPT_REFERER, eFactory::getElxis()->getConfig('URL'));
       
$result = curl_exec($ch);
        if (
curl_errno($ch) == 0) {
           
curl_close($ch);
            return
$result;
        } else {
           
$this->errormsg = curl_error($ch);
           
curl_close($ch);
            return
false;
        }
    }

}

?>