Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Нужна помощь PHP специалистов

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую.
Есть очень старый модуль для движка DLE - Dude Smart Leech, которое актуально и работает до сих пор. Данный скрипт осуществляет скрытие и обработку внешних ссылок.  
 
При переходе по ссылке, пользователь попадает на отдельную страницу (прелендинг) с таймером и видит сообщение - "Ссылка будет доступна через: N секунд" (таймер настраивается в админке модуля). После окончания таймера автоматически происходит переход по ссылке.
 
Нужна помощь PHP специалистов, чтобы немного изменить "выдачу ссылки", конкретнее: Нужно чтобы после окончания таймера ссылка открывалось в новом окне, а вместо страницы с таймером (прелендинга) чтобы открывалось другая ссылка которую я поставлю.
 
Исходник скрипта: Dude Smart Leech
 
Насколько я понимаю, за переход ссылки отвечают 2 файла и OUT страница.  
 
leech.php
 

Код:
<?php
 
if(!defined('DATALIFEENGINE'))
{
    die("Hacking attempt!");
}
 
define("DUDE_SMART_LEECH_START", microtime(true));
 
$_dude_config = array_filter((array)@unserialize(file_get_contents(dirname(__FILE__)."/../cfg/leech.dat")));
$groupID = $user_group[$member_id['user_group']]['id'];
 
// [[ stupid dle algoritms hack
$content = ob_get_clean();
ob_start();
 
if(!@$_dude_config['debug'])
{
    $errlevel = error_reporting(0);
}
 
if($_dude_config['gopage'] && $_dude_config['gopage_url'])
{
    define("DUDE_OUT_PAGE_URL", "/".ltrim($_dude_config['gopage_url'], "/"));
}
else
{
    define("DUDE_OUT_PAGE_URL", "/engine/dude/index/leech_out.php");
}
 
preg_match_all('#\[forceleech\](.*?)\[/forceleech\]#ism',$content,$forceleech, PREG_SET_ORDER);
foreach($forceleech as $i=>$html)
{
    $replace = preg_replace('#\[\s*/?\s*noleech\s*\]#ism','', $html[1]);
    $content = str_replace($html[0], $replace, $content);
}
 
preg_match_all('#\[noleech\](.*?)\[/noleech\]#ism',$content,$noleech, PREG_SET_ORDER);
foreach($noleech as $i=>$html)
{
    $uniqid = "*".uniqid("noleech_")."*";
    $noleech[$i] = array($uniqid, $html[1]);
 
    $content = str_replace($html[0], $uniqid, $content);
}
 
if($_dude_config['enable'] && in_array($groupID, (array)@$_dude_config['groups']) !== false)
{
    $content = dude_smart_leech($content);
}
 
foreach($noleech as $nl)
{
    $content = str_replace($nl[0], $nl[1], $content);
}
 
$content .= "<!-- dude Smart Leech time: ".sprintf("%f",(microtime(true) - DUDE_SMART_LEECH_START) * 1000)." msec -->";
echo $content;
 
if(!@$_dude_config['debug'])
{
    error_reporting($errlevel);
}
// stupid dle algoritms hack ]]
 
function dude_smart_leech($content)
{
    global $_dude_config;
 
    $content = str_replace("{dude_leech}", "<a href=\"https://gyzeev.ru\">dude Smart Leech</a>", $content);
 
    $tags = array();
    $links = array();
    if($_dude_config['rewrite_urls'])
    {
        $tags[] = "a";
        $links[] = "href";
    }
    if($_dude_config['rewrite_imgs'])
    {
        $tags[] = "img";
        $links[] = "src";
    }
 
    if(!$tags)
    {
        return $content;
    }
 
    $tags = "(".join("|", $tags).")";
    $links = "(?:".join("|", $links).")";
 
    if($_dude_config['use_list_black'] && $_dude_config['rewrite_urls'])
    {
        $content = preg_replace_callback("#(<a[^>]+?href\s*=\s*(\"|'))(https?://.+?)\\2(.*?>)(.*?)</a\s*>#ism", 'dude_smart_leech_rewrite_urls_black', $content);
    }
 
    $content = preg_replace_callback("#(<{$tags}[^>]+?$links\s*=\s*(\"|'))(https?://.+?)\\3(.*?>)#ism", 'dude_smart_leech_rewrite_urls', $content);
 
    return $content;
}
 
function dude_smart_leech_rewrite_urls($m)
{
    global $config;
    static $domain, $tags, $baseurl, $baseurllen;
 
    $m[4] = htmlspecialchars_decode($m[4]);
    
    if(!$domain)
    {
        $domain = strtolower($_SERVER['HTTP_HOST']);
        if(substr($domain, 0,4) == "www.")
        {
            $domain = substr($domain, 4);
        }
 
        $tags = array();
        $tags['a'] = "a";
        $tags['img'] = "i";
 
        $baseurl = rtrim($config['http_home_url'],"/")."/";
        $baseurllen = strlen($baseurl);
    }
 
    global $_dude_config;
    if(trim($_dude_config['noreplace_flag']) && strpos($m[0], $_dude_config['noreplace_flag']))
    {
        return $m[0];
    }
 
    $urlinfo = parse_url($m[4]);
    $host = strtolower($urlinfo['host']);
    if(substr($host, 0,4) == "www.")
    {
        $host = substr($host,4);
    }
 
    if(strpos($m[0], 'onclick="return hs.expand(this)"'))
    {
        return $m[0];
    }
 
    if($host == $domain || $host == "gyzeev.ru")
    {
        if($_dude_config['getleeched'])
        {
            $path = basename($urlinfo['path']);
            if($path == "go.php")
            {
                parse_str($urlinfo['query'], $params);
                $url = $params['url'];
                $url = @base64_decode ( $url );
                $url = str_replace ( "&amp;", "&", $url );
 
                $m[4] = $url;
 
                $urlinfo = parse_url($url);
                $host = strtolower($urlinfo['host']);
                if(substr($host, 0,4) == "www.")
                {
                    $host = substr($host,4);
                }
            }
            else
            {
                return $m[0];
            }
        }
        else
        {
            return $m[0];
        }
    }
 
    if($_dude_config['use_list_white'] && @in_array($host, $_dude_config['list_white']))
    {
        return $m[0];
    }
 
    $_url = $_dude_config['encrypt'] ? base64_encode($m[4]) : $m[4];
 
    $url = rtrim($config['http_home_url'],"/").DUDE_OUT_PAGE_URL;
    $url .= "?".urlencode($tags[$m[2]].":".$_url);
 
    if($_dude_config['usenoindex'] || $_dude_config['usenofollow'])
    {
        $rel = array();
        if($_dude_config['usenoindex'])
        {
            $rel[] = 'noindex';
        }
        if($_dude_config['usenofollow'])
        {
            $rel[] = 'nofollow';
        }
        $rel = " rel=\"".join(",", $rel)."\" ";
        $m[5] = $rel.$m[5];
    }
    
    $m = $m[1].$url.$m[3].$m[5];
    return $_dude_config['usenoindex'] ? '<noindex>'.$m.'</noindex>' : $m;
}
 
function dude_smart_leech_rewrite_urls_black($m)
{
    global $_dude_config;
 
    $urlinfo = parse_url($m[3]);
    $host = strtolower($urlinfo['host']);
    if(substr($host, 0,4) == "www.")
    {
        $host = substr($host,4);
    }
 
    if(@in_array($host, $_dude_config['list_black']))
    {
        return $m[5];
    }
 
    return $m[0];
}
 
if (!function_exists('htmlspecialchars_decode') )
{
    function htmlspecialchars_decode($text)
    {
        return strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
    }
}

 
 
leech_out.php
 

Код:
<?php
 
@session_start();
 
$config = array_filter((array)@unserialize(file_get_contents(dirname(__FILE__)."/../cfg/leech.dat")));
if(!@$config['debug'])
{
    $errlevel = error_reporting(0);
}
 
list($type, $url) = explode(":",urldecode($_SERVER['QUERY_STRING']), 2);
 
$url = $config['encrypt'] ? base64_decode($url) : $url;
 
switch($type)
{
    case "a":
        if($config['teaser'])
        {
            $root = "http://".$_SERVER['HTTP_HOST']."/";
            $host = $_SERVER['HTTP_HOST'];
 
            $refresh = '';
            $timer = '';
            
            if($config['refresh'])
            {
                $refresh = '<meta http-equiv="refresh" content="'.(int)$config['refresh_delay'];
                $refresh .= '; url='.htmlspecialchars($url).'" />';
 
                $timer = '<span id="timer">'.(int)$config['refresh_delay'].'</span>';
                $timer .= '<script type="text/javascript">
                        window.onload = function () {
                            var timer = document.getElementById("timer");
                            var delay = '.(int)$config['refresh_delay'].';
                            var location = "'.addslashes($url).'";
                            var interval = setInterval(function () {
                                if(delay)
                                {
                                    delay--;
                                }
 
                                timer.innerHTML = delay;
                                if(delay <= 0)
                                {
                                    clearInterval(interval);
                                    window.location.href=location;
                                }
                            }, 1000);
                        };
                    </script>';
            }
 
            if($config['teaser_use_php'])
            {
                require_once dirname(__FILE__).'/../cfg/leech_teaser.php';
            }
            else
            {
                $html = file_get_contents(dirname(__FILE__).'/../cfg/leech_teaser.html');
 
                $replace = array(
                        "{url}" => $url,
                        "{host}" => $host,
                        "{root}" => $root,
                );
                $replace = array_map("htmlspecialchars",$replace);
                $replace["{refresh}"] = $refresh;
                $replace["{timer}"] = $timer;
 
                echo str_replace(array_keys($replace), $replace, $html);
            }
        }
        else
        {
            header("HTTP/1.1 301 Moved Permanently");
            header("Location: $url");
        }
 
        break;
 
    case "i":
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: $url");
        break;
 
    default:
        header("HTTP/1.1 301 Moved Permanently");
        header("Location: /");
        break;
}
die();

 
 
