Показ последних «твитов» пользователя на сайте (Twitter+PHP+MySQL)

31 Янв
2012

Приветствую.

В Web-dev я пока только юниор, так что пинайте, закидывайте камнями и т.д.

Все началось с того что на сайте который я обслуживаю потребовалось выводить последние записи администрации на немало известном ресурсе twitter.

Изначально я столкнулся с тем, что Виджет «Профиль» предлагаемый для вывода последних твитов пользователя мне просто не нравиться. А нравиться мне вариант вывода который twitter предлагает для вывода одного твита при помощи «Разместить твит», при просмотре полной версии любой записи (как это сделать описано тут).
Выглядит это вот так:

image

Как Вы, я думаю, уже заметили, такой способ вывода позволяет не переходя на сайт twitter совершать все доступные действия для этой записи.
Минусом является то, что такой способ предлагается для вывода одного твита статическим HTML кодом. Но это меня тоже не устроило — не хотелось при появлении новой записи кого-то из администрации лезть к ним на страницу, брать HTML код этой записи, и вставлять себе на сайт, как Вы сами понимаете хлопотно это.
Потому я пошел дальше и нашел в twitter developers как получить определенное количество последних записей пользователя в формате JSON. Не составило труда средствами PHP подставлять из полученного JSON в HTML код предлагаемый для вывода твита в понравившемся мне формате. Выглядит это так:

image

Но при этом я столкнулся с очередной проблемой: через некоторое время Twitter API возвращало в ответе JSON не «массив» записей пользователя, а вот такую ошибку:
{«error»:«Rate limit exceeded. Clients may not make more than 150 requests per hour.»,«request»:»\/1\/statuses\/user_timeline\/SergeyBulgacov.json»}
Как я понял, не будь очень силен в английском, он сообщает нам о том, что Twitter API не отдает одному клиенту больше 150 запросов за один час. Соответственно меня не устраивал тот факт что если у меня будет больше 150 посетителей в час, то все последующие будут видеть ошибку вместо записей администрации.
Решено было «победить» это тем, что была создана база данных, в которой будут хранится записи определенных пользователей (для них соответственно была создана еще одна таблица).
Описание таблиц в базе данных MySQL:

Таблица для записей (твитов):
CREATE TABLE `twits` (
`twit_id` VARCHAR(100) NOT NULL DEFAULT '0' COLLATE 'cp1251_bin',
`user_screen_name` VARCHAR(150) NULL DEFAULT NULL COLLATE 'cp1251_bin', `create_at` DATETIME NULL DEFAULT NULL,
`text` TEXT NULL COLLATE 'cp1251_bin',
PRIMARY KEY (`twit_id`) )
)


Таблицы для пользователей:

CREATE TABLE `twits_users` (
`screen_name` VARCHAR(150) NULL DEFAULT NULL COLLATE 'cp1251_bin',
`name` VARCHAR(150) NULL DEFAULT NULL COLLATE 'cp1251_bin',
`photo` TEXT NULL COLLATE 'cp1251_bin'
)


И был разработан маленький PHP класс, для работы с этим всем.
Собственно ним я и хочу с Вами поделится.

class twitter {

private $req;
private $name;
private $show_limit;
private static $bd;
//twitters

public function __construct($name, $bd, $limit = 20) {
$this->bd = $bd;
$this->name = $name;
$this->show_limit = $limit;
$rez = mysql_query("SELECT 0 FROM twits_users WHERE screen_name = '" . $name . "'", $this->bd);
if ( mysql_num_rows($rez) == 0 ) {
$this->get_json();
$this ->add_user($name);
return $this;
}
$this->get_json();
return $this;
}

public function get_json(){
$req = file_get_contents("http://api.twitter.com/1/statuses/user_timeline/" . $this->name . ".json");
if ( $req ){
$this->req = json_decode( $req );
} else {
$this->req = false;
}

return $this;
}

public function show_from_db() {
$query_get_twt = "SELECT * FROM twits JOIN twits_users ON twits.user_screen_name = twits_users.screen_name WHERE twits.user_screen_name = '" . $this->name . "' ORDER BY twits.create_at DESC limit " . $this->show_limit;
$result_get_twt = mysql_query($query_get_twt, $this->bd) or die('get_twt - '. mysql_error());

while ( $twt = mysql_fetch_array($result_get_twt) ) {
printf (' blockquote class="twitter-tweet">
%s — %s (@%s)
%s
</blockquote
',
$twt['text'], $twt['name'], $twt['screen_name'], $twt['twit_id'], $twt['create_at'], $twt['create_at'] );
}
echo('');
return $this;
}

public function twits_update() {
if ( $tweets = $this->req )
{
foreach ($tweets as $twt) {
$date = substr($twt->created_at, 26, 4) . '-' . strtr(substr($twt->created_at, 4, 3),array('Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04', 'May'=>'05', 'Jun'=>'06', 'Jul'=>'07', 'Aug'=>'08', 'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12')) . '-' . substr($twt->created_at, 8, 2) . ', ' . substr($twt->created_at, 12, 8);
//echo($date);
$quer_twt = "INSERT INTO twits (twit_id, user_screen_name, create_at, text) VALUES ('" . $twt->id_str . "', '" . iconv("UTF-8","WINDOWS-1251",$twt->user->screen_name) . "', '" . $date . "', '" . mysql_real_escape_string(addslashes(iconv("UTF-8","WINDOWS-1251", $twt->text))) . "') ON DUPLICATE KEY UPDATE twit_id='" . $twt->id_str . "', user_screen_name='" . iconv("UTF-8","WINDOWS-1251",$twt->user->screen_name) . "', create_at='" . $date . "', text='" . mysql_real_escape_string(addslashes(iconv("UTF-8","WINDOWS-1251",$twt->text))) . "'";
$result_twt = mysql_query($quer_twt, $this->bd) or die('rez_twt - '. mysql_error());
}
}
return $this;
}

public function user_update() {
if ( $tweets = $this->req )
{
// echo($tweets[0]->create_at . '
');
$query_usr = "UPDATE twits_users SET name='" . mysql_real_escape_string(iconv("UTF-8","WINDOWS-1251",$tweets[0]->user->name)) . "', photo='" . $tweets[0]->user->profile_image_url ."' WHERE screen_name = '" . iconv("UTF-8","WINDOWS-1251",$tweets[0]->user->screen_name) . "'";
$result_usr = mysql_query($query_usr, $this->bd) or die('rez_usr - '. mysql_error());
}
return $this;
}

public function dell_old_twt( $interval = 8 ){
$quer_count_twt= mysql_query("SELECT count(*) AS count FROM twits WHERE user_screen_name = '" . iconv("UTF-8","WINDOWS-1251",$twt->user->screen_name) . "'", $this->bd);
$res = mysql_fetch_array( $quer_count_twt );

if ( $res['count'] > 20 ) {
$quer_del_old_twt = "DELETE FROM twits WHERE (create_at < NOW() - INTERVAL '" . $interval . "' DAY) AND (user_screen_name = '" . $this->name . "')";
$res_dell = mysql_query($quer_del_old_twt, $this->bd);
}
}

public function add_user( $user ){
if ( $quer_user_add = mysql_query("INSERT INTO twits_users (screen_name) VALUE('" . $user . "')", $this->bd) ) {
$this->user_update();
}
return $this;
}
}


P.S.: база создана в кодировке «WINDOWS-1251», поэтому и класс преобразует данные именно в нее…

И теперь пример кода для работы с этим классом:

 $result = mysql_query("Select * From twits_users", $bd); // выбираем всех пользователей из базы
$i = 0;
while( $myrow = mysql_fetch_array($result) ) { // переносим выбранное из базы в массив
$twt_usr[$i]['screen_name'] = $myrow['screen_name'];
$twt_usr[$i]['name'] = $myrow['name'];
$twt_usr[$i]['photo'] = $myrow['photo'];
$i++;
}
foreach ($twt_usr as $twtUsr) { // для каждой записи массива создаем экземпляр класса
$twt = new twitter($twtUsr['screen_name'], $bd, 10); // выводим существующие записи
$twt->show_from_db()->user_update()->twits_update()->dell_old_twt(); // обновляем данные и удаляем старые твиты
}


скачать файлом можно тут

Вот и все. Как оказалось ничего сложного — все просто и понятно.
Делал под себя, так что берите, «пилите» и пользуйтесь.
Буду рад комментариям и критике.
Кому что не понятно — задавайте вопросы, с радостью отвечу.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх