Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Берем данные с интернет-страницы.


Автор: Vladimir_K 17.12.2007, 17:02
Привет всем!
Придумал я себе новую головную боль!
Задача такая: подключиться к инету, взять данные со страницы и вывести в окно программы.
Indy я скачал, просмотрел, скажу прямо - темный лес... Давненько я делфи не занимался - многое уже подзабылось.
Использую такой код:
Код

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHttp, StdCtrls, ComCtrls;
.
.
.
procedure TForm1.Button1Click(Sender: TObject);
var http: TIdHttp;
    s: string;
begin
  RichEdit1.Clear;
  http:=TIdHTTP.Create(nil);
  try
    s:=http.Get('http://xerurg.ru/forex.php');
  except
    ShowMessage('Неудача.');
  end;

  RichEdit1.Lines.Add(s);
  http.Free;
end;

Бывает, что страница скачивается, но как-то не полностью - на странице в инете какие-то слова есть, а у меня в окне проги их нет...
Правильный ли я код использую? Есть ли особенности при подобном скачивании текста с html, или php страницы?
Ой, вопросов много... помогите, кто чем может!

Автор: MetalFan 17.12.2007, 18:17
Цитата(Vladimir_K @  17.12.2007,  17:02 Найти цитируемый пост)
но как-то не полностью - на странице в инете какие-то слова есть, а у меня в окне проги их нет

сынок, это - фантастика

Автор: Vladimir_K 17.12.2007, 18:46
Ну да! Нет и все! Серьезно!
Начало страницы есть, конец - тоже, в середине куча текста... Но не весь!

Автор: MetalFan 17.12.2007, 19:15
значит там скрипт или фрейм или еще какая-то хитрость

Автор: Vladimir_K 17.12.2007, 20:58
А может есть способ просто найти на странице нужную инфу (цифры, слова) без загрузки кода страницы в эту переменную "s"?

Просматриваю HTML-код страницы в браузере - все нормально. При пересылке в мою прогу что-то теряется...

Автор: MetalFan 17.12.2007, 22:55
Цитата(Vladimir_K @  17.12.2007,  20:58 Найти цитируемый пост)
что-то теряется


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

Автор: Vladimir_K 17.12.2007, 23:23
Извините, я никому не хотел надоедать... так получилось  smile 
Я понял причину.
Я пытаюсь зайти на одну из страниц сайта, на которую доступ есть только по паролю.
В браузере IE вхожу на эту страницу без проблем - используется автовход (наверное мой логин и пароль сохранены в куках на моем компе), а из проги войти туда не могу - предлагается ввести пароль...
То есть ничего не "теряется" - дурья моя башка, а просто не передается то, чего нет.
Вот так. Есть ли выход из данной ситуации?

Автор: MetalFan 17.12.2007, 23:34
Цитата(Vladimir_K @  17.12.2007,  23:23 Найти цитируемый пост)
Есть ли выход из данной ситуации?

есть. сначало залогиниться

Автор: Vladimir_K 18.12.2007, 00:10
Так я залогинен. Из IE вхожу без проблем. Из проги - нет...
При входе на страницу при помощи браузера я логин и пароль не ввожу.
Проблема научить прогу использовать для входа логин и пароль, которые есть у браузера.

Автор: elementos 18.12.2007, 13:40
вставлю свои пять копеек  smile 
логично, что нужно залогинится в программе. исследовать сначала html страницу с формой, куда передается логин и пасс, найти там название этих полей, затем передать логин и пасс через idhttp компоненту, а после уже обрабатывать сам полученный html. 
пример:

Код

procedure TForm1.Button1Click(Sender: TObject);
var Data: TIdMultiPartFormDataStream;
begin
Data:=TIdMultiPartFormDataStream.Create;
try
Data.AddFormField('form_sent','1');
Data.AddFormField('redirect_url','index.php'); //  куда редиректит после входа
Data.AddFormField('username','VasyaPupkin'); // поле ввода логина
Data.AddFormField('password','12345678');   // поле ввода пароля
WB_LoadHTML(Web, HTTP.Post('http://forum.мах.ru/login.php?action=in',Data));
finally
Data.Free;
end;
end;



Web - TWebbrowser
Http - TIdhttp

процедура выглядит так:
 
Код

