Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Парсинг HTML (http://forum.oszone.net/showthread.php?t=243297)

Smasher 24-09-2012 16:50 1994023

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

HTML код:

<form name="login" method="post" action="/index.php?again=yes">
<input type="hidden" name="security_token" value="kYuaS/i/YsUp9TzXrRg7NOzaIUy4+auW7k73RNkl1ts="> <input type="hidden" name="login_ticket" value="c3b03122aa536e1440bb0091e2dba5f4">
<input type="hidden" name="resolution"  value="">

Интересуют соответственно следующие присваивания: security_token = kYuaS/i/YsUp9TzXrRg7NOzaIUy4+auW7k73RNkl1ts= и login_ticket = c3b03122aa536e1440bb0091e2dba5f4

Следующей командой я сужаю поиск до тэгов: FOR /F "tokens=2,4 delims=<>" %%A IN ('FIND /I "security_token" index.php')

А вот что с этим делать, у меня разобраться не получается. Попытка присвоения а ля DO SET SECTOKLINE = %%A во первых почему-то не совершает присваивания, а во-вторых не обрабатывает второй токен (который, как мне понятно находится в %B)


Ох, а потом ведь ещё придётся переводить спецсимволы в переменной security_token в percent‐encoding, т.е. заменять / на %2F, + на %2B и = на %3D. Это вообще реально?

Dr.DG 24-09-2012 17:08 1994028

Smasher,
CMD/BAT принципиален?
Для парсинга HTML придуманы браузеры, которыми удобно управлять, например, с помощью скриптовых языков.

Smasher 24-09-2012 17:37 1994046

Дело в том, что всё это делается ради того, чтобы совершить WGET'ом авторизацию на одном сайте таким образом:

Код:

:WGET --post-data="security_token=%SECURITY_TOKEN&login_ticket=%LOGIN_TICKET&resolution=&loginname=123&password=123" https://studip.fh-trier.de/index.php --delete.after
А это в свою очередь делается для того чтобы опять-таки WGET'ом вызвать страницу, к которой без авторизации доступа нет. А точнее сделать несколько вызовов в течении 5 секунд.

Iska 24-09-2012 18:20 1994067

Smasher, всё равно без загрузки страницы с формой и последующего разбора посредством DOM не обойтись. Проще всего это сделать на WSH или PoSH. Страница с формой доступна в глобальной сети?

Smasher 24-09-2012 20:13 1994139

Iska, ну так я и загружал первым делом страницу с формой, а потом уже пытался её разобрать. Вообщем, мне неважно какими средствами это сделать, лишь бы достичь вышеуказанной цели. Если говорить ещё конкретнее, мне нужно в определённое время сделать короткий флуд по адресу https://studip.fh-trier.de/sem_verif...m_p ortal.php
Ну чтобы без криминала, например, в течении 10 секунд 20 вызовов. Почему-то первым в голову пришло написать батник с использованием wget.

Страница с формой соответственно находится по адресу studip.fh-trier.de

Foreigner 24-09-2012 21:09 1994169

Smasher, С помощью голого батника универсального решения нет, кто знает какие символы содержат значения.
На примере твоего index.php:
Код:

@echo off
setlocal

for /f "tokens=*" %%i in ('findstr "security_token login_ticket" index.php') do set string="%%i"

set "string="%string:<=%""
set "string="%string:>=%""
set "string=%string:"=%"

for /f "tokens=4,8" %%i in ('set string') do call:1 "%%i" "%%j"

echo %security_token_value%
echo %login_ticket_value%

goto:eof

:1
set "security_token_%~1"
set "login_ticket_%~2"


Bob256 24-09-2012 21:12 1994171

Код:

for /f "tokens=2,4 delims=<>" %%I in ('find /I "security_token" index.php') do (
  for /f "usebackq tokens=4,5,7 delims== " %%K in ('%%I') do if "%%K"=="name" set %%~L=%%~M
  for /f "usebackq tokens=4,5,7 delims== " %%K in ('%%J') do if "%%K"=="name" set %%~L=%%~M
)
echo security_token="%security_token%"
echo login_ticket="%login_ticket%"


Smasher 24-09-2012 21:18 1994175

Bob256, неплохая идея, но у security_token "съедается" последний символ, т.е. знак равенства.

Foreigner, работает, спасибо! Сейчас постараюсь разобраться, что там наколдовано :)

Ещё бы для security_token сделать перевод спецсимволов в URL-кодировку (см. первый пост)

Ortis 24-09-2012 21:34 1994185

Iska, любопытно посмотреть на решение с помощью DOM-технологии.
Но мне кажется что удобнее использовать утилиты типа sed и awk.
Например, с помощью sed эта задача решается в полторы строчки:
Код:

@echo off
cls
set "filehtml=Ваш файл"
FOR /F "tokens=1-4 delims=;," %%A IN ('sed -rn "/<input type/{s/.*(security_token)\x22 value.\x22(.*)\x22\x3E.*(login_ticket)\x22 value.\x22(.*)\x22\x3E.*$/\1;\2,\3;\4/p}" "%filehtml%"') do echo %%B %%D

голый батник не рекомендую использовать, ввиду подножек из спецсимволов.

Bob256 24-09-2012 21:55 1994197

Код:

set security_token=!security_token:/=%%2F!
set security_token=!security_token:+=%%2B!=


Anonymоus 24-09-2012 22:02 1994199

Smasher, вариант с grep и wget :
Код:

@Echo Off
SetLocal EnableDelayedExpansion

Set URL=https://studip.fh-trier.de/index.php?again=yes
Set Page=%Temp%\loginpage.tmp

rem Получаем страницу,особо не отсвечивая и прикидываясь браузером.
wget --no-check-certificate -U "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" --referer "https://studip.fh-trier.de/index.php" "%URL%" -O "%Page%" 1>nul 2>nul


rem Получение требуемого тэга целиком
For /F "tokens=1 delims=<>" %%A In ('grep -Eo "<input.{21}security_token[^<]*>" "%Page%"') Do (
        rem После избавления от символов перенаправления в предыдущем цикле заменяем
        rem двойные кавычки, потому что их нельзя установить в качестве значения delims
        Set Data=%%A&Set Data=!Data:"='!
        rem И вытягиваем ключик
        For /F "tokens=6 delims='" %%B In ("!Data!") Do (Set security_token=%%B)
)
For /F "tokens=1 delims=<>" %%A In ('grep -Eo "<input.{21}login_ticket[^<]*>" "%Page%"') Do (
        Set Data=%%A&Set Data=!Data:"='!
        For /F "tokens=6 delims='" %%B In ("!Data!") Do (Set login_ticket=%%B)
)

Echo security_token:        !security_token!
Echo login_ticket:        !login_ticket!
Pause


Iska 24-09-2012 22:08 1994204

Цитата:

Цитата Ortis
Iska, любопытно посмотреть на решение с помощью DOM-технологии. »

Ничего интересного, разве что надёжнее.

Smasher 24-09-2012 22:44 1994226

Всем спасибо за предложенные варианты, буду разбираться как что работает, очень интересно :)

Насчёт замены спецсимволов предложенный Bob256 вариант работает в случае символов "/" и "+", а со знаком равенства следующая конструкция (построенная мной аналогично предложенным) не работает:

Код:

set security_token=!security_token:==%%3D!
С таким кодом вместо замены символов переменной присваивается значение security_token:==%3D

Smasher 25-09-2012 17:17 1994588

Чтобы не открывать новую тему, спрошу здесь: можно ли посредством BAT запустить несколько процессов параллельно, т.е. не дожидаясь пока закончит выполнение первый, запустить ещё несколько? Ну, например, в линуксе можно было бы это реализовать посредством символа "@" в конце строки, таким образом процесс запускается в бэкграунде. А в Windows я не знаю как это сделать. Если с помощью BAT это сделать невозможно (что я подозреваю так и есть), подскажите каким ещё способом это можно автоматизировать?

Anonymоus 25-09-2012 20:45 1994684

Цитата:

Цитата Smasher
таким образом процесс запускается в бэкграунде »

Что-то вроде этого можно получить, используя "Start" с ключом "/B". При этом отдельного видимого окна не создается, и программа использует для вывода информации уже существующее окно родительского скрипта.
И всё-таки, согласно правилам этого форума - "отдельный вопрос = отдельная тема".


Время: 18:18.

Время: 18:18.
© OSzone.net 2001-