Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

Прибежали в избу дети, Второпях зовут отца...   Найти похожие ветки 

 
ProgRAMmer Dimonych ©   (2007-03-18 14:21) [0]

Тятя, тятя, наши сети
Притащили мертвеца... :(

А как вообще правильно подключиться к своему сайту и выхватить результат выполнения скрипта в своей программе? Пробовал через Inet API, но InternetOpenURL возвращает nil.

Заранее спс.


 
antonn ©   (2007-03-18 14:49) [1]

по реке плывет кирпич
волосатый как стекло.
ну и пусть себе плывет,
на не нужен пенопласт.

что бы проверить наличие файла на диске, воспользуйся функцией fileexists()


 
Юрий ©   (2007-03-18 14:53) [2]

Плохо пробовал.

procedure TMainForm.LoadData;
var
 hHttpSession, hReqUrl: HINTERNET;
 buffer: array [1..1023] of char;
 nRead: cardinal;
 strRead: string;
begin
 if (edUrl.Text = "") then exit;

 strRead := "";
 hHttpSession := InternetOpen("IE", INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0);
 try
   hReqUrl := InternetOpenUrl(hHttpSession, PChar(AUrl), NIL, 0, 0, 0);
   try
     repeat
       InternetReadFile(hReqUrl, @buffer, sizeof(buffer), nRead);
       strRead := strRead + string(buffer);
     until nRead = 0;
   finally
     InternetCloseHandle(hReqUrl);
   end;
 finally
   InternetCloseHandle(hHttpSession);
 end;

 Memo.Text := strRead;
end;


 
Юрий ©   (2007-03-18 14:54) [3]

> [2] Юрий ©   (18.03.07 14:53)

Строчку уберёшь.

if (edUrl.Text = "") then exit;


 
ProgRAMmer Dimonych ©   (2007-03-18 14:55) [4]

Хм, заработало. Осталось только одну проблему решить, но она уже связана с HTTP... Спасибо.


 
ProgRAMmer Dimonych ©   (2007-03-18 15:15) [5]

А может и не совсем с HTTP... :(

Проблема в том, что к php-скрипту я добавил вывод информации о броузере. Вот так...

<?
$Browser=$_SERVER["HTTP_USER_AGENT"];
echo("<HTML>\r\n");
echo(" <HEAD>\r\n");
echo("  <TITLE>\r\n");
echo("   Здесь чего-нибудь\r\n");
echo("  </TITLE>\r\n");
echo(" </HEAD>\r\n");
echo(" <BODY>\r\n");
echo("  ".$Browser."\r\n");
echo(" </BODY>\r\n");
echo("</HTML>");
?>

Но при повторной загрузке страницы с этого адреса программа возвращает то, что было...

<HTML>
<HEAD>
 <TITLE>
  Здесь чего-нибудь
 </TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>

Пробовал флаги INTERNET_FLAG_DONT_CACHE, INTERNET_FLAG_PRAGMA_NOCACHE и т.п. - не помогло...


 
clickmaker ©   (2007-03-18 15:20) [6]

<head>
...
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
</head>

оно?


 
ProgRAMmer Dimonych ©   (2007-03-18 17:56) [7]

> clickmaker ©   (18.03.07 15:20) [6]
Не получилось. Видно, ещё что-то есть...

Код PHP-скрипта такой...

<?
$Browser=$_SERVER["HTTP_USER_AGENT"];
echo("<HTML>\r\n");
echo(" <HEAD>\r\n");
echo("  <TITLE>\r\n");
echo("   Текст\r\n");
echo("  </TITLE>\r\n");
echo("  <META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\" />\r\n");
echo("  <META HTTP-EQUIV=\"Cache-Control\" CONTENT=\"no-cache, must-revalidate\" />\r\n");
echo(" </HEAD>\r\n");
echo(" <BODY>\r\n");
echo("  ".$Browser."\r\n");
echo(" </BODY>\r\n");
echo("</HTML>");
?>

В броузере всё нормально отображает.

Код процедуры...

procedure TForm1.Button1Click(Sender: TObject);
var
Internet,Forum:HINTERNET;
Buffer:array [0..1023] of Char;
BytesRead:Cardinal;
Res:ANSIString;
begin
Internet:=InternetOpen("Some Program",0,nil,nil,0);
try
 Forum:=InternetOpenURL(Internet,"http://www.SomeSite.com/SomeScript.php","",0,INTERNET_FLAG_EXISTING_CONNECT or INTERNET_FLAG_RELOAD,0);
 try
  Res:="";
  while True do
  begin
   ZeroMemory(@Buffer,SizeOf(Buffer));
   InternetReadFile(Forum,@Buffer,SizeOf(Buffer),BytesRead);
   if BytesRead=0 then Break;
   Res:=Res+Buffer;
  end;
 finally
  InternetCloseHandle(Forum);
 end;
finally
 InternetCloseHandle(Internet);
end;
Res:=Copy(Res,1,Pos("</HTML>",Res)+6);
Memo.Lines.Add(Res);
end;

Чего здесь может быть не так?


 
clickmaker ©   (2007-03-18 18:10) [8]


> [7] ProgRAMmer Dimonych ©   (18.03.07 17:56)

а точно у тебя этот $browser на серверной стороне заполняется?
если в body просто текст вставить - вернет?


 
ProgRAMmer Dimonych ©   (2007-03-18 21:38) [9]

> clickmaker ©   (18.03.07 18:10) [8]
Скрипт нормально отображается в броузере (GreenBrowser, на движке IE).


 
ProgRAMmer Dimonych ©   (2007-03-18 21:38) [10]

P.S. Не скрипт, а результат его работы.


 
clickmaker ©   (2007-03-19 10:26) [11]


> [10] ProgRAMmer Dimonych ©   (18.03.07 21:38)

ну то есть если написать
echo(" <BODY>\r\n");
echo("  Типа тело\r\n");
echo(" </BODY>\r\n");
то вернет
</HEAD>
<BODY>
Типа тело
</BODY>
</HTML>

?


 
ProgRAMmer Dimonych ©   (2007-03-19 15:11) [12]

> clickmaker ©   (19.03.07 10:26) [11]
> > [10] ProgRAMmer Dimonych ©   (18.03.07 21:38)
> ну то есть если написать
> echo(" <BODY>\r\n");
> echo("  Типа тело\r\n");
> echo(" </BODY>\r\n");
> то вернет
> </HEAD>
> <BODY>
> Типа тело
> </BODY>
> </HTML>
> ?
Ну, да. Только для приведённого в цитате фрагмента (3 echo) никаких HEAD"ов не будет :). А вообще, да: возвращает то, что там указано.


 
ProgRAMmer Dimonych ©   (2007-03-19 15:34) [13]

Самое забавное, что в вышеприведённом коде на Дельфи переменная Forum после попытки соединения равна nil.


 
ProgRAMmer Dimonych ©   (2007-03-19 16:30) [14]

> ProgRAMmer Dimonych ©   (19.03.07 15:34) [13]
Последнее устранил, вроде работает. Но только, кажется, кеширует где-то результат соединения :(

Убрал www после http:// - заработало (хотя хостер предлагает адрес с и без www одновременно). Потом исправил скрипт так, чтобы вывод информации о пользователе ($Browser) происходил не один, а три раза. Программа принимает только 1.

Как можно отрубить этот долбаный кэш? Флаг INTERNET_FLAG_RELOAD при вызове InternetOpenURL используется.


 
clickmaker ©   (2007-03-19 17:30) [15]


> [14] ProgRAMmer Dimonych ©   (19.03.07 16:30)

даже любопытно стало... попробовал у себя.
Вот код

procedure TForm1.Button1Click(Sender: TObject);
var
Internet,Forum:HINTERNET;
Buffer:array [0..1023] of Char;
BytesRead:Cardinal;
Res:ANSIString;
begin
Internet:=InternetOpen("Some Program",INTERNET_OPEN_TYPE_PRECONFIG,
nil,nil,0);
try
Forum:=InternetOpenURL(Internet,"http://relaxander.webest.net/somescript.php","",0,0,0);
try
 Res:="";
 while True do
 begin
  ZeroMemory(@Buffer,SizeOf(Buffer));
  InternetReadFile(Forum,@Buffer,SizeOf(Buffer),BytesRead);
  if BytesRead=0 then Break;
  Res:=Res+Buffer;
 end;
finally
 InternetCloseHandle(Forum);
end;
finally
InternetCloseHandle(Internet);
end;
Res:=Copy(Res,1,Pos("</HTML>",Res)+6);
Memo1.Lines.Add(Res);
end;


Вот результат
<HTML>
<HEAD>
 <TITLE>
  Текст
 </TITLE>
 <META HTTP-EQUIV="Pragma" CONTENT="no-cache" />
 <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate" />
</HEAD>
<BODY>
 Some Program
</BODY>
</HTML>


 
clickmaker ©   (2007-03-19 17:38) [16]

забыл...
флаги INTERNET_FLAG_HYPERLINK or INTERNET_FLAG_RELOAD

INTERNET_FLAG_EXISTING_CONNECT - это больше для ФТП


 
ProgRAMmer Dimonych ©   (2007-03-20 00:20) [17]

> clickmaker ©   (19.03.07 17:38) [16]
> забыл...
> флаги INTERNET_FLAG_HYPERLINK or INTERNET_FLAG_RELOAD
> INTERNET_FLAG_EXISTING_CONNECT - это больше для ФТП
Уже готов был радоваться, но... после одной нормальной загрузки снова выводит одно и то же.

Код...

Internet:=InternetOpen("Grace Forum Viewer",0,nil,nil,0);
if Assigned(Internet) then
begin
 Forum:=InternetOpenURL(Internet,"http://www.grace.ueuo.com/forum.php",nil,0,INTERNET_FLAG_HYPERLINK or INTERNET_FLAG_RELOAD,0);
 MessageBox(Form1.Handle,PChar(GetErrorText(False)),"",64);
 if Assigned(Forum) then
 begin
  Res:="";
  while True do
  begin
   ZeroMemory(@Buffer,SizeOf(Buffer));
   InternetReadFile(Forum,@Buffer,SizeOf(Buffer),BytesRead);
   if BytesRead=0 then Break;
   Res:=Res+Buffer;
  end;
 end;
 InternetCloseHandle(Forum);
end;
InternetCloseHandle(Internet);
Res:=Copy(Res,1,Pos("</HTML>",Res)+6);
Memo.Lines.Add(Res);

Кэш, похоже, не хочет отрубаться :(


 
Пиит   (2007-03-20 04:59) [18]


> Прибежали в избу дети,
> Второпях зовут отца...
> Тятя, тятя, наши сети
> Притащили ...


... подлеца.


 
clickmaker ©   (2007-03-20 12:02) [19]


> [17] ProgRAMmer Dimonych ©   (20.03.07 00:20)

у меня натурально работает...
меняю user agent в InternetOpen - возвращает каждый раз новый


 
ProgRAMmer Dimonych ©   (2007-03-20 14:58) [20]

> clickmaker ©   (20.03.07 12:02) [19]
> > [17] ProgRAMmer Dimonych ©   (20.03.07 00:20)
> у меня натурально работает...
> меняю user agent в InternetOpen - возвращает каждый раз
> новый
С выделенного места поподробнее, если можно...


 
VirEx ©   (2007-03-20 17:05) [21]

function DelHttp(URL: String): String;
begin
 if Pos("http://", URL) > 0 then Delete(Url, 1, 7);
 Result := Copy(Url, 1, Pos("/", Url) - 1);
if Result = "" then Result := URL;
end;

function TForm1.GetUrl(const URL: String; Header, Content: string;
 IsImage: boolean; ImageFileName: string): String;
var
 FSession, FConnect, FRequest: HINTERNET;
 FHost, FScript: String;
 Buff: array [0..1023] of byte;
 BytesRead: Cardinal;
 f: File;
begin
Result := "";

// Небольшой парсинг
// вытаскиваем имя хоста и параметры обращения к скрипту
FHost := DelHttp(Url);
FScript := Url;
Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
// Инициализируем WinInet
form1.StatusBar1.SimpleText:="Инициализация подключения...";

//X это по умолчанию "юзер агент"
FSession := InternetOpen("X", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if not Assigned(FSession) then begin
form1.StatusBar1.SimpleText:="Ошибка инициализации подключения";
Exit;
end;
try
// Попытка соединения с сервером
 form1.StatusBar1.SimpleText:="Соедиенние с сервером...";
 FConnect := InternetConnect(FSession, PChar(FHost), 80, nil, "HTTP/1.0", INTERNET_SERVICE_HTTP, 0, 0);
 if not Assigned(FConnect) then begin
 form1.StatusBar1.SimpleText:="Ошибка подключения к серверу";
 Exit;
 end;
 try
 // Подготавливаем запрос страницы
     if IsImage then
     FRequest := HttpOpenRequest(FConnect, "GET", PChar(FScript), "HTTP/1.1", "", nil, INTERNET_FLAG_RELOAD, 0)
     else
     FRequest := HttpOpenRequest(FConnect, "POST", PChar(FScript), "HTTP/1.1", "", nil, INTERNET_FLAG_RELOAD, 0);
     
     if not Assigned(FConnect) then Exit;
     try
       // Добавляем заголовки
       // вот здесь перезаписывается заголовок - Head, и юзер агент
       if not (HttpAddRequestHeaders(FRequest, PChar(Header), Length(Header), HTTP_ADDREQ_FLAG_REPLACE or HTTP_ADDREQ_FLAG_ADD)) then Exit;
       // Отправляем запрос
       form1.StatusBar1.SimpleText:="Отправка запроса...";
       if not (HttpSendRequest(FRequest, nil, 0, PChar(Content), Length(Content))) then begin
       form1.StatusBar1.SimpleText:="Ошибка отправки запроса";
       Exit;
       end;
       // Получаем ответ
        FillChar(Buff, SizeOf(Buff), 0);
        if IsImage then begin
            assignfile(f,ImageFileName{"1.jpg"});
            try
            Rewrite(F,1);
            except
            if messagebox(form1.handle,"файл невозможно записать, продолжить?","ОшЫбка!",MB_YESNO or MB_ICONHAND)=ID_NO then begin
              InternetCloseHandle(FRequest);
              InternetCloseHandle(FConnect);
              InternetCloseHandle(FSession);
              ExitProcess(1);
              end else begin
              InternetCloseHandle(FRequest);
              InternetCloseHandle(FConnect);
              InternetCloseHandle(FSession);
              form1.StatusBar1.SimpleText:="Загрузка прервана";
              exit;
              end

            end;
            form1.ProgressBar1.Max:=2383;
            form1.StatusBar1.SimpleText:="Получение изображения...";
          repeat
            application.ProcessMessages;
            //FillChar(Buff, SizeOf(Buff), 0);
            InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
            BlockWrite(F, Buff, BytesRead);
            form1.ProgressBar1.Position:=BytesRead;
            //inc(BytesIn,BytesRead); //<-- увеличиваем счетчик
          until BytesRead = 0;
            CloseFile(F);
            form1.StatusBar1.SimpleText:="Изображение получено, вводите символы";
        end else begin
          form1.StatusBar1.SimpleText:="Загрузка данных...";
          repeat
            Result := Result + PChar(@Buff);
            FillChar(Buff, SizeOf(Buff), 0);
            InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
            //inc(BytesIn,BytesRead); //<-- увеличиваем счетчик
          until BytesRead = 0;
            form1.StatusBar1.SimpleText:="Данные загружены";
          end;
      finally
       InternetCloseHandle(FRequest);
     end;
   finally
     InternetCloseHandle(FConnect);
   end;
 finally
   InternetCloseHandle(FSession);
 end;
end;

procedure Exec;
var
 s,msg:string;

 FindData: _WIN32_FIND_DATAA;
 h:THandle;
 Header:string;
begin
case Identification of
mOpera9:Header:=Opera9Header;
mIE6   :Header:=IE6Header;
end;
//загружаем контент
s:=form1.GetUrl("http://site.com",Header,"",false,"");

//загружаем картинку
form1.GetUrl("http://site.com/image.jpg",Header,"",true,"1.jpg");//урл картинки

GetCurrentDirectory(259,PChar(s));
h:=FindFirstFile(PChar(s+"1.jpeg"), FindData);
if h<>INVALID_HANDLE_VALUE then begin
try
g.LoadFromFile("1.jpg");

//файл пустой длины, избежание ошибки EJpeg #42
if g.Height+g.Width>2 then form1.Image1.Picture.Assign(g);

except
form1.StatusBar1.SimpleText:="Ошибка, перезапустите";
end;
end else form1.StatusBar1.SimpleText:="Ошибка загрузки изображения, перезапустите";

SuspendThread(t);
TerminateThread(t,DETACHED_PROCESS);
CloseHandle(t);
end;

//кнопочка "load" :)
procedure TForm1.Button1Click(Sender: TObject);
begin
if t=0 then begin
  form1.StatusBar1.SimpleText:="Старт...";
  t:=CreateThread(nil,0,@Exec,nil,IDLE_PRIORITY_CLASS{CREATE_SUSPENDED},tId)
  end else begin
  form1.StatusBar1.SimpleText:="Перезапуск...";
  SuspendThread(t);
  TerminateThread(t,DETACHED_PROCESS);
  CloseHandle(t);
  t:=CreateThread(nil,0,@Exec,nil,IDLE_PRIORITY_CLASS{CREATE_SUSPENDED},tId)
  end;
end;


 
VirEx ©   (2007-03-20 17:07) [22]

вот еще, заголовки оперы и ИЕ

Opera9Header="User-Agent: Opera/9.00 (Windows NT 5.1; U; ru)"#13#10+
 "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1"#13#10+
 "Accept-Language: ru,ru_RU;q=0.9,en;q=0.8"#13#10+
 "Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1"#13#10+
 "Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0"#13#10+
 "Connection: Keep-Alive, TE"#13#10+
 "TE: deflate, gzip, chunked, identity, trailers"#13#10+
 "Content-Type: application/x-www-form-urlencoded ";

 IE6Header="Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*"#13#10+
 "Accept-Language: ru"#13#10+
 "Content-Type: application/x-www-form-urlencoded"#13#10+
 "Accept-Encoding: gzip, deflate"#13#10+
 "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"#13#10+
 "Connection: Keep-Alive"#13#10+
 "Cache-Control: no-cache";



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.064 c
2-1174889808
Megabyte
2007-03-26 10:16
2007.04.15
Отлов нужного исключения


9-1147104863
except 2.0
2006-05-08 20:14
2007.04.15
VCL окно во весь экран.


2-1174990327
Dmitry_177
2007-03-27 14:12
2007.04.15
INI-файлы на API


3-1169575183
ndg
2007-01-23 20:59
2007.04.15
Как получить id добавленной записи


6-1161764071
yuriks
2006-10-25 12:14
2007.04.15
idFTP и большие файлы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский