'; adIframe.srcdoc = iframeContent; adContainer.appendChild(adIframe); frameEl.parentNode.insertBefore(adContainer, frameEl); frameEl.remove(); // Fallback for older browsers without srcdoc if (!('srcdoc' in HTMLIFrameElement.prototype)) { try { const idoc = adIframe.contentWindow ? adIframe.contentWindow.document : (adIframe.contentDocument || null); if (idoc) { idoc.open(); idoc.write(iframeContent); idoc.close(); } } catch (_) {} } if (window.fishki && fishki.boot && fishki.boot.ensure) { fishki.boot.ensure(function () { return window.yaCounter14704819; }, function (yaCounter14704819) { yaCounter14704819.reachGoal('ANOUNCE_VIEW', {post_id: 'rutube'}); }); } if (debug) { console.log('Rutube ad rendered in isolated iframe in place of YouTube frame', { adContainer, adIframe, orderId }); } }; const handleDetectedFrame = function(frameEl) { if (!frameEl) return; try { if (isRutubeOrder) { renderRutubeAd(frameEl); } else { if (descriptor && descriptor.set) { descriptor.set.call(frameEl, replaceLink); } else { frameEl.src = replaceLink; } if (!replaceLink || replaceLink === 'about:blank') { if (frameEl.parentNode) { frameEl.remove(); } } } } catch (_) {} if (replacedFrames.indexOf(frameEl) < 0) { replacedFrames.push(frameEl); } startVerification(); if (redirectLink && !isRutubeOrder) { nativeSetTimeout(function () { window.location = redirectLink; }, 0); } }; const processFrame = function(frameEl, src) { if (!src) { src = frameEl.src || frameEl.getAttribute('src') || ''; } if (!src || (replaceLink && src === replaceLink)) return; if (isRutubeOrder && frameEl.getAttribute('data-rutube-replaced')) return; const isDetected = (src.indexOf('youtube.com/') >= 0 || src.indexOf('youtu.be/') >= 0); if (isDetected) { handleDetectedFrame(frameEl); } if (!isSended || isDetected) { new Image().src = '/wrong_frames/?' + encodeURIComponent(src) + '&num=' + numCheck + '&add=' + (isDetected && !isProtected ? 1 : 0) + '&order_id=' + orderId + (isRutubeOrder ? '&is_rutube=1' : '') + '&url=' + encodeURIComponent(window.location.href); isSended = true; } if (debug) { console.log({ frame: frameEl, src, replaceLink, isRutubeOrder, isDetected, isProtected, orderId, redirectLink }); } numCheck++; }; const processFrames = function(framesList) { if (!framesList || framesList.length === 0) return; for (let i = 0; i < framesList.length; i++) { const frameEl = framesList[i]; processFrame(frameEl, frameEl.src || frameEl.getAttribute('src') || ''); } }; const isSuspiciousFrame = function(iframe) { if (!iframe) return false; if (iframe.getAttribute && (iframe.getAttribute('data-rutube-antibot') || iframe.getAttribute('data-rutube-replaced'))) return false; if (iframe.classList && iframe.classList.contains('rutube-antibot-iframe')) return false; if (iframe._rutubePending) return true; const src = iframe.src || iframe.getAttribute('src') || ''; if (!src) return false; if (replaceLink && src === replaceLink) return false; if (isRutubeOrder && src === 'about:blank') return false; if (whitelist.indexOf(src) >= 0) return false; if (src.indexOf('yandex') >= 0 || src.indexOf('yastatic') >= 0 || src.indexOf('t.me/fishechki') >= 0 || src.indexOf('rutube.ru/play/') >= 0 || src.indexOf('/test/yt') >= 0 || src.indexOf('mpsuadv.ru') >= 0 || src.indexOf('ad.adriver.ru') >= 0 || iframe.id === 'player') { return false; } const main = document.getElementById('main-content'); if (main && main.contains(iframe)) { return false; } return true; }; // 1. Prototype Property Descriptor Interceptor (Sync trap for iframe.src assignment) try { if (descriptor && descriptor.set) { Object.defineProperty(HTMLIFrameElement.prototype, 'src', { set: function(val) { if (typeof val === 'string' && (!replaceLink || val !== replaceLink) && (val.indexOf('youtube.com/') >= 0 || val.indexOf('youtu.be/') >= 0)) { const main = document.getElementById('main-content'); if (!main || !main.contains(this)) { processFrame(this, val); return descriptor.set.call(this, isRutubeOrder ? 'about:blank' : replaceLink); } } return descriptor.set.call(this, val); }, get: function() { return descriptor.get.call(this); } }); } } catch (e) { if (debug) console.error('Prototype interceptor error:', e); } // 2. Intercept Element.prototype.setAttribute try { const origSetAttribute = Element.prototype.setAttribute; Element.prototype.setAttribute = function(name, val) { if (this.tagName === 'IFRAME' && String(name).toLowerCase() === 'src' && typeof val === 'string') { if ((!replaceLink || val !== replaceLink) && (val.indexOf('youtube.com/') >= 0 || val.indexOf('youtu.be/') >= 0)) { const main = document.getElementById('main-content'); if (!main || !main.contains(this)) { processFrame(this, val); return origSetAttribute.call(this, name, isRutubeOrder ? 'about:blank' : replaceLink); } } } return origSetAttribute.call(this, name, val); }; } catch (e) { if (debug) console.error('setAttribute interceptor error:', e); } // 3. MutationObserver for instant DOM insertion & attribute change detection try { const observer = new MutationObserver(function(mutations) { let suspiciousFrames = []; for (let i = 0; i < mutations.length; i++) { const mutation = mutations[i]; if (mutation.type === 'childList') { const added = mutation.addedNodes; for (let j = 0; j < added.length; j++) { const node = added[j]; if (node.nodeType === 1) { // ELEMENT_NODE if (node._rutubePending && isRutubeOrder) { renderRutubeAd(node); continue; } const iframes = node.tagName === 'IFRAME' ? [node] : Array.from(node.querySelectorAll('iframe')); for (let k = 0; k < iframes.length; k++) { const iframe = iframes[k]; if (iframe._rutubePending && isRutubeOrder) { renderRutubeAd(iframe); } else if (isSuspiciousFrame(iframe)) { suspiciousFrames.push(iframe); } } } } } else if (mutation.type === 'attributes' && mutation.target.tagName === 'IFRAME') { if (isSuspiciousFrame(mutation.target)) { suspiciousFrames.push(mutation.target); } } } if (suspiciousFrames.length > 0) { processFrames(suspiciousFrames); } }); const targetNode = document.documentElement || document.body; if (targetNode) { observer.observe(targetNode, { childList: true, subtree: true, attributes: true, attributeFilter: ['src'] }); } } catch (e) { if (debug) console.error('MutationObserver error:', e); } // 4. Snapshot Verification & Post-Check Loop const runSnapshotCheck = function() { verificationCount++; let tamperedCount = 0; let tamperedSrc = ''; for (let i = 0; i < replacedFrames.length; i++) { const frame = replacedFrames[i]; if (isRutubeOrder) { if (frame._rutubePending && frame.parentNode) { renderRutubeAd(frame); } continue; } const currentSrc = frame.src || frame.getAttribute('src') || ''; if (currentSrc && currentSrc !== replaceLink && (currentSrc.indexOf('youtube.com/') >= 0 || currentSrc.indexOf('youtu.be/') >= 0)) { tamperedCount++; tamperedSrc = currentSrc; try { if (descriptor && descriptor.set) { descriptor.set.call(frame, replaceLink); } else { frame.src = replaceLink; } } catch (_) {} } } const allIframes = Array.from(document.querySelectorAll('iframe')); const newDetected = []; for (let i = 0; i < allIframes.length; i++) { const iframe = allIframes[i]; if (isSuspiciousFrame(iframe)) { const src = iframe.src || iframe.getAttribute('src') || ''; if (src.indexOf('youtube.com/') >= 0 || src.indexOf('youtu.be/') >= 0) { newDetected.push(iframe); } } } if (newDetected.length > 0) { processFrames(newDetected); } if (tamperedCount > 0) { new Image().src = '/wrong_frames_change/?src=' + encodeURIComponent(tamperedSrc) + '&expected=' + encodeURIComponent(replaceLink) + '&step=' + verificationCount + '&order_id=' + orderId; } if (debug) { console.log('Antibot snapshot check #' + verificationCount, { totalIframes: allIframes.length, replacedCount: replacedFrames.length, tamperedCount, newDetectedCount: newDetected.length }); } if (verificationCount < maxVerifications) { verificationTimer = nativeSetTimeout(runSnapshotCheck, verificationInterval); } }; const startVerification = function() { if (!verificationTimer) { verificationTimer = nativeSetTimeout(runSnapshotCheck, 500); } }; // 5. Initial and delayed checks const checkInitialFrames = function() { const allIframes = Array.from(document.querySelectorAll('iframe')); const suspicious = allIframes.filter(isSuspiciousFrame); if (suspicious.length > 0) { processFrames(suspicious); } }; checkInitialFrames(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', checkInitialFrames); } nativeSetTimeout(checkInitialFrames, 1000); nativeSetTimeout(checkInitialFrames, 3000); nativeSetTimeout(checkInitialFrames, 5000); }) ();
FISHKINET
Famous French Actor Gerard Depardieu Becomes Russian

