Поиск по блогу

среда, 3 сентября 2008 г.

Вот это да!

Сегодня ночью какой-то доброхот пометил этот блог, как блог, содержащий спам. Вот что я обнаружила утром:
Заявку на разблокировку аккаунта я отправила, но осадок остался весьма и весьма неприятным. При том, что я уже написала заготовки для следующих постов, пока не буду спешить их публиковать. Скорее всего, откажусь от этого аккаунта, удалю журнал и перенесу все написанные статьи на блог с платным хостингом.

вторник, 2 сентября 2008 г.

Автоматизация добавления RSS блога в агрегаторы. Часть II

Продолжение, первую часть читайте здесь.
Как и обещала, о некоторых моментах.

1. Зная, что придется работать с однотипными структурами, объявляем класс:
  TRSSAgregator = class
url,
field_url,
field_rss_url,
field_rss_name,
field_dsc,
field_keys,
field_email,
key_delimiter : string;
end;

Про значения полей я упоминала в прошлом посте. При загрузке программы считываем данные из ini-файла. В ini-файле данные разбиты на секции, каждая секция соответствует одному ресурсу. Вот процедура чтения секций с однотипными данными:
procedure TfrmMain.actINILoadExecute(Sender: TObject);
var
IniFile : TIniFile;
Sections : TStringList;
SecParams: TStringList;
RSSAgr : TRSSAgregator;
i : integer;
sVal : string;
begin
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'/'+IniFileName);
try
Sections := TStringList.Create();
try
// читаем имена всех секций
IniFile.ReadSections(Sections);

// перебираем имена всех секций, и для секций с именами
// вида SITEnn создаем объекты
SecParams := TStringList.Create();
try
for i:=1 to Sections.Count do
begin
sVal := Sections[i-1];
if (Pos('SITE', sVal) = 1) and
(StrToIntDef(Copy(sVal, 5, Length(sVal)-4), -1)>0) then
begin
// читаем параметры секции
IniFile.ReadSectionValues(sVal, SecParams);

if SecParams.Count > 0 then
begin
RSSAgr := TRSSAgregator.Create;
RSSAgr.url := SecParams.Values['url'];
RSSAgr.field_url := SecParams.Values['field_url'];
RSSAgr.field_rss_url := SecParams.Values['field_rss_url'];
RSSAgr.field_rss_name := SecParams.Values['field_rss_name'];
RSSAgr.field_dsc := SecParams.Values['field_dsc'];
RSSAgr.field_keys := SecParams.Values['field_keys'];
RSSAgr.field_email := SecParams.Values['field_email'];
RSSAgr.key_delimiter := SecParams.Values['key_delimiter'];
RSSAgregators.Add(RSSAgr);
end
end;
end;
finally
SecParams.Free();
end;
finally
Sections.Free();
end;
finally
IniFile.Free();
end;
end;

RSSAgregators — TList, в котором хранятся указатели на объекты типа TRSSAgregator. Он создается при создании формы, при закрытии формы - очищаем память.
После загрузки данных из ini-файла помещаем их в Grid.

2. Вот, в принципе, и все. Осталось только обработать двойной клик по ячейке грида. На него мы повесим экшн:
procedure TfrmMain.actGoToSiteExecute(Sender: TObject);
var
i : integer;
url : string;
tmpURL : TRSSAgregator;
strKeys : string;
begin
url := vRSS.DataController.Values[vRSS.DataController.FocusedRecordIndex,vRSSUrl.Index];

for i := 0 to RSSAgregators.Count-1 do
begin
if TRSSAgregator(RSSAgregators[i]).url = url then
tmpURL := RSSAgregators[i];
end;

PageLoaded := false;
WebBrowser.Navigate(tmpURL.url);
while PageLoaded = false do
Application.ProcessMessages;

