Text auf Website auslesen?



  • Hallo,
    wie kann ich in einer Konsolenanwendung den Queltext oder den Text einer Website auslesen? Und wie kann ich überhaupt eine Website "anbrowsen"?

    Danke



  • SFML hat eine Klasse Http 😉



  • GRRMPF 😃 Ich möchte mal ohne SMFL dingens weil es bei mir nicht funktioniert. Und weil ich nicht weiß wie ich es ohne zusätzliche Dateien machen kann. Also kennt jmd eine Lösung?

    Dank



  • boost::asio.



  • iMüll schrieb:

    GRRMPF 😃 Ich möchte mal ohne SMFL dingens weil es bei mir nicht funktioniert.

    Ich wollte dir ja im anderen Thread helfen, aber wenn du nicht antwortest, ist wohl nichts zu machen.

    SFML zu installieren ist nicht schwieriger als jede andere Bibliothek. Also wirst du wahrscheinlich auch mit sonstigen Bibliotheken Mühe haben. Boost scheint dir ja auch nicht zu passen.

    Unter Windows könntest du sicher mit der WinAPI etwas erreichen, damit wärst du allerdings im entsprechenden Unterforum besser aufgehoben. Wahrscheinlich brauchst du hier aber einiges mehr an Code.



  • 😃 kannst du mir erklären wie ich das hinzufügen muss das es geht? Ich habe Visual Studio 2010 Prof, aber ich weiß nicht wo ich was runterladen muss das es funktioniert.

    Danke



  • @Nexus warum antworte ich nicht?



  • WinSock Verbindung über Port 80, HTTP Get, recv(), fertig oO



  • lustig lustig



  • libcurl.
    Beispiel aus einem Live-Programm:

    //////////////////////////////////////////////////////////////////////////
    // Curl Callback
    static size_t my_curl_write( void *ptr, size_t size, size_t nmemb, void *stream)
    {
            if ( stream != NULL )
            {
                    Mainframe* frame = static_cast<Mainframe*>(stream);
                    wxString b((char*)ptr);
                    frame->TellVersion(b);
            }
            return size*nmemb;;
    }
    
    void Mainframe::OnCheckVersion( wxCommandEvent& )
    {       
            CURL* curl = curl_easy_init();
            curl_easy_setopt(curl, CURLOPT_URL, "http://awesomescript.googlecode.com/svn/trunk/ass_version.txt");
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_curl_write);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
            if ( curl_easy_perform(curl) != CURLE_OK ) 
            {
                    wxErrorBox(_("Could not connect to server. Please check Firewall or try later."), this);
            }
            curl_easy_cleanup(curl);        
    }
    

    Der Code lädt eine Versions-Datei runter und überprüft den String gegen die aktuelle Version.
    Quelle



  • iMüll schrieb:

    😃 kannst du mir erklären wie ich das hinzufügen muss das es geht? Ich habe Visual Studio 2010 Prof, aber ich weiß nicht wo ich was runterladen muss das es funktioniert.

    1. Deine gewünschte Version hier herunterladen (Official SFML libraries -> C++ | Version 1.6 -> SFML full SDK -> Windows - Visual C++ 2008).
    2. Projektdatei (.sln) öffnen, in einem Ordner "build/vc2008" oder so
    3. Konvertieren nach VS 2010, Dialog kommt automatisch
    4. SMFL.sln neu kompilieren (Erstellen -> Projektmappe neu erstellen)
    5. In deinem Programm benötigte Bibliotheken linken (wahrscheinlich sfml-system und sfml-network)
    6. Fertig

    Ist übrigens noch ausführlicher im Tutorial auf der Homepage erklärt. Hast du das gelesen?

    iMüll schrieb:

    @Nexus warum antworte ich nicht?

    Das musst du dich selbst fragen 🙂

    Bei Fehlern musst du halt konkret werden. Wie du deine Linkerfehler wegbringst, wurde ja erwähnt.



  • Warum wird mir Mainstream und wx.. unterstrichen?



  • iMüll schrieb:

    Warum wird mir Mainstream und wx.. unterstrichen?

    Weil der Code von Scorcher24 nicht für 1:1 Copy-Paste, sondern als Beispielcode gedacht ist. Er verwendet die Bibliotheken libcurl und wxWidgets, die du auch erst installieren müsstest.



  • Das heißt ich muss sie extra zum Programm dazulegen??



  • iMüll schrieb:

    Das heißt ich muss sie extra zum Programm dazulegen??

    Ich hab dir libcurl vorgeschlagen. Und ein kleines Beispiel aus einem Programm von mir um dir zu zeigen, wie man libcurl verwendet.
    Aber mir scheint du willst nur Code den du 1:1 kopieren kannst.
    Hast du überhaupt irgendeine Ahnung was Libraries sind?



  • Wie wärs erstmal mit einfachen Dingen C++ kennenzulernen (mir scheint du hast...ja.. gar keine Ahnung). Oder mit einer für diese Aufgabe gemachte Programmiersprache?



  • @Nexus habe es genauso wie du gemacht und hier mal ein Auszug aus den Fehlern: http://s7.directupload.net/images/110326/tdehlab2.png Warum ist das so?

    Danke



  • #include <stdio.h>
    #include <WinSock2.h>
    
    #pragma comment (lib, "Ws2_32.lib")
    
    // Rückgabewerte sind eh lame ;)
    int main()
    {
      WSADATA wsadata;
      int sock;
      struct sockaddr_in addr = {0};
      struct hostent* host;
      char buf[100];
      char request_dummy[] = 
        "GET / HTTP/1.0\r\n"
        "Host: %s \r\n"
        "\r\n";
      char request[256];
    
      printf("Server: ");
      fgets(buf, sizeof(buf), stdin);
      buf[strlen(buf) - 1] = 0;
      WSAStartup(WINSOCK_VERSION, &wsadata);
      host = gethostbyname(buf);
      if (!host)
      {
        printf("Could not find host: %s\n", buf);
        return 1;
      }
      addr.sin_addr = *(struct in_addr*)host->h_addr;
      addr.sin_family = PF_INET;
      addr.sin_port = htons(80);
      sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      connect(sock, (struct sockaddr*)&addr, sizeof(addr));
      sprintf(request, request_dummy, buf);
      send(sock, request, strlen(request), 0);
    
      while (1)
      {
        int rval = recv(sock, buf, sizeof(buf) - 1, 0);
        if (rval <= 0)
          break;
        buf[rval] = 0;
        printf("%s", buf);
      }
    
      closesocket(sock);
      WSACleanup();
      getchar(); // blah
      return 0;
    }
    

    Da! Nix libcurl 😃



  • Naja, wollte so ne Klasse eh mal basteln für meine kleine Headersammlung und bin mal nicht so. Ausserdem war mir langwelig :D.

    // Author: Scorcher24
    // License: Public Domain
    // Purpose: Easy download of a small document from any http-server.
    
    #include <curl/curl.h>
    #include <curl/easy.h>
    #include <string>
    
    #ifdef _MSC_VER
    #pragma comment(lib, "libcurl_imp.lib")
    #else
    #warning "Don't forget to link to libcurl. Autolink not possible!"
    #endif /* _MSC_VER */
    
    namespace Internet{
    
    class EasyCurl
    {
    public:
        bool downloadFile(const std::string& url)
        {
            CURL* curl = curl_easy_init();
            curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &EasyCurl::callback);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);
            if ( curl_easy_perform(curl) != CURLE_OK ) 
            {
                return false;
            }
            curl_easy_cleanup(curl);    
            return true;
        }
    
        const std::string& getResult() const { return m_lastResult; }
    
    private:
    
        static size_t callback( void *ptr, size_t size, size_t nmemb, void *user)
        {
            if ( user != NULL )
            {
                EasyCurl* p = static_cast<EasyCurl*>(user);
                if ( p )
                {
                    p->setResult(static_cast<const char*>(ptr));
                }
            }
            return size*nmemb;
        }
    
        void setResult(const char* r)
        {
            m_lastResult += std::string(r);
        }
    
    private:
        std::string m_lastResult;
    };
    
    } // Namespace
    

    Verwendung:

    #include "EasyCurl.hpp"
    #include <iostream>
    using namespace std;
    
    int main(int argc, char** argv) 
    {
        if ( argv[1] == NULL )
        {
            std::cout << "Usage: easycurl url" << std::endl;
            return -1;
        }
        Internet::EasyCurl c;
        c.downloadFile(argv[1]);
        std::cout << c.getResult();
        return 0;
    }
    

    Ein vorkompiliertes libcurl hab ich dir hier hochgeladen:
    http://www3.zippyshare.com/v/41773400/file.html

    Viel Spaß damit.

    edit: Nen kleinen glitch korrigiert



  • Ok, jetzt wirds peinlich @Sorcher24 viiiiielen Dank für den Code. Jedoch geht es einfach nicht. Schau dir das mal an: http://s7.directupload.net/images/110326/jihgo87m.png was bitte ist das falsch warum kann ich die header datei nicht includen?

    Danke


Anmelden zum Antworten