![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 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