Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: Ekz 
Форум » Все о Delphi » Интернет и сети » Indy и cookies. Эмм. (Проблематичная ситуация выходит.)
Indy и cookies. Эмм.
DublДата: Суббота, 23.10.2010, 23:53 | Сообщение # 1
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Опишу проблему. Я пытаюсь сделать что-то более-менее интересное. Но пока ничего не получается. Т е у меня есть программа в которой нужно перейти по ссылке находясь на сайте авторизованным, модуль в котором есть авторизация. Но после успешной авторизации я никак не могу получить куки и использовать их в дальнейшем.

Т е я в программе нажимаю Button1, авторизуюсь успешно. Затем нажимаю Button2 и соответственно не могу перейти по ссылке, так как я оказываюсь неавторизованным.

У меня есть одно, на мой взгляд решение проблемы: это работать без подпрограмм и использовать не "динамические" компоненты Indy а просто выставить их на форму и работать с idhttp1 все время, и авторизоваться в нем и переходить по ссылке, наверное так получится.

НО!

Я собираюсь делать первый большой(для меня) проект с сетями, и мне не удобно все функции и процедуры делать по нажатию на кнопки и пр. Мне бы хотелось так как я уже начал.

П. С. В основной программе есть процедура перехода по ссылке, ее тоже позже вынесу в тот модуль, где авторизация, как только все получится.

Помогите пожалуйста)) Коды ниже.

Коды программ:

Модуль авторизации:

Code
function DruzLOG(Login, Password:string; CM: TIdCookieManager): string;
var s:TStringList; c:string;  
     Comp: TIdHTTP;
begin  
   Result:='';  
s := TStringList.Create;  
comp:=TIdHTTP.Create(nil);
         CM := TidCookieManager.Create(comp);
         comp.AllowCookies := true;
         comp.CookieManager := CM;
comp.HandleRedirects:= True;
s.add('ref=');  
s.add('login='+login);  
s.add('password='+password);  
s.add('Ok=Войти');  
C:=comp.post('http://vkrugudruzei.ru/login.asp', s);
if pos('http://vkrugudruzei.ru/exit.asp', c)<>0 then
Result:=('Все хорошо. Авторизация прошла.')
else Result:=('Все плохо. Авторизация не прошла.');
comp.Free;
s.Free;  
end;

Код самой программы:

Code

unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, druzlib, StdCtrls, lib, IdHTTP, IdCookieManager,
   IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
   TForm1 = class(TForm)
     Edit1: TEdit;
     Edit2: TEdit;
     Button1: TButton;
     Label1: TLabel;
     Label2: TLabel;
     Memo1: TMemo;
     Label3: TLabel;
     Memo2: TMemo;
     Label4: TLabel;
     Button2: TButton;
     procedure FormCreate(Sender: TObject);
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;
   cook:TIdCookieManager;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
memo1.Clear;
end;

Function druzpoisk:string;
var c:string;
Comp1: TIdHTTP;
begin
result:='';
comp1:=TIdHTTP.Create(nil);
comp1.HandleRedirects:= True;
cook:= TidCookieManager.Create(comp1);
comp1.CookieManager := cook;

c:=comp1.get('http://vkrugudruzei.ru/search/');
if pos('<label for="photos">показывать с фотографией</label><br />', c)<>0 then
result:=('Страница поиска открылась') else
result:=('Страница поиска не открылась');
comp1.Free;
c:='';

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Add(DruzLog(Edit1.text, Edit2.text, cook));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.Lines.add(druzpoisk);
end;

end.
 
AdminДата: Воскресенье, 24.10.2010, 15:15 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Если честно я не совсем уловил суть вопроса. Есть функция авторизации, она вызывается по нажатию на кнопку. А как же иначе? В любом случае будут обработчики клика кнопки. Иначе ни как. Другое дело если в этих обработчиках и будет выполняться код, который должен быть в функции.

Не оказываю помощь через личные сообщения и ICQ
 
DublДата: Воскресенье, 24.10.2010, 15:49 | Сообщение # 3
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Нет нет, в кратце, я хочу чтобы при выполнении функции druzLOG записывались куки при авторизации, а при нажатии второй кнопки(где идет переход по ссыле), записанные куки передавались серверу. Так вот, но так, как сделал я не получается.
 
AdminДата: Воскресенье, 24.10.2010, 16:01 | Сообщение # 4
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Я вот, что думаю. Раз в функцию DruzLOG передается объект типа TIdCookieManager, что по всей видимости и есть куки. Там они передаются создаваемому объекту TIdHTTP. Затем TIdHTTP работает, в результате там должны быть измененные куки. Верно? Вот их если возвратить? И хранить их в глобальной cook:TIdCookieManager главного модуля.

Возвратить можно из функции как обычно возвращает значение функция, но раз там уже занято, тут есть такой выход.

Code
procedure test(var x:integer);
begin
    x := 50;
end;

// а тут вызываем
[...]
var y:integer;
test(y);
ShowMessage(inttostr(y));
[...]

В результате выведет те самые 50. А все из за того самого var в параметрах функции/процедуры


Не оказываю помощь через личные сообщения и ICQ
 
DublДата: Понедельник, 25.10.2010, 23:41 | Сообщение # 5
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Хм, я тут подумал, а если делать не через инди, вернее как, запросы делать инди, а как иначе можно получить куки? я могу даже выложить что нужно сграбить. Щас минуточку.

Добавлено (24.10.2010, 17:15)
---------------------------------------------
Так так так. Я посылаю программный запрос номер 1. в ответном хедере получаю:

Code

Set-Cookie:inviteGUID=; expires=Sat, 23-Oct-2010 10:05:06 GMT; path=/
Set-Cookie:Classmates%5FSessionID%5Fv2=7134C922514946AEB81B8E614EBFF54E; expires=Wed, 03-Nov-2010 11:05:06 GMT; domain=.vkrugudruzei.ru; path=/
Set-Cookie:Classmates%5FUserID%5Fv2=9969120; expires=Wed, 03-Nov-2010 11:05:06 GMT; domain=.vkrugudruzei.ru; path=/
Set-Cookie:inviteID=; expires=Sat, 23-Oct-2010 10:05:06 GMT; path=/
Set-Cookie:ASPSESSIONIDASQSBRAR=ECOCDMDBJLMNACNNFLEDNOIP; path=/

Так затем меня редиректит и автоматически я посылаю 2ой запрос. Вот куки которые я отсылаю в автоматическом втором запросе:

Code

Cookie:ASPSESSIONIDASQSBRAR=ECOCDMDBJLMNACNNFLEDNOIP

На этот автоматический второй запрос я получаю в ответном хедере вот какие куки:

Code

Set-Cookie:FakeFactoryChecked=Yes; expires=Mon, 25-Oct-2010 10:05:06 GMT; domain=.vkrugudruzei.ru; path=/
Set-Cookie:ASPSESSIONIDQSQCSBAT=CJECIAGBDGFAJAHKKMKEJMJM; path=/

Вот оно что получается. Когда я браузером отправляю запрос на переход по ссылке уже с авторизованного профиля я отправляю запрос сам + такие куки:

Code

Cookie:FakeFactoryChecked=Yes; partnerID=30; Classmates%5FUserID%5Fv2=9969120;  
Classmates%5FSessionID%5Fv2=7134C922514946AEB81B8E614EBFF54E

B вот эти куки

Code
Cookie:FakeFactoryChecked=Yes; partnerID=30; Classmates%5FUserID%5Fv2=9969120;  
Classmates%5FSessionID%5Fv2=7134C922514946AEB81B8E614EBFF54E

я должен программно сграбить и отправить в программном запросе на переход по ссылке с авторизованного профиля. Как же мне их сграбить так и отправить потом? Вот это делема((

Добавлено (25.10.2010, 23:41)
---------------------------------------------
/forum/6-453-1 переехал в эту тему.

 
Форум » Все о Delphi » Интернет и сети » Indy и cookies. Эмм. (Проблематичная ситуация выходит.)
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2018
Хостинг от uCoz