delphi+web
От: .smoke Россия  
Дата: 09.07.02 08:11
Оценка:
Вот уже давно не могу решить такую проблему (вернее не знаю как).
Есть сайт, с авторизацией через CGI. Моей программе надо с этого сайта брать странички. Чтобы
их брать, нужно знать ID сессии который появляется в URL после авторизации.
Так вот как в Дельфи мне сделать такого рода авторизацию, чтобы не заставлять пользователя лишний раз запускать IE, а
потом моей проге давать ID?
Re: delphi+web
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 09.07.02 08:14
Оценка:
Здравствуйте .smoke, Вы писали:

.>Вот уже давно не могу решить такую проблему (вернее не знаю как).

.>Есть сайт, с авторизацией через CGI. Моей программе надо с этого сайта брать странички. Чтобы
.>их брать, нужно знать ID сессии который появляется в URL после авторизации.
.>Так вот как в Дельфи мне сделать такого рода авторизацию, чтобы не заставлять пользователя лишний раз запускать IE, а
.>потом моей проге давать ID?

Почитать RFC на HTTP, в частности раздел, касаемо передаваемого клиенту параметра


Set-Cookie


С помощью Set-Cookie чаще всего код сессии и передается...
Re: delphi+web
От: Hacker_Delphi Россия  
Дата: 09.07.02 08:46
Оценка:
Здравствуйте .smoke, Вы писали:

.>Вот уже давно не могу решить такую проблему (вернее не знаю как).

.>Есть сайт, с авторизацией через CGI. Моей программе надо с этого сайта брать странички. Чтобы
.>их брать, нужно знать ID сессии который появляется в URL после авторизации.
.>Так вот как в Дельфи мне сделать такого рода авторизацию, чтобы не заставлять пользователя лишний раз запускать IE, а
.>потом моей проге давать ID?