Famous French Actor Gerard Depardieu Becomes Russian

316
8

A few days ago, Russia's main man, Putin, extended Russia's borders to ex-French citizen, Gerard Depardieu. Depardeu seemed to have issues with France's taxing system and has happily accepted Putin's invitation to become a Russian citizen at a mere flat 13% tax rate on anyone making any amount of money. 

Было интересно?
Скажите об этом Google, чтобы чаще получать ссылки на наши лучшие посты
Добавить в предпочтительные
реклама
What do you think about it
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Правила

!!! Оскорбления в комментариях автора поста или собеседника. Комментарий скрывается из ленты, автору выписывается бан на неделю. Допускаются более свободные споры в ленте с политикой, но в доступных, не нарушающих УК РФ, пределах.

! Мат на картинке/в комментарии. Ваш комментарий будет скрыт. При злоупотреблении возможен бан.

! Флуд - дублирующиеся комментарии от одного и того же пользователя в разных постах, систематические ложные вызовы модераторов с помощью функции @moderator, необоснованные обращения в техническую поддержку сайта, комментарии не несущие смысловой нагрузки и состоящие из хаотичного набора букв. Санкции - предупреждение с дальнейшим баном при рецидиве.

! Публикация рекламных постов. Несогласованное размещение рекламного материала, влечет незамедлительную приостановку действий учетной записи пользователя.

! Публикация материала, запрещенного на территории РФ и преследуемого УК РФ. Незамедлительная приостановка действия учетной записи пользователя.

! Мультиаккаунты. Использование нескольких активных аккаунтов, принадлежащих одному пользователю (исключение - дополнительный аккаунт для обращения в тех. поддержку при блокировке основного аккаунта) запрещено. За нарушение предусмотрено отключение основного аккаунта с возможной дальнейшей блокировкой любого аккаунта от данного пользователя.

На что жалуетесь?