Pull to refresh

Простейший сервис Вопрос/Ответ, используя Formspring

Reading time3 min
Views5.6K
В данной статье я покажу, как можно использовать сервис анонимных вопросов 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 (как и другое управление вопросами/ответами). Я не описывал всего подробно, не рассматривал обработку ошибок, сконцентрировавшись лишь на донесении основной идеи.

Пример работы скрипта также прилагается.

UPDATE:
По многочисленным просьбам залил исходники и примеры использования на github. Оформил всё в виде отдельного класса. Вероятно, в коде много Индии, поэтому об ошибках, неточностях и пожаланиях сообщайте!

UPDATE 2:
Также люди просили исходники самой страницы. Получите.
Tags:
Hubs:
+6
Comments6

Articles

Change theme settings