Все зависит от того, каким способом CGI передает параметры авторизации... если через get — все просто: генериш нужный запрос — и все ок!.
если же через post — все сложнее. нужно создать html форму, в которой заранее забиты нужные значения. (делается через загрузку странички в компонент WebBrowser и дальнейший разбор странички посредством MSHTML (там описания интерфейсов для DOM). и далее изменением ентих значений. после ентого говоришь формочке submit — и ты в дамках!
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: delphi+web
От: .smoke Россия  
Дата: 09.07.02 09:01
Оценка:
Здравствуйте Hacker_Delphi, Вы писали:

HD>если же через post — все сложнее.


Именно так

HD>нужно создать html форму, в которой заранее забиты нужные значения. (делается через загрузку странички в компонент HD>WebBrowser и дальнейший разбор странички посредством

HD>MSHTML (там описания интерфейсов для DOM). и далее изменением
HD>ентих значений. после ентого говоришь формочке
^^^^^ Про ето можно поподробней. Что это вообще такое?
HD>submit — и ты в дамках!

Идея понятна — большое спасибо, вот только что такое MSHTML?
Re[3]: delphi+web
От: Hacker_Delphi Россия  
Дата: 10.07.02 01:45
Оценка:
Здравствуйте .smoke, Вы писали:

.>Здравствуйте Hacker_Delphi, Вы писали:


HD>>если же через post — все сложнее.


.>Именно так


HD>>нужно создать html форму, в которой заранее забиты нужные значения. (делается через загрузку странички в компонент HD>WebBrowser и дальнейший разбор странички посредством

HD>>MSHTML (там описания интерфейсов для DOM). и далее изменением
HD>>ентих значений. после ентого говоришь формочке
.> ^^^^^ Про ето можно поподробней. Что это вообще такое?
HD>>submit — и ты в дамках!

.>Идея понятна — большое спасибо, вот только что такое MSHTML?


ентих === этих

MSHTML — Microsoft'овская библиотека, описана в %WinSysDir%\mshtml.tlb
там описаны интерфейсы, через которые можно разобрать весь документ HTML по кусочкам, как их VBScript или JScript.
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: delphi+web
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.07.02 03:03
Оценка:
Здравствуйте Hacker_Delphi, Вы писали:

HD>Все зависит от того, каким способом CGI передает параметры авторизации... если через get — все просто: генериш нужный запрос — и все ок!.

HD>если же через post — все сложнее. нужно создать html форму, в которой заранее забиты нужные значения. (делается через загрузку странички в компонент WebBrowser и дальнейший разбор странички посредством MSHTML (там описания интерфейсов для DOM). и далее изменением ентих значений. после ентого говоришь формочке submit — и ты в дамках!
За каким лешим так извращаться?
0. Скорее всего логин принимает параметры как в пост, так и в гет виде. То, что форма использует пост — это просто дань приличиям (не показывать пароли в урлах и не хранить их в хистори). 128 против 1 что серверу наплевать.
1. Если это не так, то можно просто состряпать Html формы в минимальном виде, т.е. просто
"<body onload = 'document.forms("form1").submit()'><form id='form1' action='http://somserver/login.cgi' method=post><input type=hidden name='user_name' value='%d'>...</form></body>"
Значения параметров вставлять при помощи функции Format. Не нужен тут никакой MSHTML. Это ж из BFG9000 по комарам.
2. Можно вообще не париться с этим, а сделать нормальный пост-запрос вручную. Он клепается очень просто, даже проще чем гет, т.к. не нужно ничего енкодить. Поскольку никаких аттачментов не предполагается (это же логин!), то не нужно знать всяких маймов.
3. Далее, в исходном посте вроде бы указано, что идентификатор сессии приходит в урле, а не кукой. То есть происходит редирект. При первом способе это отлавливается заглядыванием в урл браузера, при втором — надо поймать redirect response и вытащить урл из него. Далее следует примитивный парсинг.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: delphi+web
От: .smoke Россия  
Дата: 10.07.02 05:50
Оценка:
Здравствуйте Sinclair, Вы писали:

S>2. Можно вообще не париться с этим, а сделать нормальный пост-запрос вручную. Он клепается очень просто, даже проще чем гет, т.к. не нужно ничего енкодить.


И последний вопрос: Как сделать пост запрос (если можно примерчик или сылочку) ?
Re[4]: delphi+web
От: .smoke Россия  
Дата: 10.07.02 18:50
Оценка:
Здравствуйте .smoke, Вы писали:

.>Здравствуйте Sinclair, Вы писали:


S>>2. Можно вообще не париться с этим, а сделать нормальный пост-запрос вручную. Он клепается очень просто, даже проще чем гет, т.к. не нужно ничего енкодить.


.>И последний вопрос: Как сделать пост запрос (если можно примерчик или сылочку) ?


немного подумав, пыаюсь сделать следующее:
[pascal]
zapros := 'login=lalala&password=lalala';
PD := '';
PD := 'http://www.hotlog.ru/cgi-bin/hotlog/auth HTTP/1.0'+#13+#10;
PD := PD + 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms excel,application/msword, */*' + #13+#10;
PD := PD + 'Referer: http://www.hotlog.ru/index.shtml'+#13+#10;
PD := PD + 'Accept-Language: ru'+#13+#10;
PD := PD + 'Content-Type: application/x-www-form-urlencoded'+#13+#10;
PD := PD + 'Accept-Encoding: gzip, deflate'+#13+#10;
PD := PD + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; MSNIA; Windows 98; DigExt; AIRF)' +#13+#10;
PD := PD + 'Host: www.hotlog.ru' +#13+#10;
PD := PD + 'Content-Length: '+IntToStr(length(zapros))+#13+#10+#13+#10;
NMHTTP1.Post('http://www.hotlog.ru', PD);
[pascal]

На что получаю ответ:
405 Method Not Allowed
Method Not Allowed
The requested method POST is not allowed for the URL /index.shtml.
Apache/1.3.19 Server at www.hotlog.ru Port 80

Это что значит, что вообще не могу сделать POST запрос или что я его просто неправильно делаю?
Re[5]: delphi+web
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 11.07.02 04:07
Оценка:
Здравствуйте .smoke, Вы писали:

.>Это что значит, что вообще не могу сделать POST запрос или что я его просто неправильно делаю?


POST должен обрабатываться CGI. Просто файл тебе сервер
перезаписывать не будеть
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[5]: delphi+web
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.07.02 06:27
Оценка:
Здравствуйте .smoke, Вы писали:

.>Здравствуйте .smoke, Вы писали:


.>>Здравствуйте Sinclair, Вы писали:


S>>>2. Можно вообще не париться с этим, а сделать нормальный пост-запрос вручную. Он клепается очень просто, даже проще чем гет, т.к. не нужно ничего енкодить.


.>>И последний вопрос: Как сделать пост запрос (если можно примерчик или сылочку) ?


.>немного подумав, пыаюсь сделать следующее:

.>
.>  zapros := 'login=lalala&password=lalala';
.>  PD := '';
.>  PD := 'http://www.hotlog.ru/cgi-bin/hotlog/auth HTTP/1.0'+#13+#10;
.>  PD := PD + 'Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms excel,application/msword, */*' + #13+#10;
.>  PD := PD + 'Referer: http://www.hotlog.ru/index.shtml'+#13+#10;
.>  PD := PD + 'Accept-Language: ru'+#13+#10;
.>  PD := PD + 'Content-Type: application/x-www-form-urlencoded'+#13+#10;
.>  PD := PD + 'Accept-Encoding: gzip, deflate'+#13+#10;
.>  PD := PD + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; MSNIA; Windows 98; DigExt; AIRF)' +#13+#10;
.>  PD := PD + 'Host: www.hotlog.ru' +#13+#10;
.>  PD := PD + 'Content-Length: '+IntToStr(length(zapros))+#13+#10+#13+#10;
.>  NMHTTP1.Post('http://www.hotlog.ru', PD);
.>


.>На что получаю ответ:

.>405 Method Not Allowed
.>Method Not Allowed
.>The requested method POST is not allowed for the URL /index.shtml.
.>Apache/1.3.19 Server at www.hotlog.ru Port 80

.>Это что значит, что вообще не могу сделать POST запрос или что я его просто неправильно делаю?

Неправильно делаешь пост-запрос. Посмотри содержимое хидера запроса (NMHTTP1.SendHeader), создав обработчик евента NMHTTP1.OnAbountToSend
Я вообще-то не очень с этими NM -компонентами знаком. Но я совершенно уверен, что они и сделаны для того, чтобы избежать формирования хидера вручную. Тот хидер, который подготовлен таким кодом, надо прямо в сокет пихать. А этот враппер, скорее всего, гораздо меньше всего ожидает. Щас зарегистрюсь на хотлоге — поиграю.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: delphi+web
От: Hacker_Delphi Россия  
Дата: 11.07.02 06:51
Оценка: 1 (1) -1
Здравствуйте Sinclair, Вы писали:

S>Здравствуйте Hacker_Delphi, Вы писали:


HD>>Все зависит от того, каким способом CGI передает параметры авторизации... если через get — все просто: генериш нужный запрос — и все ок!.

HD>>если же через post — все сложнее. нужно создать html форму, в которой заранее забиты нужные значения. (делается через загрузку странички в компонент WebBrowser и дальнейший разбор странички посредством MSHTML (там описания интерфейсов для DOM). и далее изменением ентих значений. после ентого говоришь формочке submit — и ты в дамках!
S>За каким лешим так извращаться?
S>0. Скорее всего логин принимает параметры как в пост, так и в гет виде. То, что форма использует пост — это просто дань приличиям (не показывать пароли в урлах и не хранить их в хистори). 128 против 1 что серверу наплевать.
Насчет скорее всего — наоборот, сорее всего — тока POST.
S>1. Если это не так, то можно просто состряпать Html формы в минимальном виде, т.е. просто
S>"<body onload = 'document.forms("form1").submit()'><form id='form1' action='http://somserver/login.cgi' method=post><input type=hidden name='user_name' value='%d'>...</form></body>"
S>Значения параметров вставлять при помощи функции Format. Не нужен тут никакой MSHTML. Это ж из BFG9000 по комарам.
S>2. Можно вообще не париться с этим, а сделать нормальный пост-запрос вручную. Он клепается очень просто, даже проще чем гет, т.к. не нужно ничего енкодить. Поскольку никаких аттачментов не предполагается (это же логин!), то не нужно знать всяких маймов.
S>3. Далее, в исходном посте вроде бы указано, что идентификатор сессии приходит в урле, а не кукой. То есть происходит редирект. При первом способе это отлавливается заглядыванием в урл браузера, при втором — надо поймать redirect response и вытащить урл из него. Далее следует примитивный парсинг.
И все-таки самый простой способ, с учетом того, что нужно как можно меньше усилий затратить — это:
Главные плюсы:
  1. не нужно самому маяться с header'ами HTTP (в свое время наигрался, когда писал свой HTTP сервер, так что могу заверить — даже при наличии RFC проблем хватит).
  2. можно после автоматического входа дать Юзверю возможность погулять по сайту не показывая никаких строк адресов (тока надо отлавливать OnNewWindow2) в TWebBrowser.
  3. Можно спокойно обойтись и без MSHTML- достаточно присвоить значение TWebBrowser.Document в переменную OleVariant — и работать в точности так же, как из JavaScript с объектом Document.
  4. Можно и дальше все странички качать через TWebBrowser, тока по NavigateCompleate2 сохранять в файл (?) OleVariant(TWebBrowser.Document).innerHTML — и все.
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[4]: delphi+web
От: .smoke Россия  
Дата: 12.07.02 10:54
Оценка:
Здравствуйте Hacker_Delphi, Вы писали:

HD>И все-таки самый простой способ, с учетом того, что нужно как можно меньше усилий затратить — это:

HD>
Большое спасибо! Именно так и сделал — все работает на ура.
Только вот еще такой вопрос: Если я сделал
WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2, iDoc);
Его потом перед след использованием освобождаь обязательно?
Re[5]: delphi+web
От: Hacker_Delphi Россия  
Дата: 15.07.02 02:10
Оценка:
Здравствуйте .smoke, Вы писали:

.>Здравствуйте Hacker_Delphi, Вы писали:


HD>>И все-таки самый простой способ, с учетом того, что нужно как можно меньше усилий затратить — это:

HD>>
.>Большое спасибо! Именно так и сделал — все работает на ура.

.>Только вот еще такой вопрос: Если я сделал
.>WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2, iDoc);
.>Его потом перед след использованием освобождаь обязательно?
если iDoc — локальная переменная, то не надо — само освободится, а если не локальная — надо обязательно, либо же не инициализировать заново (правда не факт, что оно не изменится за время между вызовами).
Кстати, проще было написать так:
iDoc := WebBrowser.Document as IHTMLDocument2;

по крайней мере, В Delphi 6 именно так.
--- cut here ---
Hint:
В Delphi вместо использования вызова QueryInterface можно писать так:
  SomeInterfaceVariable := AnotherInterfaceVariable as SomeInterface;

Delphi все равно откомпилирует как вызов к QueryInterface да еще и с проверкой результата, а читабельность — выше

--- cut here ---
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[6]: delphi+web
От: sectus  
Дата: 19.06.06 02:53
Оценка:
Здравствуйте, Hacker_Delphi, smoke, Вы писали...
а можно получить рабочий примерчик о том. что вы тут говорили. ато срочно нужно сделать заполнение авторизации через delphi интерфейс и выдавать страницу пользователю (проделав за него на сайте некоторуе действия)... воть, если можно, то пошлите на почту
sectus@mail.ru
Время не ждет...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.