AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

URL wininet ermitteln

Ein Thema von Pascal95 · begonnen am 22. Sep 2011 · letzter Beitrag vom 26. Sep 2011
Antwort Antwort
Pascal95
(Gast)

n/a Beiträge
 
#1

URL wininet ermitteln

  Alt 22. Sep 2011, 19:13
Hallo,

ich lade mir mit wininet-Funktionen etwas aus dem Internet herunter...

Ich verwende diese Funktion.

Nun könnte man denken, ich kann mir einfach die URL, die ich ja auch als Parameter angebe, nehmen.
Dem ist aber nicht so, da ich weitergeleitet werde - ich brauche dann die andere URL.

Also
Code:
DownloadFile('http://xyz.de/abc.html')
ich werde auf die Seite "http://xyz.de/seite2.html" weitergeleitet und bekomme mit DownloadFile auch korrekterweise den Inhalt der neuen Seite, was ich gut finde.

Allerdings "weiß" ich ja nicht, dass ich jetzt eigentlich auf "http://xyz.de/seite2.html" bin. Trotzdem erhalte ich dessen Inhalt.

Wie kriege ich sowas wie im Beispiel http://xyz.de/seite2.html" genannt heraus ?

Vielen Dank,
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#2

AW: URL wininet ermitteln

  Alt 23. Sep 2011, 12:17
Die folgenden Einträge in der MSDN könnten dir weiterhelfen:

InternetOpenUrl: Du musst wahrschleinlich das Flag INTERNET_FLAG_NO_AUTO_REDIRECT setzen, damit du das Ziel des Redirects ermitteln kannst.
HttpQueryInfo: Hiermit kannst du die Headerdaten, welche der Server geschickt hat, betrachten.
Query Info Flags: Diese Flags musst du in der oben genannten HttpQueryInfo angeben. Besonders HTTP_QUERY_LOCATION und HTTP_QUERY_STATUS_CODE sind interessant.

Deine prinzipielle Vorgehensweise sollte diese sein:
  • Öffne die URL mittels InternetOpenUrl und dem genannten Flag
  • Hole dir den Statuscode der Requests (HttpQueryInfo mit HTTP_QUERY_STATUS_CODE); ist dieser z. B. 301 (beachte dabei die Liste der existierenden Codes), dann sollst du weitergeleitet werden.
  • Also nun die Ziellocation ermitteln (HttpQueryInfo mit HTTP_QUERY_LOCATION)
  • Neuen Aufruf von InternetOpenUrl mit dem neuen Ziel.

Das sollte funktionieren. Bedenke bitte, dass ich das nicht getestet, sondern nur an Hand der verlinkten Dokumentation hergeleitet habe.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons

Geändert von JamesTKirk (23. Sep 2011 um 12:18 Uhr) Grund: Schlechtschreibung
  Mit Zitat antworten Zitat
Pascal95
(Gast)

n/a Beiträge
 
#3

AW: URL wininet ermitteln

  Alt 23. Sep 2011, 14:31
Hallo,

vielen Dank für deine Antwort!

Ich halte die Idee für sehr gut.

Momentan erhalte ich mit ausgeschalteter Redirection einen 302.

Laut Wiki ist das eine typische Weiterleitung, also komme ich der Sache näher...



Ich werde mich nochmal melden.

Pascal
  Mit Zitat antworten Zitat
Pascal95
(Gast)

n/a Beiträge
 
#4

AW: URL wininet ermitteln

  Alt 23. Sep 2011, 14:44
Ich habe es geschafft !



Ohne Deine Hilfe hätte ich das nicht geschafft !

Als Dank dafür veröffentliche ich den Code, um die Weiterleitungs-URL herauszufinden:
Delphi-Quellcode:
function GetRedirection(const Url: string): string;
var
  hInet: HINTERNET;
  hConnect: HINTERNET;
  infoBuffer: array [0..512] of char;
  dummy: DWORD;
  bufLen: DWORD;
  okay: longbool;
  reply: string;
begin
  Result := '?';

  hInet := InternetOpen(PChar('a browser...'), INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);

  hConnect := InternetOpenUrl(hInet, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD +
    INTERNET_FLAG_NO_AUTO_REDIRECT, 0);

  if not Assigned(hConnect) then
    Exit
  else
  begin
    dummy := 0;
    bufLen := Length(infoBuffer);
    okay := HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE,
      @infoBuffer[0], bufLen, dummy);
    if not okay then
      Exit
    else
    begin
      reply := infoBuffer;
      if (reply = '301') or (reply = '302') then
      begin
        dummy := 0;
        bufLen := Length(infoBuffer);
        okay := HttpQueryInfo(hConnect, HTTP_QUERY_LOCATION,
          @infoBuffer[0], bufLen, dummy);
        if not okay then
          Exit
        else
        begin
          reply := infoBuffer;
          if reply <> 'then
            Result := reply;
        end;
      end
      else
        Exit;
    end;
    InternetCloseHandle(hConnect);
  end;
  InternetCloseHandle(hInet);
end;
Hoffentlich kann jemand das gebrauchen !

Nochmals vielen Dank,
liebe Grüße,
Pascal
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#5

AW: URL wininet ermitteln

  Alt 23. Sep 2011, 15:24
Ohne Deine Hilfe hätte ich das nicht geschafft !
Gern geschehen.

Eine Frage habe ich jedoch:

Delphi-Quellcode:
var
  hConnect: HINTERNET;
begin
  ...
  if not Assigned(hConnect) then
    Exit
  else
    ...
end;
Ist HINTERNET als Zeiger definiert? Ansonsten ist Assigned falsch und du solltest stattdessen auf 0 überprüfen.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Pascal95
(Gast)

n/a Beiträge
 
#6

AW: URL wininet ermitteln

  Alt 24. Sep 2011, 14:42
Ja,

in der wininet.pp:
Delphi-Quellcode:
type
     HINTERNET = LPVOID;
und in der base.inc:
Delphi-Quellcode:
type
...
     LPVOID = pointer;
Hoffe, dass das passt

Pascal
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#7

AW: URL wininet ermitteln

  Alt 26. Sep 2011, 10:51
Hoffe, dass das passt
Jupp, das passt. Ich hab nur reagiert, da die meiste Zeit die H...-Typen von Windows als Cardinal/QWord definiert sind...

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz