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

четверг, 26 февраля 2009 г.

Еще немного о раскрутке форумов с автонаполняемым содержимым

Решила запостить кое-какие мысли. Опять про форумы.

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

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

Следующие абзацы — именно про постинг на собственный форум.

Скрипт будет запускаться по крону и инсертить новые записи в базу. Помимо добавления записей, нужно сделать видимость присутствия людей на форуме. У вас уже зарегистрировано некоторое количество ботов, от имени которых постятся сообщения. Нужно написать небольшой хак для движка, который бы добавлял к списку реально присутствующих на форуме пользователей некоторое случайное количество ботов. Все это для того, чтобы забредший случайно посетитель видел, что форум живет. Но важно не переборщить: достаточно на первом этапе добавлять небольшое случайное число ботов в список (от 2 до 4, допустим).

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

Ну и, конечно, кроме наполнения форума, надо применять все свои знания по раскрутке сайтов. Если через пару месяцев на вашем форуме зарегистрируется меньше 10 человек, то выгоднее будет на этот домен повесить что-нибудь другое, — форуммейкера из вас не получилось.

Недавно в сети натолкнулась на грамотный материал о том, как создать "идеальный форум". Почитайте, может, найдете для себя что-нибудь интересное.
___

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

Мне уже не терпится поскорее приступить к тестированию автонаполнения форумов. Я даже знаю, где буду производить тестирование. Но пока к этому еще не все готово.

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

среда, 18 февраля 2009 г.

Как вызывать функции JavaScript на странице, загруженной в TWebBrowser в Delphi

Немного теории для тех, кто осваивает возможности Delphi при работе с интернетом.

Как вызвать функцию JavaScript на странице в TWebBrowser-е.

Зачем нам это может пригодиться при парсинге? Примеров может быть много, причем совершенно разноплановых. Приведу один.

парсинг страницы с AJAX
Сейчас на некоторых сайтах активно используется AJAX. Рассмотрим ситуацию, когда на веб-странице расположены несколько объектов SELECT. При первой загрузке страницы активен только первый. После выбора определенного OPTION-а без перезагрузки страницы формируется набор значений для второго SELECT-а и он становится активным. И так далее. Если просто присвоить свойству selected (iOption.selected := true;) одной из записей набора OPTIONS значение true, то JavaSctript, повешенный на onchange этого селекта, не сработает. Скрипт надо явно запустить.

Итак, решение. У объекта типа IHTMLWindow2, который представляет собой экземпляр HTML-документа, для наших целей есть метод execScript. Ему надо передать 2 строковых параметра:

1 — непосредственно строка вызова функции;
2 — язык, который используется (у нас — JavaScript).

Получить объект окна просто. Подключаем библиотеку MSHTML, объявляем переменные типов IHTMLDocument2, IHTMLWindow2.

uses
..., MSHTML;

Doc : IHTMLDocument2;
HTMLWindow : IHTMLWindow2;


Для получения объекта IHTMLWindow2 используем свойство parentWindow у объекта Document браузера (после того, как документ полностью загрузится).

WebBrowser.Document.QueryInterface(IHTMLDocument2, Doc);
HTMLWindow := Doc.parentWindow;


Перед тем, как дальше с полученным объектом, надо проверить, ассигновался ли он вообще:

if not Assigned(HTMLWindow) then Exit;


В качестве примера привожу листинг отдельной процедуры. Она в заданном SELECT-е (SelectEl) выбирает OPTION с определенным текстом (TextStr). И запускает JavaScript, повешенный на onchange селекта. Саму по себе, без контекста, вы ее не запустите, но синтаксис будет понятен.

procedure TMainF.SelectItemByTextFromSelectEl(TextStr: string;
SelectEl: IHTMLSelectElement; SelectName: string);
var
i, t : integer;
iDisp : IDispatch;
iColl : IHTMLElementCollection;
iOption : IHTMLOptionElement;
JSFStr : string;
begin
iDisp := SelectEl.tags('OPTION');
iDisp.QueryInterface(IHTMLElementCollection, iColl);
if not Assigned(iColl) then
begin
ShowMessage('Not assigned!'); exit;
end;

