Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Rund um die LCL und andere Komponenten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Synapse und Laden von Dokumenten aus dem Internet. [gelöst]

Beitrag von MmVisual »

Hallo,

Mein Programm kann nun PDF Dokumente mit THTTPClient laden und absteichern. Das funktioniert in der Regel relativ gut. Hin und wieder ist der Link veraltet, dann senden der Server einen Redirect Link, das kann ich analysieren und dann lade ich von dem zweiten Link.
Soweit funktioniert das gut.

Jedoch bei ST klappt das irgendwie nicht, ich habe noch keine Idee warum das blockiert. vielleicht kann mir jemand Tipps dazu geben.
Also wenn ich den Link in Firefox eingebe dann erscheint das PDF auf dem Bildschirm, nur nicht wenn ich es selbst laden will, dann bricht die Verbindung nach 10 Sec. Timeout ab.

Dann habe ich das ganze mal mit CURL (Linux Mint) getestet:

Code: Alles auswählen

curl -k -v -X GET https://www.st.com/resource/en/datasheet/2n3055.pdf
Das gleiche, ein Fehler und abbruch.
Vielen Dank für Ideen was ich ändern müsste damit es geht.

Das ist mein Code:

Code: Alles auswählen

      HTTP := THTTPSend.Create;
      Try
        //HTTP.UserAgent:='Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0';
        HTTP.Headers.Add('accept: */*'); // auch wenn diese Zeile weg gelassen wird geht es nicht
        HTTP.UserAgent := 'curl/7.81.0';
        HTTP.MimeType := 'application/x-www-form-urlencoded'; // auch wenn diese Zeile weg gelassen wird geht es nicht
        b := HTTP.HTTPMethod('GET', s); // s := 'https://www.st.com/resource/en/datasheet/2n3055.pdf'
        If b Then ... // Daten empfangen wird mit FALSE nach 10 Sec quittiert <<<<<<<<<<<<<<<<
        Try
          sl := TStringList.Create;
          HTTP.Document.Position := 0;
          sl.LoadFromStream(HTTP.Document); // Dann ... Analyse was der Server sendet
VG Markus
Zuletzt geändert von MmVisual am Fr 12. Apr 2024, 12:05, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von sstvmaster »

Ich sehe bei dir im Code nix mit redirect.

Hiermit sollte der redirect erkannt werden.

Code: Alles auswählen

http.AllowRedirect := true;
Das soĺte oberhalb von headers.add stehen
LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

Ein THTTPSend hat kein AllowRedirect.

Das Redirect löse ich selbst in dem ich die Antwort vom Server analysiere und dann erneut eine Anfrage los sende. Dazu lade ich die Antwort erst einmal in eine TStringList.
Ein Redirect ist normalerweise so, dass statt der PDF ein Text in HTML Format ankommt, da ist dann der erste href Link die echte PDF, also relativ einfach das zu analysieren.
Zuletzt geändert von MmVisual am Do 11. Apr 2024, 09:46, insgesamt 3-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

Mit Firefox kann man analysieren was da ausgetauscht wird.
Die erste Antwort ist ein Cookie, ein anderes wird gesendet und dann wird das PDF erhalten.

Sieht ziemlich kompliziert aus (zumindest für mich). Hier der Screenshot:
Bild1.png
Bild1.png (95 KiB) 7656 mal betrachtet
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von theo »

MmVisual hat geschrieben: Do 11. Apr 2024, 09:37 Ein Redirect ist normalerweise so, dass statt der PDF ein Text in HTML Format ankommt, da ist dann der erste href Link die echte PDF, also relativ einfach das zu analysieren.
Richtig würde man es über den Status-/Resultcode lösen.
Wie z.B. Hier (nicht von mir getestet).
https://www.matthewhipkin.co.uk/codelib ... t-synapse/

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

Vielen Dank für den Tipp.

Das funktioniert leider nicht, da das erste "b := HTTP.HTTPMethod('GET', s);" nach 10 Sec. mit FALSE abbricht, also da kommt nichts.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10921
Registriert: Mo 11. Sep 2006, 19:01

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von theo »

MmVisual hat geschrieben: Do 11. Apr 2024, 10:42 Vielen Dank für den Tipp.

Das funktioniert leider nicht, da das erste "b := HTTP.HTTPMethod('GET', s);" nach 10 Sec. mit FALSE abbricht, also da kommt nichts.
Das war auch nicht die Antwort auf deine letzte Frage. :wink:
Was weiss man, was der Server haben will?
Probier doch mal, den Firefox zu imitieren.
Als erstes mit UserAgent ("Mozilla/...."), halt was da steht in deinem Screenshot.
http://synapse.ararat.cz/doc/help/https ... #UserAgent

Ist mit SSL/https alles klar?

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

SSL/HTTPS ist kein Problem, OpenSSL V3.2.1 ist geladen und andere Dinge die ich lade funktionieren auch mit der SSL Verbindung.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von Stevie »

... Dein Problem ist, dass ST offensichtlich versucht, das Absaugen von PDFs einzuschränken. Entsprechend filtern sie nach User-Agents und lassen nur durch, was aus deren Einschätzung ein "echter" Browser ist. Folgendermaßen dürfte es daher funktionieren:

Code: Alles auswählen

      
      HTTP := THTTPSend.Create;
      Try
        HTTP.Headers.Add('accept: */*');
        HTTP.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; v: 124.0) Gecko/20100101 Firefox/124.0';
        HTTP.MimeType := 'application/x-www-form-urlencoded';
        b := HTTP.HTTPMethod('GET', s);
        ...
Wenn du das vorher manuell versuchen willst, dann so:

Code: Alles auswählen

curl -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; v: 124.0) Gecko/20100101 Firefox/124.0'  --output 2n3055.pdf https://www.st.com/resource/en/datasheet/2n3055.pdf
Natürlich musst Du angesichts der Abwehrmaßnahmen selbst wissen, ob das, was Du da tust, im Einklang mit deren Lizenzen ist, das kann ich nicht beurteilen. :)

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

Vielen Dank für die "richtige" CURL, damit klappt der Download. Mit dem -v Parameter kann ich schauen was CURL alles macht.

Mit Synapse geht es noch nicht, ich schaue noch ....

Und nein, es soll kein "Massen" Downloader werden. Wenn man bisher ein Datenblatt vom Hersteller lädt, so muss man das dann extra in einem Ort speichern, dann in meinem Programm wiederum den Speicherort öffnen um den Link zur Datei dann in der Datenbank ein zu tragen. Diese vielen Schritte sind doch sehr umständlich, daher hab ich nun ein Befehl "Lade PDF" geschaffen, mit der man dann mit einem Mausklick eine einzelne PDF laden kann und auswählen wohin die gespeichert wird. Es wird nur eine Arbeitserleichterung von etwas, was man ohnehin ständig macht, also wer mit elektronischen Bauteilen arbeitet lädt sich ohnehin für seine Projekte die Datenblätter runter.
EleLa - Elektronik Lagerverwaltung - www.elela.de

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von paweld »

Hier haben Sie eine einfache Klasse auf der Basis von THTTPSend, die auf einen Redirect bereits hinzugefügt: https://github.com/paweld/especies/blob ... PDNetU.pas

Beispiel für die Verwendung:

Code: Alles auswählen

uses
  LPDNeU;

var
  hc: THTTPClient;
  ms: TMemoryStream;
begin
  hc := THTTPClient.Create;
  ms := TMemoryStream.Create;
  if hc.Get('https://www.st.com/resource/en/datasheet/2n3055.pdf', ms) then
  begin
    ms.SaveToFile('file.pdf');
    ShowMessage(Format('File downloaded, size: %d', [ms.Size]));
  end
  else
    ShowMessage('Download error: ' + hc.ResultMessage);
  ms.Free;
  hc.Free;
end.
Grüße / Pozdrawiam
paweld

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von Stevie »

... und hier ein kleines Programm, das das PDF einfach mal runterlädt. Ist allerdings mit dem FPHttpClient gebaut, weil ich auf die Schnelle nichts anderes hatte, das HTTPS kann. Ah, und natürlich enthält es so gut wie keine Fehlerbehandlung o.ä..

Code: Alles auswählen

program PdfFetcher;

{$mode objfpc}{$H+}

uses
 fphttpclient, opensslsockets, classes, sysutils;

const
  cHost = 'www.st.com';
  cBaseURI = 'https://'+cHost+'/resource/en/datasheet/';
  cUserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; v: 124.0) Gecko/20100101 Firefox/124.0';

function GetPDF(const aName : String) : String;
var
  HTTPClient : TFPHTTPClient;
  ResponseData : String;
begin
 Result := '';
 HTTPClient := TFPHTTPClient.Create(nil);
 try
   HTTPClient.AddHeader('Accept','*/*');
   HTTPClient.AddHeader('Host', cHost);
   HTTPClient.AddHeader('User-Agent', cUserAgent);

   ResponseData := HTTPClient.Get(cBaseURI+aName);
   Result := ResponseData;

 finally
   HTTPClient.Free;
 end;
end;


var
  PdfResult  : String;
  Docname    : String;
  MyFile     : TextFile;

begin
  if ParamCount <> 1 then
  begin
    writeln('Usage: PdfFetcher <Document>');
    Exit;
  end;

  DocName := ParamStr(1);
  PdfResult := GetPDF(DocName);
  AssignFile(MyFile, DocName);
  try
    Rewrite(MyFile);
    Writeln(MyFile, PdfResult);
    CloseFile(MyFile);
  except on E : EInOutError Do
    writeln('Fehler beim Schreiben der Datei.', E.ClassName, '/', E.Message);
  end;
end.

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von Stevie »

Ah, und noch was: wichtig ist, dass der Agent auch wirklich als 'User-Agent' im Header steht und nicht aus 'UserAgent' o.ä.. Da ist der Server von ST wirklich pedantisch...

Und noch ein Tipp: ich habe mir auf meiner eigenen Maschine mit Netcat mittels ...

Code: Alles auswählen

nc -l -p 8080
... einen kleinen Webserver aufgesetzt, auf den ich den Fetcher losgelassen habe, wobei ich den cBaseURI dafür natürlich auf 'http://localhost:8080' umgestellt habe. So konnte ich bequem schauen, ob mein GET auch wirklich genauso aussieht, wie er mir die Dateien erfolgreich mit Curl abholt. Als das so weit stimmte, habe ich den cBaseURI dann wieder auf den ST-Server umgestellt und - siehe da - das PDF kam an.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von MmVisual »

Ich habe mir jetzt eine Kombination aus Synapse und TFPHTTPClient gebastelt.
Wenn THTTPSend fehl schlägt, dann versuche ich es nochmals mit TFPHTTPClient.
Das ganze ist jetzt ziemlich komplex geworden, dafür funktioniert es in vielen möglichen (mir bekannten) szenarien ohne dass eine Fehlermeldung kommt mit dem der User nichts anfangen kann.

Warum dieser spezielle Link von st mit Synapse nicht funktionieren mag ist mir immer noch ein Rätsel. Diese paar Header Parameter setzen ist ja nun wirklick kein Hexenwerk.

Vielen Dank Paweld & Stevie für die Beispiele, beide haben mir sehr geholfen. :D

VG Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Synapse und Laden von Dokumenten aus dem Internet.

Beitrag von Stevie »

Worin genau schlägt THTTPSend denn eigentlich jetzt noch fehl? Noch immer Timeouts? Eigentlich müsste Synapse das nämlich ganz genauso hinbekommen wie FPHTTPClient...

Antworten