Відправка відкладених постів в

З недавніх пір в Живому Журналі (він же livejournal.com, він же ЖЖ) з'явилася можливість робити відкладену відправку записів. Тобто ви відправляєте пост в будь-який зручний вам час, але в стрічці користувачів, які вас читають, він з'явиться тільки в певний час. Раніше такою можливістю можна було скористатися за допомогою сторонніх сервісів (які належать СУП'у), а тепер така можливість з'явилася в самому сервері ЖЖ.

Так як документація по роботі з сервером ЖЖ не оновлювалася, схоже, ще з часів Бреда Фіцпатріка, то для того, щоб зрозуміти, як скористатися цією можливістю зі своєї програми, довелося покопатися в исходниках движка ЖЖ. благо, вони відкриті.

Не буду зупинятися на тому, яким чином з початкових кодів вдалося з'ясувати принцип відправки відкладених постів, просто приведу сухий результат, тим більше, що використовувати цю можливість досить легко.

Демонстраційна програма

Для демонстрації роботи відправки постів в ЖЖ я написав простеньку програмку ljdelay. інтерфейс якої показаний на наступному скріншоті:

Відправка відкладених постів в

За допомогою цієї програми можна відправляти пости, задаючи їм певні дати. Якщо не встановлено прапорець "Використовувати відкладену відправку", то введена дата буде встановлена, як дата поста, але сам запис в стрічці ваших друзів з'явиться відразу ж. Якщо цей прапорець встановлений, то запис з'явиться в стрічці ваших друзів в заданий час, при цьому ви зможете її побачити в списку відкладених записів.

Розглянемо вихідні цієї програми і заодно розберемося, як же все-таки використовувати відкладену відправку.

Робота з сервером ЖЖ

Якщо ви не читали попередні статті серії, особливо статтю Основи роботи з сервером livejournal.com. коротко нагадаю основні моменти, пов'язані з роботою сервера.

Сервер ЖЖ може працювати по двох протоколах - Flat, коли дані передаються у вигляді параметр = значення і XML-RPC, коли вони оформляються у вигляді XML. У зазначеній вище статті наводилися два класи для роботи по обох протоколах. У цій статті буде використовуватися клас FlatLjServer для роботи по протоколу Flat.

Щоб використовувати відкладену відправку постів, в порівнянні зі звичайним запитом postevent необхідно додати або змінити всього кілька параметрів:

  • Номер версії протоколу (параметр ver) повинен бути більше 3, тобто логічно використовувати 4.
  • Параметр custom_time. рівний 1, позначає, що використовується відкладена відправка.
  • Параметр tz (від слів "time zone"), що задає часовий пояс користувача (різницю в часі в порівнянні з UTC). Здається рядком у вигляді "+0400" (зміщення на +4 години), або "-0400" (Зсув на -4 години), або "-0130" (зміщення на -1 годину 30 хвилин) і т.д.

Давайте подивимося, як така робота з сервером реалізована в програмі. Як вже було сказано, для роботи з сервером ЖЖ в програмі використовується клас FlatLjServer. UML-діаграма якого показана нижче:

Відправка відкладених постів в

Клас FlatLjServer має два публічних методу: PostEvent для звичайної відправки поста в блог і PostDelayEvent для відкладеної відправки. Вони дуже схожі і відрізняються лише додаванням нових параметрів для відправки відкладених постів.

///


/// Надіслати постав блог без затримки
///

/// Ім'я користувача
/// пароль
/// Заголовок
/// текст поста
/// Дата поста
public void PostEvent # 40; string user,
string password,
string subj,
string text,
DateTime dateTime # 41;
# 123;
Dictionary paramItems =
GetPostEventParams # 40; user, password, subj, text, dateTime # 41; ;

string request = Dict2Request # 40; paramItems # 41; ;
SendRequest # 40; request # 41; ;
# 125;


///


/// Надіслати пост в блог з використанням затримку надсилання
///

/// Ім'я користувача
/// пароль
/// Заголовок
/// текст поста
/// Дата відправки поста
public void PostDelayEvent # 40; string user,
string password,
string subj,
string text,
DateTime dateTime # 41;
# 123;
Dictionary paramItems =
GetPostEventParams # 40; user, password, subj, text, dateTime # 41; ;

// Зміни в запиті в порівнянні з відправкою поста без затримки
// Номер протоколу повинен бути> 3
paramItems # 91; "Ver" # 93; = "4";

// Вказуємо, що використовуємо відкладену відправку поста
paramItems # 91; "Custom_time" # 93; = "1";

// Часовий пояс. Здається в форматі +0400 або -0400
paramItems # 91; "Tz" # 93; = HttpUtility. UrlEncode # 40; GetTimeZone # 40; # 41; # 41; ;

string request = Dict2Request # 40; paramItems # 41; ;
SendRequest # 40; request # 41; ;
# 125;

Метод GetPostEventParams створює словник з параметрами для звичайної (не відкладення) відправки поста.

private Dictionary GetPostEventParams # 40; string user,
string password,
string subj,
string text,
DateTime dateTime # 41;
# 123;
string challenge = GetChallenge # 40; # 41; ;
string auth_response = GetAuthResponse # 40; password, challenge # 41; ;

Dictionary paramItems = new Dictionary # 40; # 41; ;
paramItems # 91; "Mode" # 93; = "Postevent";
paramItems # 91; "Auth_method" # 93; = "Challenge";
paramItems # 91; "Auth_challenge" # 93; = Challenge;
paramItems # 91; "Auth_response" # 93; = Auth_response;
paramItems # 91; "User" # 93; = User;
paramItems # 91; "Event" # 93; = HttpUtility. UrlEncode # 40; text # 41; ;
paramItems # 91; "Subject" # 93; = HttpUtility. UrlEncode # 40; subj # 41; ;
paramItems # 91; "Allowmask" # 93; = 0. ToString # 40; # 41; ;
paramItems # 91; "Year" # 93; = DateTime. Year. ToString # 40; # 41; ;
paramItems # 91; "Mon" # 93; = DateTime. Month. ToString # 40; # 41; ;
paramItems # 91; "Day" # 93; = DateTime. Day. ToString # 40; # 41; ;
paramItems # 91; "Hour" # 93; = DateTime. Hour. ToString # 40; # 41; ;
paramItems # 91; "Min" # 93; = DateTime. Minute. ToString # 40; # 41; ;
paramItems # 91; "Ver" # 93; = "1";
return paramItems;
# 125;

Після цього за допомогою методу Dict2Request словник перетворюється в рядок виду "param1 = value1param2 = value2.", А за допомогою методу SendRequest надсилається запит на додавання поста в блог. Метод SendRequest не змінився в порівнянні з однойменною методом зі статті Основи роботи з сервером livejournal.com. тому докладно на ньому зупинятися не будемо, ось його текст:

protected string SendRequest # 40; string textRequest # 41;
# 123;
// Виводимо в лог посилається запит
_log. WriteLine # 40; "\ R \ n *** Request:" # 41; ;
_log. WriteLine # 40; textRequest # 41; ;

// Перетворимо запит з рядка в byte []
byte # 91; # 93; byteArray = Encoding. UTF8. GetBytes # 40; textRequest # 41; ;

// Отримуємо клас запиту
HttpWebRequest request = # 40; HttpWebRequest # 41; WebRequest. Create # 40; ServerUri # 41; ;

// Заповнюємо параметри запиту
request. Credentials = CredentialCache. DefaultCredentials;
request. Method = "POST";
request. ContentLength = textRequest. Length;
request. ContentType = this. ContentType;
request. UserAgent = "LJTest";

// Очищаємо колекцію від старих cookie і додаємо туди нові
request. CookieContainer = new CookieContainer # 40; # 41; ;
request. CookieContainer. Add # 40; _cookies # 41; ;

// Заповнюємо параметри Proxy (_proxy == null, якщо проксі не використовується)
request. Proxy = null;

// Відправляємо дані запиту
Stream requestStream = request. GetRequestStream # 40; # 41; ;
requestStream. Write # 40; byteArray, 0. textRequest. Length # 41; ;

// Отримуємо клас відповіді
HttpWebResponse response = # 40; HttpWebResponse # 41; request. GetResponse # 40; # 41; ;

// Читаємо відповідь
Stream responseStream = response. GetResponseStream # 40; # 41; ;
StreamReader readStream = new StreamReader # 40; responseStream, Encoding. UTF8 # 41; ;

string currResponse = readStream. ReadToEnd # 40; # 41; ;

// Виводимо в лог відповідь сервера
_log. WriteLine # 40; "\ R \ n *** Response:" # 41; ;
_log. WriteLine # 40; currResponse # 41; ;

// Виведемо в лог отримані у відповіді cookie
_log. WriteLine # 40; "\ R \ n *** Cookies:" # 41; ;
for # 40; int i = 0; i # 123;
_log. WriteLine # 40; response. Cookies # 91; i # 93 ;. ToString # 40; # 41; # 41; ;
# 125;

readStream. Close # 40; # 41; ;
response. Close # 40; # 41; ;

return currResponse;
# 125;

Відправка поста пройшла вдало і ми отримали посилання на новий запис в блозі.

А ось як виглядає відповідь сервера в разі відкладеного поста:

Запит також пройшов вдало, ми отримали посилання на відправлений пост, як доказ, що пост дійсно відправився, ми можемо побачити його на сторінці відкладених записів.

Відправка відкладених постів в

Ось і все, за допомогою такого нехитрого доповнення ви можете змусити вашу програму використовувати відкладену відправку постів.

На завершення статті ще раз нагадаю посилання, звідки ви можете завантажити вихідні програми ljdelay.