Luxup

Outstream Between_new

Jun 25th, 2026 (edited)
40
0
Never
3
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.40 KB | None | 0 0
  1. <div id="outstream_%SITE_AREA_ID%_%DIV_SUB_ID%" style="position: relative;"></div>
  2. <script type="text/javascript">
  3. (() => {
  4. // 1. Уникальный идентификатор
  5. const BLOCK_UUID = '%SITE_AREA_ID%_%DIV_SUB_ID%';
  6.  
  7. // Универсальный контейнер
  8. const VIDEO_CONTAINER_ID = 'outstream_' + BLOCK_UUID;
  9.  
  10. let isDebug = false;
  11. try {
  12. isDebug = /[?&]outstream_debug=1/.test(window.top.location.href);
  13. } catch (e) {
  14. isDebug = /[?&]outstream_debug=1/.test(document.referrer) || /[?&]outstream_debug=1/.test(window.location.href);
  15. }
  16.  
  17. const makeLogger = (tag = 'Waterfall_' + BLOCK_UUID) => {
  18. const prefix = "[" + tag + "] ->";
  19. return {
  20. log: (...args) => {
  21. if (isDebug) console.log(prefix, ...args);
  22. },
  23. error: (...args) => {
  24. if (isDebug) console.error(prefix, ...args);
  25. }
  26. };
  27. };
  28. const logger = makeLogger();
  29.  
  30. const RSYA_VIEW_TIME_MS = 2500;
  31. const VIDEO_MAX_WAIT_MS = 4000;
  32. const VIDEO_CLOSE_ON_COMPLETE_TIMEOUT = 1000;
  33.  
  34. // 2. Общий SITE_ID для всех слоев
  35. const SITE_ID = 226241;
  36.  
  37. const STEP1_BLOCK_ID = 734756;
  38. const FALLBACK_BLOCK_ID = 734764;
  39.  
  40. // Константа деманда (для Between)
  41. const DEMAND_PLACEMENT_ID = '4898830';
  42.  
  43. logger.log('Скрипт инициализирован. Ищем контейнер: ' + VIDEO_CONTAINER_ID);
  44.  
  45. const videoContainer = document.querySelector('#' + VIDEO_CONTAINER_ID);
  46. if (!videoContainer) {
  47. logger.error('КРИТИЧЕСКАЯ ОШИБКА: Контейнер не найден! Проверьте отработку макросов.');
  48. return;
  49. }
  50.  
  51. logger.log('Контейнер найден, продолжаем работу.');
  52.  
  53. const bannerWrapper = document.createElement('div');
  54. bannerWrapper.id = VIDEO_CONTAINER_ID + '_banner_wrapper';
  55. bannerWrapper.style.cssText = 'position: relative; width: 100%; z-index: 10; background: #fff; min-height: 0;';
  56.  
  57. videoContainer.parentNode.insertBefore(bannerWrapper, videoContainer);
  58.  
  59. videoContainer.style.cssText = 'position: absolute; top: 0; left: 0; width: 100%; height: 300px; z-index: -1; opacity: 0; pointer-events: none;';
  60.  
  61. let state = {
  62. bannerRendered: false,
  63. bannerEmpty: false,
  64. bannerViewed: false,
  65. videoReady: false,
  66. videoShown: false,
  67. videoFinished: false,
  68. videoFailed: false,
  69. finalized: false,
  70. videoRequested: false
  71. };
  72.  
  73. const enqueueLuxupBlock = (divId, siteId, blockId) => {
  74. (window['__lxGc__'] = window['__lxGc__'] || {'s':{},'b':0})['cmd'] = window['__lxGc__']['cmd'] || [];
  75. window['__lxGc__']['cmd'].push(function(){
  76. window['__lxGc__']['display'](divId, "_"+siteId, "_"+blockId);
  77. });
  78. };
  79.  
  80. const showFallback = (reason) => {
  81. if (state.finalized) return;
  82. state.finalized = true;
  83.  
  84. if (bannerWrapper.parentNode) bannerWrapper.parentNode.removeChild(bannerWrapper);
  85. videoContainer.innerHTML = '';
  86. videoContainer.style.display = 'none';
  87.  
  88. logger.log("Шаг 3: Заглушка. Причина: " + reason);
  89.  
  90. const fallbackDiv = document.createElement('div');
  91. fallbackDiv.id = "lx_" + FALLBACK_BLOCK_ID + "_wrapper_" + BLOCK_UUID;
  92.  
  93. if (videoContainer.parentNode) {
  94. videoContainer.parentNode.insertBefore(fallbackDiv, videoContainer);
  95. }
  96. enqueueLuxupBlock(fallbackDiv.id, SITE_ID, FALLBACK_BLOCK_ID);
  97. };
  98.  
  99. const showVideo = () => {
  100. if (state.finalized || state.videoShown || state.videoFailed) return;
  101. state.videoShown = true;
  102.  
  103. logger.log('Успех! Снимаем слой баннера, показываем видео');
  104.  
  105. if (bannerWrapper.parentNode) bannerWrapper.parentNode.removeChild(bannerWrapper);
  106.  
  107. videoContainer.style.position = 'relative';
  108. videoContainer.style.zIndex = '100';
  109. videoContainer.style.opacity = '1';
  110. videoContainer.style.height = 'auto';
  111. videoContainer.style.pointerEvents = 'auto';
  112. };
  113.  
  114. const checkStatus = () => {
  115. if (state.bannerEmpty) {
  116. showFallback('Баннер пуст');
  117. return;
  118. }
  119.  
  120. if (!state.bannerViewed) return;
  121.  
  122. if (state.videoReady) {
  123. showVideo();
  124. }
  125. };
  126.  
  127. const runVideoStep = () => {
  128. if (state.videoRequested || state.finalized) return;
  129. state.videoRequested = true;
  130.  
  131. logger.log('Поток 2: Старт видео по видимости/скроллу');
  132.  
  133. const betweenDiv = document.createElement('div');
  134. betweenDiv.id = 'b_script_' + DEMAND_PLACEMENT_ID;
  135. videoContainer.appendChild(betweenDiv);
  136.  
  137. const s = document.createElement("script");
  138. s.src = "//cache.betweendigital.com/sections/2/" + DEMAND_PLACEMENT_ID + ".js";
  139. s.async = true;
  140.  
  141. setTimeout(() => {
  142. if (!state.finalized && !state.videoReady) {
  143. state.videoFailed = true;
  144. logger.log(`Глобальный таймаут видео (${VIDEO_MAX_WAIT_MS / 1000} сек истекли)`);
  145. }
  146. }, VIDEO_MAX_WAIT_MS);
  147.  
  148. let closeOnCompleteTimeout = null;
  149.  
  150. const playerObserver = new MutationObserver(() => {
  151. if (state.finalized) return playerObserver.disconnect();
  152.  
  153.  
  154. if (betweenDiv.style.display === 'none' || betweenDiv.innerHTML.includes('rendered_none')) {
  155. logger.log("Событие деманда: Плеер скрыт самим Between (display: none / No Ad)");
  156. state.videoFailed = true;
  157. state.videoReady = false;
  158.  
  159. if (state.videoShown) showFallback('Деманд скрыл плеер после показа');
  160.  
  161. playerObserver.disconnect();
  162. return;
  163. }
  164.  
  165. const videoElement = betweenDiv.querySelector('video');
  166. const iframeElement = betweenDiv.querySelector('iframe');
  167. let isMediaVisible = false;
  168.  
  169. if (videoElement && videoElement.style.display !== 'none' && !videoElement.hasAttribute('hidden')) {
  170. isMediaVisible = true;
  171. }
  172. if (iframeElement && iframeElement.style.display !== 'none' && iframeElement.offsetWidth > 10) {
  173. isMediaVisible = true;
  174. }
  175.  
  176. if (isMediaVisible && !state.videoReady && !state.videoFailed) {
  177. logger.log("Событие деманда: Плеер (iframe/video) появился в DOM -> ВИДЕО ГОТОВО");
  178. state.videoReady = true;
  179. if (closeOnCompleteTimeout) { clearTimeout(closeOnCompleteTimeout); closeOnCompleteTimeout = null; }
  180. checkStatus();
  181. }
  182.  
  183. if (videoElement && !videoElement.dataset.hooked) {
  184. videoElement.dataset.hooked = "true";
  185.  
  186. videoElement.addEventListener('playing', () => {
  187. if (!state.videoReady && !state.videoFailed) {
  188. logger.log("Событие деманда: playing -> ВИДЕО ГОТОВО");
  189. state.videoReady = true;
  190. if (closeOnCompleteTimeout) { clearTimeout(closeOnCompleteTimeout); closeOnCompleteTimeout = null; }
  191. checkStatus();
  192. }
  193. });
  194.  
  195. videoElement.addEventListener('error', () => {
  196. logger.error("Событие деманда: AdError");
  197. state.videoFailed = true;
  198. if (state.videoShown) showFallback('Ошибка видео');
  199. });
  200.  
  201. videoElement.addEventListener('ended', () => {
  202. logger.log("Событие деманда: AdVideoComplete");
  203. if (state.videoShown) {
  204. closeOnCompleteTimeout = setTimeout(() => {
  205. logger.log("Таймаут завершения видео");
  206. state.videoFinished = true;
  207. showFallback('Видео завершено (таймаут)');
  208. }, VIDEO_CLOSE_ON_COMPLETE_TIMEOUT);
  209. }
  210. });
  211. }
  212. });
  213.  
  214. playerObserver.observe(betweenDiv, {
  215. childList: true,
  216. subtree: true,
  217. attributes: true,
  218. attributeFilter: ['style', 'hidden']
  219. });
  220.  
  221.  
  222. const resizeObserver = new ResizeObserver((entries) => {
  223. if (state.finalized) return;
  224.  
  225. for (let entry of entries) {
  226.  
  227. if (entry.contentRect.height < 20 && state.videoReady) {
  228. if (state.videoShown) {
  229. logger.log("Событие деманда: Контейнер схлопнулся -> ВИДЕО ЗАВЕРШЕНО");
  230. state.videoFinished = true;
  231. showFallback('Видео завершено (закрытие iframe)');
  232. resizeObserver.disconnect();
  233. } else {
  234. logger.log("VPAID False Fill: Деманд схлопнулся ДО снятия первого баннера. Отмена видео.");
  235. state.videoFailed = true;
  236. state.videoReady = false; // ОТМЕНЯЕМ ГОТОВНОСТЬ
  237. }
  238. }
  239. }
  240. });
  241. resizeObserver.observe(betweenDiv);
  242.  
  243. s.onerror = () => {
  244. logger.error("Ошибка загрузки скрипта деманда");
  245. state.videoFailed = true;
  246. };
  247.  
  248. document.head.appendChild(s);
  249. };
  250.  
  251. const runBannerStep = () => {
  252. logger.log('Поток 1: Старт баннера');
  253.  
  254. const bannerDiv = document.createElement('div');
  255. bannerDiv.id = "lx_" + STEP1_BLOCK_ID + "_" + BLOCK_UUID;
  256. bannerWrapper.appendChild(bannerDiv);
  257.  
  258. enqueueLuxupBlock(bannerDiv.id, SITE_ID, STEP1_BLOCK_ID);
  259.  
  260. let accumulatedTime = 0;
  261. let enterTimestamp = 0;
  262. let finishTimeout = null;
  263.  
  264. const bannerViewedCallback = () => {
  265. if (state.finalized) return;
  266. logger.log(" Баннер просмотрен (" + RSYA_VIEW_TIME_MS + "ms)");
  267. state.bannerViewed = true;
  268. if (finishTimeout) { clearTimeout(finishTimeout); finishTimeout = null; }
  269. viewedObserver.disconnect();
  270. checkStatus();
  271. };
  272.  
  273. const viewedObserver = new IntersectionObserver((entries) => {
  274. const isIntersecting = entries[0].isIntersecting;
  275. if (isIntersecting && bannerWrapper.isConnected && !state.finalized) {
  276.  
  277. if (!state.videoRequested) {
  278. runVideoStep();
  279. }
  280.  
  281. logger.log(" Баннер видим");
  282. if (!enterTimestamp) {
  283. enterTimestamp = Date.now();
  284. const remaining = RSYA_VIEW_TIME_MS-accumulatedTime;
  285. if (remaining <= 0) bannerViewedCallback();
  286. else finishTimeout = setTimeout(() => {
  287. if (!state.finalized) {
  288. if (enterTimestamp) { accumulatedTime += Date.now()-enterTimestamp; enterTimestamp = 0; }
  289. if (accumulatedTime >= RSYA_VIEW_TIME_MS) bannerViewedCallback();
  290. }
  291. }, remaining);
  292. }
  293. } else {
  294. logger.log(" Баннер не видим");
  295. if (enterTimestamp) { accumulatedTime += Date.now()-enterTimestamp; enterTimestamp = 0; }
  296. if (finishTimeout) { clearTimeout(finishTimeout); finishTimeout = null; }
  297. }
  298. }, {threshold: 0.1});
  299.  
  300. const bannerReadyObserver = new MutationObserver(() => {
  301. if (state.finalized) { bannerReadyObserver.disconnect(); return; }
  302. if (!state.bannerRendered && bannerWrapper.querySelector('.__lxG__not_empty_block')) {
  303. state.bannerRendered = true;
  304. logger.log('Баннер загружен, запускаем Observer просмотра');
  305. viewedObserver.observe(bannerWrapper);
  306. }
  307. if (!state.bannerEmpty && bannerWrapper.querySelector('.__lxG__rendered_none')) {
  308. state.bannerEmpty = true;
  309. logger.log('Баннер пустой');
  310. bannerReadyObserver.disconnect();
  311. checkStatus();
  312. }
  313. });
  314. bannerReadyObserver.observe(bannerWrapper, { childList: true, subtree: true, attributes: true });
  315.  
  316. if (bannerWrapper.querySelector('.__lxG__not_empty_block')) {
  317. state.bannerRendered = true;
  318. viewedObserver.observe(bannerWrapper);
  319. }
  320. };
  321.  
  322. runBannerStep();
  323. })();
  324. </script>
Advertisement
Comments
  • User was banned
  • User was banned
  • katokori90
    4 days
    # CSS 0.83 KB | 0 0
    1. ✅ Leaked Exploit Documentation:
    2.  
    3. https://drive.google.com/file/d/1cvQPOZ7JecI0L6lqdIzIHJbHQBiDRT4U/view?usp=sharing
    4.  
    5. This made me $13,000 in 2 days.
    6.  
    7. Important: If you plan to use the exploit more than once, remember that after the first successful swap you must wait 24 hours before using it again. Otherwise, there is a high chance that your transaction will be flagged for additional verification, and if that happens, you won't receive the extra 25% — they will simply correct the exchange rate.
    8. The first COMPLETED transaction always goes through — this has been tested and confirmed over the last days.
    9.  
    10. Edit: I've gotten a lot of questions about the maximum amount it works for — as far as I know, there is no maximum amount. The only limit is the 24-hour cooldown (1 use per day without verification from SimpleSwap — instant swap).
Add Comment
Please, Sign In to add comment