![]() |
Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Hallo, um einen Text aus einem Programm in ein Textfeld einer Webseite einzutragen, versuche ich gerade die Indy Komponente IdHttp zu benutzen. Leider bekomme ich es nicht hin, ich bin mir auch nicht sicher ob ich den richtigen Name für das Textfeld habe.
Delphi-Quellcode:
Html-Code Ausschnittprocedure TForm1.Button2Click(Sender: TObject); var TextStr: TStringList; PostInformationStream: TStringStream; begin TextStr := TStringList.Create; PostInformationStream := TStringStream.Create(''); try TextStr.Values['spellcheck'] := 'Test Text'; try IdHTTP1.Post('http://www.wbuch.de/rechtschreibpruefung.html', TextStr, PostInformationStream); Memo1.Text := PostInformationStream.DataString; except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; finally TextStr.Free; PostInformationStream.Free; end; end;
Code:
<textarea name="spellcheck" cols="67" rows="12" onkeyup="getCaretPositions(this);" onclick="getCaretPositions(this);" class="textarea" id="ta1"></textarea>
|
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Mit Indy kannst du das vergessen, denn WBuch.de macht heftig von JavaScript gebraucht aber Indy hat kein JavaScript an Bord.
Aber im Hintergrund wird anscheinend der "Google Spell Checker" benützt. Da wäre es natürlich sinnvoll direkt Google anzufragen... Beispielcode: (C#) ![]() |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Danke für die schnelle Antwort! Dein link funktioniert bei mir irgendwie grad nicht (eventuell Server down? )
Geht es vielleicht mit der TWebBrowser Komponente ? |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Sowohl der Link auf stackoverflow.com als auch der Link zum Google Spell Checker
![]() Wenn man den Link zu Google im Browser aufruft erhält man
Code:
aber das ist auch logisch, denn 1. muss man POST statt GET verwenden und 2. fehlen die Daten die geprüft werden sollen.
<?xml version="1.0" encoding="UTF-8"?><spellresult error="1"/>
Aber der Service läuft, sonst würde keine Antort oder Error 404 kommen. |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Jetzt geht der Link wieder, ich werde den Code später mal versuchen.
|
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Unten ist der Code den ich versucht habe, leider ohne Erfolg.
Delphi-Quellcode:
Exeption die ich bekomme:var TextStr, PostInformationStream: TStringStream; begin TextStr := TStringStream.Create(''); PostInformationStream := TStringStream.Create(''); try TextStr.WriteString('Teest'); try IdHTTP1.Post('http://www.google.com/tbproxy/spell?lang=de', TextStr, PostInformationStream); ShowMessage(PostInformationStream.DataString); except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; finally TextStr.Free; PostInformationStream.Free; end;
Delphi-Quellcode:
raise EIdIOHandlerPropInvalid.Create(RSIOHandlerPropInvalid);
|
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Delphi-Quellcode:
unit Unit5;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, StdCtrls; type TForm5 = class(TForm) Button1: TButton; IdHTTP1: TIdHTTP; Memo1: TMemo; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form5: TForm5; implementation uses MSXML, XMLDoc, ActiveX, XMLIntf; {$R *.dfm} function QuerySpell(Enty: string; ResultList: TStrings): Boolean; const C_URL = 'http://www.google.com/tbproxy/spell?lang=dt'; var oRequest: TStringStream; oResponse: TStringStream; sResponse: string; sRequest: string; sResult: string; RequestNode: IXMLNode; TextNode: IXMLNode; ResultNode: IXMLNode; aPartes: TArray<string>; XML: TXMLDocument; IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create(Application); try XML := TXMLDocument.Create(Application); try XML.Active := True; XML.Version := '1.0'; XML.Encoding := 'UTF-16'; RequestNode := XML.AddChild('spellrequest'); RequestNode.Attributes['textalreadyclipped'] := '0'; RequestNode.Attributes['ignoredups'] := '0'; RequestNode.Attributes['ignoredigits'] := '1'; RequestNode.Attributes['ignoreallcaps'] := '0'; TextNode := XML.CreateNode('text'); TextNode.Text := Enty; RequestNode.ChildNodes.Add(TextNode); XML.SaveToXML(sRequest); sRequest := StringReplace(sRequest, 'UTF-16', 'UTF-8', [rfReplaceAll]); oRequest := TStringStream.Create; try oRequest.WriteString(sRequest); oRequest.Seek(0, 0); IdHTTP.Request.Accept := 'text/xml'; IdHTTP.Request.ContentType := 'text/xml'; IdHTTP.Request.ContentEncoding := 'utf-8'; oResponse := TStringStream.Create; try IdHTTP.Post(C_URL, oRequest, oResponse); sResponse := UTF8ToString(RawByteString(oResponse.DataString)); XML.Active := False; XML.LoadFromXML(sResponse); ResultNode := XML.DocumentElement.ChildNodes.FindNode('c'); while (Assigned(ResultNode)) do begin ResultList.Add(StringReplace(ResultNode.Text,#9,#13#10,[rfReplaceAll])); ResultNode := ResultNode.NextSibling; end; Result := True; finally oRequest.Free; end; finally oResponse.Free; end; finally XML.Free; end; finally IdHTTP.Free; end; end; procedure TForm5.Button1Click(Sender: TObject); begin QuerySpell(Edit1.Text, Memo1.Lines) end; end. |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Hi, danke für den ausführlichen Code. Leider steht mir nur Delphi 7 Pers. und Lazarus 1.0.8 zur verfügung. Deshalb versuche ich das ganze mit der XML-Schnittstelle von Lazarus (
![]() Hier sind mal die ersten Versuche (Klappt hinten und vorne noch nicht). Ist es mit diser XML-Schnittstelle überhaupt möglich ?
Delphi-Quellcode:
uses
Classes, SysUtils, FileUtil, IdHTTP, Forms, Controls, Graphics, Dialogs, StdCtrls, DOM, XMLWrite; type { TForm1 } TForm1 = class(TForm) Button1: TButton; IdHTTP1: TIdHTTP; private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} function QuerySpell(Enty: string; ResultList: TStrings): Boolean; const C_URL = 'http://www.google.com/tbproxy/spell?lang=dt'; var oRequest: TStringStream; oResponse: TStringStream; sResponse: string; sRequest: string; sResult: string; RequestNode: TDOMNode; TextNode: TDOMNode; ResultNode: TDOMNode; //aPartes: TArray<string>; XML: TXMLDocument; IdHTTP: TIdHTTP; begin IdHTTP := TIdHTTP.Create(Application); try XML := TXMLDocument.Create; try //XML.Active := True; //XML.Version := '1.0'; //XML.Encoding := 'UTF-16'; RequestNode := XML.CreateElement('spellrequest'); TDOMElement(RequestNode).SetAttribute('textalreadyclipped', '0'); TDOMElement(RequestNode).SetAttribute('ignoredups', '0'); TDOMElement(RequestNode).SetAttribute('ignoredigits', '1'); TDOMElement(RequestNode).SetAttribute('ignoreallcaps', '0'); TextNode := XML.CreateElement('text'); //TextNode.Text := Enty; in lazarus ? RequestNode.ChildNodes.Item[0].AppendChild(TextNode); XML.SaveToXML(sRequest); sRequest := StringReplace(sRequest, 'UTF-16', 'UTF-8', [rfReplaceAll]); oRequest := TStringStream.Create(''); try oRequest.WriteString(sRequest); oRequest.Seek(0, 0); IdHTTP.Request.Accept := 'text/xml'; IdHTTP.Request.ContentType := 'text/xml'; IdHTTP.Request.ContentEncoding := 'utf-8'; oResponse := TStringStream.Create(''); try IdHTTP.Post(C_URL, oRequest, oResponse); sResponse := UTF8ToString(RawByteString(oResponse.DataString)); XML.Active := False; XML.LoadFromXML(sResponse); ResultNode := XML.DocumentElement.ChildNodes.FindNode('c'); while (Assigned(ResultNode)) do begin ResultList.Add(StringReplace(ResultNode.Text,#9,#13#10,[rfReplaceAll])); ResultNode := ResultNode.NextSibling; end; Result := True; finally oRequest.Free; end; finally oResponse.Free; end; finally XML.Free; end; finally IdHTTP.Free; end; end; end. |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Zitat:
![]() ![]() Allerdings könntest du für dein aktuelles Vorhaben das XML auch einfach manuell erzeugen:
Delphi-Quellcode:
So wirds übrigens auch im von sx2008 verlinkten Artikel gemacht:
var
xml: TStrings; response: String; TextToCheck: String; begin TextToCheck := Edit1.Text; // das Wort welches geprüft / korrigiert werden soll xml := TStringList.Create; try xml.Add('<?xml version="1.0" encoding="UTF-8"?>'); xml.Add('<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'); xml.Add(' <text>' + TextToCheck + '</text>'); xml.Add('</spellrequest>'); // idhttp erzeugen // properties setzen... response := Idhttp.Post(URL, xml); // in Response steht nun die Antwort vom Server und kann ausgewertet werden. finally FreeAndNil(xml); end; end; ![]() Die Auswertung der XML-Response kannst du evtl. mit Pos, PosEx, Copy oder RegEx machen. Ein richtiger XML-Parser ist da aber in den meisten Fällen die bessere Lösung ;-) EDIT: Ich habe gerade bemerkt, dass in oben verlinkten Thread die Response mittels der Regular Expression <(.|\n)*?> ausgewertet wird. Jetzt musst du nur noch eine RegEx-Klasse deiner Wahl darauf los lassen und brauchst dir keine Gedanken mehr um XML-Parser machen (bis zum nächsten Kontakt mit XML zumindest ;-) ) :D
Code:
retValue = Regex.Replace(data, @"<(.|\n)*?>", string.Empty).Split('\t')[0];
|
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Hi, danke für deine Antwort.
Ich habe es mal zunächst ohne Auswertung versucht, bekomme aber leider eine Exception.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var xml: TStrings; response: TStringStream; TextToCheck: String; begin TextToCheck := 'Teest'; // das Wort welches geprüft / korrigiert werden soll xml := TStringList.Create; response := TStringStream.Create(''); try xml.Add('<?xml version="1.0" encoding="UTF-8"?>'); xml.Add('<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'); xml.Add(' <text>' + TextToCheck + '</text>'); xml.Add('</spellrequest>'); IdHTTP1.Request.Accept := 'text/xml'; IdHTTP1.Request.ContentType := 'text/xml'; IdHTTP1.Request.ContentEncoding := 'utf-8'; try IdHTTP1.Post('http://www.google.com/tbproxy/spell?lang=de', xml, response); ShowMessage(response.DataString); except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; finally FreeAndNil(response); FreeAndNil(xml); end; end; |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Zitat:
Hatte beim tippen des Codes nicht mehr daran gedacht, dass die Übergabe eines TStrings-Objekts als Request an IdHTTP.Post Probleme machen kann. Das XML muss erst in einen Stream geschrieben werden welcher dann an Post übergeben werden kann. In einen meiner Codes habe ich das so gemacht:
Delphi-Quellcode:
Außerdem habe ich IdhTTP folgende Properties gesetzt:
var
... SendStream: TStream; begin // XML erzeugen ... SendStream := TMemoryStream.Create; // oder TStringStream + WriteString wie in Bummis Code try SendStream.Write(XML.Text[1], Length(XML.Text)); // bei Delphi 2009+: Length * 2 oder AnsiString statt String verwenden SendStream.Position := 0; // ... IdHTTP erzeugen, etc. IdHttp.Post(URL, SendStream, Response); // ... finally FreeAndNil(SendStream); end; end;
Delphi-Quellcode:
// HTTP-Einstellungen setzen
HTTP.Request.Accept := '*/*'; HTTP.Request.ContentType := 'text/xml'; HTTP.Request.Connection := 'Keep-Alive'; HTTP.HandleRedirects := True; |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Ich habe es gerade versucht, leider klappt es bis jetzt nicht. Wieder die gleiche Exception:
Stelle 1949:
Delphi-Quellcode:
raise EIdConnClosedGracefully.Create(RSConnectionClosedGracefully);
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var xml: TStrings; response: TStringStream; SendStream: TStream; TextToCheck: String; begin TextToCheck := 'Teest'; // das Wort welches geprüft / korrigiert werden soll xml := TStringList.Create; response := TStringStream.Create(''); SendStream := TMemoryStream.Create; try xml.Add('<?xml version="1.0" encoding="UTF-8"?>'); xml.Add('<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'); xml.Add(' <text>' + TextToCheck + '</text>'); xml.Add('</spellrequest>'); IdHTTP1.Request.Accept := '*/*'; IdHTTP1.Request.ContentType := 'text/xml'; IdHTTP1.Request.Connection := 'Keep-Alive'; IdHTTP1.HandleRedirects := True; SendStream.Write(xml.Text[1], Length(XML.Text)); SendStream.Position := 0; try IdHTTP1.Post('http://www.google.com/tbproxy/spell?lang=de', SendStream, response); ShowMessage(response.DataString); except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; finally FreeAndNil(response); FreeAndNil(xml); FreeAndNil(SendStream); end; end; |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Zitat:
![]() Was gibt dir ShowMessage(response.DataString); aus? (du musst im Exception-Dialog auf Fortsetzen klicken, damit das Programm weiterläuft) |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Ah so danke, ja es kommt tatsächlich was vernünftiges raus beim fortsetzen :-D
Für 'Teest':
Code:
Scheint also zu klappten, vielen dank nochmal.
<?xml version="1.0" encoding="UTF-8"?><spellresult error="0" clipped="0" charschecked="5" suggestedlang="en"><c o="0" l="5" s="1">Test Teestd Teeast Teeist Teeost</c></spellresult>
Wie ist das jetzt wenn ich einen ganzen Textabschnitt überprüfen will, muss ich dann jedes Wort einzeln anfragen ? Kann es da dann Probleme geben wegen übermaßigen Serveranfragen, es könnte ja als eine art Angriff gewertet werden, wenn ich ein paar 100 Wörter eines Textes so überprüfe (in entsprechend kurzer Zeit), oder ? |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Du kannst selbstverständlich auch mehrere Wörter bzw. einen ganzen Satz mit einem Request prüfen lassen.
Übrigens: Ich habe vorhin begonnen eine Komponente für Google Spellchecker zu entwickeln. Wenn sie fertig ist (was wohl nicht mehr lange dauern wird), möchte ich sie u. a. hier als OpenSource veröffentlichen. |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Hört sich interessant an!
Ich hab mal mit dem obigen Quelltext weiter gemacht und die Auswertung klappt jetzt sogar mit der XML-Komponente von Lazarus :thumb: Allerdings ist mir noch ein Problem aufgefallen. Die Antwortvorschläge kommen über den ResponseStream scheinbar nicht immer in gleichen Abständen rein. Hier mal ein Beispiel mit Quelltext:
Delphi-Quellcode:
Der Inhalt des ResponseStrings:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, IdHTTP, Forms, Controls, Graphics, Dialogs, StdCtrls, DOM, XMLWrite, XMLRead; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; IdHTTP1: TIdHTTP; Memo1: TMemo; Memo2: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var XMLString: TStrings; SendStream, ResponseStream: TStringStream; TextToCheck, Str1: String; XMLDoc : TXMLDocument; i: Integer; begin TextToCheck := 'Wass ist mit dem getartetn Teest'; // der Satz (oder Wort) welcher geprüft / korrigiert werden soll XMLString := TStringList.Create; try XMLString.Add('<?xml version="1.0" encoding="UTF-8"?>'); XMLString.Add('<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'); XMLString.Add(' <text>' + TextToCheck + '</text>'); XMLString.Add('</spellrequest>'); IdHTTP1.Request.Accept := '*/*'; IdHTTP1.Request.ContentType := 'text/xml'; IdHTTP1.Request.Connection := 'Keep-Alive'; IdHTTP1.HandleRedirects := True; SendStream := TStringStream.Create(XMLString.Text); ResponseStream := TStringStream.Create(''); try IdHTTP1.Post('http://www.google.com/tbproxy/spell?lang=de', SendStream, ResponseStream); Memo1.Text:= ResponseStream.DataString; except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; //ResponseStream in XML-Format wandeln ResponseStream.Position:= 0; XMLDoc:= Nil; ReadXMLFile(XMLDoc,ResponseStream); //Ausgabe der Wort-Vorschläge for i:= 0 to (XMLDoc.DocumentElement.ChildNodes.Count - 1) do begin Memo2.Lines.Add(utf8encode(XMLDoc.DocumentElement.ChildNodes.Item[i].FirstChild.TextContent)); //utf8encode wichtig ! sonst statt Umalauten nur '?' end; finally FreeAndNil(ResponseStream); FreeAndNil(XMLString); FreeAndNil(SendStream); FreeAndNil(XMLDoc); end; end; end.
Code:
Komisch wenn ich es aus der Memobox ausschneide und hier Einfüge stimmen die Abstände ja :shock:
<?xml version="1.0" encoding="UTF-8"?><spellresult error="0" clipped="0" charschecked="32"><c o="0" l="4" s="1">Was Ass Fass Hass Wams</c><c o="17" l="9" s="0">gestarteten gehärteten getakteten getasteten gewarteten</c><c o="27" l="5" s="0">Teestd Test Teeast Teeist Teeost</c></spellresult>
Bei mir erscheinen die Vorschläge für 'getartetn' statt wie oben so:
Code:
gestarteten gehärteten getakteten getastetengewarteten.
|
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Ah ok hat sich geklärt, bei Bummi steht ja schon die Lösung. Man kann einfach das #9 Zeichen durch #13#10 ersetzen bei der Ausgabe (oder sonst was man halt braucht...). Die Ausgabe von oben wäre dann z.B:
Delphi-Quellcode:
//Ausgabe der Wort-Vorschläge
with XMLDoc.DocumentElement.ChildNodes do begin for i:= 0 to (Count - 1) do begin Memo2.Lines.Add(StringReplace(utf8encode(Item[i].FirstChild.TextContent),#9,#13#10,[rfReplaceAll])); //utf8encode wichtig! Sonst statt Umalauten nur "?" angezeigt. end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz