[javascript] tracken van downloadlinks

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Mijne heren, dames,

ik ben momenteel bezig met een statistiekentooltje te proggen in ASP/ javascript. Ik ben zover dat ik alle systeeminfo en klikpaden (op IP adres) registreer en bewaar (in een Access databaseje voorlopig).

Om te kijken hoe eea eruit moet zien, heb ik de features een aantal "grote jongens" bekeken. Indextools heeft een hele leuke: zij tracken (en registreren) ook wanneer iemand op een downloadlink (bv. http://www.mijnsite.com/files/bestandje.zip) klikt.

Om te kijken hoe dit werkt heb ik het .js bestand dat Indextools naar de client stuurt, gedownload (zie hieronder). Ik heb best enige javascript kennis, maar dit gaat mijn pet echt te boven. Vooral omdat alle variabele- en functienamen afgekort zijn (om kb's te besparen natuurlijk) is het moeilijk lezen.

Ik ben al flinke tijd bezig geweest eea te doorgronden, maar loop toch vast. Ik neem in ieder geval aan dat de functie getFileName(x) er iets mee te maken heeft >:), maar hoe:

- definieren ze download links (dus: .zip, .tar.gz, .exe etc)
- submitten ze deze info zonder de pagina te reloaden?

Hieronder staat een voorbeeldje van de uiteindelijke bedoeling:
Afbeeldingslocatie: http://www.indextools.com/images/static/visitpath_240.gif

Zou iemand onderstaande code eens willen bekijken en een stap in de goede richting aangeven?

JavaScript:
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
var BU = 'http://stats.indextools.com/p.pl?a=100014';
var _ud = "undefined";
var IT = "";
var olt = false;
var img = new Image();
var na = (navigator.appName == "Netscape");

function __e(m,u,l)
{
    var url = 'http://members.indextools.com/p.pl?a=100014&ua='+escape(navigator.userAgent);
    url+="&JsErrorUrl="+escape(u);
    url+="&JsErrorLine="+escape(l);
    url+="&JsErrorMsg="+escape(m);
    url+="&JsErrorAppcode="+escape(navigator.appCodeName);
    url+="&JsErrorApp="+escape(navigator.appName);
    url+="&JsErrorVer="+escape(navigator.appVersion);
    url+="&JsErrorUsr="+escape(navigator.userAgent);
    url+="&b=JSERROR";
    url+="&f=" + escape('file: '+u+' / msg: '+m+' / line: '+l);
    img.src = url;
}

__oe = window.onerror;
window.onerror = __e;


if (typeof ACTION != _ud)
{
    IT += "&x=" + escape(ACTION);
    ACTION = '';
}
else
    var ACTION = '';
if (typeof AMOUNT != _ud)
{
    IT += "&xa=" + escape(AMOUNT);
    AMOUNT = '';
}
else
    var AMOUNT = '';
if (typeof MEMBERID != _ud)
    BU += "&m=" + escape(MEMBERID);
if (typeof DOCUMENTGROUP != _ud)
    BU += "&c=" + escape(DOCUMENTGROUP);
if (typeof DOCUMENTNAME != _ud)
    BU += "&b=" + escape(DOCUMENTNAME);
else if (document.title.length > 0)
    BU += "&b=" + escape(document.title);
var itDate = new Date();
IT += "&d=" + escape(itDate.toGMTString());
IT += "&n=" + escape(parseInt(itDate.getTimezoneOffset() / 60));
var ecl = '';
if (typeof EXCL != _ud)
    ecl = EXCL;
function gcpn(x)
{
    var z = location.search;
    var i = z.indexOf("?" + x + "=");
    var j = z.indexOf("&" + x + "=");
    if ((i == 0) || (j > -1))
    {
        var k = (i == 0) ? 0 : j;
        var l = z.indexOf('&', k + 1);
        return z.substring(k + 2 + x.length, (l > -1) ? l : z.length);
    }
    return '';
}

function getFileName(x)
{
    return (x.substring(x.lastIndexOf("/") + 1, x.length));
}

function gh(x)
{
    var i = x.host.indexOf(":");
    return (i >= 0) ? x.host.substring(0, i) : x.host;
}

function gpr(x)
{
    var y = x.protocol;
    var i = y.indexOf(":");
    return (i >= 0) ? y : y + ":";
}

function gp(x)
{
    var y = x.pathname;
    var i = y.indexOf("/");
    return (i == 0) ? y : "/" + y;
}

function mxDmnRGXP(v)
{
    return new RegExp(mxRgXpStr(v), "i");
}

function mxR(e, _x, _y, _z)
{
    i = 0;
    while (e.indexOf(_x) >= 0)
    {
        i++;
        e = e.replace(_y, _z);
        if (i > 50)
            break;
    }
    return e;
}

function mxRgXpStr(e)
{
    e = mxR(e, " ", " ", "");
    e = mxR(e, "\*\.", "\\*\\.", "\*");
    e = mxR(e, ",\*", ",\\*", "|");
    e = mxR(e, "*", "*", "");
    e = mxR(e, ",", ",", "|^");
    e = mxR(e, ".", "\\.", ";");
    e = mxR(e, ";", ";", "\\.");
    return e;
}

function exitLink(x)
{
    if (gh(location) == gh(x))
        return true;
    var pt =
        (typeof DOMAINS != _ud) ? mxDmnRGXP(DOMAINS) : mxDmnRGXP(gh(location));
    a = (ACTION == '') ? "" : "&x=" + escape(ACTION);
    xa = (AMOUNT == '') ? "" : "&xa=" + escape(AMOUNT);
    ln = escape(x.href);
    if (pt.test(gh(x)))
        return true;
    if (na)
        setTimeout("img.src=BU+xa+a+'&el='+ln;", 1);
    else
        img.src = BU + xa + a + '&el=' + ln;
    return true;
}

function oco(x, y)
{
    var i = 0;
    var rv = true;
    while (document.links[i] != x)
    {
        i++;
    }
    if (y.li[i])
        rv = y.li[i].oc();
    fn = getFileName(x.pathname);
    if (fn != "")
    {
        var pt = new RegExp ("\..?html?|\.asp|\.cfm|\.jsp|\.cgi|\.php[3-4]?|\.pl|\.taf|\.dll|\.vm|jsessionid", "i");
        if ((!pt.test(fn)) && (fn.indexOf(".") != -1))
        {
            if (((ecl.length > 0) && (!mxDmnRGXP(ecl).test(x.pathname))) ||
                (ecl.length == 0))
            {
                a = (ACTION == '') ? "" : "&x=" + escape(ACTION);
                xa = (AMOUNT == '') ? "" : "&xa=" + escape(AMOUNT);
                fn = gpr(x) + "//" + gh(x) + gp(x);
                if (na)
                    setTimeout("img.src=BU+xa+a+\"&fn=\"+escape(fn);", 1);
                else
                    img.src = BU + xa + a + "&fn=" + escape(fn);
            }
        }
        else
            exitLink(x);
    }
    else
        exitLink(x);
    return rv;
}

function olo()
{
    if (olt)
        ool();
    lnks = new Object();
    var ln = document.links.length;
    lnks.li = new Array(ln);
    for (var i = 0; i < ln; i++)
    {
        if (document.links[i].onclick)
        {
            lnks.li[i] = document.links[i];
            lnks.li[i].oc = document.links[i].onclick;
        }
        eval("document.links[i].onclick=function(){return oco(this,lnks);}");
    }
}

ns = (navigator.appName.substring(0, 9) == "Microsoft");
if (((window.screen) || ((new Array()).toSource) || ((new Array()).shift && ns))
    && (navigator.userAgent.indexOf('Mac') < 0))
{
    if (window.onload)
    {
        ool = window.onload;
        olt = true;
    }
    window.onload = olo;
}

function _e()
{
    _rf(false);
    return true;
}

_rf(true);
function _rf(_d)
{
    r = "";
    if ((navigator.userAgent.indexOf('Mac') >= 0) &&
        (navigator.userAgent.indexOf('MSIE 4') >= 0))
        r = document.referrer;
    else if (_d)
    {
        window.e = window.onerror;
        window.onerror = _e;
        r = (document.location ==
             top.location) ? document.referrer : top.document.referrer;
    }
    else
        IT += "&nr=t";
    window.onerror = window.e;
    if (r.length > 0)
        IT += "&e=" + escape(r);
    BU += "&f=" + escape(window.document.location);
    document.cookie = "itc=t";
    IT += "&g=" + escape(na ? navigator.language : navigator.userLanguage);
    IT += "&h=" + escape((navigator.javaEnabled()? 'Y' : 'N'));
    IT += "&j=" + escape(screen.width + 'x' + screen.height);
    IT += "&k=" + escape((ns) ? screen.colorDepth : screen.pixelDepth);
    IT += "&l=" + ((document.cookie.indexOf("itc=") >= 0) ? "true" : "false");
    if ((typeof CAMPAIGN != _ud) && (CAMPAIGN != ''))
        IT += "&cp=" + escape(CAMPAIGN);
    if ((typeof CMPPARM != _ud) && (CMPPARM != ''))
        IT += "&cp=" + escape(gcpn(CMPPARM));
    if ((typeof PROMO != _ud) && (PROMO != ''))
        IT += "&scp=" + escape(PROMO);
    if ((typeof PROMOPARM != _ud) && (PROMOPARM != ''))
        IT += "&scp=" + escape(gcpn(PROMOPARM));
    img.src = BU + IT;
    document.write("<\!--");
}
window.onerror = __oe;

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • ruuds
  • Registratie: Maart 2001
  • Laatst online: 13:54
definieren ze download links (dus: .zip, .tar.gz, .exe etc)
string op . splitten en dan t laatste stuk?
submitten ze deze info zonder de pagina te reloaden?
in een iframe?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod



nee, dit doen ze met het herladen van het plaatje (die img).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

__oe staat waarschijnlijk voor original errorhandler. Die __e(m,u,l) functie is een error logger die wat info naar indextools stuurt waneer er iets fout gaat met het JS. Na deze functie wordt deze functie als error handler gezet, en helemaal aan het einde van het script wordt de orginele error handler weer terug gegeven.

//__e defenition
__oe = window.onerror;
window.onerror = __e;
//Al die andere functies
window.onerror = __oe;

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
nu je het zegt: de info wordt gesubmit door het plaatje opnieuw aan te roepen - img.src string verandert. Duidelijk. Dat ik een URL op de laatste punt kan splitten om te zien of het IndexOf .zip ofzo is, is ook duidelijk. Maar dan is nog steeds de vraag: hoe registreer ik met een client-side javascript functie dat er een call naar de server gedaan wordt om dat zipbestand op te halen :?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."