i := 0;
while i <= iColl.length-1 do
begin
iDisp := iColl.item(i,0);
iDisp.QueryInterface(IHTMLOptionElement, iOption);
if Assigned(iOption) then
begin
if iOption.text = TextStr then
begin
iOption.selected := true;
if not Assigned(HTMLWindow) then Exit;
try
JSFStr := 'setTimeout(''__doPostBack(\''' + SelectName + '\'',\''\'')'', 0)';
HTMLWindow.execScript(JSFStr, 'JavaScript'); // вызов функции
except
end;

for t := 0 to WaitPause-1 do
begin
Sleep(1000); Application.ProcessMessages;
end;
break;
end;
end;
inc(i);
end;

end;

Не забывайте про экранирование эскейп-символов при помощи обратных слешей. Если в функцию надо передавать какие-либо параметры, то при подготовке строки с вызовом функции удобно пользоваться Format-ом.

JSFStr := Format('Foo("%s",%d)', [S, I]);


Следует отметить, что метод execScript предназначен для запуска функций, которые не возвращают значения, или таких функций, у которых нам возвращаемое значение не нужно.


Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

среда, 4 февраля 2009 г.

Общие слова о парсинге сообщений с форумов

Давно не обновляла блог, так как во всю занимаюсь непосредственно программированием и на писанину лишнего времени нет.

Этот материал я подготовила в рамках ряда статей по теме автоматизации первоначального наполнения форумов. В последнее время на фрилансе часто появляются проекты по наполнению форумов. За один пост предлагают смешные цены — $0,03 - $0,05. Но еще более смешным является то, что исполнители на такие проекты находятся. Уж не знаю, то ли на них как-то по-особому отразился кризис, то ли они готовы на все за отзыв. В любом случае, ручное выполнение такой работы — труд неблагодарный. А вот автоматизировать этот процесс — еще какой благодарный! ;)

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

Итак, с тематикой своего форума вы определились. Далее блуждаете по сети и подыскиваете ресурсы, которые станут донорами. Кстати, если вы все-таки собрались открыть форум, идеальным вариантом будет тематика, интересная и близкая вам. Не стоит заводить форум по аквариумным рыбкам, если с рыбой вы имеете дело только за обедом.

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

После того, как выбрали форумы-доноры, требуется написать их парсер. Под каждый форум составляются регулярные выражения для парсинга разделов, тем, сообщений и авторов сообщений. Это самая, на мой взгляд, трудоемкая и рутинная задача. Но главное — правильно разработать структуру БД, в которой все темы и сообщения потом будут храниться.



На следующем этапе парсится содержимое форума и сохраняется в базе. Алгоритм обхода форума интуитивно прост. С главной страницы в базу заносятся все разделы, потом обходим все разделы для сбора тем и сообщений в каждой теме.

После того, как все сообщения оказались у вас в руках, можно приступать к подготовке данных для размещения на ваш форум. Если форум ваш собственный, то регистрируете банду ботов напрямую инсертами в базу (ники, аватары, краткая информация). Если же форум не ваш — все это проделываете вручную. Темы и сообщения изменяются и импортируются в определенном формате в файлы. В отдельный файл импортируются данные о юзерах/паролях, от лица которых будет осуществляться постинг. Сообщения будут появляться на форуме постепенно, по расписанию. Это создаст иллюзию реального общения стабильной аудитории. А если темы будут интересными — новые пользователи не замедлят подтянуться. Еще один важный момент, который я предусматривала при разработке, — как можно более широкие возможности по управлению контентом на стадии подготовки к постингу. Каждое сообщение можно менять вручную (после изменения оно помечается и вы всегда видите, что меняли, а что нет), исходная спарсенная ветка остается в оригинале, а для постинга готовится ее копия, так что можно менять и не бояться :) Так же можно в любое место добавить произвольные сообщения или удалить из списка ненужные.

Подробнее о форматах и механизме постинга напишу потом.
___

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Поделиться