Ne v kontakte Antisocial programmer's blog

Как не надо делать сайты автосерфинга или Получаем посетителей на халяву

Есть такая система обмена показами - asurf.net.ru. Идея заключается в том, что после того, как ты просмотришь (под чутким руководством их скриптов) N нужных сайтов, твой адрес заносится в этот список и те, кто будут добавлять свой сайт после вас будут вынуждены посмотреть ваш сайт. В итоге вы получите N просмотров. В целом система оказалась удачной, стала пользоваться популярностью и даже было запущено для аналогичных сервиса на других доменах. Особо замечательным свойством этой системы оказалось то, что она не требует ни регистрации, ни ввода какой бы то ни было капчи… Как вы думаете, какая мысль меня тут же посетила? Правильно, автоматизировать это дело и на халяву рубить посетителей. Ну а если еще и учесть, что на наиболее активно прокручиваемые в системе сайты вешаются сквозняки, в том числе со страничеко с PR5, то идея становится вообще крайне заманчивой. :) Ладно, автоматизировать, так автоматизировать. За пару минут я выяснил, что навигация осуществляется с помощью мета-тега в верхнем фрейме. В итоге выстроилась такая схема вызовов адресов:

0) http://asurf.net.ru/next.php?h=N&url=http://nevkontakte.org.ru
1) http://asurf.net.ru/nextN.php
...
N) http://asurf.net.ru/nextN.php
N+1) http://asurf.net.ru/save.php

N - это количество хитов, которое мы хотим получить. Система поддерживает значения N только 3, 5, 9, 15, 23. Как человек ленивый, я подумал, что пусть даже скриптом, но столько скачиваний делать как-то совсем не здорово. Не долго думая, я попробовал вместо 23 вызовов делать всего 3 и это, как ни странно, сработало! Чуть-чуть поэксперементировав я пришел к выводу, что системе пофигу, сколько раз я загружаю страницу http://asurf.net.ru/nextN.php. При чем настолько пофигу, что если я вызову http://asurf.net.ru/save.php сразу после http://asurf.net.ru/next.php?h=N&url=http://nevkon­tak­te.org.ru, то система все равно будет считать, что я честно посмотрел всю ту чушь, что полагается! B) Теперь дело осталось за малым. За пол-часа я наваял первую версию скрипта, который будет автоматом делать все необходимое.

<?php
/**
 * AClicker 1.1
 * Asurf.net.ru auto surfing script by Alek$
 * http://nevkontakte.org.ru
 */
/**
 * Запрещается модифицировать данный скрипт без разрешения автора.
 */
// Usage [hits] [site] [promos]

// Define log entries types
define('ST_INFO', "Information");
define('ST_WARN', "Warning");
define('ST_ERROR', "Error");

// Include curl http library
require_once("http.php");

// Init argv[]
if(empty($argv))
{
    $argv = explode('S', $_REQUEST['q']);
    array_unshift($argv, '');
}
// Obtain number of requires hits
$hits = array(3,5,9,15,23);
if(in_array($argv[1],$hits))
{
    $hits = $argv[1];
}
else
{
    $hits = 3;
    log_action('Invalid hit number! Assuming 3...', ST_WARN);
}

// Obtain which site promote
$site = array(
    'http://testsite'.rand(3000,30000).'.ru',
    'http://nevkontakte.org.ru',
);

if(isset($site[$argv[2]]))
{
    $site = $site[$argv[2]];
}
else
{
    $site = $site[0];
    log_action("Invalid site id! Assuming $site ...", ST_WARN);
}

// Obtain which promoter use
$promos = array(
    'all',
    'asurf.net.ru',
    'rpanel.in',
    'surf.rpanel.info',
);

if(isset($promos[$argv[3]]))
{
    $promo = $promos[$argv[3]];
}
else
{
    $promo = $promos[1];
    log_action("Invalid promoter id! Assuming $promo ...", ST_WARN);
}

if($promo == 'all')
{
    log_action("Starting multipromo request queue for $hits hits to $site");
    for($i = 1; $i < sizeof($promos); $i++)
    {
        $promo = $promo = $promos[$i];
        log_action("Starting request for $hits hits to $site at $promo");

        $curl = &new Curl_HTTP_Client();

        //pretend to be IE6 on windows
        $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        $curl->set_user_agent($useragent);

        $cookies_file = "./cookies.txt";
        fclose(fopen($cookies_file, 'w'));
        $curl->store_cookies($cookies_file);
        //if you want to send some post data
        //form post data array like this one
        $post_data = array(
            'h'     => $hits,
            'url'   => $site,
        );
        //and send request to http://www.foo.com/login.php. Result page is stored in $html_data string
        $html_data = $curl->send_post_data("http://$promo/next.php", $post_data);
        if(preg_match('##', $html_data))
        {
            $html_data = $curl->fetch_url("http://$promo/save.php");
            if(preg_match('##', $html_data))
            {
                log_action('Succeed');
            }
            else
            {
                echo $html_data;
                $html_data = str_replace("\n",'',$html_data);
                log_action("Error at step 2! Responce: $html_data", ST_ERROR);
            }
        }
        else
        {
            echo $html_data;
            $html_data = str_replace("\n",'',$html_data);
            log_action("Error at step 1! Responce: $html_data", ST_ERROR);
        }
    }
}
else
{
    log_action("Starting request for $hits hits to $site at $promo");

    $curl = &new Curl_HTTP_Client();

    //pretend to be IE6 on windows
    $useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
    $curl->set_user_agent($useragent);

    $cookies_file = "./cookies.txt";
    fclose(fopen($cookies_file, 'w'));
    $curl->store_cookies($cookies_file);
    //if you want to send some post data
    //form post data array like this one
    $post_data = array(
        'h'     => $hits,
        'url'   => $site,
    );
    //and send request to http://www.foo.com/login.php. Result page is stored in $html_data string
    $html_data = $curl->send_post_data("http://$promo/next.php", $post_data);
    if(preg_match('##', $html_data))
    {
        $html_data = $curl->fetch_url("http://$promo/save.php");
        if(preg_match('##', $html_data))
        {
            log_action('Succeed');
        }
        else
        {
            echo $html_data;
            $html_data = str_replace("\n",'',$html_data);
            log_action("Error at step 2! Responce: $html_data", ST_ERROR);
        }
    }
    else
    {
        echo $html_data;
        $html_data = str_replace("\n",'',$html_data);
        log_action("Error at step 1! Responce: $html_data", ST_ERROR);
    }
}

log_action();

function log_action($log = '', $status = ST_INFO, $display = true)
{
    static $aid;
    static $string = array();

    if(empty($log))
    {
        $out = implode('',$string);
        $fp = fopen(date('y-m-d').'.txt','a');
        fwrite($fp, $out);
        fclose($fp);
        return;
    }

    if(empty($aid))
    {
        $aid=number_format(microtime(true),5,'','');
    }
    $date = date('y-m-d H:M');
    $string[] = "$aid [$date] $status: $log\n";

    if($display)
        echo "$aid [$date] $status: $log\n";

}
?>

Read more →

FF3: На старт... Внимание...

The Official Download Day Time | Spread Firefox Сегодня в 10:00 PDT (Pacific Daylight Time) будет обубликован для скачивания релиз FF3. В Москве в это время будет 21:00, а у меня в Новосибирске - полночь :) Время, конечно, не самое удачное, но что поделаешь :)

Chmod на пальцах.

    unix     articles     chmod

Собственно, тема уже давно обсосана со всех сторон и любой неленивый человек с легкостью найдет всю нужную информацию, но… ХЗ, почему это “но” есть, но вопросы о правах доступа возникают с завидной регулярностью. Поэтому я попробую в тысячный раз изобрести велосипед и изложить основы прав доступа к файлам в *NIX системах, а так же некоторые неочевидные тонкости при работе с ними.

Часть первая. Какие существуют права доступа.

Существуют три основных разновидности прав доступа: чтение (r), запись (w) и выполнение(x). Первые два, думаю, никаких вопросов не вызывают. А вот последнее для людей, привыкших к Windows станет сюрпризом. Дело в том, что в NIX и Windows используются разные подходы к различению исполняемых (программ) и не исполняемых файлов (файлов данных). В Windows за это отвечают расширения файлов (exe, com, bat и некоторые другие воспринимаются как исполняемые, а все остальные - нет), а в NIX - право на выполнение файла. То есть для одного пользователя один и тот же файл может являться выполняемым, а для другого - нет. Это может быть очень полезно, если администратору необходимо запретить простым юзерам пользоваться какой-то программой, но в то же время самому иметь возможность пользоваться ею.

Каждый файл в *NIX имеет владельца - обычно это пользователь, который его создал, и группу владельцев - ею обычно становится основная группа владельца файла. Соответственно, права доступа к файлу задаются отдельно для владельца, группы и всех остальных пользователей, ни являющихся владельцами файла, ни входящими в группу владельцев.

Read more →

Лучшие бесплатные хостинги

Я не буду претендовать на 100% объективность, а лишь перечислю бесплатные хостинги, которые я считаю лучшими на данный момент.

EOMY.
Пожалуй, лучший среди русских хостингов. Быстрые сервера, отзывчивый администратор, развитая инфраструктура. Достоинства: нет рекламы (единственное требование - разместить небольшую кнопочку, которую, к слову, вы можете нарисовать сами под свой дизайн, со ссылкой на eomy и небольшую надпись “Бесплатный хостинг от EOMY.NET” и то, и другое вы можете разместить, как пожелаете, лишь бы их было видно), PHP5, до 10 БД MySQL, 300 МБ диска, до 10 паркованных доменов, cPanel, cron - все не перечислишь…

Из недостатков - не одобряются исходящие соединения и категорически запрещены всякие скрипты-демоны, но это, в принципе, понятно, требуется приглашение. Тут надо заметить отдельно, что любой стоящий проект код получит. Если вам пока не удалось доказать, что ваш сайт достоин этого, можно некоторое время перекантоваться на http://vagonchik.com/ , который является более доступной версией eomy и отличается лишь наличием рекламы, но этого вполен достаточно, чтобы дать начальный старт, а потом перебраться на eomy.

Internet Ob­ser­va­to­ry.
Неплохой русский бесплатных хостинг, предоставляет PHP+Mysql+200MB, для среднестатистического сайта этого более чем достаточно. По запросу могут дать дополнительное место/базу/поддомен или еще,ч то надо. При регистрации так же есть ценз, осуществляемый модераторами, выбранными из числа пользователей хостинга. Проекты, получившие после проверки модераторами оценку хотябы 4 из 5 получают хостинг и бесплатный домен в зоне RU. Недостатки: как уже говорил, есть отбор заявок на хостинг, малофункциональная самописная панель управления, не всегда быстрая реакция техподдержки, высокая загруженность серверов. Еще одна проблема - выкупить домен практически нереально, правда случаев, чтобы его отобрали просто так, как это бывало на других аналогичных хостингах, еще ни разу не было. Требуют размещение небольшого блока текстовой рекламы на главной.

Read more →

17 июня - Firefox Download Day

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

Don’t forget to be part of Firefox’s Download Day! Mark your calendar, wrap a ribbon around your finger or write a little sticky yellow note. Download Day will start on June 17, 2008. If you prefer to no longer receive emails from Mozilla concerning Download Day, you may un­sub­scribe [here](http://spread­fire­fox.com/en-US/worl­drecord/remove?code=XXXX) The sender of this email is Mozilla Cor­po­ra­tion, 1981 Landings Drive, Bldg.. K, Mountain View, CA 94043-0801.

Так что все ждем вторника :)