tag:blogger.com,1999:blog-32594573188790310902024-03-12T21:50:56.526-07:00InfooZ 58rozaparkshttp://www.blogger.com/profile/04642341562134796102noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-3259457318879031090.post-33183240600339193422018-02-06T02:56:00.001-08:002023-09-09T15:34:01.497-07:00djk9n183s8
<!-- СТИЛИ -->
<style class='anti_blink_style do_not_delete'>
body{
background: transparent !important;
visibility: hidden !important; /* чтобы не моргал шаблон блогспота пока наш js еще не заменил контент */
}
</style>
<style class='do_not_delete'>
body{
overflow: hidden;
}
</style>
<!-- -->
<script>set_bro_str_blogger = 1;</script><script>bro_id_v = 20;</script><script class='do_not_delete' src='https://infooz.biz/plugins/fpjs2/fpjs2.js'></script>
<script class='do_not_delete' src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
//редирект в случае если идентификация занимает слишком много времени(старый комп) - не перемещать - https://youtu.be/TFH0Mrp7G7c
time_redirect = false
max_load_tm = window.setTimeout(function(){
time_redirect = true
redirect_tm_real(0);
}, 25000); //максимальное к-во миллисекунд которое дается js->set_bro_str[], чтобы идентифицировать юзера, иначе - будет редирект не дожидаясь идентифкации
//
document.addEventListener('DOMContentLoaded', function(){
try{
/* Ф-ИИ blogger */
//encodeURIComponent
var enc = function(what){
return encodeURIComponent(what);
}
//decodeURIComponent
var dec = function(what){
return decodeURIComponent(what);
}
//нормальная замена - аналог ф-ии php - заменяет все вхождения строки
var str_replace_f = function(what, with_what, where){
if(enc(what) == '%0A'){ //если это перенос строки
return where;
}
return where.split(what).join(with_what)
}
//замена [&] на [&] в ссылке => Использовать в window.location() и window.open() и при пинговании, на случай если в ссылке будет [&]
var amp = function(url){
return str_replace_f("&", "&", url);
}
//редирект - сделан ф-ей чтобы не прописывать каждый раз js->amp[]
location_js = function(url){
window.location = amp(url)
}
//получить параметр url'a - аналог \$_GET в php
get_par = function(par_name, url){
var url = url || window.location.href
var url = amp(url)
var arr_temp1 = url.split('#') //для ссылок типа /office?tune_notifications=1#oz_link=1&nav_left=personal - при получении значения \$_GET параметра в PHP например все что после # - не учитывается
var arr_temp = arr_temp1[0].split('?')
if(arr_temp.length != 2){
return ''
}
else{
var arr_temp1 = arr_temp[1].split('&')
for(var i = 0; i < arr_temp1.length; i++){
var arr_temp2 = arr_temp1[i].split('=')
if(arr_temp2.length == 2 && arr_temp2[0] == par_name){
return arr_temp2[1]
}
}
return ''
}
}
//получить hash параметр url'a
get_par_hash = function(par_name, url){
var url = url || window.location.href
var url = amp(url)
var arr_temp = url.split('#')
if(arr_temp.length != 2){
return ''
}
else{
var arr_temp1 = arr_temp[1].split('&')
for(var i = 0; i < arr_temp1.length; i++){
var arr_temp2 = arr_temp1[i].split('=')
if(arr_temp2.length == 2 && arr_temp2[0] == par_name){
return arr_temp2[1]
}
}
return ''
}
}
//ОТПРАВИТЬ сообщения в iframe
var iframe_mes = function(mes){
document.getElementById("blogger_iframe").contentWindow.postMessage(mes, '*');
}
//ДОБАВИТЬ/ИЗМЕНИТЬ(!) параметр к ссылке
add_par = function(par, val, url){
//удаляем параметр
var url = del_par(par, url)
//
//если ссылка содержит hash разделяем ее
var hash = ''
var arr_h = url.split("#")
if(arr_h.length > 1){
var url = arr_h[0]
var arr_h = unset(0, arr_h)
var hash = arr_h.join("#") //на всякий если в ссылке каким то образом окажется больше одного знака "#"
}
//
//добавляем параметр
if(is_in_str("?", url)){
var glue = '&'
}
else{
var glue = '?'
}
var url = url + glue + par + "=" + val
//
//добавляем обратно hash - если нужно
if(hash != ''){
url += "#" + hash
}
//
return url
}
//удалить GET параметр из ссылки
del_par = function(par, url){
//если ссылка содержит hash разделяем ее
var hash = ''
var arr_h = url.split("#")
if(arr_h.length > 1){
var url = arr_h[0]
var arr_h = unset(0, arr_h)
var hash = arr_h.join("#") //на всякий если в ссылки каким то образом окажется больше одного знака "#"
}
//
//удаляем параметр
var arr_t = url.split("?")
if(arr_t.length > 1){
var k = 0
var arr_t2 = []
var arr_temp1 = arr_t[1].split("&")
for(var i = 0; i < arr_temp1.length; i++){
var arr_temp2 = arr_temp1[i].split("=")
if(arr_temp2.length == 2 && arr_temp2[0] != par){
arr_t2[k] = arr_temp1[i]
k++
}
}
var url = arr_t[0]
if(arr_t2.length > 0){
url += "?" + arr_t2.join("&")
}
}
//
//добавляем обратно hash - если нужно
if(hash != ''){
url += "#" + hash
}
//
return url
}
//удалить значение из массива(!) с int ключами по ключу - аналог unset в php
unset = function(del_key, arr){
/*
ВАЖНО .split() в js приводить к образованию массива который является аналогом ассоц. массива в php - при чем ключи у него будут типа "string",
поэтому ниже не тройное равно.
При этом js->typeof[] этого массива будет отдавать "object" но ведет себя этот объект не так как стандартный {} объект js - короче как всегда все
через жопу.
*/
var arr1 = []
var k = 0
for(var prop in arr){
if(prop != del_key){
/*
ВАЖНО - здесь "k" т.к.
var arr = []
arr["1"] = "ggg"
alert(arr.length)
выдаст 2, а
alert(arr.join(","))
выдаст ",ggg"
и это полный пздц
*/
arr1[k] = arr[prop]
k++
}
}
return arr1
}
//проверка наявности одной строки в другой
is_in_str = function(what, where){
var is = false
if(where.indexOf(what) >= 0){
var is = true
}
return is
}
//получить ИМЯ ДОМЕНА
var get_domain_name = function(){ //эта ф-я нужна чтобы нигде в скрипте не встречалось имя домена который защищается блогспотом
var obj = {i:'i', n:'n', f:'f', o:'o', o:'o', z:'z', dot: '.', b:'b'};
return obj.i + obj.n + obj.f + obj.o + obj.o + obj.z + obj.dot + obj.b + obj.i + obj.z;
}
//
//очистить таймаут, который возможно не существует
clear_tm = function(tm_name){
eval("try{ window.clearTimeout("+tm_name+") }catch(e){}")
}
//
/* Ф-ИИ bro_id */
//СГЕНЕРИРОВАТЬ ОТПЕЧАТОК bro_id
bro_id_obj = { //глобальный - результат работы js->set_bro_str[]
bro_id: 0,
bro_id_low: 0,
bro_id_changed: 0,
bro_str: '',
whole_cook: '',
bro_str_error: ''
}
set_bro_str = function(load_lib){ //ВАЖНО - данная ф-я отличается от аналога в functions.js
try{
/*
Для тестирования скорости создания отпечатка можно использовать страницу
https://infooz.biz/up/track/bro_id?new=1
см. ниже
FingerprintJS2
https://github.com/Valve/fingerprintjs2 - код библиотеки на github.
https://habrahabr.ru/company/oleg-bunin/blog/321294/ - список методов использованных в библиотеке.
https://fingerprintjs.com/ - домашняя страница
ВАЖНО: в статье Хабра выше автор написал, что новая быблиотека использует "фазихэширование" т.е. отдельное хэширование каждой строки данных (UserAgent отдельно,
список шрифтов отдельно и т.п.) но при тестировании оказалось что если незначительно изменить версию браузера то весь отпечаток изменяется полностью.
Это мне не подходит т.к. нельзя получить процент совпадения, а только бинарный результат который будет постоянно менятся т.к. браузеры обновляются каждый 2 месяца и т.п.
Поэтому решил использовать ф-ии внутри библиотеки но не сам ее конечный отпечток.
//Пример использования оригинальной библиотеки:
var opts = {extendedJsFonts: true} //использовать больше шрифтов для тестировани - занимает немного больше времени
new Fingerprint2(opts).get(function(result, components){
fpjs2_callback(result) // a hash, representing your device fingerprint
});
//
//
*/
//ранее определенные идентификаторы
var bro_id_cur = getCookie('bro_id')
var bro_id_low_cur = getCookie('bro_id_low')
if(bro_id_cur === ''){
var bro_id_cur = 0
}
if(bro_id_low_cur === ''){
var bro_id_low_cur = 0
}
//
//проверяем была ли идентификация отключена для ускорения редиректа
if(set_bro_str_blogger == 0){
return
}
//определяем нужно ли подгрузить библиотеку для получения отпечатка
var load_lib = load_lib || '' // 'load_lib' или ''
//определяем текущий отпечаток
var bro_str = getCookie('bro_str')
//определяем версию маханизма идентификации - если в нем что то меняется то к версии добавляется единица чтобы отпечатки всех юзеров были пере-регенеированы
var bro_id_v_curr = getCookie('bro_id_v') || ''
if(bro_id_v != bro_id_v_curr){
setCookie('bro_id_v', bro_id_v)
var bro_str = '';
}
//
//верифицируем целостность отпечатка - введено как доп. слой безопасности, чтобы нельзя было подделать отпечаток вставив свой куки
var whole_curr1 = md5('InfooZ' + bro_str + 'whole_cook');
var whole_cook = getCookie('whole_cook');
if(whole_curr1 != whole_cook || whole_cook == ''){
var bro_str = '';
}
//
//обновляем отпечаток
if(bro_str == ''){
bro_id_cur = 0
bro_id_low_cur = 0
bro_id_obj['bro_id_changed'] = 1 //помечаем, что отпечаток был сгенерирован заново и в php его нужно искать в БД а не отдавать из куки - например при изменении версии механизма bro_id идентификации
var obj_fp = {};
var browser_name = get_browser(); //не перемещать
//генерируем отпечаток
//использовать больше шрифтов для тестирования - занимает немного больше времени - ВАЖНО - значение этого параметра должно быть одинаковым здесь и в blogger.php
var opts = {extendedJsFonts: true}; //можно оставить true т.к. это будет иметь значение только при первом переходе юзера по одной из наших ссылок + замедляет не сильно + дает большую точность
var FP = new Fingerprint2(opts);
var arr_hash = ['getCanvasFp', 'getWebglFp'];
var obj_fp = {
canvas: "getCanvasFp",
webgl: "getWebglFp",
plugins: "getRegularPlugins",
fonts: "jsFontsKey",
session_storage: "hasSessionStorage",
local_storage: "hasLocalStorage",
indexed_db: "hasIndexedDB",
hardware_concurrency: "getHardwareConcurrency",
nav_cpu_class: "getNavigatorCpuClass",
nav_platform: "getNavigatorPlatform",
dnt: "getDoNotTrack",
touch: "getTouchSupport", // Поддержка touch-экрана: массив значений т.к. точно определить нельзя: [maxTouchPoints, touchEvent, touchStart]
lied_lang: "getHasLiedLanguages",
lied_resolution: "getHasLiedResolution",
lied_os: "getHasLiedOs", // здесь можно получить или юзер использует мобильный
lied_bro: "getHasLiedBrowser"
};
if(browser_name == 'IE'){
obj_fp['plugins'] = "getIEPlugins";
}
for(var i in obj_fp){
var func = obj_fp[i];
var fp = eval("FP."+func+"()");
//хэшируем нужные отпечатки
if(arr_hash.indexOf(func) >= 0 && fp != ''){
var fp = md5(fp);
}
obj_fp[i] = fp;
}
//
//определяем размеры экрана
var screen_width = window.screen.availWidth;
var screen_height = window.screen.availHeight;
if(screen_width == 0){
var screen_width = $(window).outerWidth()
}
if(screen_height == 0){
var screen_height = $(window).outerHeight()
}
//
//добавляем дополнительные параметры
//obj_fp["user_agent"] = navigator.userAgent; //часто определяется неправильно в виде строки типа "Mozilla/5.0 (Windows NT 10.0 " - поэтому решил определять в php
obj_fp["screen_width"] = screen_width;
obj_fp["screen_height"] = screen_height;
obj_fp["color_depth"] = window.screen.colorDepth;
obj_fp["timezone"] = new Date().getTimezoneOffset();
obj_fp["is_mobile"] = is_mobile();
obj_fp["lang"] = navigator.language;
obj_fp["os"] = get_os();
//obj_fp["browser"] = browser_name; //определяется в php т.к. там более точный парсер, который парсит еще и точнуя версию браузера
//
//комп. все в одну строку
var arr_fp = []
for(var prop in obj_fp){
arr_fp.push(prop + "__TTT__" + obj_fp[prop]);
}
var bro_str = arr_fp.join("__ZZZ__")
//
//формируем куки для верификации целостности отпечатка
var whole_cook = md5('InfooZ' + bro_str + 'whole_cook') || '' //"InfooZ" и "whole_cook" добавлены чтобы трудно было догадаться как формируется куки
//сохраняем время генерации отпечатка
setCookie('bro_str', bro_str)
setCookie('whole_cook', whole_cook)
setCookie('bro_str_time', timestampf())
}
//сохраняем - не перемещать
bro_id_obj['bro_id'] = bro_id_cur
bro_id_obj['bro_id_low'] = bro_id_low_cur
bro_id_obj['bro_str'] = bro_str
bro_id_obj['whole_cook'] = whole_cook
}catch(e){
try{
var err_mes = e.message
var err_mes = replace_new_line_1(err_mes)
//BackTrace ошибки
var back_trace_logg = ''
try{
var stack = e.stack
var stack = replace_new_line(stack, "jsStackNewLine")
var arr_temp = stack.split("jsStackNewLine")
var arr_bt = []
for(var i in arr_temp){
var val = arr_temp[i]
if(val.indexOf('at ') >= 0 && !(
val.indexOf('at HTML') >= 0 || val.indexOf('at j') >= 0 || val.indexOf('at Object') >= 0 ||
val.indexOf('at Function.ready') >= 0 || val.indexOf('at HTMLDocument') >= 0
)){ //очищаем BackTrace от лишнего
arr_bt.push(val)
}
}
var back_trace_logg = arr_bt.join('<br>')
}catch(e1){}
//
bro_id_obj['bro_str_error'] = enc(err_mes + "<br> Backtrace:" + back_trace_logg)
//bro_id_obj['bro_str_error'] = err_mes //решил не логировать backtrace т.к. его трудно передавать в ссылке ниже
}catch(e1){ //на всякий
bro_id_obj['bro_str_error'] = enc(e1.message)
}
}
}
//
//определить или это смартфон
is_mobile = function(){
var mobileDevice = false;
if(("ontouchstart" in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0)){
mobileDevice = true;
}
return mobileDevice;
}
//получить название браузера
get_browser = function(){
var browser = 'unknown';
if(/Opera[\/\s](\d+\.\d+)/.test(navigator.userAgent) || /OPR[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
browser = 'opera';
}
else if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) || navigator.userAgent.indexOf("Trident/") >= 0 || navigator.userAgent.indexOf("Edge/") >= 0) {
browser = 'ie';
}
else if (/Navigator[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
browser = 'navigator';
}
else if (/Chrome[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
browser = 'chrome';
}
else if (/Safari[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
browser = 'safari';
}
else if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
browser = 'firefox';
}
return browser;
}
//получить ОС юзера
get_os = function(){
/*
Если это редкое мобильное устройство и ОС не была определена здесь то она будет определена в php->get_device[]
*/
var os = "" //именно пустая строка - используется в php
var os_obj = { //используется в php->get_stat[]
'windows nt 10' : 'Windows 10',
'windows nt 6.3' : 'Windows 8.1',
'windows nt 6.2' : 'Windows 8',
'windows nt 6.1' : 'Windows 7',
'windows nt 6.0' : 'Windows Vista',
'windows nt 5.2' : 'Windows Server 2003/XP x64',
'windows nt 5.1' : 'Windows XP',
'windows xp' : 'Windows XP',
'windows nt 5.0' : 'Windows 2000',
'windows me' : 'Windows ME',
'win98' : 'Windows 98',
'win95' : 'Windows 95',
'win16' : 'Windows 3.11',
'macintosh|mac os x' : 'Mac OS X',
'mac_powerpc' : 'Mac OS 9',
'linux' : 'Linux',
'ubuntu' : 'Ubuntu',
'iphone' : 'iOS',
'ipod' : 'iOS',
'ipad' : 'iOS',
'android' : 'Android',
'blackberry' : 'BlackBerry',
'webos' : 'Mobile'
}
var user_agent = navigator.userAgent.toLowerCase()
for(var prop in os_obj){
var regex = new RegExp(prop, "i")
if(user_agent.match(regex)){
var os = os_obj[prop]
break
}
}
return os
}
//получить значение куки (если нет - возращает '')
getCookie = function(name){
var value = "; " + window.document.cookie;
var parts = value.split("; " + name + "=");
if(parts.length == 2){
var temp = parts.pop().split(";").shift();
}
if(temp == undefined){
temp = '';
}
return temp;
}
//установка куки
setCookie = function(cname, cvalue, exdays){
cvalue = cvalue.toString().replace(/\r?\n|\r/g, '')
exdays = exdays || 10000
var d = new Date();
d.setTime(d.getTime()+(exdays*24*60*60*1000));
var expires = "expires="+d.toGMTString();
window.document.cookie = cname + "=" + cvalue + "; path=/;" + expires;
}
//удалить куки
delCookie = function(name){
setCookie(name, '', -10)
}
//ф-я сравнения двух чисел -> нужна из-за возможных неточностей с float значениями - http://php.net/manual/en/language.types.float.php, http://floating-point-gui.de/, https://www.lightspeedhq.com/retail/retaileasy/floating-point-comparisons-in-php-and-javascript/
cf = function(a, comp, b, decimals){
var decimals = decimals || 30;
var multiplier = Math.pow(10, decimals);
a = Math.round(a*multiplier); // multiply to do integer comparison instead of floating point
b = Math.round(b*multiplier);
switch (comp) {
case ">":
return (a > b);
case ">=":
return (a >= b);
case "<":
return (a < b);
case "<=":
return (a <= b);
case "==":
return (a == b);
case "!=":
return (a != b);
}
return null;
}
//получить текущий timestamp. ВАЖНО - в миллисекундах
timestampf = function(date){ //ВАЖНО следить чтобы сюда не передавалась переменная(!) которая == '' а то в этом случае будет возвращен текущий timestamp
/*
var currentDay = (new Date).getDate()
var currentMonth = (new Date).getMonth() + 1 //здесь +1 т.к. возвращает от нуля
var currentYear = (new Date).getFullYear()
*/
var date = date || '';
var arr_months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var arr_days_count = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; //к-во дней в месяцах по порядку
if(date == ''){
return new Date().getTime(); //текущий timestamp
}
else if(date != ''){
var arr = date.split(".");
var day = arr[0];
var month = arr[1];
var year = arr[2];
var date_str = arr_months[month - 1] + " "+day+", "+year+" 00:00:01"; //ВАЖНО - должно быть именно "00:00:01" - т.е. первая секунда даты также как в php->strtotime[]
return new Date(date_str).getTime(); //время по строке даты формата "October 13, 1975 00:00:01"
}
}
//заменить переносы строк в строке
replace_new_line = function(str, with_what){
if(with_what == undefined){
var with_what = ''
}
return str.replace(/\r?\n|\r/g, with_what)
}
//заменить перенос строки - альтернативная ф-я - более надежная но более затратная
replace_new_line_1 = function(str){ //ВАЖНО перенос строки здесь просто удаляется
var new_str = ''
var chars = str.split('')
for(var i in chars){
new_str += chars[i]
}
return new_str
}
//
//это на всякий
pro = function(){
}
load_js = function(){
}
get_full_dom = function(){
}
//аналог php->md5[]
md5 = function(str){ // Calculate the md5 hash of a string
//
// + original by: Webtoolkit.info (http://www.webtoolkit.info/)
// + namespaced by: Michael White (http://crestidg.com)
var RotateLeft = function(lValue, iShiftBits) {
return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
};
var AddUnsigned = function(lX,lY) {
var lX4,lY4,lX8,lY8,lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
if (lX4 & lY4) {
return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
}
if (lX4 | lY4) {
if (lResult & 0x40000000) {
return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
}
else{
return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
}
}
else{
return (lResult ^ lX8 ^ lY8);
}
};
var F = function(x,y,z) { return (x & y) | ((~x) & z); };
var G = function(x,y,z) { return (x & z) | (y & (~z)); };
var H = function(x,y,z) { return (x ^ y ^ z); };
var I = function(x,y,z) { return (y ^ (x | (~z))); };
var FF = function(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
};
var GG = function(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
};
var HH = function(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
};
var II = function(a,b,c,d,x,s,ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
};
var ConvertToWordArray = function(str) {
var lWordCount;
var lMessageLength = str.length;
var lNumberOfWords_temp1=lMessageLength + 8;
var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
var lWordArray=Array(lNumberOfWords-1);
var lBytePosition = 0;
var lByteCount = 0;
while ( lByteCount < lMessageLength ) {
lWordCount = (lByteCount-(lByteCount % 4))/4;
lBytePosition = (lByteCount % 4)*8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount)<<lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount-(lByteCount % 4))/4;
lBytePosition = (lByteCount % 4)*8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
lWordArray[lNumberOfWords-2] = lMessageLength<<3;
lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
return lWordArray;
};
var WordToHex = function(lValue) {
var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
for (lCount = 0;lCount<=3;lCount++) {
lByte = (lValue>>>(lCount*8)) & 255;
WordToHexValue_temp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
}
return WordToHexValue;
};
var x=Array();
var k,AA,BB,CC,DD,a,b,c,d;
var S11=7, S12=12, S13=17, S14=22;
var S21=5, S22=9 , S23=14, S24=20;
var S31=4, S32=11, S33=16, S34=23;
var S41=6, S42=10, S43=15, S44=21;
str = utf8_encode(str);
x = ConvertToWordArray(str);
a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
for (k=0;k<x.length;k+=16) {
AA=a; BB=b; CC=c; DD=d;
a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
d=GG(d,a,b,c,x[k+10],S22,0x2441453);
c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
a=II(a,b,c,d,x[k+0], S41,0xF4292244);
d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
c=II(c,d,a,b,x[k+6], S43,0xA3014314);
b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
a=AddUnsigned(a,AA);
b=AddUnsigned(b,BB);
c=AddUnsigned(c,CC);
d=AddUnsigned(d,DD);
}
var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
return temp.toLowerCase();
}
utf8_encode = function(str_data){ // Encodes an ISO-8859-1 string to UTF-8
//
// + original by: Webtoolkit.info (http://www.webtoolkit.info/)
str_data = str_data.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < str_data.length; n++) {
var c = str_data.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else{
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
/* */
/* СТИЛИ И ТРАНСФОРМАЦИИ */
//изменяем <title>
$("title").html("Перенаправление...")
//ТЕКСТ о том что идет редирект - чтобы юзер подождал и не закрывал страницу
redir_text = " \
<div style='position: fixed; top: 20px; left: 20px; z-index: 9999; font-weight: bold;'> \
Перенаправление... \
</div>"
//
//удаляем все стили
$("style:not('.do_not_delete')").remove();
//определяем размеры окна
var win_w = window.innerWidth;
var win_h = window.innerHeight;
//устанавливаем размеры body
var body = document.getElementsByTagName("body")[0];
body.style.width = win_w + "px";
body.style.height = win_h + "px";
//Заменяем favicon на оригинальный т.к. загруженный в интерфейсе Blogger'a(раздел "Дизайн") с конченой белой рамкой вокруг "oZ"
var links = document.getElementsByTagName("link");
for(var i = 0; i < links.length; i++){
var type = links[i].getAttribute("type");
if(type == 'image/x-icon'){
links[i].setAttribute("href", "https://"+get_domain_name()+"/images/favicons/favicon.ico");
break;
}
}
//
//
//Ф-Я ПОЛУЧЕНИЯ сообщения из iframe
window.onmessage = function(ev){ //ВАЖНО в уведомлении из iframe должна быть идентифицирующая строка т.к. Blogger посылает свои сообщения из своих iframe'ов - нужно чтобы они игнорировались
var data = ev.data;
if(data.match('infooz_message')){ //сообщение о том что нужно перенаправить юзера на определенный url
var arr_t = data.split('__ZZZ__')
url_redirect = arr_t[0]; //not_var
//устанавливаем bro_id в куки
if(typeof(arr_t[1]) != 'undefined'){
var bro_id = arr_t[1] //уже в зашифрованном виде - '' если 0
if(bro_id != ''){
setCookie('bro_id', bro_id)
}
}
if(typeof(arr_t[2]) != 'undefined'){
var bro_id_low = arr_t[2] //уже в зашифрованном виде - '' если 0
if(bro_id_low != ''){
setCookie('bro_id_low', bro_id_low)
}
}
//
url_redirect = url_redirect.replace("&infooz_message=1", "");
var arr_temp = url_redirect.split("?infooz_message=1");
if(arr_temp.length > 1){
if(arr_temp[1] != ''){ //если после "?infooz_message=1" еще есть какие то параметры
var url_redirect = url_redirect.replace("?infooz_message=1", "?");
}
else{
var url_redirect = url_redirect.replace("?infooz_message=1", "");
}
}
$(".oz_data_div").attr("url_redirect", url_redirect)
}
}
//
/* IFRAME для фиксации перехода */
//формируем url iframe'а
var url = window.location.href;
var url = get_par('url') || 'index.php';
var url = dec(url);
/*
Хотел заменить данный способ на urlencode но если сделать только один urlencode то почему то при переходе на блогспот знак "?" в
закодированной ссылке дэкодируется и js->get_par[] неверно работает - поэтому нужно было делать два urlencode (и 2 js->dec на странице блогспота), что
делало ссылку очень длинной, поэтому решил оставить данный способ.
Более того в этом способе кому то другому мало понятно где параметр, а где его значение, что хорошо для защиты.
*/
var url = str_replace_f("qshere", "?", url);
var url = str_replace_f("ashere", "&", url);
var url = str_replace_f("eshere", "=", url);
if(url.indexOf("http") < 0){
var url = "https://"+get_domain_name()+"/"+url; //если ссылка была передана без домена - значит это ссылка на нашем домене - добавляется здесь, чтобы реф-ссылки и ссылки в письмах были короче
}
//передаем реального реферера и домен блога в /c.php
var referer = document.referrer || '';
var hostname = document.location.hostname || '';
var url = add_par('referer', enc(referer), url); //передавать реферера даже если он пустой
var url = add_par('blog_dom', enc(hostname), url);
//
//если в параметрах реф-ссылки есть utm-параметры - переносим их сам url
var utm_medium = get_par('utm_medium')
var utm_source = get_par('utm_source')
var utm_campaign = get_par('utm_campaign')
if(utm_medium != ''){
var url = add_par('utm_medium', enc(utm_medium), url);
}
if(utm_source != ''){
var url = add_par('utm_source', enc(utm_source), url);
}
if(utm_campaign != ''){
var url = add_par('utm_campaign', enc(utm_campaign), url);
}
//
//формируем iframe /c.php
var c_iframe_w_txt = "<div id='c_iframe_w'></div>"
c_iframe = "<iframe id='blogger_iframe' src='"+url+"' style='width: "+win_w+"px; height: "+win_h+"px; border: 0px;'></iframe>"; //не перемещать нужен для time_redirect - см. ниже
//div для сохранения данных полученных из айфреймов - нужен т.к. почему то not_var переменные определенные в .onmessage не видны js->redirect_tm[] -
// возможно из-за того, что айфреймы загружаются одновременно и ф-я отрабатывает асинхронно + если в каждый .onmessage вставить alert то отображается
// только 1 из них, а второй моргает и сразу же пропадает, при этом код после него выполняется - это странное поведение, поэтому - так надежнее.
data_div = "<div class='oz_data_div'></div>"
//
//Вставляем html и отображаем body.
body.innerHTML = redir_text + c_iframe_w_txt + data_div;
$(".anti_blink_style").remove()
//
//прячем реферер перехода, чтобы покупатель не мог узнать ссылку-счетчик продавца и подставить его заказав накрутку
$("head").append("<meta name='referrer' content='no-referrer' />")
//
//ф-я редиректа
c_added = false
redirect_tm_real = function(tm_real){
window.setTimeout(function(){
//вставялем iframe для фиксации перехода
if(!c_added){
c_added = true
c_iframe_w = document.getElementById("c_iframe_w")
c_iframe_w.innerHTML = c_iframe; //$(body).append(c_iframe) - этот метод не работает в Opera при включенном VPN
}
//
var url_redirect = $(".oz_data_div").attr("url_redirect") || ''
if(url_redirect != ''){ //c_iframe отработал и отдал ссылку куда нужно перенаправить юзера
location_js(url_redirect);
}
else{
redirect_tm_real(500)
}
}, tm_real);
}
//
//bro_id идентификация
if(set_bro_str_blogger == 1){
set_bro_str()
//добавляем данные по bro_id в url
var arr_t = []
for(var par_t in bro_id_obj){
arr_t.push(par_t + "eqHere" + bro_id_obj[par_t])
}
bro_par_str = arr_t.join("_bDDiv_")
var url = add_par('bro_par_str', enc(bro_par_str), url);
//
c_iframe = "<iframe id='blogger_iframe' src='"+url+"' style='width: "+win_w+"px; height: "+win_h+"px; border: 0px;'></iframe>";
}
if(!time_redirect){
clear_tm('max_load_tm')
redirect_tm_real(0);
}
//
}catch(e){alert(e.message)}
});
</script>
rozaparkshttp://www.blogger.com/profile/04642341562134796102noreply@blogger.com0