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

вторник, 23 декабря 2008 г.

Программный кликер

Хочу рассказать еще один случай, когда парсинг помог мне в автоматизации. На этот раз — в автоматизации кликинга. Я уже говорила, что когда-то "продвигала" свой город на MyMiniCity.com. Когда я начала искать информацию по поводу "продвижения" в онлайн-играх, нашла несколько кликообменников.

Что из себя представляет кликообменник? Пользователь регистрируется, в своем профиле указывает одну или несколько ссылок, на которые нужно кликать другим. Потом через интерфейс получает доступ к ссылкам других зарегистрированных пользователей. За каждый клик по чужой ссылке тебе начисляются "кредиты", за каждый клик по твоей ссылке "кредиты" списываются со счета. В итоге, чем больше ты кликнешь по чужим ссылкам, тем больше кликнут по твоим. Каждый пользователь по одной ссылке может кликнуть только раз в сутки, но на популярных кликообменниках количество пользователей очень большое, поэтому в день выходило около двух тысяч кликов по моей ссылке — и мой город рос, как на дрожжах. У вас возник вопрос, не заколебалась ли я день напролет кликать? Ответ: не заколебалась, так как после недели кликинга поняла, что надо все автоматизировать, иначе, — как в одной из серий "Саус Парка", — у меня не будет никакой личной жизни :)

В итоге была создана программка, которая логинится на сайт, ищет ссылки по определенному шаблону во всех возможных разделах (слава регулярным выражениям!) и кликает по ним.

Такую программу написать достаточно просто. Реализацию всех действий по-отдельности я уже разбирала в этом блоге: заполнение и сабмит формы, получение содержимого страницы, поиск ссылок по шаблону, открытие ссылок с использованием TWebBrowser. Так что при желании трудностей возникнуть не должно. А здесь — просто показала еще одно направление для написания программ web-автоматизации.

yarold clicker

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

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

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

четверг, 18 декабря 2008 г.

RSS в виде дерева (TTreeView в Delphi)

Приятно, когда есть обратная связь с блога. Когда уточняют что-либо или задают вопросы. Поэтому в продолжение к статье об отображении XML в виде дерева напишу еще эту — об отображении RSS в TreeView.

Про структуру RSS я уже писала. Задача сводится к малому: пройтись по всем записям, разобрать их элементы и представить в виде дерева "Адрес RSS — Записи".

Для достижения своих целей будем оперировать данными типов IXMLNode и IXMLNodeList.

nd : IXMLNode;
firstTier : IXMLNodeList;


DocumentElement — возвращает корневой объект документа.
childNodes — возвращает список прямых потомков вершины. Далее с дочерними узлами можно работать просто как с элементами списка. Например, узнать имя узла, можно будет firstTier[i].NodeName.

Итак, исследуем код RSS-фида, который генерируется feedburner-ом. Видим, что самый простой способ получить все записи, — это из списка узлов первого уровня выбрать узлы с именем entry, а потом каждый из этих узлов обработать (выделить нужные нам дочерние узлы content, published (дата публикации) и link (у узла link нам понадобится значение атрибута href)).


XMLDocument1.FileName := 'MyRSSFeed.xml';
XMLDocument1.Active := true;

nd := XMLDocument1.DocumentElement;

TreeView1.Items.AddChild(nil,edtRSSURL.Text);
firstTier := nd.childNodes;
for i := 0 to firstTier.Count-1 do
begin
if firstTier[i].NodeName = 'entry' then
begin
nd := firstTier[i];
ProcessItem();
end;
end;


Что касается обработки записей. Все просто со значениями узлов с именами content и published, так как такие узлы встречаются один раз. А вот узлов с именем link встречается несколько.

<link rel="replies" type="application/atom xml" href="http://mama-karlo.blogspot.com/feeds/6599339245902184370/comments/default" title="..." />
<link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=29395559131211965&amp;postID=6599339245902184370" title="..." />
<link rel="edit" type="application/atom xml" href="http://www.blogger.com/feeds/29395559131211965/posts/default/6599339245902184370?v=2" />
<link rel="self" type="application/atom xml" href="http://www.blogger.com/feeds/29395559131211965/posts/default/6599339245902184370?v=2" />
<link rel="alternate" type="text/html" href="http://mama-karlo.blogspot.com/2008/12/blog-post_16.html" title="..." />


Нам нужно выбрать только тот узел, у которого значение атрибута rel равно alternate. В итоге получаем код:

type
PRSSFeedData = ^TRSSFeedData;
TRSSFeedData = record
URL : string;
Description : string;
Date : string;
end;

procedure ProcessItem();
var
rssFeedData : PRSSFeedData;
tn : TTreeNode;
title : string;
j : integer;
begin
New(rssFeedData);

title := nd.ChildNodes.FindNode('title').Text;

with nd.ChildNodes do
begin
rssFeedData.Description := FindNode('content').Text;
rssFeedData.Date := FindNode('published').Text;
end;

for j := 0 to nd.ChildNodes.Count-1 do
if (nd.ChildNodes[j].NodeName = 'link') and (nd.ChildNodes[j].GetAttribute('rel') = 'alternate') then
begin
rssFeedData.URL := nd.ChildNodes[j].GetAttribute('href');
break;
end;

tn := TreeView1.Items.AddChild(TreeView1.Items.GetFirstNode, title);
tn.Data := rssFeedData;
end;


Вот небольшое приложение, на примере которого можно поразбираться, как все работает.
RSS-feed in TreeView, Delphi

Исходники можно скачать здесь.

P.S. Спасибо благодарным читателям, которые шлют на пиво! %D

среда, 10 декабря 2008 г.

Парсинг на службе у геймера

Парсингу можно найти применение не только для получения контента. Сегодняшний мой рассказ будет связан с автоматизацией "прокачки" объекта в одной браузерной игре.

В последнее время в сети появилось огромное множество браузерных игр разных типов. В конце прошлого года, когда появился портал MyMiniCity, я построила себе там город NewYorg (кто сидит по траффику — лучше не заходить :) ). Суть игры заключается в том, что надо "построить" свой виртуальный город. Подробно расписывать не буду, так как уже писала про эту игру. Поигравшись пару месяцев, вручную заходя в другие города и оставляя на доске приглашения посетить Newyorg, решила все автоматизировать. Тогда и была написана программа, которая посещает города на MyMiniCity.com, заполняет поля, отгадывает капчу и сабмитит форму. Надо было только подсунуть программе файл со списком городов. Таким образом я выводила город достаточно высоко в рейтинге (но потом мне стало лень даже запускать программу :) ).

Вот для создания списка городов я и использовала парсинг. Проанализировав код страницы, нашла, что список части городов, выведенных в рейтинге в правой части, в коде представлен в определенном формате. На каждой странице с городом есть строка типа:

ranking=145,flycity.de|146,ssv-city|147,join|148,seti.germany|149,krokant|150,demonslayers|151,maschboard


Оставалось только распарсить строку, добавить города в список и перейти к последнему (или первому, в зависимости от направления обхода) городу. Список городов можно было представить в формате, который подходит для программы обхода городов MMCVisitor :)

myminicity parser

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

Поделиться