вторник, 16 августа 2011 г.

Delphi Работа с твиттером

Привет уважаемый читатель моего блога! Я сегодня расскажу как можно авторизовать в твиттере и научимся отправить сообщения в твиттер и читать пользователя. Мы не будем использовать  твиттер API а будем работать со страницей m.twitter.com то есть с мобильной версий сайта.
Авторизация
Нам понадобится сниффер HTTPFox, я проводил маленький обзор в этой статье там же и лежит ссылка на сниффер. И как раз мы проверим его на практики какой уж он удобный ;-). Заходим в наш браузер, заходим на страничку https://mobile.twitter.com/session/new тут же мы видим формы для заполнения.
Вот тут же и включаем сниффер, заполняем формы "Имя пользователя и Пароль" и жмем "Войти" и возвращаемся в сниффер на вкладку "POST Data" смотрим какие параметры нужно заполнить.
Это параметры username - имя пользователя, password - пароль, а параметр authenticity_token его нужно с парсить со странице он постоянно изменяется, не веришь? Это можно проверить, давайте попробуем опять зайти на страницу и войти.
 Вот смотрите сами значения поменялись. Так теперь ищем в коде странице значение "authenticity_token" будет разумно воспользоваться поиском.

Как вы видите значение "authenticity_token" в коде странице найдено, вот вся строчка кода.
<form action="https://mobile.twitter.com/session" method="post">
<div style="display: inline; margin: 0; padding: 0;">
<input name="authenticity_token" type="hidden" value="ef37b9fb28969820ad5a" /></div>
</form>
Теперь нужно вытащить все что хранится в value="" то есть то что нам нужно, и после заполнить параметр. Что бы вытащить все что хранится в value=""  мы воспользуемся  функциями pos/copy их будет достаточно. 
var
  auth_t: string; // хранится значение authenticity_token
...
procedure TForm5.Button1Click(Sender: TObject);
var
  get: String;
begin
  get := IdHTTP1.get('https://mobile.twitter.com/session/new');
  auth_t := Copy(get, Pos('type="hidden" value="', get) + 21, 20);
  // Вытаскиваем значение authenticity_token
end;
Значение "authenticity_token" мы получили теперь нужно заполнить поля "Имя пользователя, Пароль" и по пробовать авторизироваться. 
var
  auth_t: string; // хранится значение authenticity_token
...
procedure TForm5.Button1Click(Sender: TObject);
var
  data: TStringList;
  get: String; 
begin
  get := IdHTTP1.get('https://mobile.twitter.com/session/new');
  auth_t := Copy(get, Pos('type="hidden" value="', get) + 21, 20);
  // Вытаскиваем значение authenticity_token
  data := TStringList.Create;
  data.Add('authenticity_token=' + auth_t); 
 data.Add('username=' + login.Text);
  data.Add('password=' + pass.Text);
  IdHTTP1.Post('https://mobile.twitter.com/session', data); 
 // Отправляем все параметры
  get := IdHTTP1.get('https://mobile.twitter.com/');
  if Pos('Home', get) <> 0 then
  begin
    ShowMessage('Авторизовались удачно!');
    Button1.Enabled := False;
  end
  else
    ShowMessage('Авторизовались не удачно!'); 
// Проверяем авторизовались или нет 
end;
Вводим значения в login.text и pass.text и пробуем авторизоваться. У меня все работает!
Отправка твита 
Ну вот пожалуй и все, мы авторизовались. Давайте научимся отправлять сообщение в твиттер. Заходим на страницу твиттера, только уже нужно будет войти в твиттер включаем сниффер пишим сообщение и отправляем. Заходим на вкладку "POST Data" смотрим какие параметры нужно заполнить.
 Параметр authenticity_token у нас уже есть нам нужно только вставить как мы делали с авторизацией, параметр tweet[text] тут хранится текст для отправки сообщения остальные параметры пустые мы их так и оставим.

procedure TForm5.Button2Click(Sender: TObject);
var
 send: TStringList;
begin
 send := TStringList.Create;
 send.Add('authenticity_token=' + auth_t);
 send.Add('tweet[text]=' + twit.Text);
 send.Add('tweet[in_reply_to_status_id]=');
 send.Add('tweet[lat]=');
 send.Add('tweet[long]=');
 send.Add('tweet[place_id]=');
 send.Add('tweet[display_coordinates]=');
 // Заполнили все поля
 idHTTP1.Post('https://mobile.twitter.com/',send);
 // Отправляем заполненые параметры
end;

Фолловинг
Вот и все, все очень легко! Сниффер нам очень помогает :) Теперь научимся читать пользователя не буду так же все подробно показывать тут почти тоже самое покажу только код.
procedure TForm3.Button5Click(Sender: TObject);
var
 follow: TStringList;
begin
 follow := TStringList.Create;
 follow.Add('authenticity_token=' + auth_t);
 follow.Add('last_url/=' + name.Text);
 // Заполнили все поля
 idHTTP1.Post('https://mobile.twitter.com/'+ name.Text +'/follow',follow);
 // Отправляем заполненые параметры, то есть фолловим!
end;
Далее можете сами уже улучшать вашу программу. Ну вот и все написал долгожданную статью которую хотел написать очень давно, оцениваем:)  

5 комментариев:

  1. Тоже делал такую же штуку.
    Только никогда не использую Copy и Pos, а вместо этого юзаю регулярки.

    ОтветитьУдалить
  2. > Только никогда не использую Copy и Pos, а вместо этого юзаю регулярки.
    Почему? Чем они тебя не устраивают или есть какието минусы..

    ОтветитьУдалить
  3. Хоть регулярки немного медленней, тем не менее они более удобны при парсинге. С copy/pos малейшее изменение в тексте парсинга и придется заново компилить программу, например, если длина токена изменится. В регулярных выражениях более гибкая подстройка.

    А вообще, парсинг HTML регулярками или copy/pos это не есть хорошо. Должны быть специальные средства, аля XHTML, XPath. Только вот в delphi нормальных парсеров HTML я еще не видел.

    ОтветитьУдалить
  4. По какой то причине неработает с твитером

    ОтветитьУдалить

Сделай автору приятно - оставь комментарий!