Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ ОС и ПО _ Броузер бот

Автор: SKVOZNJAK 3.10.2007 20:53

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

Автор: FreeMan 4.10.2007 2:54

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

Автор: SKVOZNJAK 4.10.2007 15:15

Вот на дельфи не тянет, во первых, неизвестно как нужная страница будет отображаться в собранном из его компонентов броузере. А во вторых, не хочется углубляться сверх необходимости в вин smile.gif В третьих, уже есть работающий прототип проги. Если частично его доработать, то пока нет смысла ради небольшого улучшения переделывать всё заново. Склепал под виндой, чуть зрение не посадил разглядывая мелкие буквочки.


var
Q7,W7: FILE;
Q3,W3,E3:BYTE;
MAS1:ARRAY[1..500000] OF BYTE;
MAS2:ARRAY[1..500000] OF BYTE;

Q2,W2,NACALOT2,KONCELOT2,DLINATEKSTA : LONGINT;
LABEL 1,2,3,4,5,6,99,100;


FUNCTION MASKA1(QQ8: WORD) : WORD;
BEGIN
CASE QQ8 OF
48..57,32: QQ8:=256;
END;
MASKA1:=QQ8;
END;


begin
ASSIGN(W7,ParamStr(2));
reset(W7,1);
WRITELN('');

1:
ASSIGN(Q7,ParamStr(1));
writeln('—?’Ђ…’‘џ ’…Љ‘’Ћ‚Ћ‰ ”Ђ‰‹ ',ParamStr(1));
reset(Q7,1);

Q2:=FILESIZE(Q7);
BLOCKREAD(Q7,MAS1,Q2);
KONCELOT2:=0;
FOR W2:=1 TO Q2 DO IF MAS1[W2]=60 THEN BEGIN
FOR Q3:=1 TO 2 DO IF (MAS1[W2+Q3])<>60 THEN GOTO 4;
FOR W3:=1 TO 150 DO CASE MASKA1(MAS1[W2+Q3+W3]) OF
{ 256:}
62: BEGIN
FOR E3:=1 TO 2 DO IF (MAS1[W2+Q3+W3+E3])<>62 THEN GOTO 4;
NACALOT2:=W2+Q3+W3+E3+1;
GOTO 3;
END;
1..61,63..255,257..1000: GOTO 4;
END;

4:
END;

GOTO 5;
3:
FOR W2:=NACALOT2+1 TO Q2 DO IF MAS1[W2]=60 THEN BEGIN
FOR Q3:=1 TO 2 DO IF (MAS1[W2+Q3])<>60 THEN GOTO 6;
FOR W3:=1 TO 150 DO CASE MASKA1(MAS1[W2+Q3+W3]) OF
{ 256:}
62: BEGIN
FOR E3:=1 TO 2 DO IF (MAS1[W2+Q3+W3+E3])<>62 THEN GOTO 6;
KONCELOT2:=W2+Q3+W3+E3;
GOTO 5;
END;
1..61,63..255,257..1000: GOTO 6;
END;

6:
END;



5:
CLOSE(Q7);
IF KONCELOT2=0 THEN GOTO 100;
DLINATEKSTA:=KONCELOT2-NACALOT2+1;
FOR W2:=1 TO DLINATEKSTA DO MAS2[W2]:=MAS1[NACALOT2+W2-1];
Q2:=FILESIZE(W7);
SEEK(W7,Q2);
BLOCKWRITE(W7,MAS2,DLINATEKSTA);



WRITELN('„ЋЃЂ‚‹…Ќ ”ђЂѓЊ…Ќ’ ’…Љ‘’Ђ');
2:
WRITELN('‚‚…„? 1 „‹џ „ЋЃЂ‚‹…Ќ?џ ‘‹…„“ћ™…ѓЋ ”ђЂѓЊ…Ќ’Ђ ?‹? 0 „‹џ ‚›•Ћ„Ђ');

READ(Q3);
CASE Q3 OF
1: GOTO 1;
0: GOTO 100;
END;
WRITELN('‚‚…„рЌ Ќ…‚…ђЌ›‰ ЏЂђЂЊ…’ђ');
GOTO 2;

99:
WRITELN('NACALOT2=',NACALOT2);

100:
CLOSE(W7);

end.


Как видно из кода, это прога не просто так пилит файлы, она книги пишет lol.gif Фентези с фантастикой и прочее, что в броузере читать ломово. Нужно лишь чтобы в обрабатываемых текстовиках присутствовало 2 строки типа
<<< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 >>> 