procedure WB_LoadHTML(WebBrowser: TWebBrowser; HTMLCode: string);
var
sl: TStringList;
ms: TMemoryStream;
begin
WebBrowser.Navigate('about:blank');
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages;
if Assigned(WebBrowser.Document) then begin
sl := TStringList.Create;
try
ms := TMemoryStream.Create;
try
sl.Text := HTMLCode;
sl.SaveToStream(ms);
ms.Seek(0, 0);
(WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
end;
finally
sl.Free;
end;
end;
end;


не забудьте кукиманагер на форму положить, и привязать его к idhttp

Автор: Gess 18.12.2007, 17:40
Хотелось бы решить следующую "проблему"


При работе со страницей

WebBrowser1.Navigate('https://www.np-ats.ru/reports.jsp?part=1')

возникает следующее сообщение
user posted image

такое же "безобразие" и при попытке получить файл с сайта

перерыл инет, ни настройки браузера, ни отключение всего в "Центре безопасности" проблему не решают.

Как избавиться от этих назойливых сообщений?

Автор: MetalFan 18.12.2007, 17:43
Gess, создай отдельную тему

Автор: Vladimir_K 18.12.2007, 20:19
Расположил на форме IdHTTP и IdCookieManager. 
IdHTTP привязал к IdCookieManager.
Вот то, что у меня в uses:

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHttp, StdCtrls, ComCtrls, ActiveX, MsHtml, IdBaseComponent,
  IdCookieManager, IdComponent, IdTCPConnection, IdTCPClient;

Нужно ли еще что-нибудь указывать?
Моя программулина:
Код

unit PExp_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHttp, StdCtrls, ComCtrls, ActiveX, MsHtml, IdBaseComponent,
  IdCookieManager, IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    RichEdit1: TRichEdit;
    IdCookieManager1: TIdCookieManager;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure WB_LoadHTML(WebBrowser: TWebBrowser; HTMLCode: string);
var
sl: TStringList;
ms: TMemoryStream;
begin
WebBrowser.Navigate('about:blank');
while WebBrowser.ReadyState < READYSTATE_INTERACTIVE do
Application.ProcessMessages;
if Assigned(WebBrowser.Document) then begin
sl := TStringList.Create;
try
ms := TMemoryStream.Create;
try
sl.Text := HTMLCode;
sl.SaveToStream(ms);
ms.Seek(0, 0);
(WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
finally
ms.Free;
end;
finally
sl.Free;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var HTTP: TIdHttp;
    Web: TWebbrowser;
    Data: TIdMultiPartFormDataStream;
begin
 Data:=TIdMultiPartFormDataStream.Create;
 try
  Data.AddFormField('form_sent','1');
  Data.AddFormField('redirect_url','index.php'); //  êóäà ðåäèðåêòèò ïîñëå âõîäà
  Data.AddFormField('username','VasyaPupkin'); // ïîëå ââîäà ëîãèíà
  Data.AddFormField('password','12345678');   // ïîëå ââîäà ïàðîëÿ
  WB_LoadHTML(Web, HTTP.Post('http://forum.ìàõ.ru/login.php?action=in',Data));
 finally
  Data.Free;
end;
end;
end.

Выдает ошибки:
[Error] PExp_U.pas(31): Undeclared identifier: 'TWebBrowser'
[Error] PExp_U.pas(36): Missing operator or semicolon
[Error] PExp_U.pas(37): 'DO' expected but identifier 'ReadyState' found
[Error] PExp_U.pas(39): ')' expected but identifier 'Document' found
[Error] PExp_U.pas(47): ')' expected but identifier 'Document' found
[Error] PExp_U.pas(47): Operator not applicable to this operand type
[Error] PExp_U.pas(50): EXCEPT or FINALLY expected
[Error] PExp_U.pas(51): 'END' expected but 'FINALLY' found
[Error] PExp_U.pas(54): '.' expected but ';' found
[Warning] PExp_U.pas(55): Text after final 'END.' - ignored by compiler
[Error] PExp_U.pas(17): Unsatisfied forward or external declaration: 'TForm1.Button1Click'
[Fatal Error] PExp.dpr(5): Could not compile used unit PExp_U.pas'

Автор: aktuba 18.12.2007, 21:48
А зачем тебе тут WebBrowser???
Код

procedure TForm1.Button1Click(Sender: TObject);
var lData: TStringList;
begin
  lData := TStringList.Create;
  try
    lData.Add('login=user');
    lData.Add('pass=vasya');
    IdHTTP.Post('http://url/login.php', lData);
    ShowMessage(IdHTTP.Get('http://url'));
  finally
    lData.Free;
  end;
end;

Автор: Vladimir_K 18.12.2007, 22:05
Цитата(aktuba @ 18.12.2007,  20:48)
А зачем тебе тут WebBrowser???

Интересный вопрос. Так посоветовали...

Сейчас буду пробовать твой код.

Автор: aktuba 18.12.2007, 22:33
Цитата(Vladimir_K @  18.12.2007,  23:05 Найти цитируемый пост)
Использовал твой код, ошибки:

Undeclared identifier: 'Post'
Undeclared identifier: 'Get'

Покажи свой код...

Автор: Vladimir_K 18.12.2007, 22:52
Ошибки исправил - обычная невнимательность...
Но вот этот код не работает.

Код

unit PExp_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHttp, StdCtrls, ComCtrls, ActiveX, MsHtml, IdBaseComponent,
  IdCookieManager, IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    RichEdit1: TRichEdit;
    IdCookieManager1: TIdCookieManager;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var lData: TStringList;
    IdHTTP: TIdHttp;
    HTTP: TIdHttp;
    s: string;
    i:integer;

begin
  lData := TStringList.Create;
  try
    lData.Add('login=llll');
    lData.Add('pass=llll');
    IdHTTP.Post('http://www.url', lData);
    ShowMessage(IdHTTP.Get('http://www.url'));
  finally
    lData.Free;
  end;

  RichEdit1.Clear;
  http:=TIdHTTP.Create(nil);
  try
    s:=http.Get('http://www.url');
  except
    ShowMessage('Íåò êîííåêòà ñ ñåðâåðîì');
    Exit;
  end;
  RichEdit1.Lines.Add(s);
  http.Free;

// Ищу словосочетание Your Data на странице - если вход осуществлен, эти слова найдутся.

if s<>'' then
 begin
 i:=Pos(AnsiLowerCase('Your Data'),AnsiLowerCase(s));
  if i<=0 then
   begin
    Label1.Caption:='Íåò...';
    exit;
   end
   else
   begin
    Label1.Caption:='Åñòü!';
    exit;
   end;
end;
end;
end.


Добавлено через 7 минут и 24 секунды
Слова login и pass - это должны быть те слова, которые там на странице, или нет?
Если на странице: User name: и Password: - эти слова вводить в код программы?

Автор: aktuba 18.12.2007, 23:31
Цитата(Vladimir_K @  18.12.2007,  23:52 Найти цитируемый пост)
Если на странице: User name: и Password: - эти слова вводить в код программы?

Нет. Названия полей надо.

Автор: Vladimir_K 18.12.2007, 23:45
Вот кусок кода страницы для ввода логина-пароля:

<td><b>User name:</b></td>
<td><input type=text name=username></td>
</tr>
<tr> 
<td><b>Password:</b></td>
<td><input type=password name=password></td>

Какие слова вводить в прогу?

Автор: aktuba 19.12.2007, 00:34
username и password

Автор: Vladimir_K 19.12.2007, 08:18
Возникает ошибка во время выполнения проги, когда жму кнопку Button1.

Access violation at address 00474CB2 in module 'PExp.exe'. Read of address 00000008.
вот в этой строке: IdHTTP.Post('http://www.url.net/pages/qw.php?pid=1', lData);

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

Автор: elementos 19.12.2007, 10:35
Цитата(Vladimir_K @  19.12.2007,  08:18 Найти цитируемый пост)
вот в этой строке: IdHTTP.Post('http://www.url.net/pages/qw.php?pid=1', lData);

и где там форма входа? 

Автор: Vladimir_K 19.12.2007, 13:12
Ха, а ведь действительно такая страница есть: http://www.url.net/pages/qw.php?pid=1
Я же просто вместо адреса вставил "url"  smile 

Вот точный: http://www.payingcash.net/pages/ptpstats.php?pid=1
Если это так уж необходимо.

Добавлено через 4 минуты и 19 секунд
Я ICQ указал, может кто захочет воспользоваться... Так удобнее. А конечный результат (?) уже выложить здесь?

Автор: elementos 19.12.2007, 14:46
мои глаза от красного цвета лопнут smile 
не могу там зарегестрироваться, дайте мне в личку како-нить действующий аккаунт с паролем, чтобы потестить

Автор: Vladimir_K 19.12.2007, 18:23
Извини, чего не могу - того не могу... У меня там денюжка лежит.

К тому же там регистрация с хитростями.

Автор: Vladimir_K 19.12.2007, 19:26
Ну а если сделать вход в почтовый ящик Яндекса?
Используется тот же принцип?

Код

unit PExp_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHttp, StdCtrls, ComCtrls, ActiveX, MsHtml, IdBaseComponent,
  IdCookieManager, IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    RichEdit1: TRichEdit;
    IdCookieManager1: TIdCookieManager;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var lData: TStringList;
    IdHTTP: TIdHttp;
    HTTP: TIdHttp;
    s: string;
    i:integer;

begin
  lData := TStringList.Create;
  try
    lData.Add('username=логин');
    lData.Add('password=пароль');
    IdHTTP.Post('http://www.yandex.ru/', lData);
    ShowMessage(IdHTTP.Get('http://www.yandex.ru/'));
  finally
    lData.Free;
  end;


  RichEdit1.Clear;
  http:=TIdHTTP.Create(nil);
  try
    s:=http.Get('http://www.yandex.ru/');
  except
    ShowMessage('No connect with server.');
    Exit;
  end;
  RichEdit1.Lines.Add(s);
  http.Free;

// Поиск слова Входящие на странице - если вход осуществлен, это слово найдется.

if s<>'' then
 begin
 i:=Pos(AnsiLowerCase('Входящие'),AnsiLowerCase(s));
  if i<=0 then
   begin
    Label1.Caption:='No';
    exit;
   end
   else
   begin
    Label1.Caption:='Yes';
    exit;
   end;
end;
end;
end.

Автор: Vladimir_K 19.12.2007, 21:55
Ой, не могу удержаться, чтоб не софтопить:

Страфиствюуйтэ! Я узьбекский вирюс. Па причин ужасный бэдность моей создателя и низкий уровин развитиё технология наша страна я не способин причинять какая-либа уред Ваш компютыр. Патаму очина прашю Уас, пажальста, сами сатрите какая-нибут важная для Уас файл, а патом разашлиты миня па почта другой адриса. Зарания благадарин за паниманий и сатрудничий.
 smile  smile  smile 

Автор: aktuba 19.12.2007, 23:20
Цитата(Vladimir_K @ 19.12.2007,  20:26)
Ну а если сделать вход в почтовый ящик Яндекса?
Используется тот же принцип?

Код

unit PExp_U;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHttp, StdCtrls, ComCtrls, ActiveX, MsHtml, IdBaseComponent,
  IdCookieManager, IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    RichEdit1: TRichEdit;
    IdCookieManager1: TIdCookieManager;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var lData: TStringList;
    IdHTTP: TIdHttp;
    HTTP: TIdHttp;
    s: string;
    i:integer;

begin
  lData := TStringList.Create;
  try
    lData.Add('username=логин');
    lData.Add('password=пароль');
    IdHTTP.Post('http://www.yandex.ru/', lData);
    ShowMessage(IdHTTP.Get('http://www.yandex.ru/'));
  finally
    lData.Free;
  end;


  RichEdit1.Clear;
  http:=TIdHTTP.Create(nil);
  try
    s:=http.Get('http://www.yandex.ru/');
  except
    ShowMessage('No connect with server.');
    Exit;
  end;
  RichEdit1.Lines.Add(s);
  http.Free;

// Поиск слова Входящие на странице - если вход осуществлен, это слово найдется.

if s<>'' then
 begin
 i:=Pos(AnsiLowerCase('Входящие'),AnsiLowerCase(s));
  if i<=0 then
   begin
    Label1.Caption:='No';
    exit;
   end
   else
   begin
    Label1.Caption:='Yes';
    exit;
   end;
end;
end;
end.

Почти. Только поля иначе называются + надо один дополнительный запрос делать...

Автор: Vladimir_K 20.12.2007, 08:24
Вот эта часть:
Код

  lData := TStringList.Create;
  try
    lData.Add('username=s12x');
    lData.Add('password=12345');
    IdHTTP.Post('http://www.yandex.ru/', lData);
    ShowMessage(IdHTTP.Get('http://www.yandex.ru/'));
  finally
    lData.Free;
  end;

Логин и пароль от реального почтового ящика!
Этот код вводит пароль на странице, и типа нажимает кнопку "Войти"? И тогда уже можно на следующей открывшейся странице искать определенные слова и т.д.?
У меня вот в этой части во время выполнения проги возникает ошибка. Я ее приводил выше.
Правильно ли составлена эта часть кода?

Автор: elementos 20.12.2007, 10:44
Vladimir_K,  
мне не нужен ваш акк с денгами, мне нужен любой работающий (без денег). 
впрочем, если для вас это такие сложности - решайте свои проблемы самостоятельно.

Автор: Vladimir_K 20.12.2007, 19:35
Сложности...

Вот: http://www.blackygold.com/pages/enter.php
логин: w123
пароль: 12345

Автор: Artem91 13.1.2008, 18:10
А как сделать, чтобы при загрузке страницы, используя idHTTP, прога не подвисала? Processmessages не помогает!!!

Автор: remax 13.1.2008, 18:31
Используй инди антифриз (TIdAntiFreeze)

Автор: VICTAR 13.1.2008, 18:32
Запихни idHTTP в поток. Или используй другие компоненты (например SwinHTTP)

Автор: mr_smit 9.3.2008, 13:18
Цитата(Vladimir_K @ 20.12.2007,  08:24)
Вот эта часть:
Код

  lData := TStringList.Create;
  try
    lData.Add('username=s12x');
    lData.Add('password=12345');
    IdHTTP.Post('http://www.yandex.ru/', lData);
    ShowMessage(IdHTTP.Get('http://www.yandex.ru/'));
  finally
    lData.Free;
  end;

Логин и пароль от реального почтового ящика!
Этот код вводит пароль на странице, и типа нажимает кнопку "Войти"? И тогда уже можно на следующей открывшейся странице искать определенные слова и т.д.?
У меня вот в этой части во время выполнения проги возникает ошибка. Я ее приводил выше.
Правильно ли составлена эта часть кода?


Я пробую по простому вот так и всё равно не заходит:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  d: TStringList;
  s: String;
begin
  d := TStringList.Create;
  d.Add('login=мой логин');
  d.Add('passwd=мой пасс');
try
  s := IdHTTP1.Post('http://passport.yandex.ru/passport?mode=auth',d);
finally
  d.Free;
end;
end;


http://ipicture.ru/

что ему ещё нужно?

Вот код со страницы яндекса:

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
</head>

<body>
<form action="http://passport.yandex.ru/passport?mode=auth" method="post" name="MainLogin" id="loginform">
<img src="http://img.yandex.net/wmi/modern/static/4/i//login/heading.gif" alt="Почта" width="136" height="36" style="margin: 15px 0 10px 0;">
<div class="input login"><label for="inputLogin">логин:</label><br><input type="text" name="login" id="inputLogin" tabindex="1"></div>
<div class="input passwd"><label for="inputPassword">пароль:</label><br><input type="password" name="passwd" id="inputPassword" tabindex="2"></div>
<p style="text-align: center;"><label for="twoweeks"><input type="checkbox" id="twoweeks" name="twoweeks" value="yes" autocomplete="no" tabindex="3" style="vertical-align: middle;"> запомнить меня</label></p>
<div><input type="hidden" name="retpath" value="http://mail.yandex.ru/?from=mail..........."><input type="submit" value="Войти" class="hugeBtn" tabindex="4"></div>
</form>
</body>
</html>

Автор: dumb 9.3.2008, 18:05
Цитата(mr_smit @  9.3.2008,  13:18 Найти цитируемый пост)
что ему ещё нужно?

Код
IdHTTP1.HandleRedirects := true;

Автор: aktuba 11.3.2008, 14:44
Цитата(mr_smit @  9.3.2008,  14:18 Найти цитируемый пост)
что ему ещё нужно?

Ему нужно не много - чтобы ты хоть краем глаза посмотрел в спецификацию http...

Автор: XerSon 17.3.2008, 22:15
smile Все решил) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)