Сам себе браузер

CWICWEB, ClarioNET и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Мне нужно заслать СВОИ данные на уже существующий сайт. Якобы я браузером прочитал страничку, занёс данные в поля и отправил обратно. С тем, чтобы сайт решил, что я ручками заполнил нужные поля и нажал нужную кнопку. А я хочу сделать то же самое, но программно.

В MSDN есть функции HTTPSendRequest (HttpSendRequestEx) . Они, скорее всего, и делают то что надо.

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@renet.com.ru (дом)
ICQ#75924439

Не могли бы Вы поделиться результатом изысканий? Я имею в виду, воспользовались ли Вы каталистой или другим продуктом или, наоборот, HttpSendRequest'ом? Возникла совершенно аналогичная задача - послать запрос, предварительно проинициализировав списки месяцев и годов на веб-странице.

С уважением, Михаил.
Я имею в виду, воспользовались ли Вы каталистой или другим продуктом или, наоборот, HttpSendRequest'ом? Возникла совершенно аналогичная задача - послать запрос, ...
Угу. Именно так.
... предварительно проинициализировав списки месяцев и годов на веб-странице.
Могу. http://www.tacis-dipol.ru/fil/ftp.zip

Там класс для считывания и записи данных.
А звучит примерно так.

Код: Выделить всё

F                   CLASS(Chttp)                          
                     END           


          F.SetUserName(Loc:userName,loc:Password)
          F.SetProxy(Loc:Proxy)
          F.Connect(Loc:Address,Loc:Port)
          If F.Error()
             Stop('Connect Error:' & F.Error)
          Else
            ... Подготовка полей к передаче ... 
            F.AddData('Id',Field)
            ...
            F.GetData(Loc:Url)
            ! Теперь F.Response содержит принятый текст или F.Error сообщение об ошибке 
          End
---------------------------------------
C уважением,
Юрий Философов
Написал: ClaList(2)
Гость

Сообщение Гость »

Здравствуйте, Юрий.
Спасибо за помощь. Только не получается что-то. Когда я вызываю PostData, получаю ошибку "NAME NOT RESOLVED".
Может кто знает, как на странице
http://www.drugreg.ru/Bases/WebRemoveQuery.asp
выбрать месяц и год и нажать кнопку "Month - вывести данные"?

С уважением, Михаил

У меня тоже не получается с этой страницей :( . Вообще зависает .

---------------------------------------
C уважением,
Юрий Философов

(Добавление)

Гады они :)
В общем примерно так, берем прямо их пример запроса (внизу страницы):

telnet http://www.drugreg.ru 80

Запрос:
GET /Bases/WebRemoveQuery.asp?Action=FIND&MnfNmR=%D3%F0%E0%EB%E1%E8%EE%F4%E0%F0%EC HTTP/1.1
Host: http://www.drugreg.ru

Сервер выдает 302-й код (moved temporarily) и выставляет куку. Нас интересуют 2 поля:
Location: WebRemoveList.asp
Set-Cookie: ASPSESSIONIDSQTRRSAA=HHFMHKOCNLEOCMMLFPHMHELG; path=/

Формируем новый запрос с учетом Location и полученной куки:

GET WebRemoveQuery.asp HTTP/1.1
Host: http://www.drugreg.ru
Cookie: ASPSESSIONIDSQTRRSAA=FEFMHKOCHOIBJKEPCNNAGCHJ; path=/

После чего получаем от сервера то, что просили.
То есть надо или доработать класс Юрия на предмет добавления Cookie: xxx в заголовки для HTTPSendRequest, или прямо через сокет гнать.

--
Best regards,
Maxim Yemelyanov
ICQ#75924439
Если мне не изменяет "ICQ user detail"
Юрия Философова можно поздравить с Днем Рождения!
Что я и делаю :)

--
С уважением,
Алексей Дынин
daa@polad.ru

Всем спасибо, уважили ... :)

---------------------------------------
C уважением,
Юрий Философов
Может кто знает, как на странице http://www.drugreg.ru/Bases/WebRemoveQuery.asp выбрать месяц и год и нажать кнопку "Month - вывести данные"?
Без установленных кук не сработает.
Юрий, доработайте ваши классы: в Chttp добавьте метод AddCookie. И еще можно добавить класс Ccookie, а AddCookie вызывать, передавая ему екземпляр/список екземпляров Ccookie.
У меня тоже не получается с этой страницей :( . Вообще зависает .
Зависает на отправке запроса, или на приеме?

PS. С Днем Рождения!

--
Best regards,
Maxim Yemelyanov

С днем рождения, Юрий!

Та же ошибка, когда подставляю http://www.gg.ru
Видимо, что-то делаю не так. В Connect и PostData передаю http://www.gg.ru. Может, надо по другому?

Максим, я не понял, куки надо добавлять всегда?

С уважением, Михаил.

(Добавление)
Видимо, что-то делаю не так. В Connect и PostData передаю http://www.gg.ru. Может, надо по другому?
Ошибка с зависанием? Просто я не тестировал классы Юрия, я в код смотрел.
Максим, я не понял, куки надо добавлять всегда?
Форма поиска туров у меня отработала и без кук. Не отрабатывает что-то другое?

Просто в случае с http://www.drugreg.ru без этого не срабатывало.
Кроме того на всех сайтах, где для просмотра нужна регистрация надо работать с куками - отсылка формы логина, получение куки, и последующее использование этой куки для всех страниц, попадающих под path этой куки.

--
Best regards,
Maxim Yemelyanov

Привет, Максим!
Слушай, а почему запрос по первой форме (где наименование и производитель) работает напрямую:
http://www.drugreg.ru/Bases/WebRemoveQu ... MnfNmR=ged
а по второй нет:
http://www.drugreg.ru/Bases/WebRemoveQu ... tYear=2004

Михаил

С тонкостями работы WML не знаком, а WAP-браузеров у меня на машине нет, чтоб поиграться.

--
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)
Гость

Сообщение Гость »

Слушай, Максим.
Я создаю файл

Код: Выделить всё

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<form action="http://www.drugreg.ru/Bases/WebRemoveQuery.asp?Action=MONT"
method="post">
  <input name="Отправить" type="submit" value="Отправить">
  <input type="text" size="30" name="lstSelectMonth" value="7">
  <input type="text" size="30" name="lstSelectYear" value="2001">
</form>
</body>
</html>
загружаю его в броузер, жму кнопку и получаю что мне надо. А как бы его
программно грузить? То есть лежит он, скажем, на c:\docs\webremove.html, как
послать запрос?

С уважением, Михаил

Бравзер видимо с разрешенными куками? Потому, что ежели я в своей мозилке блокирую куки с этого сайта, то фиг он мне что-нибудь покажет.
А как бы его программно грузить? То есть лежит он, скажем, на c:\docs\webremove.html, как послать запрос?
"Чем послать запрос" - в этом вопрос.
Ежели работать с сокетами, то подключиться к http://www.drugreg.ru:80, послать ему:

GET /Bases/WebRemoveQuery.asp?Action=MONT HTTP/1.1
Host: http://www.drugreg.ru
Content-Length: 35 <--- это длина передаваемых POST-ом данных

lstSelectMonth=7&lstSelectYear=2001

, после чего прочитать из сокета ответ. Практика показывала (не помню точно, когда и почему), что иногда read возвращает только заголовки HTTP, тогда надо проверить, нет ли в заголовках Content-Length, и если есть, и тело документа еще не прочитано, то дочитать из сокета указанное число байт.

Ну или воспользоваться чем-то готовым catalystическим.

WinInet для работы с HTTP ни разу не использовал. Как в нем идет работа с GET/POST данными и куками - на сильно в курсе. Из прочитанного в MSDN вчера следует, что любые HTTP заголовке можно (придется?) обрабатывать руками.

--
Best regards,
Maxim Yemelyanov