Есть идея сделать полуавтомат: прога раз в секунду ищет файл, если находит, обрабатывает, стирает, повторяет цикл снова. А в это время пользователь в опере сохраняет текстовые файлы с одним и тем же именем на рабочий стол smile.gif Естесственно, всё это чисто в ознакомительных целях.

Автор: xds 4.10.2007 19:37

Вообще для таких целей Перл в самый раз smile.gif

Автор: SKVOZNJAK 4.10.2007 20:51

Наверно это так, но для этого нужно затратить время и силы. Вначале до ассемблера надо добраться wacko.gif В описанном выше режиме бот уже работает. Как говорится, техника на грани фантастики: нажал на кнопку и спина в мыле smile.gif

USES CRT,DOS;
var
Q7,W7: FILE;
Q3,W3,E3,R3:BYTE;
MAS1:ARRAY[1..500000] OF BYTE;
MAS2:ARRAY[1..500000] OF BYTE;
S: SearchRec;
Q2,W2,NACALOT2,KONCELOT2,DLINATEKSTA : LONGINT;
LABEL 1,2,3,4,5,6,7,99,100;


FUNCTION MASKA1(QQ8: WORD) : WORD;
BEGIN
CASE QQ8 OF
48..57,32: QQ8:=256;
END;
MASKA1:=QQ8;
END;


begin

ASSIGN(W7,ParamStr(2));
reset(W7,1);
WRITELN('');
DELAY(50);
FOR Q3:=1 TO 100 DO IF KEYPRESSED=TRUE THEN READKEY;
WRITELN('0 - ‚›•Ћ„');

7:
DELAY(1000);
FindFirst(ParamStr(1),AnyFile,S);
FOR Q3:=1 TO 50 DO IF KEYPRESSED = TRUE THEN IF ORD(READKEY)=48 THEN GOTO 100;
IF DosError<>0 THEN GOTO 7;
DELAY(100);


1:
ASSIGN(Q7,ParamStr(1));
writeln('—?’Ђ…’‘џ ’…Љ‘’Ћ‚Ћ‰ ”Ђ‰‹ ',ParamStr(1));
reset(Q7,1);

Q2:=FILESIZE(Q7);
BLOCKREAD(Q7,MAS1,Q2);
CLOSE(Q7);
erase(Q7);
KONCELOT2:=0;
FOR W2:=1 TO Q2 DO IF MAS1[W2]=60 THEN BEGIN
FOR Q3:=1 TO 2 DO IF (MAS1[W2+Q3])<>60 THEN GOTO 4;
FOR W3:=1 TO 150 DO CASE MASKA1(MAS1[W2+Q3+W3]) OF
{ 256:}
62: BEGIN
FOR E3:=1 TO 2 DO IF (MAS1[W2+Q3+W3+E3])<>62 THEN GOTO 4;
NACALOT2:=W2+Q3+W3+E3+1;
GOTO 3;
END;
1..61,63..255,257..1000: GOTO 4;
END;

4:
END;

GOTO 5;
3:
FOR W2:=NACALOT2+1 TO Q2 DO IF MAS1[W2]=60 THEN BEGIN
FOR Q3:=1 TO 2 DO IF (MAS1[W2+Q3])<>60 THEN GOTO 6;
FOR W3:=1 TO 150 DO CASE MASKA1(MAS1[W2+Q3+W3]) OF
{ 256:}
62: BEGIN
FOR E3:=1 TO 2 DO IF (MAS1[W2+Q3+W3+E3])<>62 THEN GOTO 6;
KONCELOT2:=W2+Q3+W3+E3;
GOTO 5;
END;
1..61,63..255,257..1000: GOTO 6;
END;

6:
END;



5:
IF KONCELOT2=0 THEN GOTO 100;
DLINATEKSTA:=KONCELOT2-NACALOT2+1;
FOR W2:=1 TO DLINATEKSTA DO MAS2[W2]:=MAS1[NACALOT2+W2-1];
Q2:=FILESIZE(W7);
SEEK(W7,Q2);
BLOCKWRITE(W7,MAS2,DLINATEKSTA);



