Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
31 / 31 / 11
Регистрация: 03.02.2011
Сообщений: 182
1

Проблема с куками при отправке запроса

08.04.2012, 16:59. Показов 1762. Ответов 9
Метки нет (Все метки)

Добрый вечер, пользуясь инфой с интернета и своими соображениями написал гулялку по спрашивай ру, проработала пару дней нормально, но затем перестала работать, как я понял авторизация проходит успешно т.к. мне выдает логин юзера под которым я вошел, но, когда я делаю проверку на новые вопросы то мне подгружается страница НЕ авторизованного пользователя, получается после авторизации меня сразу выкидывает, у меня сложилось мнение, что это из-за не правильной передачи куков, мб кто увидет проблему, код программы ниже
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, ExtCtrls, StdCtrls, Umd5, AdvAlertWindow, CoolTrayIcon, Menus;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Timer1: TTimer;
    CoolTrayIcon1: TCoolTrayIcon;
    Button2: TButton;
    Edit3: TEdit;
    Label5: TLabel;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure CoolTrayIcon1Click(Sender: TObject);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1:TForm1;
  HTTP:TIdHTTP;
  PData:TStringList;
  Page, Login, S:String;
  Yes,P,Interval:Integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var HASH:String;
begin
//Создаем список
PData:=TStringList.Create;
//Отправляем заголовки. Начало.
HTTP.Request.Host:='http://sprashivai.ru';
HTTP.Request.Referer:='http://sprashivai.ru';
HTTP.Request.UserAgent:='Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0';
HTTP.Request.ContentType:='application/x-www-form-urlencoded; charset=UTF-8';
//Отправляем заголовки. Конец.
//Отключаем автоматическое принятие Куков
HTTP.AllowCookies:=False;
//Разрешаем автоматический редирект
HTTP.HandleRedirects:=True;
//Перекодируем парот в md5 формат
HASH:=MD5(Edit2.Text);
//Добавляем в список передаваемых параметров логин и пароль
PData.Add('email='+Edit1.Text);
PData.Add('pass='+Hash);
try
//Отправляем POST запрос (передаем список данных)
Page:=HTTP.Post('http://sprashivai.ru/login',PData);
//В переменную S получаем заголовки результата запроса
S:=HTTP.Response.RawHeaders.GetText;
except
//Вывод сообщения об ошибке
ShowMessage('fatal error');
exit;
end;
//Если на страниц найдено слово "error" => произошли проблемы при авторизации
if Pos('error',Page) <> 0
then begin
showmessage('Invalid Pass or login');
Exit;
end
//Иначе
else
begin
//Получаем Логин, под которым вошли и выводим его.
Delete(Page,1,Pos('"username":',Page));
Login:=Copy(Page,Pos('"username":',Page)+12,Length(Page)-13);
showmessage('Вы вошли как: '+Login);
//Если авторизовались - присваиваем еденицу
Yes:=1;
//Обработка Интервала проверки данных. Начало.
//Если Поле Edit3 не пустое то умножаем кол-во минут на 1 минуту в мили сек.
if Edit3.Text <> '' then
Timer1.Interval:=60000*StrToInt(Edit3.Text)
//Иначе по умолчанию выставляем 3 минуты в мили сек.
                    else Timer1.Interval:=1000;
end;
//Обработка Интервала проверки данных. Конец.
//Получени Куков. Начало
showmessage(s);
pos('usersession=',S);
//т.к. у нас 2 вхождения, а нам нужно второе удаляем первое вхождение
delete(S,1,pos('usersession=',S)+12);
//Получаем 28 значный ключ куков
S:=copy(S,pos('usersession=',S)+12,28);
//Добавляем их к нашим отправленным заголовкам
HTTP.Request.CustomHeaders.Add('Cookie: usersession='+S+';SERV=STEALTH117;_ym_visorc =w');
//Получени Куков. Конец
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var QCount:String;
begin
//Если авторизовались то
if Yes = 1 then
begin
//Подгружаем страничку новых вопросов
Page:=HTTP.Get('http://sprashivai.ru/questions/new');
//Ищем строку, сообщающвая о новых вопросах
//QCount:=Copy(Page,Pos('sprashivai.newquestions =',Page) + 26,1);
//Если в строке нет 0 то
//Если кол-во вопросов предыдущего запроса не равно нынещнему выводим сообщение
if pos('0',QCount) = 0 then if StrToInt(QCount) <> p then
begin
showmessage(QCount);
CoolTrayIcon1.IconVisible:=True;
CoolTrayIcon1.ShowBalloonHint('Спрашивай.ру Информер', 'Уважаемый '+Login+'.'+#13' У вас появился новый вопрос, на который вы еще не отвечали!' ,bitInfo, BITSPIXEL);
//Переменной p присваиваем нынещнее значение новых вопросов
p:=StrToInt(QCount);
end;
end;
end;           
 
procedure TForm1.FormCreate(Sender: TObject);
begin
//Создание TIdHTTP
HTTP:=TIdHTTP.Create(Self);
Try
//Подключение к ya.ru для проверки связи
HTTP.Get('http://ya.ru');
Except
//Если не произошло подключение => выдаем сообщения о проблеме с подключением
 ShowMessage('Возможно интернет соеденение отсутствует.'+#13+'Проверьте подключение к интернету!');
End;
P:=0;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
//Выводим иконку в трее
CoolTrayIcon1.IconVisible:=True;
//Сворачиваем форму в трей
CoolTrayIcon1.HideMainForm;
//Выводим сообщение
CoolTrayIcon1.ShowBalloonHint('Спрашивай.ру Информер', 'Программа работает в автономном режиме' ,bitInfo, 20);end;
 
procedure TForm1.CoolTrayIcon1Click(Sender: TObject);
begin
//Скрываем иконку в трее
CoolTrayIcon1.IconVisible:=False;
//Разворачиваем форму
CoolTrayIcon1.ShowMainForm;
end;
 
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
//Разрешаем в Edit3 ввод только цифр
if key in ['0'..'9'] then key:=key else key:=#0;
end;
 
procedure TForm1.N1Click(Sender: TObject);
begin
//Скрываем мконку в трее
CoolTrayIcon1.IconVisible:=False;
//Разворачиваем форму
CoolTrayIcon1.ShowMainForm;
end;
 
procedure TForm1.N2Click(Sender: TObject);
begin
//Закрываем программу
Form1.Close;
end;
 
end.
А вообще ругается, на то что мол строку не моет перевести в цифру, но ясное дело это потому что в не авторизованной странице на том месте, где я ее выдираю нет...
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2012, 16:59
Ответы с готовыми решениями:

Ошибка при отправке post запроса idhttp
help!!!отправляю запрос авторизации в базу данных. ругается на строчку: ...

Обработка SQL-запроса при отправке формы (при нажатии submit)
Добренького Вам настроеница. Как организовать обработку SQL-запроса при нажатии на submit в form,...

Ошибка при отправке POST запроса
Ситуация в следующем программа которую сделал отправляет пост запрос на https выдает ошибку &quot;Could...

IOException при отправке http запроса
Есть данный чудо-код на java. Функция OpenConnection открывает подключение. Подключение - поле...

9
54 / 54 / 4
Регистрация: 15.12.2010
Сообщений: 260
09.04.2012, 09:46 2
Снифер + руки + мозги.
Надо смотреть что уходит/приходит. Нормально ли взялись куки, отправляются они или нет. Ту ли страницу (адрес в браузере не смотреть, подгружаться может совершенно с другого адреса) смотрите для получения данных
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
09.04.2012, 11:31 3
выкладывай весь проект, будет время и настроение посмотрю

P.S.
ну и логин с паролем в личку, а то регестрироваться не охота
1
31 / 31 / 11
Регистрация: 03.02.2011
Сообщений: 182
09.04.2012, 12:15  [ТС] 4
Вот весь проект, использую delphi 7
Вложения
Тип файла: zip myspraw.zip (310.4 Кб, 36 просмотров)
0
31 / 31 / 11
Регистрация: 03.02.2011
Сообщений: 182
09.04.2012, 12:17  [ТС] 5
Цитата Сообщение от smw1975 Посмотреть сообщение
Снифер + руки + мозги.
Надо смотреть что уходит/приходит. Нормально ли взялись куки, отправляются они или нет. Ту ли страницу (адрес в браузере не смотреть, подгружаться может совершенно с другого адреса) смотрите для получения данных
Я снифиром и отслеживал все...
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
09.04.2012, 13:09 6
Huskar, логин и пароль кинь
0
31 / 31 / 11
Регистрация: 03.02.2011
Сообщений: 182
09.04.2012, 14:09  [ТС] 7
Отправил в ЛС
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
09.04.2012, 15:35 8
мдаа... пришлось поломать голову, TIdHTTP настойчиво не хотел принимать куки.
Получилось только после того как я на форму кинул компонент TIdHTTP (почему не работало в динамически созданном не понимаю)
Так же после отсылки post запроса добавь такой код
Delphi
1
2
3
4
5
6
For n:=0 To HTTP.Response.RawHeaders.Count-1 Do
  If (HTTP.Response.RawHeaders.Names[n]='Set-Cookie')and
  (pos('domain',HTTP.Response.RawHeaders.ValueFromIndex[n])>0) Then
    cookie:=HTTP.Response.RawHeaders.ValueFromIndex[n];
cookie:=copy(cookie,1,pos(';',cookie)-1);
HTTP.Request.CustomHeaders.Add('Cookie:usersession='+cookie);
cookie - string;
1
31 / 31 / 11
Регистрация: 03.02.2011
Сообщений: 182
09.04.2012, 17:06  [ТС] 9
Все сделал, как написали, но все равно корректно работать не хочет...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, ExtCtrls, StdCtrls, Umd5, AdvAlertWindow, CoolTrayIcon, Menus;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Timer1: TTimer;
    CoolTrayIcon1: TCoolTrayIcon;
    Button2: TButton;
    Edit3: TEdit;
    Label5: TLabel;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure CoolTrayIcon1Click(Sender: TObject);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1:TForm1;
  HTTP:TIdHTTP;
  PData:TStringList;
  Page, Login, S:String;
  Yes,P,Interval:Integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var HASH, cookie:String;    n:integer;
begin
//Создаем список
PData:=TStringList.Create;
//Отправляем заголовки. Начало.
HTTP.Request.Host:='http://sprashivai.ru';
HTTP.Request.Referer:='http://sprashivai.ru';
HTTP.Request.UserAgent:='Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0';
HTTP.Request.ContentType:='application/x-www-form-urlencoded; charset=UTF-8';
//Отправляем заголовки. Конец.
//Отключаем автоматическое принятие Куков
HTTP.AllowCookies:=False;
//Разрешаем автоматический редирект
HTTP.HandleRedirects:=True;
//Перекодируем парот в md5 формат
HASH:=MD5(Edit2.Text);
//Добавляем в список передаваемых параметров логин и пароль
PData.Add('email='+Edit1.Text);
PData.Add('pass='+Hash);
try
//Отправляем POST запрос (передаем список данных)
Page:=HTTP.Post('http://sprashivai.ru/login',PData);
//В переменную S получаем заголовки результата запроса
S:=HTTP.Response.RawHeaders.GetText;
//Куки. Начало.
For n:=0 To HTTP.Response.RawHeaders.Count-1 Do
if (HTTP.Response.RawHeaders.Names[n]='Set-Cookie')and
(pos('domain',HTTP.Response.RawHeaders.ValueFromIndex[n])>0) Then
cookie:=HTTP.Response.RawHeaders.ValueFromIndex[n];
cookie:=copy(cookie,1,pos(';',cookie)-1);
HTTP.Request.CustomHeaders.Add('Cookie:usersession='+cookie);
//Куки. Конец.
except
//Вывод сообщения об ошибке
ShowMessage('fatal error');
exit;
end;
//Если на страниц найдено слово "error" => произошли проблемы при авторизации
if Pos('error',Page) <> 0
then begin                                              
showmessage('Invalid Pass or login');
Exit;
end
//Иначе                                            
else
begin
//Получаем Логин, под которым вошли и выводим его.
Delete(Page,1,Pos('"username":',Page));
Login:=Copy(Page,Pos('"username":',Page)+12,Length(Page)-13);
showmessage('Вы вошли как: '+Login);
//Если авторизовались - присваиваем еденицу
Yes:=1;
//Обработка Интервала проверки данных. Начало.
//Если Поле Edit3 не пустое то умножаем кол-во минут на 1 минуту в мили сек.
if Edit3.Text <> '' then
Timer1.Interval:=60000*StrToInt(Edit3.Text)
//Иначе по умолчанию выставляем 3 минуты в мили сек.
                    else Timer1.Interval:=1000;
end;
//Обработка Интервала проверки данных. Конец.
{
//Получени Куков. Начало
showmessage(s);
pos('usersession=',S);
//т.к. у нас 2 вхождения, а нам нужно второе удаляем первое вхождение
delete(S,1,pos('usersession=',S)+12);
//Получаем 28 значный ключ куков
S:=copy(S,pos('usersession=',S)+12,28);
//Добавляем их к нашим отправленным заголовкам
HTTP.Request.CustomHeaders.Add('Cookie: usersession='+S+';SERV=STEALTH117;_ym_visorc =w');
//Получени Куков. Конец
}
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var QCount:String;
begin
//Если авторизовались то
if Yes = 1 then
begin
//Подгружаем страничку новых вопросов
Page:=HTTP.Get('http://sprashivai.ru/questions/new');
//Ищем строку, сообщающвая о новых вопросах
//QCount:=Copy(Page,Pos('sprashivai.newquestions =',Page) + 26,1);
//Если в строке нет 0 то
//Если кол-во вопросов предыдущего запроса не равно нынещнему выводим сообщение
if pos('0',QCount) = 0 then if StrToInt(QCount) <> p then
begin
showmessage(QCount);
CoolTrayIcon1.IconVisible:=True;
CoolTrayIcon1.ShowBalloonHint('Спрашивай.ру Информер', 'Уважаемый '+Login+'.'+#13' У вас появился новый вопрос, на который вы еще не отвечали!' ,bitInfo, BITSPIXEL);
//Переменной p присваиваем нынещнее значение новых вопросов
p:=StrToInt(QCount);
end;
end;
end;
                  
procedure TForm1.FormCreate(Sender: TObject);
begin
//Создание TIdHTTP
//HTTP:=TIdHTTP.Create(Self);
HTTP:=IdHTTP1;
Try
//Подключение к ya.ru для проверки связи
HTTP.Get('http://ya.ru');
Except
//Если не произошло подключение => выдаем сообщения о проблеме с подключением
 ShowMessage('Возможно интернет соеденение отсутствует.'+#13+'Проверьте подключение к интернету!');
End;
P:=0;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
//Выводим иконку в трее
CoolTrayIcon1.IconVisible:=True;
//Сворачиваем форму в трей
CoolTrayIcon1.HideMainForm;
//Выводим сообщение
CoolTrayIcon1.ShowBalloonHint('Спрашивай.ру Информер', 'Программа работает в автономном режиме' ,bitInfo, 20);end;
 
procedure TForm1.CoolTrayIcon1Click(Sender: TObject);
begin
//Скрываем иконку в трее
CoolTrayIcon1.IconVisible:=False;
//Разворачиваем форму
CoolTrayIcon1.ShowMainForm;
end;
 
procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
//Разрешаем в Edit3 ввод только цифр
if key in ['0'..'9'] then key:=key else key:=#0;
end;
 
procedure TForm1.N1Click(Sender: TObject);
begin
//Скрываем мконку в трее
CoolTrayIcon1.IconVisible:=False;
//Разворачиваем форму
CoolTrayIcon1.ShowMainForm;
end;
 
procedure TForm1.N2Click(Sender: TObject);
begin
//Закрываем программу
Form1.Close;
end;
 
end.
Если не затруднит можно измененный проект? хотя бы для сравнения, но я думаю, что я все правильно сделал... Все так же не может перевести полученные данные в строку т.е. я как понимаю не принимает куки, на форму IDHTTP добавил...
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
09.04.2012, 17:40 10
держи
Вложения
Тип файла: rar myspraw.rar (251.5 Кб, 38 просмотров)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2012, 17:40

IdHTTP - Ошибка при отправке запроса
Всем привет, у меня возникла небольшая проблема. Решил научится работать с API и тп, но вот во...

не записываются данные при отправке запроса почему
1.php &lt;!DOCTYPE html&gt; &lt;html lang=&quot;ru&quot;&gt; &lt;head&gt; &lt;title&gt;Заголовок&lt;/title&gt; &lt;/head&gt; &lt;body&gt; ...

При отправке запроса получаю не тот результат?
У меня такая проблема. Посылаю я запрос $ch = curl_init...

При отправке Post запроса пропадают символы
Привет! Довольно давно работаю с Post запросами и до этого не сталкивался с такой проблемой....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru