Показать полную графическую версию : Парсинг 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. Это вообще реально?
Smasher,
CMD/BAT принципиален?
Для парсинга HTML придуманы браузеры, которыми удобно управлять, например, с помощью скриптовых языков.
Дело в том, что всё это делается ради того, чтобы совершить 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 секунд.
Smasher, всё равно без загрузки страницы с формой и последующего разбора посредством DOM не обойтись. Проще всего это сделать на WSH или PoSH. Страница с формой доступна в глобальной сети?
Iska, ну так я и загружал первым делом страницу с формой, а потом уже пытался её разобрать. Вообщем, мне неважно какими средствами это сделать, лишь бы достичь вышеуказанной цели. Если говорить ещё конкретнее, мне нужно в определённое время сделать короткий флуд по адресу https://studip.fh-trier.de/sem_verify.php?id=b66f14b17a9ad2b7476a12758fd07c9c&send_from_search=1&send_from_search_page=%2Fsem_portal.php
Ну чтобы без криминала, например, в течении 10 секунд 20 вызовов. Почему-то первым в голову пришло написать батник с использованием wget.
Страница с формой соответственно находится по адресу studip.fh-trier.de (https://studip.fh-trier.de/index.php?again=yes)
Foreigner
24-09-2012, 21:09
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"
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%"
Bob256, неплохая идея, но у security_token "съедается" последний символ, т.е. знак равенства.
Foreigner, работает, спасибо! Сейчас постараюсь разобраться, что там наколдовано :)
Ещё бы для security_token сделать перевод спецсимволов в URL-кодировку (см. первый пост)
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
голый батник не рекомендую использовать, ввиду подножек из спецсимволов.
set security_token=!security_token:/=%%2F!
set security_token=!security_token:+=%%2B!=
Anonymоus
24-09-2012, 22:02
Smasher, вариант с grep (http://gnuwin32.sourceforge.net/packages/grep.htm) и wget (http://gnuwin32.sourceforge.net/packages/wget.htm) :
@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, любопытно посмотреть на решение с помощью DOM-технологии. »
Ничего интересного, разве что надёжнее.
Всем спасибо за предложенные варианты, буду разбираться как что работает, очень интересно :)
Насчёт замены спецсимволов предложенный Bob256 вариант работает в случае символов "/" и "+", а со знаком равенства следующая конструкция (построенная мной аналогично предложенным) не работает:
set security_token=!security_token:==%%3D!
С таким кодом вместо замены символов переменной присваивается значение security_token:==%3D
Чтобы не открывать новую тему, спрошу здесь: можно ли посредством BAT запустить несколько процессов параллельно, т.е. не дожидаясь пока закончит выполнение первый, запустить ещё несколько? Ну, например, в линуксе можно было бы это реализовать посредством символа "@" в конце строки, таким образом процесс запускается в бэкграунде. А в Windows я не знаю как это сделать. Если с помощью BAT это сделать невозможно (что я подозреваю так и есть), подскажите каким ещё способом это можно автоматизировать?
Anonymоus
25-09-2012, 20:45
таким образом процесс запускается в бэкграунде »
Что-то вроде этого можно получить, используя "Start" с ключом "/B". При этом отдельного видимого окна не создается, и программа использует для вывода информации уже существующее окно родительского скрипта.
И всё-таки, согласно правилам этого форума - "отдельный вопрос = отдельная тема".
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.