В данной статье я покажу, как можно использовать сервис анонимных вопросов Formspring для организации раздела «Вопрос/Ответ» на стороннем ресурсе на PHP.
Formpring API в природе существует (REST-like), но сейчас находится на стадии «беты», и полноценно им пользоваться могут, насколько я понял, лишь избранные. На странице для разработчиков пишут: «The API is currently limited to a select group of users and partners right now». Нужна регистрация, которая не тут же выплёвывает необходимые для работы ключи. Я уже посылал свою заявку какое-то время назад, но ответа так и не получил. Однако, некоторыми методами API можно пользоваться, не проходя аутентификации (банальное получение информации).
Сейчас я покажу, как лично я обошёл возникшие проблемы. Как я уже отметил в заголовке, это простейший сервис, который сможет:
- Задавать анонимно вопросы;
- Выводить список ответов.
Для работы с сервисом нам, естественно, потребуется аккаунт на Formspring. Начнём с простого и очевидного: вывод ответов с аккаунта.
Вывод списка ответов
Тут путей несколько: парсить RSS-ленту аккаунта или использовать API. Угадайте, какой вариант мы выберем? Правильно, второй.
Для этого есть метод /answered/list, который выведет 20 последних записей на странице. Кроме того, есть дополнительные параметры для запроса:
- max_id — возвращает записи с id < max_id
- since_id — возвращает записи с id > since_id
- before — То же, что и max_id
При этом нельзя использовать одновременно max_id и since_id.
Для нашего сервиса ограничимся стандартной выдачей в 20 записей. Тут сложностей нет, поэтому воспользуемся функцией file_get_contents(). Запрос делаем по URL:
beta-api.formspring.me/answered/list/ВАШ_ЛОГИН
Такой запрос вернёт нам список ответов в формате JSON.
В итоге получим примерно такой код:
$data = json_decode(file_get_contents('http://beta-api.formspring.me/answered/list/ВАШ_ЛОГИН'));
foreach ($data->response as $item)
{
echo '
<strong>'.$item->question.'</strong>
('.date('d.m', strtotime($item->time)).' <a href="http://www.formspring.me/ВАШ_ЛОГИН/q/'.$item->id.'" target="_blank">#</a>)
<br />
'.$item->answer.'
<hr />
';
}
Примечание: ещё запись содержит поле asked_by, которое будет не пустым, если вопрос задали не анонимно.
Отправка анонимного вопроса
Тут и начинается главное шаманство. Первым делом получим token, который позволит успешно осуществить задуманное. Для этого лучше всего выйти из учётной записи (разлогиниться), т.е. стать анонимом и зайти на вашу страничку:
www.formspring.me/ВАШ_ЛОГИН
Смотрим исходный код страницы (обычно используются клавиши Ctrl+U). Ищем там или «token», или «id=”ask”», внутри которого ищем скрытое поле token.
Теперь нужно узнать User-Agent вашего браузера. По моим наблюдениям, token генерируется с использованием значения User-Agent, поэтому нужно узнать это значения для браузера, в котором искали token. Сделать это можно разными способами. Например, для Firefox или Google Chrome можно открыть консоль JavaScript и ввести:
navigator.userAgent
Например, для моего браузера это строка:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Теперь переходим непосредственно к кодированию. Создайте форму с полем для ввода текста вопроса. Обработчик отправки формы должен быть примерно следующим:
$ch = curl_init('http://www.formspring.me/profile/ask/ВАШ_ЛОГИН');
$data = array(
'token' => ПОЛУЧЕННЫЙ_ТОКЕН,
'question' => ТЕКСТ_ИЗ_ФОРМЫ,
'ajax' => 1
);
curl_setopt($ch, CURLOPT_URL, 'http://www.formspring.me/profile/ask/ВАШ_ЛОГИН');
curl_setopt($ch, CURLOPT_REFERER, 'http://www.formspring.me/ВАШ_ЛОГИН');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_USERAGENT, ПОЛУЧЕННЫЙ_USER-AGENT);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if (curl_exec($ch) !== FALSE)
{
echo 'Вопрос был успешно отправлен!';
}
else
{
echo curl_error($ch);
}
curl_close($ch);
Используем библиотеку cURL для имитации работы браузера и отправки формы на сервер Formspring.
Если всё было сделано правильно, ответить на вопрос можно будет со страницы профиля на Formspring (как и другое управление вопросами/ответами). Я не описывал всего подробно, не рассматривал обработку ошибок, сконцентрировавшись лишь на донесении основной идеи.
Пример работы скрипта также прилагается.
Автор: Jemeron