MozRepl Connector

      MozRepl Connector

      Hiho, da ich im Netz keinen MozRepl Connector gefunden habe (für C++), habe ich mir einen gecoodet (auch zur Übung). Das is dabei rausgekommen. Vielleicht hat jemand interesse weiter daran zu Proggen :)


      socket.h
      Spoiler anzeigen

      C-Quellcode

      1. #ifndef SOCKET_H
      2. #define SOCKET_H
      3. #include <iostream>
      4. #include <string.h> //String
      5. #include "winsock2.h" // WinSock
      6. /* Simpel MozRepl Class by Speedy */
      7. class MozRepl
      8. {
      9. protected:
      10. WSADATA wsaData;
      11. SOCKET mySocket;
      12. SOCKET myBackup;
      13. sockaddr_in myAdress;
      14. private:
      15. bool SendData(char*); // Winsocket send
      16. int RecvData(void); // Winsocket recv
      17. void CloseConn(void); // aufraeumen
      18. void Format(); // RecvBuf Formatieren
      19. public:
      20. MozRepl(); // Standart Constructor
      21. MozRepl(char*,int); // Constructor ip undd port
      22. ~MozRepl(); //Defstructor
      23. char RecvBuf[512]; // Rückgabe von Recv
      24. char *ip; //Ip von MozRepl
      25. int port; //Port von Mozrepl
      26. bool ConnectFF(); //Verbindung aufbauen
      27. bool MozStuck(); // AntiStuck
      28. bool FFSend(char*);
      29. };
      30. #endif // SOCKET_H


      socket.cpp
      Spoiler anzeigen

      C-Quellcode

      1. #include "..\include\socket.h"
      2. /* Zum Daten Senden intern */
      3. void MozRepl::Format()
      4. {
      5. std::string str;
      6. str = RecvBuf;
      7. // für repl>
      8. std::string search_word = "repl>";
      9. std::string replace_word = "";
      10. size_t pos = 0, length = search_word.length();
      11. while ((pos = str.find(search_word, pos)) != std::string::npos)
      12. str.replace(pos, length, replace_word);
      13. //für repl1>
      14. search_word = "repl1>";
      15. length = search_word.length();
      16. while ((pos = str.find(search_word, pos)) != std::string::npos)
      17. str.replace(pos, length, replace_word);
      18. //für repl2>
      19. search_word = "repl2>";
      20. length = search_word.length();
      21. while ((pos = str.find(search_word, pos)) != std::string::npos)
      22. str.replace(pos, length, replace_word);
      23. //für repl3>
      24. search_word = "repl3>";
      25. length = search_word.length();
      26. while ((pos = str.find(search_word, pos)) != std::string::npos)
      27. str.replace(pos, length, replace_word);
      28. // Mehr als 3 ? Na dann ging was schieff
      29. // Zum schluss aufräumen
      30. search_word = "http://";
      31. length = search_word.length();
      32. while ((pos = str.find(search_word, pos)) != std::string::npos)
      33. str.replace(pos, length, replace_word);
      34. search_word = '"';
      35. length = search_word.length();
      36. while ((pos = str.find(search_word, pos)) != std::string::npos)
      37. str.replace(pos, length, replace_word);
      38. //Anschliessend wieder füllen..
      39. int temp = str.size();
      40. for (int a=0;a<=temp;a++)
      41. {
      42. RecvBuf[a]=str[a];
      43. }
      44. }
      45. bool MozRepl::SendData(char *buffer)
      46. {
      47. if(send(mySocket,buffer, strlen(buffer),0) == SOCKET_ERROR)
      48. return false; // uergend was ging schieff
      49. else
      50. return true; // alles i.o
      51. }
      52. /* Zum Empfangen intern */
      53. int MozRepl::RecvData()
      54. {
      55. int byte;
      56. do {
      57. byte = recv(mySocket, RecvBuf, 512,0);
      58. if(byte == 0)
      59. return 2; // conn closed
      60. else if(byte == -1)
      61. return 3; //uergend was lief falsch...
      62. else
      63. RecvBuf[byte] = '\0';
      64. Format();
      65. return 1;
      66. // Aufraeumen
      67. } while( byte > 0 );
      68. //Formatieren... ...> expl..
      69. }
      70. void MozRepl::CloseConn()
      71. {
      72. if(closesocket(mySocket) == SOCKET_ERROR)
      73. printf("\n");// Kein Socket offen! egal...
      74. else
      75. printf("\n");// Socket war offen.. egal ..
      76. mySocket = myBackup; // Backup von socket evtl hilfreich ..
      77. }
      78. /* Constructor 2 */
      79. MozRepl::MozRepl(char *_ip,int _port)
      80. {
      81. ip = _ip;
      82. port = _port;
      83. if(ConnectFF() != true)
      84. exit(1);
      85. else
      86. if(RecvData()!=1)
      87. exit(1);
      88. }
      89. /* Constructor 1 */
      90. MozRepl::MozRepl()
      91. {
      92. ip = "127.0.0.1";
      93. port = 4242;
      94. if(ConnectFF() != true)
      95. exit(12);
      96. else
      97. if(RecvData()!=1)
      98. exit(12);
      99. }
      100. MozRepl::~MozRepl()
      101. {
      102. // Aufräumen
      103. CloseConn();
      104. WSACleanup();
      105. }
      106. bool MozRepl::ConnectFF()
      107. {
      108. if(WSAStartup(MAKEWORD(2,2), &wsaData) == SOCKET_ERROR)
      109. {
      110. printf("WSA Start nicht möglich! Error-Code: %d \n", WSAGetLastError());
      111. return false;
      112. }
      113. else
      114. {
      115. mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      116. if( mySocket == INVALID_SOCKET)
      117. {
      118. printf("Socket Start nicht möglich! Error-Code: %d \n", WSAGetLastError());
      119. return false;
      120. }
      121. else
      122. {
      123. printf("Connect zu MozRepl via: \n");
      124. printf("Port: %d\n",port);
      125. printf("IP: %s\n",ip);
      126. myBackup = mySocket; //Backup vom socket
      127. myAdress.sin_family = AF_INET;
      128. myAdress.sin_addr.s_addr = inet_addr( ip );
      129. myAdress.sin_port = htons( port );
      130. if(connect( mySocket, (SOCKADDR*) &myAdress, sizeof(myAdress)) == SOCKET_ERROR)
      131. {
      132. printf("Connect nicht Möglich! Error-Code: %d \n", WSAGetLastError());
      133. return false;
      134. }
      135. else
      136. {
      137. return true;
      138. }
      139. }
      140. }
      141. }
      142. // überprüfen ob Sticki BETA
      143. bool MozRepl::MozStuck(void)
      144. {
      145. if ( strstr(RecvBuf, "....>") == NULL )
      146. return true;
      147. else
      148. return false;
      149. }
      150. bool MozRepl::FFSend(char *command)
      151. {
      152. if(SendData(command) == true) //Senden
      153. if(RecvData()==1) //Empfangen
      154. if(MozStuck() == true) // Prüfen auf ...> wenn ja
      155. if( SendData(";\r") == true) // ; senden
      156. if(RecvData()==1) // Empfangen
      157. if(SendData(command) == true) // nochmal senden...
      158. if(RecvData()==1) // und nochmal empfangen...
      159. return true; //okay
      160. else
      161. return false;
      162. else
      163. return false;
      164. else
      165. return false;
      166. else
      167. return true;
      168. else
      169. return true;
      170. else
      171. return false;
      172. else
      173. return false;
      174. }

      Hier ein Einfaches Beispiel (nicht vergessen libws2_32.a zu Linken)
      Spoiler anzeigen

      C-Quellcode

      1. #include <iostream>
      2. #include <windows.h>
      3. #include "include\socket.h"
      4. int main()
      5. {
      6. MozRepl _FF; // oder MozRepl _FF("127.0.0.1",4242);
      7. //printf("%s \r",_FF.RecvBuf); // MozRepl Begrüssung
      8. char *send;
      9. send = "content.location.href\r";
      10. printf("Sende: %s\n",send);
      11. if(_FF.FFSend(send)==true)
      12. printf("Erhalten: %s" , _FF.RecvBuf);
      13. send = "content.location.href = 'http://www.autoitbot.de'\r";
      14. printf("Sende: %s\n",send);
      15. if(_FF.FFSend(send)==false) // Gibt nix zurück als auch nicht ausgeben...
      16. printf("Fehler beim Senden\r");
      17. return 1;
      18. }

      :!: I never comment my sourcecode. What's HARD to write must be HARD to read! © :!:
      :!: ROGRAMMING LANGUAGES ARE LIKE GIRLFRIENDS: THE NEW ONE IS BETTER BECAUSE *YOU* ARE BETTER :!:
      Hallo Speedy.
      Da du hier nicht mehr aktiv bist erwarte ich mir keine Antwort, aber ich probiere es trotzdem.

      Danke für diesen Connector. Funktioniert wunderbar.
      Leider ist mir die Syntax noch nicht ganz klar.

      Ich schaffe es eine Website zu öffnen:
      send = "content.location.href = 'http://www.extremetech.com'\r";

      oder die Toolbar zu hiden/unhiden:
      send = "document.getElementById('toolbar-menubar').hidden = true";

      Aber Werte mittels XPath auszulesen gelingt mir nicht, da mir der Ansatz fehlt.

      Ich habe es mit Autoit geschafft Werte einer Website (Stocks) auszulesen, jedoch war mir Chart drawing viel viel zu langsam und ich bin auf C++ mit OpenGL gewechselt.
      Was Autoit in 45 minuten gezeichnet hatte zeichne ich nun in 0,5 Sekunden.

      Wie auch immer. Wäre für jeden Hinweis dankbar was XPath angeht bzw. Mozrepl Befehle.

      Danke,
      ChriS
      Was Autoit in 45 minuten gezeichnet hatte zeichne ich nun in 0,5 Sekunden.

      Das kann ich mir irgendwie kaum vorstellen. Auch Autoit kennt OpenGL, vlt wäre das eine Lösung. Ansonsten schau dir doch mal Selenium an:
      github.com/linotex/quelenium (C++)
      oder für viele andere Sprachen:
      docs.seleniumhq.org/download/
      Ich kann nur erzählen was ich herausgefunden habe bezüglich Autoit mit "GraphGDIPlus.au3" + und C++ mit OpenGL und da ist es so dass ich eine CSV Datei mit 2Millionen Chart Ticks in 45 Minuten plotten konnte.
      In C++ benötige ich 0,5 Sekunden für den selben Vorgang. Klingt komisch, ist aber so.
      Irrlicht habe ich in Autoit auch probiert und da ist es ähnlich schnell (nicht ganz aber fast). Allerdings lässt es sich schlecht mit Koda(Windows) GUI Elementen kombinieren.
      Wie auch immer. Ich bin nun schon für dieses Projekt und zu Lernzwecken zu C++ gewechselt und es ist sauschnell.
      Nur aus Interesse. Wie kann man OpenGL sonst noch über Autoit ansprechen? Welche UDF?

      @CentuCore
      Heißt daß das ich mit send und receive (mit dem MozRepl Connector) auch XPath Befehle senden kann oder benötige ich da etwas eigenes?
      Sollte ja gehen da ja XPath auch Javascript ist, oder?

      Die XPath's habe ich ja schon von meinem AutoIt Programm wo das wunderbar funktioniert.
      Auch das erzeugen der XPaths mittels Firebug ist recht leicht.

      Danke für Eure Antworten!!

      Greets
      ChriS

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Blaxxun“ ()

      Das Irrlicht, bzw C++ & OpenGL schneller ist liegt unteranderem an der Performance von GDI+ (wird per Software gezeichnet).
      OpenGL sendet die DrawCommands an die GPU (= hardwareunterstütztes Zeichnen).
      Irrlicht ist eine Engine die entweder Direct3D oder eben OpenGL als Renderer verwendet. Darum wird die Performance ähnlich sein.
      Ich mein mich zu erinnern das es mal eine OpenGl.au3 gab müsstest danach googlen (oder ich find sie auf meiner Festplatte, geh aber lieber nicht davon aus)
      Ganz ehrlich ich empfehl dir C++. Die Lernkurve ist am Anfang steil, aber du hast soviel mehr Möglichkeiten plus die IDEs sind mit ihren Debuggern deutlich besser.

      Zu XPath in Javascript kannst du dir das anschauen: developer.mozilla.org/en-US/do…using_XPath_in_JavaScript
      Aber ja, wenn du's so machst kannst du XPaths senden.

      Edit: OpenGL kann ich nicht finden, dafür aber eine Direct3D9 UDF. Die war von @Deathly Assassin.
      Dateien
      • D3D9 UDF.zip

        (527,64 kB, 1 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „CentuCore“ ()

      @CentuCore
      Hallo, danke für die UDF und die Links.

      Ja, wegen der Hardware Unterstützung bei OpenGL bin ich ja gewechselt da GDI+ ja, wie du sagst nur Software seitig Rendert.
      Bezüglich C++ gebe ich dir vollkommen Recht. Extrem steile Lernkurve, dafür aber auch extrem schnell.
      AutoIt hat durch seine fantastische Hilfe und "Einfachheit" in vielen Bereichen die Nase vorne. Aber eben nicht in allen Bereichen.

      Ich werde also nun versuchen mittels "send" XPath Code an Firefox zu senden (Sobald ich die genaue Syntax gefunden habe). Mal sehen ob er mit etwas brauchbarem antwortet.

      Danke für die Hilfe.

      lg
      ChriS

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Blaxxun“ ()