Fphttpclient / Telegram Bot: Wie Dateien verschicken?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1042
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Fphttpclient / Telegram Bot: Wie Dateien verschicken?

Beitrag von Timm Thaler »

Ich habe einen kleinen Client auf dem Raspberry laufen, der mit einem Telegram Bot kommuniziert, von diesem Anfragen bekommt und daraufhin eine Antwort generiert und rausschickt. Das funktioniert soweit mit Text-Mitteilungen ganz gut.

Mit curl sieht das so aus:

Code: Alles auswählen

curl -X POST 'https://api.telegram.org/bot123456789:Alkbldpfkbdp123456789/sendMessage?chat_id=123456789&text="Testtest"'


Umgesetzt in FPC wird daraus:

Code: Alles auswählen

uses
  fphttpclient;
 
procedure Tbot.SendMessage(txt : string);
var
  httpClient : TFPHTTPClient;
begin
  try
    httpClient := TFPHTTPClient.Create(nil);
    try
      txt := 'https://api.telegram.org/bot123456789:Alkbldpfkbdp123456789/sendMessage?chat_id=123456789&text=' + txt;
      txt := httpClient.Get(txt);
    except
      WriteLn('Keine Verbindung zu Telegram');
    end;
  finally
    httpClient.Free;
  end;
end;


Nun möchte ich eine Bilddatei per Telegram verschicken. In curl sieht das so aus:

Code: Alles auswählen

curl -X POST https://api.telegram.org/bot123456789:A ... /sendPhoto -F chat_id=123456789 -F photo="@/home/pi/test.jpg"


Anscheinend verwendet curl hier die ID und den Pfad zur Datei als Argumente, so richtig hab ich den Unterschied zu obiger Schreibweise nicht verstanden.

Ich könnte das jetzt in FPC so umsetzen wie für Text:

Code: Alles auswählen

      txt := 'https://api.telegram.org/bot123456789:Alkbldpfkbdp123456789/sendPhoto?chat_id=123456789&photo=' + imgfile;
      txt := httpClient.Get(txt);
 


Ähm, geht leider nicht.

Wie muss ich den Dateipfad übergeben, dass die Datei mit gesendet wird? Oder muss ich die Datei erst einlesen und dann als Stream ausgeben?

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Fphttpclient / Telegram Bot: Wie Dateien verschicken?

Beitrag von Warf »

Schau dir mal das an: Link. Du performst mit curl POST requests, in lazarus aber nur get requests. das kann nicht funktionieren.

Aber als ich das letzte mal den FPHTTPClienten für Post verwndet hatte, hatte ich einen kleinen bug bei leeren stings den ich händisch fixen musste, kann sein das es den immernoch gibt.

Timm Thaler
Beiträge: 1042
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Fphttpclient / Telegram Bot: Wie Dateien verschicken?

Beitrag von Timm Thaler »

Hm, ich hab den Client vor einem Jahr geschrieben, da schien mir das am leichtesten. Aber POST scheint in einigen Belangen besser zu sein, und wahrscheinlich ist es auch keine schlechte Idee, die Anfrage in JSON zu packen. Muss ich mir nochmal anschauen.

Btw: Gibt es denn keine Hilfe zu Fphttpclient? Ich komme immer wieder auf http://wiki.freepascal.org/fphttpclient, aber das ist doch sehr dürftig. Ich hab mir das damals anhand von Beispielen zusammengebastelt, aber mir scheint, da fehlt mir einiges.

Warf
Beiträge: 1421
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: Fphttpclient / Telegram Bot: Wie Dateien verschicken?

Beitrag von Warf »

Timm Thaler hat geschrieben:Btw: Gibt es denn keine Hilfe zu Fphttpclient? Ich komme immer wieder auf http://wiki.freepascal.org/fphttpclient, aber das ist doch sehr dürftig. Ich hab mir das damals anhand von Beispielen zusammengebastelt, aber mir scheint, da fehlt mir einiges.


Nö, aber es ist eigentlich nicht so kompliziert wenn man ein bisschen was von HTTP versteht. Der Code ist auch recht einfach einzusehen (HTTP/1.1 ist nicht so sonderlich kompliziert). Einfach ein bisschen in die Unit schauen

Antworten