Да, с куками.
WinInet для работы с HTTP ни разу не использовал. Как в нем идет работа с GET/POST данными и куками - на сильно в курсе. Из прочитанного в MSDN вчера следует, что любые HTTP заголовке можно (придется?) обрабатывать руками.
Я в общем запутался в 2-х соснах
hSession =
InternetOpen(Agent,INTERNET_OPEN_TYPE_PRECONFIG,,,INTERNET_FLAG_NO_CACHE_WRITE)
hUrl = InternetOpenUrl(hSession, Url,,0,INTERNET_FLAG_NO_CACHE_WRITE,0)

Чего надо подставить в Url, чтобы локальный файл прочитать? Пробовал Url='http://localhost/C:/docs/test.html' ругается на какие-то манифесты и полисы (GetLastError возвращает что-то вроде 12008).
Видать, где-то какие-то флаги надо расставить правильно?

С уважением, Михаил

А на localhost-е у тебя сервер запущен? :)

Локальный файл - это file://
Только я не понял, что ты потом с этим локальным файлом делать собрался?
... ругается на какие-то манифесты и полисы (GetLastError возвращает что-то вроде 12008).
Видать, где-то какие-то флаги надо расставить правильно?
Для такого случая - вряд ли. Хотя, можно указать INTERNET_FLAG_NO_CACHE_WRITE.
По RFC данные, полученные в результате POST запроса не должны кешироваться, но кто этих мелкомягких знает... 6-я Опера, например, может закешировать.

--
Best regards,
Maxim Yemelyanov
А на localhost-е у тебя сервер запущен? :)
Не-а...
Локальный файл - это file://
Только я не понял, что ты потом с этим локальным файлом делать собрался?
Его урлу подсунуть в InternetOpenUrl.

Дуга Михаил
Видать, где-то какие-то флаги надо расставить правильно?
Это надо у себя открыть веб-сервер и должным образом сконфигурить... Блин, руки не доходят разобраться в библиотеке, может быть, в выходные разберусь. Но для интранета работает....

---------------------------------------
C уважением,
Юрий Философов

(Добавление)
Его урлу подсунуть в InternetOpenUrl.
А дальше?

--
Best regards,
Maxim Yemelyanov

Он открывает drugreg.ru, я его читаю. Меня терзают смутные сомненья - что, всё не так?

Дуга Михаил
Написал: ClaList(2)
Гость

Сообщение Гость »

Все не так.

Если в некой форме <form > нажали на Submit (в т.ч. программно), браузер посылает на указанный в action этой формы url (если не указан, то url, содержащий эту форму) методом method (если не указан, то GET) запрос, составленный из значений всех successful элементов ввода, находящихся на этой форме (input, textarea, image, select, etc).
И т.д, в общем, клариона это вовсе не касается.

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

Как послать запрос серверу, показано в классах Юрия. Я показал, как послать запрос, используя сокеты. Я только не знаю, как в WinInet организована работа с куками. Как с ними работать руками, я тоже показал.
Вам остается лишь решить, каким из способов воспользоваться. На файлсерверах есть "пускач" Дегтяренко, можно им. Или все-таки кодом Юрия, тем более, что он обещал доработать классы.

Я бы вам дал свои классы для работы с HTTP, но они на плюсах.

--
Best regards,
Maxim Yemelyanov

Я, честно говоря, не очень понимаю, в чём дело. У меня в интранете всё крутится, как надо - собственно, пока меня это устраивает. А вот c выходом в "Большой Интернет" - не знаю, никак не пройду прокси. Конечно, если кто-то разберётся и доработает - это было бы замечательно, тем более, что тексты открыты.

---------------------------------------
C уважением,
Юрий Философов

(Добавление)

Здравствуйте!
Я запутался сам и запутал всех вокруг.
Максим! Спасибо тебе за подробные разъяснения, но, кажется, всё проще. Вводим в строке браузера http://www.drugreg.ru/Bases/WebRemoveQu ... MnfNmR=ged
и получаем список препаратов с производителем like '%ged%'
Вводим http://www.drugreg.ru/Bases/WebRemoveQu ... tYear=2004
и получаем 'Необходимо выбрать месяц и год для просмотра сведений!'
То есть в первом случае значения передаются, а во втором нет. Вот тут где я ошибаюсь? Неправильно написал строку? Насколько я понял из переписки на эту тему, после ?Action=MONT надо подставить &имя переменной=значение... и сервер их получит? А не получает.
Куки предполагаются всегда вкл.

С уважением, Михаил

Как это - не передаются? Из чего это следует?
Я бы сказал совсем по другому: данные передаются, но в неверном формате.

С уважением,
В.Смелик.

Осталось совсем чуть-чуть: а как правильно-то? Я и кавычил, и в формате %31 значения вписывал.

Михаил

Неправильно не по форме, а по содержаню.
Для аналогии представь себе обращение к чужой процедуре, сидящей в кокой-то DLL. Может играть значение все, вплоть до регистра имен переменных и данных.
Кроме того, ряд скрытых переменных передается и может анализироваться серверной часть. Например, url страницы, с которой послан запрос.

С уважением,
В.Смелик.
Написал: ClaList(2)
Гость

Сообщение Гость »

У меня в интранете всё крутится, как надо - собственно, пока меня это устраивает.
Я не спорю, что у вас все крутится. Но вот 2 вопроса:
1. Как вы будете получать контент страницы, защищенной серверной аутентификацией (Basic или Digest), зная логин/пароль?
2. То же самое, но в случае защиты контента аутентификацией с установкой куки и последующей ее проверки сервером?

В обоих случаях требуется передача дополнительных данных серверу в заголовках HTTP. Вот и вся доработка.

--
Best regards,
Maxim Yemelyanov

1. Не знаю!
2. Не знаю!!
В обоих случаях требуется передача дополнительных данных серверу в заголовках HTTP. Вот и вся доработка.
Максим, ты профессионал, тебе и карты в руки. А я в этом деле полный чайник :) и вдобавок сейчас переброшен на совершенно другой проект. Посмотри, пожалуйста, код и подскажи как. И все тебе будут благодарны.

---------------------------------------
C уважением,
Юрий Философов

(Добавление)
Кроме того, ряд скрытых переменных передается и может анализироваться серверной часть. Например, url страницы, с которой послан запрос.
Url вряд ли. А можно как-то узнать точно, что передаётся, когда я на кнопку жму?

Дуга Михаил

Да. Запустить локальный сервер на к-либо порту (пишется за 3 минуты с использованием готовых сокетных библиотек) и обратиться браузером на него.
Сразу все прояснится.

--
Best regards,
Maxim Yemelyanov

Максим, издеваешься? Я про методы POST и GET только вчера услышал, не говоря уж о сокетах.

Дуга Михаил

Ну я же написал, _что_ передается.
Для GET запрос имеет вид
url?key=value&key=value
вместо & может использоваться ;
Для POST тот же запрос идет в тебе письма.
Кстати, оба вида запросов можно смешивать.
Если запрос со страницы работает, а руками нет, то посмотрите в код html, это поможет понять чего в борще не хватает. Может передается еще что-то, может есть скрытые поля..

--
Best regards,
Maxim Yemelyanov

Дык я этот хтмл уже наизусть выучил. Нет там скрытых полей. Беда прям

С уважением, Михаил

В Asp информация о сеансе хранится в куках :(

---------------------------------------
C уважением,
Юрий Философов

А где они лежат? я бы посмотрел внутри чего есть. Помогите чайнику

Михаил

(Добавление)
То есть в первом случае значения передаются, а во втором нет. Вот тут где я ошибаюсь? Неправильно написал строку? Насколько я понял из переписки на эту тему, после ?Action=MONT надо подставить
&имя переменной=значение... и сервер их получит? А не получает.
Сервер все получает. Но мало ли как написан скрипт обработки для Action=MONT.
Может он ожидает увидеть еще какие-то параметры.

--
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)
Гость

Сообщение Гость »

А где они лежат? я бы посмотрел внутри чего есть. Помогите чайнику
Триллер продолжается.
Нашёл папку Documents & settings\...\Cookies\, грохнул там всё кроме index.dat, гружу страницы разные, а новых файлов не создаётся.

Михаил

(Добавление)
Максим, ты профессионал, тебе и карты в руки. А я в этом деле полный чайник :) и вдобавок сейчас переброшен на совершенно другой проект. Посмотри, пожалуйста, код и подскажи как. И все тебе будут благодарны.
Я посмотрел на существующие модули, подумал... Не буду я это писать (на кларе).
Потому, что уже есть написанное. А самому писать - не оправдано ни по средствам, ни более-менее реально по срокам.
Я имею в виду, написать правильные классы для кук, работы с http, отсылки multipart/form-data форм и т.д...
Почему бы не взять готовое? Отлаженное и проверенное тысячами юзеров на десятках платформ и серверов?


PS. Некоторые задачи я пишу на перле, а потом компилю в бинарники - так проще и быстрее.

You can sometimes _write_ _faster_ _code_ in C, but you can always _write_
_code_ _faster_ in Perl. Because you can use each from the other, combine them
as you wish.

PPS.
perl -MLWP::Simple -e "print get('http://www.drugreg.ru/Bases/WebRemoveQu ... MnfNmR=ged');"
--
Best regards,
Maxim Yemelyanov

get('http://www.drugreg.ru/Bases/WebRemoveQu ... adeNmR=&Mn
fNmR=ged');"
А то же, только
'http://www.drugreg.ru/Bases/WebRemoveQu ... ectMonth=1
&lstSelectYear=2004' сработает? Не сработает. Пример, что ты привёл,
работает у меня и в Кларе.

Михаил
Написал: ClaList(2)
Гость

Сообщение Гость »

Гады они. Но на каждую ж.. найдется свой винт... ;) Получите, распишитесь.
Там сказано, что инфа выдается бесплатно, но надо региться. Ну, надо так надо. Я зарегился, посмотрел на полный вид кук в мозилке, перенес их в скрипт и получилось такое:

Код: Выделить всё

 use LWP::UserAgent;

 my $host = 'http://www.drugreg.ru'; # имя сервера нам понадобится
 my $url = '/Bases/WebRemoveQuery.asp?Action=MONT';
 my $post_data = 'lstSelectMonth=1&lstSelectYear=2004';

 # запрос по методу POST
 my $req = new HTTP::Request POST => $host.$url, undef, $post_data;
 my $ua = LWP::UserAgent->new;

 # это мои куки
 $req->header('Cookie' => [ 'UserID=15380; expires=Wed, 25-May-2005 20:00:00 GMT; path=/'
        , 'UserLastName=web+test; expires=Wed, 25-May-2005 20:00:00 GMT; path=/']);

 # послали запрос, получили ответ. ответ - это объект класса HTTP::Response
 my $r = $ua->request($req);

 if ($r->code == 302)       # если нас редиректнули, повторяем запрос
 {
     warn "Server redirected us to ".$r->headers->header('Location').", re-getting... (with new cookie)";
     # ставим указанную сервером куку
     $req->header('Cookie' => $r->headers->header('Set-Cookie'));
     my $url = $r->headers->header('Location'); # куда нас редиректнули
     $url = $host.$url unless $url =~ m!^http://!; # добавляем имя сервера, если url не полный
     $req = new HTTP::Request GET => $url; # запрос на новый url
     $r = $ua->request($req);
 }

 # печатаем или полученную страницу, или сообщение об ошибке
 print $r->is_success ? $r->content : $r->status_line;
Всё.
Осталось перенесть на клару. Тут уж увольте.

--
Best regards,
Maxim Yemelyanov

Слушай, а нельзя всё, что ты написал, сгенерить в исполняемый модуль и вызывать из клары? А то, боюсь, я тоже не справлюсь с переводом. :(

С уважением, Михаил.

Отож и мне не захотелось переводить.

Я пользуюсь http://www.indigostar.com/perl2exe.htm.
Всего лишь $50. Правда, я пока что не покупал, т.к. имеет смысл купить сразу кроссплатформенный компилер (родной юниксовый, который собирает и под винду).
Как только что-то из перловки пойдет на продажу в бинарном виде, бум думать о покупке.

PS. Для компиляции надо в скриптах указывать некоторые вещи явно, в первую очередь use bytes;

--
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)
Ответить