Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы (http://www.flasher.ru/forum/forumdisplay.php?f=10)
-   -   Проверка наличия плеера без использования JavaScript :) (http://www.flasher.ru/forum/showthread.php?t=32334)

[subway]design 29.05.2002 19:17

Проверка наличия плеера без использования JavaScript :)
 

Привет!

Итак, "пособие по обнаружению плеера у пользователя и выдаче ему флеш или хтмл версии документа":

1) Надо выяснить, есть ли у пользователя флеш.
2) Если есть, то какой? Вдруг у нас еще пупер-версия-MХ приготовлена.
3) Еще хочется следить за сеансом/сессией пользователя чтобы не проводить проверку на каждой странице.

Я расскажу только об определении плагина - второй пункт остается на домашнее задание.

Инвентарь, который нам потребуется:

1) PHP
2) Flash 5/MX
3) Блокнот

Что бы все работало нам нужны три файла: dfp_redirect.php, dfp_register.php и dfp_ini.php (нужен для объявления общих переменных).
Первый файл должен вставляться в каждую страницу сайта с помощью функции include(), и ОБЯЗАТЕЛЬНО поверх всей поступающей в броузер информации, например так:
---------------------------
somefile.php
---------------------------
<?
include("http://www.somehost.ru/dfp_redirect.php");
//...
include("http://www.somehost.ru/some_top_design.php");
//...
?>
<body>

...

---------------------------

Если include() Редиректа будет осуществлен где-то "между" данными, то куки работать НЕ БУДУТ!
Файл-регистратор будет существовать отдельно и не содержать в себе ничего кроме php-кода.

План действий таков:

1) Человек заходит на сайт
2) Файл-редирект уличает его в том, что у посетителя нет сессии или нет куки и его "статус" неизвестен.
3) Файл-редирект посылает его на Индекс с параметром from откуда пришел посетитель:

Например:
Посетитель набрал в броузере www.somehost.ru/mycop/docs/tutorial.php, файл-редирект перенаправил его на http://www.somehost.ru/index.php?dfp...s/tutorial.php
Строка /mycop/docs/tutorial.php берется из переменной $REQUEST_URI.

4) Файл-регистратор выплевывает хтмл и флеш, которые редиректят на тот же файл-регистратор, только с дополнительными параметрами. Пишется хтмл код со следующими мета-указаниями:

<META HTTP-EQUIV="refresh" CONTENT="4; URL=http://www.somehost.ru/директория/dfp_register.php?dfp_from=/mycop/docs/tutorial.php&dfp_flash=no">

Ниже пишется хтмл-код для ролика, c параметрами dfp_from, dfp_host и dfp_dir. Т.е. путь к ролику записывается так: some/dir/check_flash.swf?dfp_from=/mycop/docs/tutorial.php&dfp_host=имя_хоста&dfp_dir=имя_директории
Имя ролика - dfp.swf, и он должен лежать в той же директории, что и скрипты register.php и redirect.php.
В ролике есть один-единственный кадр со строкой:


getURL(dfp_host+"/"+dfp_dir+"/dfp_register.php?dfp_from="+from+"&dfp_flash=yes");



5) В файле-регистраторе стоит проверка на присутствие переменной $dfp_flash - если ее нет или она не равна ни no, ни yes, то пишется указанный выше хтмл; если же она валидна, то создается кука (cookie) сроком на неделю, в которой содержится переменная dfp_flash, равная no или yes. Также создается сессия и сессионная переменная dfp_flash_s=yes/no, на случай отключенных кук - пусть посетитель хоть во время сеанса не будет каждый раз подвергаться проверке. Другое имя переменной требуется для разделения переменных сессии и кук.
6) Посетитель отсылается обратно на документ, хранящийся в переменной $dfp_from, где проверяется еще раз скриптом-редиректом, который видит куку, перезаписывает ее, если надо (удлинняя ее срок), и, в зависимости от значения кукиной переменной dfp_flash выдает ему соответствующие данные.

Вот весь план. В нем есть несколько некрасивых моментов, на которых я должен заострить внимание:

1) Если у посетителя нет плеера, то он ждет 4 секунды до редиректа.
2) Если ролик не загрузился за 4 секунды, то броузер его направляет по "хтмл-пути", но, с другой стороны, зачем пихать посетителю флешки, которые так тормознуто грузятся?
3) Если у посетителя такой древний броузер, что тот не поддерживает META HTTP-EQUIV, то это посетитель никогда не сможет проникнуть на сайт. Но таких посетителей единицы.

Я надеюсь, что Вы полностью поняли идею, поэтому приведу совсем простенький исходный код, который легко переделать "под себя".
Код:

------------------------------------------------------------
dfp_ini.php:
------------------------------------------------------------
<?
        Префикс dfp_ используется для того, чтобы имена переменных, участвующих в идентификации не совпадали с другими именами переменных страницы.
        //
        //
        // Переменные-параметры, которые настраиваются хозяином скрипта:
        //
        //
        $dfp_cookie_num_days_no_flash=7;    //Сколько дней хранить куку, если плеера нет.
                                                // Лучше срок покороче, чтобы посетитель, приобретя плагин, смог его применить в деле.
        $dfp_cookie_num_days_have_flash=30; //Сколько дней хранить куку, если плеер есть.
                                                // Чем дольше, тем лучше. Посетитель может избавиться от плеера, сменив броузер (но в новом броузере тех кук не будет) или (*) отключив activeX.
       
        $dfp_meta_refresh=4; // Время до обновления страницы с помощью тега <META>                                       
        $dfp_rewrite=1;  // Перезаписывать ли куку (продлевать ее срок), или ждать истечения срока, а потом проверять?
                        // Поставьте ноль, если боитесь пункта - (*)
                       
        $dfp_host="http://www.somehost.ru"; // Имя вашего сервера (без завершающего слэша!)
        $dfp_dir="dfp/scripts"; // Директория для скриптов. Без слэшей в начале и в конце! Если директория корневая, то поставьте $dfp_dir="";