try
// заполнение полей
if tmpURL.field_url <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_url).Value := edtURL.Text;
if tmpURL.field_rss_url <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_rss_url).Value := edtRSSURL.Text;
if tmpURL.field_rss_name <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_rss_name).Value := edtTitle.Text;
if tmpURL.field_dsc <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_dsc).Value := edtDSC.Text;
if tmpURL.field_email <> '' then
WebBrowser.OleObject.document.getElementById(tmpURL.field_email).Value := edtEmail.Text;
// ключевики
strKeys := edtKeys.Text;
if (tmpURL.key_delimiter <> '') and (edtKeys.Text <> '') then
begin
strKeys := StringReplace(edtKeys.Text,',',tmpURL.key_delimiter,[rfReplaceAll]);
WebBrowser.OleObject.document.getElementById(tmpURL.field_keys).Value := strKeys;
end;
except
end;
end;

PageLoaded становится true по событию OnDocumentComplete объекта TWebBrowser.

Вот сейчас точно все. :)

____

Update: новая версия RSSAdder-а.
____


Итак, краткий курс автоматизации работы с формами пройден и даже приведен пример создания полезной утилиты. В следующих постах планирую все-таки начать рассказ о том, что ближе к теме блога, — непосредственно о создании парсера. В уме я уже прикинула, создание каких типов парсеров я буду приводить в пример. Но если вы хотите, чтобы я разобрала парсинг информации на вашем примере — пишите, рассмотрю все пожелания (это могут быть интернет-магазин, новостной ресурс, форум и т.д.).

понедельник, 1 сентября 2008 г.

Автоматизация добавления RSS блога в агрегаторы. Часть I

Итак, теории пока достаточно, перейдем к практике. Сделаем утилиту, которая добавляет RSS ленту вашего блога в разные RSS-агрегаторы. Если вам часто приходится заниматься проектированием, то рассуждения об организации программы можно пропустить, не читая.

При проектировании всегда хочется, чтобы программа получилась более-менее универсальной. То есть, чтобы список ссылок ресурсов можно было бы дополнять в конфигурационном файле (базу данных сразу отметаем, не стоит заморачиваться). В конфигурации для каждого ресурса понадобится заполнить следующие поля:

url= /*ссылка на страницу, на которой расположена форма для добавления RSS*/
field_url= /*название (id) поля формы, в которое надо вписать ссылку на сайт (если потребуется)*/
field_rss_url= /*название (id) поля формы, в которое надо вписать ссылку на RSS*/
field_rss_name= /*название (id) поля, в которое надо вписать название блога*/
field_dsc= /*название (id) поля, в которое надо вписать описание блога (если потребуется)*/
field_keys= /*название (id) поля, в которое надо вписать ключевики*/
key_delimiter= /*разделитель ключевых слов. В программе все ключевые слова будем разделять запятыми. А если на ресурсе разделитель будет отличаться — заменим его.*/


Названия полей необходимы для обращения к этим полям. Как видите, программа получается универсальная. Самым трудоемким будет обойти ресурсы и записать в конфигурационный файл id полей. Я преднамеренно включила максимальное количество полей для того, чтобы в будущем эту же программу можно было использовать для добавления ссылок в каталоги соц. закладок и т.д.. Принцип программы будет чрезвычайно прост: после двойного щелчка по ссылке на ресурс (в левой части формы) страница откроется в WebBrowser-е и поля в соответствии с конфигурационным файлом заполнятся данными из верхней части формы. Человеку останется только просмотреть на всякий случай, все ли поля заполнены, ввести где надо капчу, выбрать категорию (если понадобится) и нажать кнопку.

Интерфейс получился такой:

автоматическое добавление ссылки
Итак, в принципе, алгоритм описан. Реализовать его на Delphi — достаточно просто. Выкладываю прототип программы. В ее ini-файле пока только 3 ресурса. По аналогии вы можете добавить, сколько угодно (новые разделы в INI-файле должны называться SITEnn, где nn - порядковый номер. Названия полей (инпутов) ищутся в html-коде страниц и вносятся для каждого сайта отдельно). Крайне полезный список ссылок на RSS-агрегаторы можно найти на блоге ЖПО - Жизнь Поисковой Оптимизации. Было бы здорово, если бы кто-нибудь добавил все ссылки и выложил получившийся файл. Может, у меня дойдут руки на этой неделе... Но пока не до этого. Ждите продолжения данной статьи. Там я остановлюсь на некоторых технических моментах написания программы и приведу кое-какие листинги.

Качайте и пробуйте прототип программы. Надеюсь, что пригодится.

Поделиться