Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.04.2016, 00:11
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

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

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

пример gclid: CMiPqOCPu8kCFYHbcgodoPABOQ
Ответить с цитированием
  #2 (permalink)  
Старый 27.04.2016, 16:28
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

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

var temp = atob("CMiPqOCPu8kCFYHbcgodoPABOQ");
temp  = btoa(temp);
alert(temp  == "CMiPqOCPu8kCFYHbcgodoPABOQ");
Ответить с цитированием
  #3 (permalink)  
Старый 28.04.2016, 00:18
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

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
Ответить с цитированием
  #4 (permalink)  
Старый 28.04.2016, 19:21
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

я по этой статье и делал, 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");
Ответить с цитированием
  #5 (permalink)  
Старый 28.04.2016, 22:04
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от psiklop Посмотреть сообщение
я по этой статье и делал, 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() можно убрать, она устарела
Ответить с цитированием
  #6 (permalink)  
Старый 29.04.2016, 20:12
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от 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 могут присутствуют переводы строк, зачем они там?
Ответить с цитированием
  #7 (permalink)  
Старый 29.04.2016, 22:32
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от Rise
bes, для продолжения раскодирования...
как разделители частей в смысле?
Ответить с цитированием
  #8 (permalink)  
Старый 09.05.2016, 04:01
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

да все дело во флаге /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));
Ответить с цитированием
  #9 (permalink)  
Старый 06.10.2016, 13:57
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск