- → Программирование
- → PHP
- → Статьи
Twitter + PHP + Codeigniter: пишем twitter статус на PHP
Всем привет! В этой статье мы будем обновлять наш twitter статус с помощью PHP (Фреймворк Codeigniter) и сервиса “Twitter API”. Рекомендую вам следовать шаг за шагом, чтобы не запутаться и во всем разобраться. Нужно сказать, что при написании статьи использовалась программа: CodeIgniter PHP Framework 1.7.1. Что ж поехали!
Настройка CodeIgniter
Для начала, нам необходимо установить некоторые настройки умолчания в разделе настроек codeigniter. Откройте файл system/application/config/autoload.php и измените следующую строку:
$autoload['libraries'] = array('');
на:
$autoload['libraries'] = array('database');
С помощью этого параметра мы будем осуществлять автозагрузку базы данных. Далее откройте файл database.php и измените параметры соединения с базой данных на ваши: имя базы данных, пользователь, пароль. В качестве названия мы будем использовать twitter_api. Теперь откройте файл config.php и измените параметр base_url на путь к вашей папке с codeigniter. Моя папка называется twitter_api. Это моя системная папка. Мой параметр выглядит таким образом:
$config['base_url'] = "http://localhost/ci/twitter_api";
Заполнение базы данных
Так как мы будем работать с базой данных, нам необходимо иметь некоторые данные в базе, чтобы иметь возможность их использовать. Откройте phpmyadmin или вашу систему управления базами данных и создайте новую базу с именем ci_twitter_api. Отлично, теперь мы создадим новую таблицу, используя следующий mysql запрос. Перед выполнением запроса, отредактируйте в нем ваш ПАРОЛЬ и ИМЯ ПОЛЬЗОВАТЕЛЯ для доступа к аккаунту twitter.
CREATE TABLE IF NOT EXISTS `accounts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(120) NOT NULL, `password` varchar(32) NOT NULL, `active` int(11) NOT NULL, `last_message` varchar(140) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ; INSERT INTO `accounts` (`id`, `username`, `password`, `active`, `last_message`) VALUES (1, '<b>YOUR USERNAME</b>', '<b>YOUR PASSWORD</b>', 1, 'No message sent.');
Нажмите кнопку подтверждения и ваш запрос будет выполнен. Теперь ваша структура параметров доступа к twitter аккаунту будет выглядеть таким образом:
Создание модели
Для этого перейдите в папку system/application/models и создайте новый файл с именем twitter_model.php.
Для начала, мы объявим две глобальные переменные в самом верху.
var $accounts_table = 'accounts'; var $update_url = 'http://twitter.com/statuses/update.xml';
$accounts_table – содержит имя таблицы, которую мы только что создали. $update_url – это адрес, который мы будем использовать для изменения нашего статуса. Если twitter поменяет этот адрес, вам необходимо будет также поменять его в этой переменной, так как этот адрес будет основой нашего приложения.
Далее, мы создадим наш первый метод, который просто возвратит активный аккаунт пользователя, который хранится в бд. Для определения активности мы будем использовать строку active и значение 1. Мы добавили этот параметр, потому что некоторые люди имеют несколько twitter аккаунтов. Ниже код метода:
class Twitter_model extends Model { // get the active twitter account from the database, by row active = 1 function getActiveAccount() { return $this->db->get_where($this->accounts_table, array('active' => '1'))->row(); }
В этом методе, для удобства, мы используем класс active_records для получения активного аккаунта и возвращения избранной строки.
Далее, мы создадим наш главный метод, который будем изменять twitter статус. Он будет использовать наш пароль, имя пользователя, и конечно же сообщение которое мы будем отправлять для обновления статуса. Кроме этого, он будет определять HTTP_CODE, который будет возвращен от twitter и будет сообщать нам о результате выполнения обновления статуса.
// update twitter status and last message on success function update_status($username, $password, $message) { $ch = curl_init($this->update_url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.urlencode($message)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password); curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // if we were successfull we need to update our last_message if ($httpcode == '200') { $this->db->where('active', '1'); $this->db->update($this->accounts_table, array('last_message' => $message)); return TRUE; } else { return FALSE; } }
На первый взгляд, код может показаться сложным, но это не так, он прост для понимания. Наиболее важная часть метода, та где мы используем cURL для связи с Twitter. Это отличная библиотека, для того, чтобы отправлять и получать данные из twitter.
Теперь рассмотрим подробнее, curl_init инициализирует сессию и принимает URL, как параметр – в нашем случае это url для обновления twitter статуса, который предоставляется сервисом Twitter API.
С помощью curl_setopt, мы устанавливаем некоторые необходимые опции для передачи данных.
CURLOPT_POST – мы устанавливаем значение «1», для того чтобы HTTP запрос, был аналогичен запросу посылаемому из HTML формы.
CURLOPT_POSTFIELDS – этот параметр содержит данные, которые нам необходимо отправить. В нашем случае это ‘status=’ и наше сообщение. Также мы должны использовать функцию urlencode, для того, чтобы иметь возможность использовать спецсимволы в нашем сообщении, такие как ‘%&/” .
CURLOPT_RETURNTRANSFER – этот параметр должен быть равен «1», это важно, потому что, мы будем получать ответ в виде строки, которая будет содержать информацию об успешности обновления twitter статуса.
CURLOPT_USERPWD – этот параметр предназначен для аутентификации. Он просто содержит наш twitter пароль и имя пользователя в формате: username:password.
После установки CURLOPT параметров, мы выполняем отправку с помощью функции curl_exec() и получаем обратный ответ с помощью curl_getinfo(CURLINFO_HTTP_CODE). Как вы уже поняли, HTTP_CODE сообщает нам об успешности выполнения запроса. Если код равен «200», это значит, что все работает и статус обновлен. В нашем методе, при получении ответа 200, мы обновляем запись в базе данных и возвращаем TRUE, в противном случае возвращаем FALSE.
В завершения нашей модели, мы создадим еще один, последний, метод. Он будет получать наше последнее сообщение из базы данных, это необходимо для вывода его в виде (view).
// get the last_message, by row active = 1 function getLastMessage() { $this->db->select('last_message'); $last_message = $this->db->get_where($this->accounts_table, array('active' => '1'))->row()->last_message; return htmlspecialchars($last_message); }
Этот метод достаточно простой. Он выбирает из БД строку last_message, активного аккаунта. И возвращает ее в конвертированном виде с помощью htmlspecialchars, для замены некоторых символов HTML сущностями. Вот мы и закончили писать модель для обновления twitter статуса с помощью PHP. Теперь приступим к следующему шагу.
Создание контроллера
Сейчас перейдите в папку system/application/controllers и создайте новый файл с именем twitter.php.
Давайте добавим в него несколько строк:
class Twitter extends Controller { function Twitter() { parent::Controller(); $this->load->model('twitter_model'); }
Это простой конструктор, который будет загружать нашу модель (twitter_model). Теперь, перейдем к созданию index() метода:
function index() { $data['heading'] = 'Hi, send a tweet!'; $data['last_message'] = $this->twitter_model->getLastMessage(); $data['active_user'] = $this->twitter_model->getActiveAccount()->username; $this->load->view('header', $data); $this->load->view('index'); $this->load->view('footer'); }
В этом методе, мы передаем простой текст, имя пользователя активного twitter аккаунта и последнее его сообщение в массиве $data.
Благодаря нашей модели, нам очень просто получать информацию об активном пользователе и его статусе. В этом и есть преимущества MVC. В конце мы загружаем вид (view), точнее несколько видов.
Теперь, закончим создание контроллера, создадим метод update:
// updating our status on twitter ( new message ) function update() { if ($this->input->post('submit')) { $this->load->library('form_validation'); $this->form_validation->set_error_delimiters('<div class="error">', '</div>'); $this->form_validation->set_rules('message', 'Message', 'trim|required|min_length[5]|max_length[140]'); if ($this->form_validation->run() == FALSE) { $this->index(); } else { $message = $this->input->post('message'); // get useraccount data $account = $this->twitter_model->getActiveAccount(); $username = $account->username; $password = $account->password; // send a tweet if ($this->twitter_model->update_status($username, $password, $message)) { redirect('twitter'); } else { $data['error'] = 'There was an error while updating your status'; $this->load->view('header', $data); $this->load->view('error'); $this->load->view('footer'); } } }
Если понимаете весь код данного метода, отлично можете следовать к следующему шагу. Если нет, давайте разберем код поэтапно, он будет повторяться, но так будет понятнее о чем идет речь.
if ($this->input->post('submit')) { $this->load->library('form_validation'); $this->form_validation->set_error_delimiters(' <div class="error">', '</div> '); $this->form_validation->set_rules('message', 'Message', 'trim|required|min_length[5]|max_length[140]'); if ($this->form_validation->run() == FALSE) { $this->index(); }
С помощью $this->input->post(‘submit’), определяем факт подачи запроса из формы. Далее загружаем библиотеку валидации форм (form_validation). Устанавливаем ограничения на сообщение от 5 до 140 символов, удаляем пробелы с помощью функции trim, также устанавливаем поля required, чтобы исключить возможность получения пустого сообщения. Функция set_rules, имеет два параметра: первый – это имя нашего поля сообщения указанного в главном виде, второй – это имя пользователя, которое вставляется в сообщение ошибки (будет понятнее, когда мы создадим вид).
После установки параметров валидации, запускаем валидацию $this->form_validation->run(), которая возвращает истину или ложь. В случае FALSE запускаем наш index() метод. Он будет отображать сообщение об ошибке, когда мы создадим виды.
Рассмотрим следующий фрагмент кода:
else { $message = $this->input->post('message'); // get useraccount data $account = $this->twitter_model->getActiveAccount(); $username = $account->username; $password = $account->password; // send a tweet if ($this->twitter_model->update_status($username, $password, $message)) { redirect('twitter'); } else { $data['error'] = 'There was an error while updating your status'; $this->load->view('header', $data); $this->load->view('error'); $this->load->view('footer'); } }
Благодаря нашей модели, мы с легкостью получаем имя пользователя и пароль twitter аккаунта, активного пользователя. Используя $this->twitter_model->update_status(), мы собственно отправляем новый статус, как помните, в этот метод необходимо передать имя пользователя, пароль и сообщение. Если статус обновлен успешно, мы перенаправляем методом redirect(), используя url helper. Если, что то не так, мы выводим ошибку и загружаем виды, которые мы создадим в следующем шаге.
Создаем виды
Для полноценной работы нашего PHP приложения, нам необходимо создать виды, для этого перейдите в папку system/application/views и создайте следующие файлы:
- header.php
- footer.php
- index.php
- error.php
header.php – содержит основную информацию и метатеги, подключает css стиль, и открывает главные див блоки:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link media="screen" rel="Stylesheet" type="text/css" href="<?php echo base_url(); ?>css/style.css" /> <title>Using the Twitter API with CodeIgniter</title> </head> <body> <div id="wrapper"> <div id="main">
Мы используем функцию base_url(), для указания пути к нашему css файлу, который мы создадим в следующем шаге.
footer.php – просто содержит все закрывающие теги:
</div><!--end main--> </div><!--end wrapper--> </body> </html>
index.php – это страница, на которой будут происходить главные действия приложения:
<h3> <?php echo $heading; ?> <span> ( account: <?php echo anchor('http://twitter.com/' . $active_user, $active_user); ?> ) </span> </h3> <?php echo form_error('message'); ?> <?php echo form_open('twitter/update', array('id' => 'update_form')); ?> <?php echo form_input(array('name' => 'message', 'maxlength' => '140')); ?> <?php echo form_submit('submit', 'update'); ?> <?php echo form_close(); ?> <div id="last_message"> <fieldset> <legend>Last <span>sent by <b><?php echo $active_user ?></b></span></legend> <p><?php echo $last_message; ?></p> </fieldset> </div><!--end last_message-->
Все переменные используемые в этом виде, передаются через index() метод нашего контроллера. В дополнение, мы используем form helper для создания html форм. Помните, ранее упоминалось, что сообщение об ошибке, будет выводится в этом виде. form_error(‘message’) – будет осуществлять это. Ниже форм, мы будем выводить последнее сообщение, которое отправил активный пользователь.
error.php – будет использоваться, как отдельный файл ошибки, для вывода сообщения в случае невозможности обновления статуса в twitter.
<h3><?php echo $error; ?></h3> <?php echo anchor('twitter', 'Go back and try again'); ?>
Создание CSS файла
Для того, чтобы сделать наше приложение более красивым, мы добавим css код стиля. Зайдите в папку system/ и создайте папку css. В этой папке создайте файл style.css и вставьте в него следующий код:
/* Reset CSS */ html, body, div, span, object, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, address, code, img, small, strong, dl, dt, dd, ol, ul, li, fieldset, form, label { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baselinebaseline; background: transparent; } body { line-height: 1.5; font-family:Arial, sans-serif; margin:0; } ol, ul, li { list-style: none; list-style-type:none; } .clear { clear:both; } /* DEFAULTS */ h3 { color:#35CCFF; font-size:20px; } /* CUSTOM */ #wrapper { width:900px; margin:0 auto; } /* main */ #main { margin-top:50px; } #main h3 span { font-size:14px; color:#cccccc; } #main h3 a { color:#cccccc; } /* form */ #update_form input { width:888px; padding:5px; border:1px solid #d3d3d3; display:block; } #update_form input[type="submit"] { width:auto; margin-top:10px; background-color:#000000;; border:none; color:white; font-size:12px; font-weight:bold; cursor:pointer; padding:3px; } div.error { display:block; background-color:#FB8A8A; border:1px solid #FF3B3B; padding:5px; color:#ffffff; width:50%; margin-bottom:30px; font-weight:bold; margin:0 auto 10px auto; text-align:center; } /* last message */ #last_message fieldset { border:1px dashed #d3d3d3; padding:5px; margin-top:30px; } #last_message fieldset p { padding:5px; font-size:18px; font-weight:normal; } #last_message legend span { font-size:12px; }
Код кроссбраузерный и в этом его преимущество. Теперь ваше приложение, должно выглядеть следующим образом:
КАРТИНКА
Проверка на работоспособность
Мы только что, создали отличное приложения для обновления twitter статуса с помощью PHP, CodeIgniter и Twitter API. Теперь остается только тестировать и радоваться проделанной работе, что мы сейчас и сделаем:
Главный вид нашего приложения, давайте напишем что-нибудь!
Вводим наш статус:
После обновления выглядит следующим образом:
Давайте проверим, действительно ли работает это? Зайдем в наш Twitter.
В заключение
Очень надеюсь, что вы поняли, как создать приложение и выучили что-то новое. Если, все еще остались некоторые недопонимания по поводу twitter и php, или вы осуществляете это другим способом, дайте знать (в комментариях ниже). Спасибо за внимание!
Development — Slavik Nemchenko, Taras Moroz