Програмне відправлення коментарів до livejournal
Софт, вихідники та фото
Зміст
Трохи теорії
- Авторизація на сайті livejournal.
Реалізація на C#
Для наочності подальший опис супроводжуватимемо написанням коду мовою C#. Завантажити вихідники та скомпільовану програму можна звідси.

Використовувані класи
Спочатку розглянемо загальну структуру програми з основними класами.

Для виведення повідомлень у балку ми будемо використовувати клас TextLog, що реалізує інтерфейс ILog. Тут немає нічого особливо примітного, і його вміст не відноситься до теми посту, тому зупинятись на ньому не будемо.

Або повністю з перевірками на можливі винятки та помилки введення:
namespace LJBot < public partial class mainForm : Form < public mainForm ( ) < InitializeComponent ( );
_log=new TextLog(logTextBox); >
private void sendButton_Click (object sender, EventArgs e) < // Прочитаємо введені параметри string url = urlTextBox . Text; string login = loginTextBox . Text; string password = passwordTextBox . Text; string message = commentTextBox . Text; string subj = subjTextBox . Text;
// Очистимо лог від попередніх записів _log. Clear();
// Створимо клас для роботи з сервером ЖЖ LJServer server = new LJServer (_log);
> // private void sendButton_Click (object sender, EventArgs e)
> // public partial class mainForm : Form
Тепер, коли ми коротко згадали допоміжні класи, почнемо розбиратися з класом LJServer, всередині якого відбуватиметься вся робота з сервером ЖЖ.
/// public void PostComment ( string login, stringpassword, string url, string message, string subj, int parent )
Тепер розглянемо як реалізовані усі перелічені вище етапи для надсилання повідомлень усередині методу PostComment().
Підготовка
Тут USERNAME - нік користувача, а NNNNN - цілий номер запису. Ці дані ми повинні дізнатися на даному етапі.
Насправді є ще один тип постів – трансляції в ЖЖ, тоді посилання мають вигляд http://syndicated.livejournal.com/NAME/NNNNN.html, але в цій статті ми їх не розглядатимемо.
Більше того, якщо в ніке користувача є дефіси, то їх треба обов'язково замінити на підкреслення, інакше при спробі відкрити таке посилання другим або третім способом ми отримаємо 404 помилку.
/// /// Це співтовариство? /// public readonly bool IsCommunity;
if (url. StartsWith ("http://community.livejournal.com")) < // Посилання на спільноту IsCommunity = true; urlRe = @"http://community.livejournal.com/(? .*)/(? \d+)\.html" ; > else if (url. StartsWith ("http://users.livejournal.com") url. StartsWith ("http://user.livejournal.com")) < // Посилання на користувача в "екзотичному" форматі IsCommunity = false; urlRe = @"http://users?.livejournal.com/(? .*)/(? \d+)\.html" ; > else < // Посилання на користувача в стандартному форматі IsCommunity = false ; urlRe = @"http://(? .*).livejournal.com/(? \d+)\.html" ; >
// Знайдемо ім'я користувача (або спільноти) та номер запису Match match = Regex. Match (url, urlRe, RegexOptions. IgnoreCase);
// Перевіримо, чи все було знайдено за допомогою регулярного виразу if (! match. Success) < throw new FormatException ("InvaludURL format" ) ; >
if ( ! match . Groups [ " name " ] . Success ) < throw new FormatException ("Invalud URL format"); >
if ( ! match . Groups [ " id " ] . Success ) < throw new FormatException ("Invalud URL format"); >
Journal = match. Groups ["name"]. Value; >= int . Parse (match. Groups ["id"]. Value); > >
Використання класу UrlInfo у методі PostComment() виглядає так:
// Розберемо посилання на складові
try < urlElements = new UrlInfo (url); > catch (FormatException e) < _log. WriteLine (e. Message); throw; >
_log. WriteLine ("Parsing URL."); _log. WriteLine (string. Format ("Username:", urlElements. Journal)); _log. WriteLine (string. Format ("Post ID:", urlElements. Id));
Ця частина коду повністю взята з попередньої статті, тому я не наводитиму код використовуваних методів GetBaseCookie() і GetPage() ще раз, а наведу відразу частину коду методу PostComment(), де використовуються перелічені методи.
CookieCollection cookies = GetBaseCookie (login, password);
try < text = GetPage (url, cookies); > catch (WebException e) < _log. WriteLine(e. ToString()); throw new FormatException ("URL Error", e); >
Отримання параметра lj_form_auth
private string GetLjFormAuth ( string text ) < _log. WriteLine (""); _log. WriteLine ("Parsing Form.");
// Знайдемо параметр lj_form_auth всередині форми string authFormRe = "( \\ \ )? \" lj_form_auth( \\ \ )? \"value=(\\\)?\"(?.*?)(\\\)? \"";
string lj_form_auth = Regex. Match (text, authFormRe, RegexOptions. Multiline RegexOptions. IgnoreCase). Groups ["auth"]. Value;
_log. WriteLine (string. Format ("auth:", lj_form_auth));
if (lj_form_auth. Length == 0) < throw new FormatException ( ) ; > return lj_form_auth; >
Цей метод просто шукає значення lj_form_auth за допомогою регулярного виразу. Вас може збентежити безліч необов'язкових зворотних слішів у регулярному вираженні. Вся справа в тому, що форма в коді сторінки може бути записана у двох варіантах:
Коментарі не надсилаються
Дякую.
Якщо є бажання, то можу надати права на редагування http://blogsapi.codeplex.com/