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

суббота, 8 ноября 2008 г.

Автоматизация постинга в дневники на блогхостингах с WordPress. Часть IV

Переходим к той части автоматизации, которая позволит нам постить записи. Я уже писала, что для удобства на каждой записи с данными о блоге вызывается контекстное меню. Записи в датасете берутся из запроса:
select b.n as blog_n, b.blogname,b.title,b.url as blog_url,
b.update_date,b.n_bloghosting,
b.login,b.pass,bh.*
from blog b
left join bloghosting bh on b.n_bloghosting = bh.n
where b.n_bloghosting = :n

То есть там есть нужная нам информация о блоге и блогхостинге, на котором он расположен. Кстати, информация в таблице о блогхостинге на wordpress.com у меня получилась следующая:

INSERT INTO BLOGHOSTING (N, URL, URL_LOGIN, FORM_LOGIN, FIELD_LOGIN, FIELD_PASS, BUTTON_LOGIN, URL_UNLOGIN, URL_NEW_MESS, FIELD_TITLE, FIELD_MESS, FIELD_TAGS)
VALUES (1, 'http://wordpress.com', 'http://[BlogName].wordpress.com/wp-login.php', 'loginform', 'log', 'pwd', 'wp-submit', NULL, 'http://[BlogName].wordpress.com/wp-admin/post-new.php', 'title', 'content', 'tags-input');

[BlogName] потом при формировании ссылки для каждого дневника будет заменяться на содержимое поля BLOGNAME.

Поле BUTTON_LOGIN можно не заполнять, так как тип кнопки - submit.
Для последующего упрощения процесса программирования, советую выносить часто повторяющиеся действия в отдельные процедуры и функции. А потом оформить это в библиотеку. Например, поиск формы по ее имени:
function FindFormByName ( W : TWebBrowser; FormName : string) : Variant;
var
i : integer;
formitem : variant;
S : String;
begin
Result:=Null;
for i := 0 to w.oleobject.document.forms.length - 1 do
begin
formitem := w.oleobject.document.forms.item(i);
S:= lowercase(formitem.name);
if S = lowercase(FormName) then Result:=formitem;
end;
end;

Входные параметры: TWebBrowser, в котором загружена страница, и название формы.

Еще в отдельную функцию можно вынести заполнение поля формы:
function fillform(aformitem : variant; fieldname: string; value: string): boolean;
var
i, j: integer;
begin
result := false;
for j := 0 to aformitem.length - 1 do
begin
try
if aformitem.item(j).name = fieldname then
begin
aformitem.item(j).value := value;
result := true;
end;
except
exit;
end;
end;
end;
Входные параметры: форма, название поля и что в это поле поместить.

Сабмит (отправление) формы:
function SubmitForm( V : Variant) : boolean;
var
i : integer;
begin
Result:=false;
for i := 0 to V.length - 1 do
begin
try
if Trim(lowercase(V.item(i).type)) = 'submit' then
begin
result := true;
V.item(i).click();
exit;
end;
except
exit;
end;
end;
end;


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

procedure TFMain.N2Click(Sender: TObject);
var
sURL : string;
V : Variant;
begin
// залогиниться
// формируем ссылку для логина
sURL := StringReplace(qBlogURL_LOGIN.AsString,'[BlogName]',qBlogBLOGNAME.AsString,[rfIgnoreCase]);
ShowPage(sURL);
// найти форму по имени
V:=FindFormByName(WebBrowser,qBlogFORM_LOGIN.AsString);
if VarIsNull(V) then exit;
// ввести в форму, что надо
fillform(V,qBlogFIELD_LOGIN.AsString,qBlogLOGIN.AsString);
fillform(V,qBlogFIELD_PASS.AsString,qBlogPASS.AsString);
// нажать на кнопку
try
if submitform(v) then NowLogin := qBlogBLOG_N.AsInteger;
except
end;
end;

Функция ShowPage просто загружает URL в веббраузер.
procedure TFMain.ShowPage(URL: string);
begin
vLoaded := false;
WebBrowser.Navigate(URL);
while not vLoaded do
Application.ProcessMessages;
end;


До того, как обработалась команда нажатия на кнопку, форма выглядела так:
ввод данных в форму

После автосабмита мы оказываемся уже залогиненными:

автоматический логин

Как видите, все очень просто. В переменной NowLogin будет храниться N последнего блога, в котором залогинились. Это надо для того, чтобы при публикации каждого сообщения в один и тот же блог повторно не логинились.

Не вот и все, аналогично прописать действия для помещения записи в блог:
- если не залогинены - залогиниться;
- перейти на страницу для создания новой записи;
- ввести данные в поля;
- отправить форму.

Удачных разработок ;)

Статьи схожей тематики:



Комментариев нет:

Отправить комментарий

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться