Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   расшивровка gclid (https://javascript.ru/forum/misc/62744-rasshivrovka-gclid.html)

psiklop 27.04.2016 00:11

расшивровка gclid
 
нужна функция на javascript для расшивровки gclid параметра
есть много функций но они все для сервера, есть ли для браузера?
gclid это параметр от гугла который добавляется к ссылкам там зашифрована дата и еще кое что

вот например сайт по расшивровке
http://gclid.tk/, я таких много видел но они все обращаются к серверу
а нужна функция для браузера

пример gclid: CMiPqOCPu8kCFYHbcgodoPABOQ

psiklop 27.04.2016 16:28

насчет функции пытаюлся сделать но вот столкнулся с проблемой
почему этот код так работает, я рассчитываю на true:

var temp = atob("CMiPqOCPu8kCFYHbcgodoPABOQ");
temp  = btoa(temp);
alert(temp  == "CMiPqOCPu8kCFYHbcgodoPABOQ");

bes 28.04.2016 00:18

https://developer.mozilla.org/en-US/...dowBase64/btoa
Цитата:

Unicode strings
In most browsers, calling window.btoa() on a Unicode string will cause an InvalidCharacterError exception.

One option is to escape any extended characters so that the string you actually encode is an ASCII representation of the original.
function utf8_to_b64(str) {
    return window.btoa(escape(encodeURIComponent(str)));
}

function b64_to_utf8(str) {
    return decodeURIComponent(unescape(window.atob(str)));
}
var temp = utf8_to_b64("CMiPqOCPu8kCFYHbcgodoPABOQ");
temp  = b64_to_utf8(temp);
alert(temp  == "CMiPqOCPu8kCFYHbcgodoPABOQ");//true

насчёт gclid, сам не вникал, но эта статейка вроде бы должна помочь реализовать подобное на js
https://deedpolloffice.com/blog/arti...clid-parameter

psiklop 28.04.2016 19:21

я по этой статье и делал, php функция работает верно
я начал ее построчно постепенно переводить на javascript, но почти сразу проблема возникла: результаты разнятся

function gclid_decode(gclid) {
gclid = gclid.replace("_","/");
gclid = gclid.replace("-","+");
gclid = atob(escape(encodeURIComponent(gclid)));
var matches = [];
var regexp = /(?=[\x5\xd\x15\x1d%\-5=EMU\]emu}\x85\x8d\x95\x9d\xa5\xad\xb5\xbd\xc5\xcd\xd5\xdd\xe5\xed\xf5\xfd])([\x80-\xff]*[\0-\x7f])(.{4})|([\x80-\xff]*[\0-\x7f])([\x80-\xff]*[\0-\x7f])/gm;
var result;
while (result = regexp.exec(gclid)) {
matches.push(result);}
var ret = [];
var key,val,temp;

alert(matches.length);
// 4 вместо 3 в php функции

for (var i = 0; i < matches.length; i++) {
key = val = 0;
temp = matches[i][1] ? matches[i][1] : matches[i][3];
for (var i2 = 0; i2 < temp.length; i2++) key += (temp[i2].charCodeAt(0) & 0x7f) << i2 * 7;
alert(key);}
//результат javascript 8,21,10,30753
//результат php 8,21,29
//первые два кстати совпадают, не знаю где ошибка, atob дает неверный результат или регулярка в php не так работает
return gclid;}

gclid_decode("CMiPqOCPu8kCFYHbcgodoPABOQ");

bes 28.04.2016 22:04

Цитата:

Сообщение от psiklop (Сообщение 415239)
я по этой статье и делал, php функция работает верно
я начал ее построчно постепенно переводить на javascript, но почти сразу проблема возникла: результаты разнятся

function gclid_decode(gclid) {
gclid = gclid.replace("_","/");
gclid = gclid.replace("-","+");
gclid = atob(escape(encodeURIComponent(gclid)));
var matches = [];
var regexp = /(?=[\x5\xd\x15\x1d%\-5=EMU\]emu}\x85\x8d\x95\x9d\xa5\xad\xb5\xbd\xc5\xcd\xd5\xdd\xe5\xed\xf5\xfd])([\x80-\xff]*[\0-\x7f])(.{4})|([\x80-\xff]*[\0-\x7f])([\x80-\xff]*[\0-\x7f])/gm;
var result;
while (result = regexp.exec(gclid)) {
matches.push(result);}
var ret = [];
var key,val,temp;

alert(matches.length);
// 4 вместо 3 в php функции

for (var i = 0; i < matches.length; i++) {
key = val = 0;
temp = matches[i][1] ? matches[i][1] : matches[i][3];
for (var i2 = 0; i2 < temp.length; i2++) key += (temp[i2].charCodeAt(0) & 0x7f) << i2 * 7;
alert(key);}
//результат javascript 8,21,10,30753
//результат php 8,21,29
//первые два кстати совпадают, не знаю где ошибка, atob дает неверный результат или регулярка в php не так работает
return gclid;}

gclid_decode("CMiPqOCPu8kCFYHbcgodoPABOQ");

для начала
str_replace(array('_','-'), array('+','/'), $gclid)

значит _ заменяется +, а - на /
escape() можно убрать, она устарела

bes 29.04.2016 20:12

Цитата:

Сообщение от Rise
bes, в комментах там пишут что это ошибка

особо не вникал и странно, что не исправили, но вероятно это действительно так, так как gclid передаётся параметром в url, а для url обычно используют url safe алфавит с разницей в 2 последних символа
https://tools.ietf.org/html/rfc3548#section-4
Цитата:

62 - (minus)
63 _ (understrike)
https://tools.ietf.org/html/rfc1421#section-4.3.2.4
Цитата:

62 +
63 /
о чём незатейливо узнаётся из википедии
https://ru.wikipedia.org/wiki/Base64

Цитата:

Сообщение от Rise
escape и encodeURIComponent убрать atob не btoa

здесь тоже верно, на входе уже base64-закодированная строка, которую просто надо раскодировать

Цитата:

Сообщение от Rise
Регулярка в php с флагом "s" копать оттуда.

в раскодированной строке gclid могут присутствуют переводы строк, зачем они там?

bes 29.04.2016 22:32

Цитата:

Сообщение от Rise
bes, для продолжения раскодирования...

как разделители частей в смысле?

psiklop 09.05.2016 04:01

да все дело во флаге /s
я к сожалению эту функцию вообще не понимаю
но переделанный вариант вот, с php совпадает

function gclid_decode(gclid) {
gclid = gclid.replace("_","/");
gclid = gclid.replace("-","+");
gclid = atob(gclid);
var matches = [];
var regexp = /(?=[\x5\xd\x15\x1d%\-5=EMU\]emu}\x85\x8d\x95\x9d\xa5\xad\xb5\xbd\xc5\xcd\xd5\xdd\xe5\xed\xf5\xfd])([\x80-\xff]*[\0-\x7f])([\s\S]{4})|([\x80-\xff]*[\0-\x7f])([\x80-\xff]*[\0-\x7f])/gi;
var result;
while (result = regexp.exec(gclid)) {matches.push(result);}
var ret = [];
var key,val,temp;


for (var i = 0; i < matches.length; i++) {
key = val = 0;
temp = matches[i][1] ? matches[i][1] : matches[i][3];
for (var i2 = 0; i2 < temp.length; i2++) key += (temp[i2].charCodeAt(0) & 0x7f) << i2 * 7;
if (matches[i][1]) {
for (var i2 = 0; i2 < matches[i][2].length; i2++) {
val = val + (matches[i][2][i2].charCodeAt(0) * Math.pow(2, i2 * 8));}}
else {
for (var i2 = 0; i2 < matches[i][4].length; i2++) {
val = val + ((matches[i][4][i2].charCodeAt(0) & 0x7f) * Math.pow(2, i2 * 7));}}

ret[key >> 3] = val;}
return ret;}

var x = gclid_decode("CMiPqOCPu8kCFYHbcgodoPABOQ");
alert(JSON.stringify(x));

psiklop 06.10.2016 13:57

вот бы еще узнать как yclid от яндекс расшифровать(


Часовой пояс GMT +3, время: 21:20.