diff --git a/README.md b/README.md index f6a2970..471da3a 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,10 @@ inbound.referrer.parse(url, referrer, function (err, description) { * [Pinterest](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/pinterest.js) * [LinkedIn](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/linkedin.js) * [Me2day](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/me2day.js) +* [Vkontakte](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/vkontakte.js) +* [LiveJournal](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/livejounal.js) +* [Odnoklassniki](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/odnoklassniki.js) +* [MyWorld](https://github.com/segmentio/inbound/tree/master/lib/matchers/social/myworld.js) ### Search * [Google](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/google.js) @@ -113,6 +117,7 @@ inbound.referrer.parse(url, referrer, function (err, description) { * [Yahoo](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/yahoo.js) * [Baidu](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/baidu.js) * [Yandex](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/yandex.js) +* [Mail.ru](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/mailru.js) * [Naver](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/naver.js) * [Daum](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/daum.js) * [Nate](https://github.com/segmentio/inbound/tree/master/lib/matchers/search/nate.js) @@ -123,11 +128,14 @@ inbound.referrer.parse(url, referrer, function (err, description) { * [Hotmail](https://github.com/segmentio/inbound/tree/master/lib/matchers/email/hotmail.js) * [Naver](https://github.com/segmentio/inbound/tree/master/lib/matchers/email/naver.js) * [Daum](https://github.com/segmentio/inbound/tree/master/lib/matchers/email/daum.js) +* [Yandex](https://github.com/segmentio/inbound/tree/master/lib/matchers/email/yandex.js) +* [Mail.ru](https://github.com/segmentio/inbound/tree/master/lib/matchers/email/mailru.js) ### Ads * [Bing](https://github.com/segmentio/inbound/tree/master/lib/matchers/ad/bing.js) * [Google](https://github.com/segmentio/inbound/tree/master/lib/matchers/ad/google.js) * [Yahoo](https://github.com/segmentio/inbound/tree/master/lib/matchers/ad/yahoo.js) +* [Yandex](https://github.com/segmentio/inbound/tree/master/lib/matchers/ad/yandex.js) ### Internal Internal referrers occur when a visitor navigates between two pages of the same domain. Example: http://site.com => http://site.com/about diff --git a/lib/matchers/ad/yandex.js b/lib/matchers/ad/yandex.js new file mode 100644 index 0000000..40dc865 --- /dev/null +++ b/lib/matchers/ad/yandex.js @@ -0,0 +1,29 @@ +var querystring = require("querystring"); + +module.exports = function (href, referrer, callback) { + + if ( + referrer.host && + ( + referrer.host.indexOf('yabs.yandex.') !== -1 && + referrer.path && + referrer.path.indexOf("/count") !== -1 + ) || + ( + href.href.indexOf("utm_medium=cpc") !== -1 && + href.href.indexOf("yclid=") !== -1 + ) + ) { + var description = { + type: 'ad', + network: 'yandex' + }; + var query = querystring.parse(referrer.query).q; + if (query) description.query = query; + + return callback(null, description); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/email/mailru.js b/lib/matchers/email/mailru.js new file mode 100644 index 0000000..1043a85 --- /dev/null +++ b/lib/matchers/email/mailru.js @@ -0,0 +1,16 @@ + + +module.exports = function (href, referrer, callback) { + + if (referrer.host && referrer.host.indexOf('e.mail.ru') !== -1) { + return callback(null, { + type: 'email', + client: 'mailru', + from: referrer.href, + link: href.href + }); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/email/yahoo.js b/lib/matchers/email/yahoo.js index 0e36a1a..f779ea9 100644 --- a/lib/matchers/email/yahoo.js +++ b/lib/matchers/email/yahoo.js @@ -1,4 +1,4 @@ -var tldextract = require('tldextract'); +var tldextract = require("tldextract"); module.exports = function (href, referrer, callback) { diff --git a/lib/matchers/email/yandex.js b/lib/matchers/email/yandex.js new file mode 100644 index 0000000..e8d1a34 --- /dev/null +++ b/lib/matchers/email/yandex.js @@ -0,0 +1,16 @@ + + +module.exports = function (href, referrer, callback) { + + if (referrer.host && referrer.host.indexOf('mail.yandex.') !== -1) { + return callback(null, { + type: 'email', + client: 'yandex', + from: referrer.href, + link: href.href + }); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/index.js b/lib/matchers/index.js index 109d0c2..a432c62 100644 --- a/lib/matchers/index.js +++ b/lib/matchers/index.js @@ -3,10 +3,11 @@ * Priority fall through list of url matchers * @type {Array} */ -module.exports = [ +module.exports = [ require('./ad/bing'), require('./ad/google'), require('./ad/yahoo'), + require('./ad/yandex'), require('./local/bing'), require('./local/foursquare'), @@ -24,6 +25,10 @@ module.exports = [ require('./social/pinterest'), require('./social/twitter'), require('./social/me2day'), + require('./social/vkontakte'), + require('./social/odnoklassniki'), + require('./social/myworld'), + require('./social/livejournal'), require('./search/aol'), require('./search/baidu'), @@ -31,7 +36,8 @@ module.exports = [ require('./search/google'), require('./search/yahoo'), require('./search/bing'), - require('./search/yandex'), + require('./search/yandex'), + require('./search/mailru'), require('./search/naver'), require('./search/daum'), require('./search/nate'), @@ -41,6 +47,8 @@ module.exports = [ require('./email/yahoo'), require('./email/naver'), require('./email/daum'), + require('./email/yandex'), + require('./email/mailru'), require('./internal/internal'), @@ -50,4 +58,4 @@ module.exports = [ require('./unknown/unknown') -]; \ No newline at end of file +]; diff --git a/lib/matchers/search/mailru.js b/lib/matchers/search/mailru.js new file mode 100644 index 0000000..ad446ef --- /dev/null +++ b/lib/matchers/search/mailru.js @@ -0,0 +1,19 @@ +var querystring = require('querystring'); + +module.exports = function (href, referrer, callback) { + + if ( + referrer.host && referrer.href && + referrer.host.indexOf('go.mail.ru') !== -1 && + referrer.href.indexOf('/search') !== -1 + ) { + + var description = { type: 'search', engine: 'mailru' }; + var query = querystring.parse(referrer.query).q; + if (query) description.query = query; + return callback(null, description); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/search/yandex.js b/lib/matchers/search/yandex.js index a7d8f9b..15639bc 100644 --- a/lib/matchers/search/yandex.js +++ b/lib/matchers/search/yandex.js @@ -1,15 +1,21 @@ - var querystring = require('querystring'); module.exports = function (href, referrer, callback) { - if (referrer.host && referrer.host.indexOf('yandex.com') !== -1) { + if (referrer.host && + referrer.href && + referrer.host.indexOf('mail.yandex.') === -1 && + referrer.host.indexOf('yandex.') !== -1 && + ( + referrer.href.indexOf('/clck') !== -1 || + referrer.href.indexOf('/search') !== -1 + ) + ) { + var description = { type: 'search', engine: 'yandex' }; - var query = querystring.parse(referrer.query).text; - if (query) description.query = query; return callback(null, description); } else { return callback(null, false); } -}; \ No newline at end of file +}; diff --git a/lib/matchers/social/livejournal.js b/lib/matchers/social/livejournal.js new file mode 100644 index 0000000..d913b7c --- /dev/null +++ b/lib/matchers/social/livejournal.js @@ -0,0 +1,13 @@ + +module.exports = function (href, referrer, callback) { + + if (referrer.host && referrer.host.indexOf('livejournal') !== -1) { + return callback(null, { + type: 'social', + network: 'livejournal' + }); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/social/myworld.js b/lib/matchers/social/myworld.js new file mode 100644 index 0000000..3914dc9 --- /dev/null +++ b/lib/matchers/social/myworld.js @@ -0,0 +1,13 @@ + +module.exports = function (href, referrer, callback) { + + if (referrer.host && referrer.host.indexOf('my.mail.ru') !== -1) { + return callback(null, { + type: 'social', + network: 'myworld' + }); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/social/odnoklassniki.js b/lib/matchers/social/odnoklassniki.js new file mode 100644 index 0000000..6dda9f4 --- /dev/null +++ b/lib/matchers/social/odnoklassniki.js @@ -0,0 +1,18 @@ + +module.exports = function (href, referrer, callback) { + + if (referrer.host && + ( + referrer.host.indexOf('ok.ru') !== -1 || + referrer.host.indexOf('odnoklassniki.ru') !== -1 + ) + ) { + return callback(null, { + type: 'social', + network: 'odnoklassniki' + }); + } else { + return callback(null, false); + } + +}; diff --git a/lib/matchers/social/vkontakte.js b/lib/matchers/social/vkontakte.js new file mode 100644 index 0000000..414357f --- /dev/null +++ b/lib/matchers/social/vkontakte.js @@ -0,0 +1,24 @@ + +module.exports = function (href, referrer, callback) { + + if ( + referrer.host && + ( + referrer.host.indexOf('vk.com') !== -1 || + referrer.host.indexOf('vkontakte.ru') !== -1 || + referrer.host === 'vk.cc' || + ( + referrer.host === 'vk.com' && + referrer.path.indexOf('/away.php') + ) + ) + ) { + return callback(null, { + type: 'social', + network: 'vkontakte' + }); + } else { + return callback(null, false); + } + +}; diff --git a/test/cases/referrers.json b/test/cases/referrers.json index fa88801..de5a171 100644 --- a/test/cases/referrers.json +++ b/test/cases/referrers.json @@ -667,5 +667,96 @@ "type": "direct" } } + }, + { + "url": "https://segment.com/?utm_source=yandex&utm_medium=cpc&utm_campaign=segment&utm_content=segment.io&yclid=3873814799576992717", + "referrer": "http://yabs.yandex.ua/count/B0COuQR0VS40000ZhkY17W5NmUL0Pi2RaEt0IGpYB8KS245YVaX9DXgviSb29W5dQ3RJmAcKOgpShov1Doz-ULq1hsyuB2X1AekfQpx_WIyh5hY18q1tG7Ua2JqaRxsJq82b_0umHCc8ho93fEF29a5GeoOXKksa11PjP0uIg2Oy7-lc8LBivYxVRIGE4hPgWiD0TgePmW1b90_3QUVpGUelfLl5mUam0000F08hlR704DsF2XS0x43igGG00AveDjF0hlotACWS7X73G71__________yFmlHw6CMALfr22SMF3zB__________m_J0jlpLZtnxisSP07VZmXw7W00?q=segment.io", + "result": { + "referrer": { + "type": "ad", + "network": "yandex", + "query": "segment.io" + }, + "campaign": { + "source": "yandex", + "medium": "cpc", + "campaign": "segment" + } + } + }, + { + "url": null, + "referrer": "https://yandex.ua/clck/jsredir?from=yandex.ua%3Bsearch%2F%3Bweb%3B%3B&text=&etext=1110.u_2RiEBwVeECHFFFFhvtvHzhKkWViSFDTYoSOmYOf6g.d6bde9d0b6a6f5a4b6b1681e643523f20aec79f0&uuid=&state=PEtFfuTeVD5kpHnK9lio9bb4iM1VPfe4W5x0C0-qwflIRTTifi6VAA&data=UlNrNmk5WktYejY4cHFySjRXSWhXQ01pUWpVa1RKcWNKbV9oaWVqd1dUZy0wQTRmVkIzVWFYRk1IYm8zaWR6ZGotQjA2cEZFRXBINGpBRWZ2MFc5UlNiclFmYUUxWHBG&b64e=2&sign=d1fd21cc10e07b9f55dabbb9de3023b5&keyno=0&cst=AiuY0DBWFJ5Hyx_fyvalFAXyIP5Pir9WA4xNsQx3SOl-mm4if1VeYn6jRoDeY5OzYiNmq_5g4UYwUKY6B297uz8p5U06PEOQZk_Fhu3cDKvAsI-hOSk_ptJI3j3jI_5aZtUdzmi6UdXhwmEDRNV7u9K6IY1_98bFD9waKU93SYJ2heKqBk4EB4X8hjQy5QTwtapMU26HFa8wVg9QDc6XvxT4XB_faek6n3s09VONfkXkrEWxSx6yQ9Tg9UAApKQkuw2tWA-FaLnHXnIlCOsxAUbq6rxNhJNSBnau3jd-k2G80ySxHvSiPf_sFlwWRYU6zOSvBqUi56bfo4EeK8mEke6SM85WkDa0&ref=orjY4mGPRjmt1xzYuZsDZSKx6sHOF1RVVGPmwHJSlJG8Lea9dUm8MxcbEsy8AOzONFVgX0KliUZuDirBdSxKmItE-3JD5Q6q1uU7d5FC_QBYzdSLdQbbSXosDuD-EzPrV1-J6_OQ7Zsp_QV5NTccC6KX1Yz1UM-E&l10n=ru&cts=1468019597446&mc=5.506933514686471", + "result": { + "referrer": { + "type": "search", + "engine": "yandex" + } + } + }, + { + "url": "https://segment.io/", + "referrer": "http://go.mail.ru/search?fr=main&frm=main&q=segment.io", + "result": { + "referrer": { + "type": "search", + "engine": "mailru", + "query": "segment.io" + } + } + }, + { + "url": null, + "referrer": "https://vk.com/away.php?to=https%3A%2F%2Fsegment.com%2F", + "result": { + "referrer": { + "type": "social", + "network": "vkontakte" + } + } + }, + { + "url": null, + "referrer": "https://click.my.mail.ru/redir?u=https%3A%2F%2Fsegment.com%2F&c=smw&r=http&o=mm&e=1468109237&s=5ecb7a1fa259a10c", + "result": { + "referrer": { + "type": "social", + "network": "myworld" + } + } + }, + { + "url": null, + "referrer": "https://livejournal.com", + "result": { + "referrer": { + "type": "social", + "network": "livejournal" + } + } + }, + { + "url": "https://segment.com", + "referrer": "https://mail.yandex.ua/?uid=2386333614546&login=username#message/159314836818231294569", + "result": { + "referrer": { + "type": "email", + "client": "yandex", + "from": "https://mail.yandex.ua/?uid=2386333614546&login=username#message/159314836818231294569", + "link": "https://segment.com/" + } + } + }, + { + "url": "https://segment.com", + "referrer": "https://e.mail.ru/message/14680259660000000222234235/", + "result": { + "referrer": { + "type": "email", + "client": "mailru", + "from": "https://e.mail.ru/message/14680259660000000222234235/", + "link": "https://segment.com/" + } + } } ]