Florian Kammerer: Linkklick-Erkennung auf externem Server

Hallo SelfHTML Community,
in unserem Betrieb gibt es ein kleines Problemchen, an dem ich Hilfe bräuchte:

Wir würden gerne sehen wann ein User auf einen bestimmten Downloadlink klickt, und zwar auf einem externen Server.

Die Idee dahinter, man erstellt zu jedem Download den es gibt
eine Dummy-Datei mit unterschiedlicher Kennung (was kein Problem ist), welche beim Link mitgeladen wird und diese Dummy-Datei befindet sich auf unserem internen Server, von wir den Status abrufen können.

Wäre es möglich direkt mit HTML einen Downloadlink zu kreieren, in dem eine zweite Datei unwissentlich mitgeladen wird ? Meine erste Idee war ein JavaScript-Befehl, der scheidet jedoch aus, weil viele Javascript deaktiviert haben :(
Eine weitere Idee wäre eine Referrer einzubauen, welcher auf unserem Server liegt, der wiederum auf die Datei des externen Server verweisst.

Gibts es vielleicht andere klügere Alternativen ? Evtl. ohne
Referrer ?

  1. hi,

    Wir würden gerne sehen wann ein User auf einen bestimmten Downloadlink klickt, und zwar auf einem externen Server.

    und aus welchen gründen seid ihr der meinung, das würde euch etwas angehen?

    Wäre es möglich direkt mit HTML einen Downloadlink zu kreieren, in dem eine zweite Datei unwissentlich mitgeladen wird ?

    nein.

    es wäre höchstens möglich, nicht direkt auf die download-datei zu verlinken, sondern zuerst auf eine HTML-seite, die dann per redirect auf den download weiterleitet.

    Meine erste Idee war ein JavaScript-Befehl, der scheidet jedoch aus, weil viele Javascript deaktiviert haben :(
    Eine weitere Idee wäre eine Referrer einzubauen, welcher auf unserem Server liegt, der wiederum auf die Datei des externen Server verweisst.

    wenn JS ausscheidet, scheidet der referrer aus dem gleichen grund aus.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. und aus welchen gründen seid ihr der meinung, das würde euch etwas angehen?

      Nur mal so: warum sollte es den Betreiber nicht interessieren wollen, wie groß das Interesse an seinem Angebot ist?

      Viele Grüße!
      _Dirk
      DECAF°

      1. Hi Schuer,

        Nur mal so: warum sollte es den Betreiber nicht interessieren wollen, wie groß das Interesse an seinem Angebot ist?

        Dazu muss man aber nicht wissen, wann welcher User _wo_ auf _welchen_ Link geklickt hat. Dazu reicht es lediglich zu wissen, wie oft eine Seite/Datei aufgerufen wurde, eventuell kann man ja auch noch in den überlieferten Referres stöbern - aber das findet man alles schon in der access-log Datei. Da braucht man kein kompliziertes System drum basteln, um den Besucher weitgehenst möglich zu „durchleuchten”.

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Krieg ist Gottes Art, den Amerikanern Geographie beizubringen. (Häfft)
        1. Hi,

          Dazu muss man aber nicht wissen, wann welcher User _wo_ auf _welchen_ Link geklickt hat. Dazu reicht es lediglich zu wissen, wie oft eine Seite/Datei aufgerufen wurde,

          Wenn du schonmal ne Downloadseite betrieben hättest, wüsstest du, das zwischen dem Aufrufen der Downloadseite und dem Downloaden an sich ein schwund von 30-50% ist.
          Also wie willst du vom Aufruf einer Seite darauf schliessen, wieoft etwas runtergeladen wurde?

          Und wenn es so einfach wäre, warum machen es dann Downloadportale per redirect?
          Ich halte es für wesentlich einfacher, wenn ich nur einen Wert in der Datenbank abfragen muss, um die DOwnloadzahlen zu sehen, als erstmal die Logdateien zerpflücken zu müssen.

          1. Hi Manuel,

            Also wie willst du vom Aufruf einer Seite darauf schliessen, wieoft etwas runtergeladen wurde?

            Ich hatte mich durch das "Seite/Datei" mißverständlich ausgedrückt. Gemeint war eigentlich nur "Datei". (Das eine Seite auch nur eine Datei ist, lassen wir jetzt mal außen vor. Ich rede von den Dateien, die der User downloaden will.)

            Ich halte es für wesentlich einfacher, wenn ich nur einen Wert in der Datenbank abfragen muss, um die DOwnloadzahlen zu sehen, als erstmal die Logdateien zerpflücken zu müssen.

            Da schreibst du dir schnell ein klieines (bswp. Perl) Script, welches dir diese Arbeit abnimmt.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            Man sollte nie aufhören zu fragen (Albert Einstein)
            ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
            1. Hallo,
              erstmal Danke für die vielen Antworten. Also es ist so, wir dürfen beim Kunden die Website so verändern das wir unserer Dateien bei uns überprüfen können - allerdings kriegen wir keine kompletten Zugriff, soll heissen: Logdateien fallen raus. Es gibt hier wirklich exzellente Lösungsansätze, muss euch echt mal loben. Ich hab hier noch was gefunden, eine PHP Lösung:

              http://www.webmaster-resource.de/tricks/php/download-zaehler-mit-php-und-mysql-teil-1.php

              Natürlich bedeutet das nicht, wie einer hier schon erwähnt hat das Download-Hit auch gleichzeit ein Download sein muss, gibt zuviele die das dann wieder abbrechen. Jedoch reicht uns auch eine Statistik wie oft unserer Dateien angeklickt wurden. Ich werde die Lösungsansätze mal weiterreichen, weil ich kein Schimmer von PHP/Pearl etc. habe, bei mir reichts grad noch zum primitiven HTML ;-)

              Also nochmal vielen Dank für die zahlreichen Antworten, falls einer noch Ideen hat, kann er sie gerne immer noch hier reinschreiben ;-)

              Grüsse,
              Florian Kammerer

            2. Hi,

              Da schreibst du dir schnell ein klieines (bswp. Perl) Script, welches dir diese Arbeit abnimmt.

              Dann muss dieses Scrpt aber erstmal alle Logdateien durchgehen. Somit bin ich grundsätzlich nie aktuell.
              Wenn ich den Download aber sofort zähle, hab ich imer ein brandaktuelles Ergebnis

    2. Hi,
      erstmal Danke für deine Antwort - so, ganz langsam, nicht das wir uns falsch verstehen :)
      Das hat keinen Grund der Spionage etc. (Quote "und aus welchen gründen seid ihr der meinung, das würde euch etwas angehen?")

      Das ist unser bzw. ein Server unserer Kunden mit unseren Dateien, ohne Upload der Dummy Dateien wäre das ja ohne hin nicht möglich. Brauchst also keine Angst haben, das geht schon alles seinen ordentlichen Weg ;-)

      So nochmal zum Problem, du sagst es wäre möglich auf eine externe HTML Seite zu verbinden, die als redirect wieder auf den Download führt. Sprich das war ja meine 2te Idee, nur das ich Hirbel nen referrer mit ner Weiterleitung verwechselt habe. Aber so könnte es gehen. Die redirect-Seite liegt auf unserem Server, welche wiederrum auf die Datei auf deren Server verweisst.

      Gruss,
      Florian Kammerer

      1. Hi Florian,

        (...) du sagst es wäre möglich auf eine externe HTML Seite zu verbinden, die als redirect wieder auf den Download führt. Sprich das war ja meine 2te Idee, nur das ich Hirbel nen referrer mit ner Weiterleitung verwechselt habe. Aber so könnte es gehen. Die redirect-Seite liegt auf unserem Server, welche wiederrum auf die Datei auf deren Server verweisst.

        Bedenke aber, dass hierbei der User auch den direkten Link eingeben kann (sofern er ihn kennt, was durchaus der Fall sein kann, wenn diesen z.B. jemand in einem Forum postet) und damit deine „Zählerschnittstelle” umgeht.

        Wenn du es wirklich richtig[tm] machen willst, müsstest du die Download-Dateien außerhalb des Document-Roots legen und dann ein PHP Script schreiben, welches nach getaner Log-Arbeit die gewüschte Datei sozusagen „durchreicht”. Nur so kannst du dem Vorbeugen, dass du „umgangen” wirst.

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Man sollte nie aufhören zu fragen (Albert Einstein)
        ... aber natürlich erst, nachdem man sämliche FAQ's und Archive durchgelesen hat :-P
    3. Hallo,

      Wir würden gerne sehen wann ein User auf einen bestimmten Downloadlink klickt, und zwar auf einem externen Server.

      und aus welchen gründen seid ihr der meinung, das würde euch etwas angehen?

      aus Marketinggründen?

      es wäre höchstens möglich, nicht direkt auf die download-datei zu verlinken, sondern zuerst auf eine HTML-seite, die dann per redirect auf den download weiterleitet.

      das kann man besser und einfacher machen:

      anstatt z.B. abc.pdf zu verlinken, verlinkt man ein Script, dem man das Ziel als Parameter mitgibt:
      pdf.cgi?src=abc.pdf

      In dem CGI (ich rede von Perl, andere Sprache entsprechend) kann man den Zugriff auswerten und per print "Location:.....\n\n" ganz einfach die eigentlich gewünschte Datei an den Client schicken!

      Gruß
      Reiner

      1. Hi Reiner,

        und aus welchen gründen seid ihr der meinung, das würde euch etwas angehen?

        aus Marketinggründen?

        Besteht Marketing nur daraus, den Besucher so transparent wie möglich zu machen? (die Frage ist ernst gemeint.)

        In dem CGI (ich rede von Perl, andere Sprache entsprechend) kann man den Zugriff auswerten und per print "Location:.....\n\n" ganz einfach die eigentlich gewünschte Datei an den Client schicken!

        Hier gelten die gleichen Bedenken, wie ich sie hier geäußert habe.

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Dies hier ist ein öffentliches Forum - wer dir hier geholfen hat, hat dies vollkommen freiwillig und unter Aufopferung seiner Freizeit getan!
        1. Hi,

          und aus welchen gründen seid ihr der meinung, das würde euch etwas angehen?

          aus Marketinggründen?

          Besteht Marketing nur daraus, den Besucher so transparent wie möglich zu machen? (die Frage ist ernst gemeint.)

          Du interpretierst 'ne Menge da rein!
          Ob man "nur" die Anzahl der Sichtungen zählt oder mehr macht, war ursprünglich wirklich nicht die Frage.
          Ich habe es so verstanden, daß man ja .pdf und Co. nicht direkt durch Webbugs messen kann wie man es bei HTML kann.

          Gruß
          Reiner

          1. Hi Reiner,

            Besteht Marketing nur daraus, den Besucher so transparent wie möglich zu machen? (die Frage ist ernst gemeint.)

            Du interpretierst 'ne Menge da rein!

            Mag gut sein - ich habe auch mit Marketing nichts am Hut ;-)

            Ob man "nur" die Anzahl der Sichtungen zählt oder mehr macht, war ursprünglich wirklich nicht die Frage.

            Darauf wollte ich aber hinaus.

            Ich habe es so verstanden, daß man ja .pdf und Co. nicht direkt durch Webbugs messen kann wie man es bei HTML kann.

            Für alle interessanten Informationen reicht die access-log Datei des Servers vollkommen aus. Dort finden sich Informationen über:

            • IP
            • Uhrzeit
            • falls eine HTTP Authentifikation erfolgt ist, der Username
            • die Anforderungs-Methode
            • die angeforderte Datei
            • den Statuscode, mit dem der Server geantwortet hat
            • die Anzahl der gesendeten Bytes
            • sofalls vom Besucher mitgeliefert, der Referer
            • der User-Agent String, soweit angegeben

            Das sollte IHMO an Informationen genug sein - und es gibt ja auch Programme, die diese Log-Files schön auswerten und evtl. sogar grafisch darstellen.

            Jegliche weiteren, zusätzlichen, selbst programmierten Log-Mechanismen belasten das System nur zusätzlich.

            MfG, Dennis.

            --
            Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
            „Papa, da sammelt einer für das neue Schwimmbad.” - „Na dann, gib ihm einen Eimer Wasser.”
            1. Hallo.

              Das sollte IHMO an Informationen genug sein - und es gibt ja auch Programme, die diese Log-Files schön auswerten und evtl. sogar grafisch darstellen.

              Du hattest aber schon mitbekommen, dass es um einen "externen Server" geht, auf dessen Logs also gegebenenfalls kein Zugriff besteht?
              MfG, at

              1. Hi,

                Du hattest aber schon mitbekommen, dass es um einen "externen Server" geht, auf dessen Logs also gegebenenfalls kein Zugriff besteht?

                Und du glaubst, wenn jemand keinen Zugriff auf die Logs hat, hat er die Möglichkeit, die Seite zu verändern um den Link zählbar zu machen?

                Ich denke mal, das für beide Dinge ein Zugriff auf den Server möglich sein muss.

                1. Hallo.

                  Und du glaubst, wenn jemand keinen Zugriff auf die Logs hat, hat er die Möglichkeit, die Seite zu verändern um den Link zählbar zu machen?

                  Wenn du mir jetzt noch verrätst, wie man vom Klicken auf ein vollständiges Herunterladen schließen kann, wäre ich dir zu größten Dank verpflichtet. Den werde ich mir aber wohl sparen können.
                  MfG, at

                  1. Hallo.

                    Und du glaubst, wenn jemand keinen Zugriff auf die Logs hat, hat er die Möglichkeit, die Seite zu verändern um den Link zählbar zu machen?

                    Wenn du mir jetzt noch verrätst, wie man vom Klicken auf ein vollständiges Herunterladen schließen kann, wäre ich dir zu größten Dank verpflichtet. Den werde ich mir aber wohl sparen können.
                    MfG, at

                    das kannst Du auch mit anderen Techniken nicht!
                    Wenn Du das über eine Scriptumleitung machst und dann per print Location ... rausschickst, kann der User den Vorgang auch abbrechen. D.h. Du weißt auch hier nicht, ob alles angekommen ist!

                    Gruß
                    Reiner

                    1. Hallo.

                      Wenn Du das über eine Scriptumleitung machst und dann per print Location ... rausschickst, kann der User den Vorgang auch abbrechen. D.h. Du weißt auch hier nicht, ob alles angekommen ist!

                      Aber du kannst sehen, ob eine Datei vollständig abgerufen worden ist.
                      MfG, at

                      1. Hallo.

                        Wenn Du das über eine Scriptumleitung machst und dann per print Location ... rausschickst, kann der User den Vorgang auch abbrechen. D.h. Du weißt auch hier nicht, ob alles angekommen ist!

                        Aber du kannst sehen, ob eine Datei vollständig abgerufen worden ist.
                        MfG, at

                        Woran?

                        1. Hi Reiner,

                          Aber du kannst sehen, ob eine Datei vollständig abgerufen worden ist.

                          Woran?

                          Ich vermute, at will auf die Anzahl der übertragenen Bytes, die in der Log-Datei stehen hinaus...

                          MfG, Dennis.

                          --
                          Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
                          Schon gewusst, dass Bugs und Feature Vorschläge für das CForum ins Entwicklerforum oder in den BugTracker von WWWTech gehören und nicht hier her?
                          1. Hi Reiner,

                            Aber du kannst sehen, ob eine Datei vollständig abgerufen worden ist.

                            Woran?

                            Ich vermute, at will auf die Anzahl der übertragenen Bytes, die in der Log-Datei stehen hinaus...

                            Dann hat er meinen Beitrag nicht gelesen!

                            Gruß
                            Reiner

                            1. Hallo.

                              Dann hat er meinen Beitrag nicht gelesen!

                              Falsch, ich habe ja sogar auf ihn geantwortet.
                              MfG, at

                  2. Hi,

                    Wenn du mir jetzt noch verrätst, wie man vom Klicken auf ein vollständiges Herunterladen schließen kann, wäre ich dir zu größten Dank verpflichtet. Den werde ich mir aber wohl sparen können.

                    Selbst, wenn ein Download abgeschlossen wurde, heisst es nicht, das die Software auch installiert/benützt wird.
                    Es geht auch hier nicht darum, wieviel Leute etwas nutzen, sondern es geht um eine Übersicht, wie das Interesse ist.

                    Und da ist eine Erhebung, wieoft ein DOwnload angestossen wurde wohl genauer, als die Erfassung, wieoft die Seite aufgerufen wurde, auf der der Downloadlink zu finden ist.

                    1. Hallo.

                      Selbst, wenn ein Download abgeschlossen wurde, heisst es nicht, das die Software auch installiert/benützt wird.

                      Und?

                      Es geht auch hier nicht darum, wieviel Leute etwas nutzen, sondern es geht um eine Übersicht, wie das Interesse ist.

                      Und eben das ist schwer zu erfassen.

                      Und da ist eine Erhebung, wieoft ein DOwnload angestossen wurde wohl genauer, als die Erfassung, wieoft die Seite aufgerufen wurde, auf der der Downloadlink zu finden ist.

                      Mein Reden -- aber hinreichend genau ist es eben nicht.
                      MfG, at

                      1. Hi,

                        Mein Reden -- aber hinreichend genau ist es eben nicht.

                        Dafür gibts auch nur eine Möglichkeit. Und zwar, das bei jedem Start des Programmes eine Nachricht an einen Server gesendet wird. Und ich denke, da sind die Benutzer nicht wirklich begeistert.

  2. Wir würden gerne sehen wann ein User auf einen bestimmten Downloadlink klickt, und zwar auf einem externen Server.

    Hi Florian,

    Ich gehe jetzt mal davon aus, das euch php zur verfügung steht, sonst mach es halt mit asp oder was weiß ich.

    Du könntest den download-link auf eine php-datei leiten, die den download-zähler erhöht, und dann per location-header auf die andere datei weiterleiten.

    Download-Link:
    <a href="download.php">Runterladen!</a>

    Datei download.php:
    [code lang=php]
    <?php
    $filepath = "http://andrerserver.de/datei.exe"; pfad zur datei, die downgeloadet werden soll

    // zähler erhöhen (datenbank, datei, was weiß ich), darf nix ausgeben

    header("Location: $filepath\n");
    ?>

    Viel erfolg, Marian

    1. Hi Marian,

      header("Location: $filepath\n");

      Auch hier ist es natürlich so, dass man die Datei auch direkt runterladen könnte.

      Zudem würde ich das PHP Script auf den Server setzen, auf dem auch die Download-Dateien liegen, denn so ist ein „weiterreichen” der Dateien problemlos möglich. Das geht so: Das PHP Script liest die Datei die downgeloadet werden soll ein, packt die korrekten Header davor und gibt den Datei Inhalt wieder aus.

      So könnte das ungefähr gehen:

      // Wir gehen davon aus, in $file steht der Pfad zu  
      // einer real auf dem Server existierenden Datei  
      // $file darf keine URL sein, sondern eben ein Dateipfad  
        
      // Content-Type feststellen (geht erst ab PHP 4.3.0  
      $content_type = mime_content_type($file);  
      // Dateigröße  
      $filesize     = filesize($file);  
        
      // Datei öffnen und sperren  
      if(!($fp = fopen($file, "r") AND flock($fp, LOCK_EX)))  
      {  
          die("Fatal Error: Could not open and lock the requested file.");  
      }  
        
      // Datei auslesen und wieder schließen  
      $content = fread($fp, $filesize);  
      fclose($fp);  
        
      // Header senden  
      header("Content-type: $content_type"); // Dateityp  
      header("Content-disposition: attachment; filename=".basename($file)); // Dateiname  
      header("Content-length: ".$filesize); // Dateigröße  
        
      // und Datei ausgeben  
      echo $content;  
        
      // Script beenden  
      exit;
      

      Das habe ich gerade eben mal zusammengestellt - zwar auch getestet heißt aber nicht, dass es in allen Fällen einwandfrei funktioniert ;-)

      Um die Funktion mime_content_type() auch in PHP < 4.3.0 nutzen zu können, braucht man eine macig.mime Datei und diese Funktion.

      MfG, Dennis.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher. (Albert Einstein)
      1. Hi again,

        if(!($fp = fopen($file, "r") AND flock($fp, LOCK_EX)))

        An dieser Stelle sollte man statt LOCK_EX besser LOCK_SH verwenden, da die Datei ja nur für lesenden Zugriff gesperrt werden soll.

        Sonst keine Kommentare zu dem Script?

        MfG, Dennis.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Wissen ist gut, Können ist besser, aber das Beste und Interessanteste ist der Weg dahin! (Detlef G.)