Autor Beitrag
CABALxx
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: Mi 25.01.06 22:35 
Also ich bins mal wieder und hab ein Problem.
Situation ist folgende: ich will einen Bot schreiben. Er soll mir bei einem kleinen Internetgame zur hand gehen. Es gibt eine seite, da kann man Entwicklungen tätigen, per Buttonklick.
Mein kleiner Helfer soll nun kontrollieren ob schon eine Entwicklung läuft ( in diesem falle kann keine weitere gestartet werden ). Das ist kein Problem.

Er hat weiterhin eine Liste von Entwicklungen die er nach einander durchgehen soll, und als allererstes mal feststellen muss, ist die Entwicklung denn überhaupt verfügbar. Auch das ist kein Problem.

Das große Problem ist folgendes: Um eine Entwicklung zu starten, wird im normalfalle ein Button gedrückt.
Im Quelltext sieht das so aus:


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<tr>
    <td height="28"  align="center" width="25%" class="MainText">
       Basic Warfare</td>
    <td height="28"  valign="middle" width="55%" class="MainText">
      Research into the basic fundamentals of warfare in space.<br>
      <b>Composite: 4000, Energy: 500,</b><br>
      <i>4 Hours Research</i>
    </td>
    <td height="28"  valign="middle" align="center" width="20%" class="MainText">
      <a href="research.aspx?ItemID=1"><img src="Btn_Start.gif" width="70" height="23" border="0"></a>
    </td>
  </tr>



So ich hab versucht das Problem so zu lösen, das ich mit Pos und Copy den teil mit ?ItemID=.... rausgeschnitten habe und an die URL gehängt habe. Dadurch kann man diesem Submiteffekt ebenfalls erreichen. Hat auch ganz gut geklappt, für die erste Entwicklung. Nur scheinbar sind die Zeichenanzahlen, Zeilenlängen usw. im Quelltext so verschieden bei den verschiedenen Entwicklungen, das sich das nicht veralgemeinern lies.

Hier mein Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
procedure TForm1.Timer6Timer(Sender: TObject);
var p, i : integer;
    nores, researchcode, s, b, e, item : string;
    Techtree : array of string;
begin

nores := 'no research';
researchcode := Memo1.Text;
i := 0;

SetLength(techtree, 50);
techtree[1] := 'electrical integrity';
techtree[2] := 'basic extraction';
techtree[3] := 'basic warfare';
techtree[4] := 'field absorption';
techtree[5] := 'adv. mining';
techtree[6] := 'adv. generation';
techtree[7] := 'wave arrays';
techtree[8] := 'energy lancing';
techtree[9] := 'applied physics';
techtree[10] := 'improved hulls';
techtree[11] := 'warp technology';
techtree[12] := 'adv. hulls';
techtree[13] := 'hull fields';
techtree[14] := 'spatial barrages';
techtree[15] := 'flanking manoeuvres';
techtree[16] := 'heat shielded armour';
techtree[17] := 'structure shattering';
techtree[18] := 'electronic shielding';

repeat
    i := i +1;
    item := techtree[i];
until pos(item, researchcode) > 0;



     if Pos(nores, researchcode) > 0 = true then
     begin
     s := Memo1.Text;
     p := pos(item, s ) + 200;
     b := copy(s, p, 78);
     p := pos('href', b)+19;
     e := copy(b, p, MaxInt);
     p := pos('"><img', e);
     s := copy(e, 1, p-1);
     Memo2.Text:= s;

     WebBrowser1.Navigate('http://www.starsphere.net/game/research.aspx' + s);
     end
     else
     Memo2.Text := 'no research nicht gefunden';


end;


Für das erste Item in dem Array klappt das ausgezeichnet, aber für alle anderen sind die Werte für die Zeichen also, z.B. + 200, oder Copy in der Länge 78 Zeichen, total verschieden und funktionieren nicht mehr.

Gibt es vielleicht eine Bessere Lösung???

Danke schonmal für eure Hilfe
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: So 29.01.06 17:26 
hmm ich habs nochmal versucht bisschen zu ändern, aber es hat nicht geklappt.

Ich wüsste jetzt auch keine andere möglichkeit.

Wenn einer eine Idee hat, ich bin für jeden Rat dankbar
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 29.01.06 18:10 
Hallo,
kannst Du denn nicht direkt mit dem Webbrowser oder über MSHTML auf das Document-Object-Modell auf href=... zugreifen?
Es ist auch möglich auf innerText der <td>-HTML-Elemente zuzugreifen. :arrow: so
Gehts eventuell so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var s : String;
begin
  s := Memo1.Text;
  Delete(s,1,Pos('Basic Warfare',s));//!!Groß-/Kleinschreibung beachten !!
  Delete(s,1,Pos('research.aspx?ItemID=',s)+Length('research.aspx?ItemID=')-1);
  s := Copy(s,1,Pos('"',s)-1);
  showmessage('http://www.starsphere.net/game/research.aspx?ItemID='+s);

Sonst hänge doch mal den kompletten Quelltext der Seite hier an,
dann kann man eventuell besser etwas dazu sagen.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: So 29.01.06 21:57 
Hallo

Vielen dank schonmal

ich werde beide methoden mal ausprobieren.

Ich wusste garnicht das es Delete gibt .

Danke danke ich meld mich wieder
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 29.01.06 22:11 
Eine weitere Möglichkeit, das Problem anzugehen, ist die Nutzung von "regulären Ausdrücken", auch wenn man dazu zusatz-Units benötigt.

Mit solch einer Unit würdest Du dann nur noch nach

(Achtung: PHP-RegExp-Syntax)
#"http://www.starsphere.net/game/research.aspx?ItemID=([0-9a-zA-Z]+)"#ism

suchen und würdest ein Array mit den IDs zurückbekommen. Leider gibt's für Delphi kaum brauchbare Units, die an die RegExps von PHP auch nur annähernd rankommen (aber es gibt sie, such mal bei Torry).

Auf die Art kann man (mit etwas Fummelei) sogar komplette Revisions-Logs bei SourceForge mit einem Befehl auslesen (Selber schon erfolgreich gemacht, allerdings war der RegExp ETWAS* länger ) ;-)

* Im Endeffekt 3 Bildschirm-Zeilen, bei ~280 Zeichen Länge und 6 Matching und weiteren 8 Non-Matching-Klammern. Zwischenzeitlich hab ich sogar PHP zum Abstürzen bekommen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: Di 31.01.06 18:51 
Ui

das scheint mir eine sehr komplizierte Methode zu sein. Und ich muss sagen ich hab leider keine Ahnung von PHP

ich werd erstmal die andere Methode probieren und mich wieder melden, sobald ich mal Zeit finde.
Danke aber trotzdem, vielleicht brauch ichs ja dennoch, wenn die andren Methoden versagen.
:wink:
bis dann

:D
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Di 31.01.06 19:16 
Hallo,

ich hatte mal etwas quick and dirty gepinselt.
Eine Htmldatei wird eingelesen und dann alles nach 'href=' usw. in dem memofeld gespeichert.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
unit HrefFinden; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls; 

type 
  TForm1 = class(TForm) 
    Memo1: TMemo; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
  private 
    { Private-Deklarationen } 
    S : string
  public 
    { Public-Deklarationen } 
  end

var 
  Form1: TForm1; 

implementation 

{$R *.dfm} 
uses 
  strutils; 

procedure TagFolgerSuchen(tag:string;var s:string;var outstrL :TStringlist); 
var 
  i,von,bis,ltag :integer; 
  Kopie : string
begin 
  //Ausgabeliste leeren 
  outstrL.clear; 
  // Alles in Grossbuchstaben 
  Kopie := s; 
  Kopie:= uppercase(Kopie); 
  tag := uppercase(tag); 
  //alle SteuerZeichen etc zu Leerzeichen umwandeln 
  for i := 1 to length(Kopie) do 
    If Kopie[i] in[#0..#31,'<','>'then 
      Kopie[i] := #32
  ltag := length(tag); 
  von := 1
  if length(Kopie)>lTag then 
    repeat 
      von := PosEx(tag,Kopie,von); 
      //Kein Tag mehr gefunden -> Schleife verlassen 
      if von = 0 then 
        break; 
      von := von+ltag; 
      if von >ltag then 
        //Tag muss vereinzelt sein in nicht zufaellig ein Text 
        if Kopie[von-ltag-1]=' ' then 
          begin 
          // Falls Hochkomma dann abschliessendes Hochkomma suchen 
          case Kopie[von] of 
          #34 : begin 
                inc(von); 
                bis := PosEx('"',Kopie,von)-1
              end
          #39 : begin 
                inc(von); 
                bis := PosEx(#39,Kopie,von)-1
                end 
          else 
            bis := PosEx(' ',Kopie,von)-1
          end;//case 
          if bis >0 then 
            begin 
            outstrL.Add(copy(s,von,bis-von+1)); 
            von := bis+1
            end
          end;// I 
    until false; 
end

procedure TForm1.Button1Click(Sender: TObject); 
const 
  trenner='******************************************************************'
var 
  strL :TStringLIst; 
begin 
   strL := TSTringList.Create; 
   StrL.LoadFromFile('c:\T-online.de.html'); 
   s := strL.Text; 
   memo1.Clear; 

   Memo1.Lines.Add(trenner);Memo1.Lines.Add('Href');Memo1.Lines.Add(trenner); 
   TagFolgerSuchen('href=',s,StrL); 
   memo1.Lines.AddStrings(strl); 

   Memo1.Lines.Add(trenner);Memo1.Lines.Add('Titel');Memo1.Lines.Add(trenner); 
   TagFolgerSuchen('title=',s,StrL); 
   memo1.Lines.AddStrings(strl); 

   Memo1.Lines.Add(trenner);Memo1.Lines.Add('Name');Memo1.Lines.Add(trenner); 
   TagFolgerSuchen('name=',s,StrL); 
   memo1.Lines.AddStrings(strl); 

   Memo1.Lines.Add(trenner);Memo1.Lines.Add('Werte');Memo1.Lines.Add(trenner); 
   TagFolgerSuchen('value=',s,StrL); 
   memo1.Lines.AddStrings(strl); 

   Memo1.Lines.Add(trenner);Memo1.Lines.Add('ID''s');Memo1.Lines.Add(trenner); 
   TagFolgerSuchen('iD=',s,StrL); 
   memo1.Lines.AddStrings(strl); 

   Memo1.Lines.Add(trenner);Memo1.Lines.Add('Anker');Memo1.Lines.Add(trenner); 
   TagFolgerSuchen('a ',s,StrL); 
   memo1.Lines.AddStrings(strl); 

   strL.Free; 
end

end.


Gruss Horst
CABALxx Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 174


D7 Ent
BeitragVerfasst: Mi 01.02.06 18:06 
Hallo

Vielen Dank für den Code. Ich werd den mal Probieren

das wäre natürlich das Optimum wenn der so funktionieren würde.

Ich werds mal Probieren.

Aber rein des Verständnisses her:

Was genau bedeutet denn das:

ausblenden Quelltext
1:
Kopie[i] := #32;					



???

Weil Kopie ist doch String und I integer und ich kenne diese Darstellungsform eignetlich nur von Arrays oder Lists.?

Vielen dank :D
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mi 01.02.06 18:40 
Hallo,

das ist ja das Angenehme, dass man einen String als array[1..lenght(string)] of char auffassen darf.
Es geht darum alle Steuerzeichen,usw zu einem Blank =' '= chr(32)=#32 umzuwandeln.
Damit wird als Trenner zweier Worte immer ein ' ' gefunden.
'<td>' wird zu ' td 'usw.

Na hoffentlich ist es auch das, was Du suchst.

Gruss Horst