WRITELN('„ЋЃЂ‚‹…Ќ ”ђЂѓЊ…Ќ’ ’…Љ‘’Ђ');
2:
WRITELN('0 - ‚›•Ћ„');
DELAY(300);
FOR R3:=1 TO 100 DO BEGIN
IF KEYPRESSED = TRUE THEN Q3:=ORD(READKEY);
CASE Q3 OF
0: GOTO 100;
END;
END;

GOTO 7;

99:

100:
CLOSE(W7);
end.

Автор: hardcase 5.10.2007 21:44

Листинг ниасилил.
Но чтото мне подсказывает, что нужно элементарно сформировать http request типа get и сказать его целевому серверу в 80й порт. response'ом будет требуемая html-страничка.

Автор: FreeMan 6.10.2007 0:04

hardcase, +1. это провельный патход.
ХДС, ну или пэхопэ

Автор: xds 6.10.2007 7:54

Еще вариант:
1. Список ссылок -> файл;
2. wget -i <этот файл>;
3. Обработать полученные документы программой на Паскале.

GNU Wget/Win32: http://users.ugent.be/~bpuype/wget/

Автор: SKVOZNJAK 10.10.2007 14:22

Не получится.

wget "mail.ru"

работает
wget "http://top.rbc.ru/incidents/10/10/2007/121992.shtml"

тоже работает. А вот самый интересный пример:
wget "http://www.litportal.ru/genre32/author654/read/page/1/book19712.html"

не грузится. Но даже если с дополнительными опциями и загрузится, от сохранения в формате html толку пшик. Страница перенасыщена скриптами и даже от смены стиля текст насыщается грамматическими ошибками. Сохранять нужно в текстовом формате, а таких опций в утилите не нашёл. 21 страницу не так долго сохранить в мозиле, чуть больше тыканья мышью в опере. Не конкурирует пока такая механизация с ручным трудом blink.gif Вот если б можно было как нибудь сохранять текущую страницу на рабочем столе в формате текстового файла под именем 1.txt двумя кликами мышки rolleyes.gif Вечно разработчики не додумываются до таких простых и полезных функций dry.gif

Автор: hardcase 11.10.2007 2:35

Цитата(SKVOZNJAK @ 10.10.2007 11:22) *
от сохранения в формате html толку пшик. Страница перенасыщена скриптами

Ну, можно извратиться и написать xslt конвертер (используется для преобразования xml файлов и строгих html) который грохнет <script> </script> теги, <img/> и прочие ненужные, на вскидку, он займет строк 20-30. Кроме того, для процедурных языков есть регулярные выражения, с которыми воообще можно творить чудеса.

Автор: SKVOZNJAK 11.10.2007 15:34

А толку? Это теоретические методы плохо совмещаемые с существующими реалиями. Тот кто шаблон таких страниц разрабатывал мыслил симметрично и о таких мелочах позаботился. Попробуй в броузере зайти по последней ссылке и сохрани страницу в html А затем просмотри результат блокнотом. А вот в текстовом формате опера делает практически скриншот того что есть на экране. С этим уже можно работать.
Составлять файл со списком адресов долго. Это имееет смысл если следущий адрес нельзя вычислить. В противном случае можно задать адреса только первой и последней страницы, они отличаются всего одной цифрой. Оставшиеся адреса прога вычислит самостоятельно. Последовательность работы такая:
1 Получить данные в командной строке.
2 Вычислить адрес нужной страницы.
3 Дать задание броузеру или утилите в командной строке.
4 Обработать и удалить текстовой файл.
5 При необходимости гото 2;
6 Закрытие открытого файла и выход.

Автор: Atos 11.10.2007 21:21

[немного оффтоп]
Вот ещё очень простой способ сохранять сохранять файл по ссылке для Delphi (немного модифицированный мной пример из DRKB). просто сохранять, не в текстовом виде


Прикрепленные файлы
Прикрепленный файл  Downloading.pas ( 1.58 килобайт ) Кол-во скачиваний: 212

Автор: hardcase 12.10.2007 5:26

Последняя ссылка конечно интересна.

Код
"http://www.litportal.ru/genre32/author654/read/page/1/book19712.html"

Только проблема в том, что браузер строит эту страничку скриптом - в некоторый момент происходит постбек - подргрузка контента (Чистовика), если догове время посидеть под JavaScript отладчиком (например в FireFox2), можно понять, как строится тот постбек и элементарно вычислить, откуда грузятится контент - т.е. хакнут защиту, сейчас уже поздно заниматься сим делом, потерплю до завтра....