?>

Код:

------------------------------------------------------------
dfp_redirect.php:
------------------------------------------------------------
<?

        require("dfp_ini.php");       
       
        $dfp_user_status=0;
       
               
        // Проверка наличия куки.
       
        if(isset($dfp_flash)){
                $dfp_user_status=1;  // Кука есть, значит "статус" посетителя известен.
                if($dfp_rewrite>0){  // Если куки надо перезаписывать, перезаписываем.
                                        // Если в куке лежит не "yes", а что-то другое (может посетитель "поправил" куку), то пишем "no".
                        if($dfp_flash=="yes"){
                                $dfp_cookie_set=setcookie("dfp_flash","yes",time()+3600*24*$dfp_cookie_num_days_have_flash);
                        }else{
                                $dfp_cookie_set=setcookie("dfp_flash","no",time()+3600*24*$dfp_cookie_num_days_no_flash);
                        }
                }
        }
       
       
       
       
        // Если существует сессия, то статус посетителя известен.
       
        if(session_is_registered('dfp_flash_s')){
                $dfp_user_status=2;
        }
       
       
       
       
        if($dfp_user_status==1){
                $dfp_detected=$dfp_flash;
        }elseif($dfp_user_status==2){
                $dfp_detected=$dfp_flash_s;               
        }else{
                // Если статус неизвестен, то посылаем посетителя.       
                $dfp_redirect="Location: $dfp_host/$dfp_dir/dfp_register.php?dfp_from="+$REQUEST_URI;
                header($dfp_redirect);
        }

        // Потом во "внешнем" скрипте можно использовать переменную $dfp_detected, не задумываясь о ее происхождении.
?>

Код:

------------------------------------------------------------
dfp_register.php:
------------------------------------------------------------
<?
        require("dfp_ini.php");
       
       
        // "Защита от дураков":
       
        if(session_is_registered('dfp_flash_s')){
                header("Location: $dfp_host/");
        }
       
               
       
        if(!$dfp_flash){
                print "<html><head><title>Detecting Flash Player...</title>
                <META HTTP-EQUIV=\"refresh\" CONTENT=\"$dfp_meta_refresh; URL=$dfp_host/$dfp_dir/dfp_register.php?dfp_from=$dfp_from&dfp_flash=no\">
                </head><body>
                <OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"><PARAM NAME=movie VALUE=\"$dfp_host/$dfp_dir/dfp.swf?dfp_host=$dfp_host&dfp_dir=$dfp_dir&dfp_from=$dfp_from\">
                <EMBED src=\"$dfp_host/$dfp_dir/dfp.swf?dfp_host=$dfp_host&dfp_dir=$dfp_dir&dfp_from=$dfp_from\" TYPE="application/x-shockwave-flash" ></EMBED>
                </OBJECT></body></html>";
        }else{
                               
                if($dfp_flash=="yes"){
                        $dfp_cookie_set=setcookie("dfp_flash","yes",time()+3600*24*$dfp_cookie_num_days_have_flash);
                        session_register('dfp_flash_s');       
                        dfp_flash_s="yes";
                }else{
                        $dfp_cookie_set=setcookie("dfp_flash","no",time()+3600*24*$dfp_cookie_num_days_no_flash);
                        session_register('dfp_flash_s');
                        dfp_flash_s="no";       
                }
                header("Location: $dfp_host$dfp_from");
        }
       




?>


Junge 29.05.2002 23:53

во всех бродилках пашет ?

lexass 30.05.2002 10:19

2 Junge
при наличии поддержки куков :)

[subway]design 30.05.2002 10:23

Цитата:

Если у посетителя такой древний броузер, что тот не поддерживает META HTTP-EQUIV, то это посетитель никогда не сможет проникнуть на сайт. Но таких посетителей единицы.
Цитата:

Также создается сессия и сессионная переменная dfp_flash_s=yes/no, на случай отключенных кук - пусть посетитель хоть во время сеанса не будет каждый раз подвергаться проверке.
Внимательней читать надо :)

зы: только в туториале сказано, что куки на неделю, хотя все настраивается (см. dfp_ini.php)

[subway]design 30.05.2002 18:03

Кстати, чтобы выяснить какой у пользователя плеер (МХ или 5) достаточно продлить выполение getURL() у пятерочного ролика секунды на две, а второй ролик сделать таким же, только с компрессией кода и getURL() должен выполняться сразу же после загрузки. Если у пользователя пятый плеер, то после загрузки компрессированного ролика тот ничего не поймет и редиректится только через 2 секунды через пятерочную версию.

SPV 30.05.2002 18:30

Цитата:

Также создается сессия и сессионная переменная dfp_flash_s=yes/no, на случай отключенных кук - пусть посетитель хоть во время сеанса не будет каждый раз подвергаться проверке.
О какой сессии идёт речь при отключеных куках?

[subway]design 30.05.2002 22:07

Мне казалось, что при отключенных куках инфа о сессии хранится в части url, в переменной PHP_SESS_ID (название точно не помню)... Или это не так :confused:


Часовой пояс GMT +4, время: 11:15.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.