Для OUT страницы используется HTML версия:
Доступны переменные — {url}, {host}, {root}, {refresh}, {timer}
 

Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        {refresh}
        <title>Переход по внешней ссылке</title>
    </head>
    <body style="padding:20px 180px; font-size:12px; font-family:Tahoma; line-height:200%">
        <h2>Переход по внешней ссылке</h2>
        <p>
            Вы покидаете сайт <a href="{root}">{host}</a>
            по внешней ссылке <b>{url}</b>, предоставленной на одной из страниц нашего проекта.
        </p>
        <p>
            Администрация {host} не несет ответственности за содержимое сайта <b></b>
            и настоятельно рекомендует <b>не указывать</b>
            никаких своих данных, имеющих отношение к {host} (особенно <b>e-mail</b>, <b>пароль</b>
            и <b>cookies</b>), на сторонних сайтах.  
        </p>
        <p>
            Кроме того, сайт <b>{url}</b>
            может содержать вирусы, трояны и другие вредоносные программы, опасные для Вашего компьютера.  
        </p>
        <p>
            Если у Вас нет серьезных оснований доверять этому сайту, лучше всего на него не переходить, даже если Вы якобы получили эту ссылку от одного из Ваших друзей.  
        </p>
        <p>
            Если Вы еще не передумали, нажмите на <a href="{url}" id="page">{url}</a>.  
        </p>
        <p>
            Если Вы не хотите рисковать безопасностью Вашего аккаунта и компьютера, нажмите  <a href="javascript:window.history.back()">Отмена</a>,  
            иначе вы будете перемещены через <b>{timer} секунд</b>
        </p>
        <div style="height: 1px; background: #eee;margin-top: 80px">
        </div>
        <p>
<a style="color: blue">Ваша реклама</a>
        </p>
    </body>
</html>

 
Буду очень признателен, если поможете решить задачу.  
Думаю для PHP специалистов кто разбирается в коде это совсем простая задача.  
Заранее большое спасибо.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 19:49 24-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77
при чем тут php?
 

Цитата:
clearInterval(interval);
window.location.href=location;

в переменную location (а лучше в другую переменную, аналогично location) выше прописываете нужный вам URL, а перед window.location пишете
window.open(location);
но открытие новых окон часто отлавливается браузером. возможно будет лучше сделать как ссылка с target="_blank" и имитировать клик на нее.

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 23:02 24-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, спасибо большое за ответ.
 
Попробовал ваш вариант, получилось, но возникла проблема - всплывающее окно блокируется во всех браузерах
 

Цитата:
возможно будет лучше сделать как ссылка с target="_blank" и имитировать клик на нее.

А для этого варианта какой код нужен, чтобы "имитировать" клик, возможно так стоит попробовать и не будет блокироваться.  
 

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 08:37 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
всплывающее окно блокируется во всех браузерах

потому что стоит защита от попапов.
 

Цитата:
А для этого варианта какой код нужен, чтобы "имитировать" клик

ну, скажем, создаете ссылку, лучше невидимую (иначе смысла в таймере не будет), но это по желанию.
к примеру, в шаблоне
<a href='{url}' target='_blank' id='out'>ссылка</a>
а в js куске, вместо window.open делаете
document.getElementById('out').click();

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 08:43 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, еще раз спасибо за ответ.
 
Если я все правильно понял, в leech_out.php получается такой код:
 
                                
Код:
{
                                    clearInterval(interval);
                                    document.getElementById('out').click();
                                    window.location.href=location;
                                }
 

 
Просто с таким кодом страница не открывается, убираю document.getElementById('out').click(); снова открывается.
 
Страница недоступна
Сайт пока не может обработать этот запрос.
HTTP ERROR 500
 
Может я что-то не туда не так прописал?

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 10:04 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
Может я что-то не туда не так прописал?

замените одинарные кавычки на двойные или экранируйте их как \' в

Цитата:
document.getElementById('out').click();

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 10:10 25-11-2020 | Исправлено: Mavrikii, 10:12 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, спасибо.
 
Страница теперь открывается, но работает все как прежде, то есть ссылка не открывается в новом окне, а открывается вместо прелендинга после окончания таймера. По сути как и до этого было.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 10:19 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
а открывается вместо прелендинга после окончания таймера

потому, что в  

Цитата:
window.location.href=location;

должно быть не location, а другая js переменная или сразу строка с нужным URL, я же писал об этом.

Цитата:
Страница теперь открывается

куда вставили
Цитата:
<a href='{url}' target='_blank' id='out'>ссылка</a>
?

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 10:32 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сейчас так.  
 
leech_out.php

Код:
{
    clearInterval(interval);
    document.getElementById("out").click();
    window.location.href="https://site.ru";
}

 
leech_teaser.html (прелендинг)

Код:
Ссылка будет доступна через: <br>
<a href="{url}" target="_blank" id="out">&rArr; {timer} &lArr;</a>

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 10:54 25-11-2020 | Исправлено: kodex77, 10:55 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
<a href="{url}" target="_blank" id="out">&rArr; {timer} &lArr;</a>

в таком виде нет смысла делать, так как можно кликнуть и перейти не дожидаясь )
можно перехватывать клик, не давая перейти. или спрятать ссылку или сделать точкой, или создавать ссылку когда проходит таймер и сразу на нее кликать (потребуется больше кода).
 
не знаю как делаете, но https://jsfiddle.net/568hoxdg/
подождите 5 секунд.

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 11:01 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, еще раз проверил сравнил код, все правильно.
Получается, код срабатывает, только опять всплывающее окно блокируется
 
 
Добавлено:
Может есть вариант как-то изменить код или на PHP может сделать, чтобы таких проблем не было?

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 11:25 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
как-то изменить код или на PHP может сделать, чтобы таких проблем не было?

PHP выполняется на сервере, он не создает новых окон.
 
я ссылку дал - там тоже перехватывает открытие?

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 19:45 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, в мобильной версии хром блокирует.
В веб версии файрфокс блокирует, хром пропускает.

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 19:55 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77
все браузеры пытаются с этим бороться, поэтому обход подразумевает переход на "темную сторону" )
всякие серые баннерные сети старательно ищут способы обхода браузерной защиты.
поэтому браузеры нормально реагируют на обычный клик, но стараются предотвратить программную возможность открытия нового окна.
типичный вариант - просьба посетителю разрешить попапы на сайте в настройках браузера.

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 20:24 25-11-2020 | Исправлено: Mavrikii, 20:25 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii, нашел вот такой код, очень похожий на ваш, говорят якобы работает.  
Не могли бы вы подсказать в чем отличие или просто разное написание кода?
 

Код:
<a href="http://google.com/" target="_blank" class="bob">2 links</a>
<script>
$('a.bob').on('click', function(e){
    window.location.href="http://yahoo.com"
});
</script>

 

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 20:58 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
Не могли бы вы подсказать в чем отличие

этот код требует клика мышкой по ссылке.
с автопереходом он не сработает.
 
но, в принципе, можете действительно предлагать кликать на ссылку. правда цеплять библиотеку jquery только ради этого..
 
то, что у вас написано, идентично

Код:
<a href="http://google.com/" target="_blank" onclick="window.location.href= 'http://yahoo.com'">2 links</a>

https://jsfiddle.net/x40pt7qn/

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 21:17 25-11-2020 | Исправлено: Mavrikii, 21:22 25-11-2020
kodex77



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
поэтому обход подразумевает переход на "темную сторону" )

А на счет этого у вас никаких мыслей/идей нет?

Всего записей: 196 | Зарегистр. 07-04-2012 | Отправлено: 21:19 25-11-2020 | Исправлено: kodex77, 21:19 25-11-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kodex77

Цитата:
А на счет этого у вас никаких мыслей/идей нет?

я не вижу смысла ими заниматься. потому, что это запросто прикроется с новой версией браузера и вам снова придется искать способы обхода.

Всего записей: 15100 | Зарегистр. 20-09-2014 | Отправлено: 21:20 25-11-2020
ManHunter



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
а самому-то не западло бесплатно помогать очередному деятелю в засерании интернета рекламой?

----------
"На любое мое движение ваша реакция предусмотрена,
В лучшем случае - равнодушие, в худшем случае - патология..." (C) Егор Летов

Всего записей: 3091 | Зарегистр. 20-03-2004 | Отправлено: 17:34 28-11-2020
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » Нужна помощь PHP специалистов


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru