[Взлом] Подпись на PHP

Тема в разделе "Статьи и Co", создана пользователем ASD, 19 авг 2007.

Статус темы:
Закрыта.
  1. ASD

    ASD Постоялец

    Регистр.:
    27 июл 2007
    Сообщения:
    59
    Симпатии:
    23
    Подпись на PHP

    Хоть и данный сабж не является глобальной темой но мне он очень был нужен и после нахождения данной статьи я ее выкладываю тут.

    Автор: nerezus

    Вступление
    ##########

    Итак, Вы, возможно, хотите сделать подпись, в которой кроме вашего изображения и данных
    будут ещё и данные из заголовка HTTP запроса, например ip, браузер, провайдер или ось
    смотрящего сей баннер.
    Сделать это достаточно просто. Для этого необходимо:
    -хостинг с поддержкой PHP и .htaccess;
    -своя картинка;
    -прямые руки.
    Для этого не потребуются (хотя и приветствуются) зание PHP и наличие мозга в черепной
    коробке.

    Своя картинка
    #############

    Рисуем картинку/лого/аватор. Только поаккуратнее, и оставляем свободное место для текста,
    который будет выводить скрипт. Сохраняем в формате png под именем "img.png".

    Скрипт
    ######

    В файле с именем "logo.png" сохраняем нижеследующее:
    CODE
    <?php
    Header("Content-type: image/png");
    $string="Your IP is $REMOTE_ADDR";
    $im = ImageCreateFromPng("img.png");
    $c = ImageColorAllocate($im, 225, 225, 225);
    ImageString($im,3,75,43, $string,$c);
    ImagePng($im);
    ImageDestroy($im);
    ?>


    Теперь объясняю:

    <?php
    Начало искрипта

    Header("Content-type: image/png");
    Это нужно для определения типа документа

    $string="Your IP is $REMOTE_ADDR";
    А это сам текст, который будет выводиться.
    Сюда можно записаль любую переменную из хэдеров. В моём случае это $REMOTE_ADDR.

    $im = ImageCreateFromPng("img.png");
    Создаем картинку средствами PHP: img.png - ваша нарисованная картинка, узнали?

    $c = ImageColorAllocate($im, 225, 225, 225);
    Собственно, цвет. Три цифры - RGB. Красная, зеленая и синяя составляющии.

    ImageString($im,3,75, 43, $string,$c);
    Собственно, пишем по картинке. Вторая переменная (3) - размер; третья (75) и
    четвертая (43) - расстояние от левого верхнего угла по горизонтали и вертикали,
    пятая ($string) - текст, шестая ($c) - цвет.

    ImagePng($im);
    Мы её выводим на экран.

    ImageDestroy($im);
    Ну теперь всё, уничтожаем, синтаксис требует =).

    ?>
    Конец скрипта


    Хостинг
    #######

    Наилучшим результатом цена/качество из мною известных хостингов отличается
    Фатал.ру[ http://www.fatal.ru ]
    Зарегистриуйтесь, войдите по FTP, создайте папку (например logo) и залейте туда
    два файла. Картинку и скрипт.
    Теперь чтобы файлы с расширением png обрабатывались не как картинки, а как скрипты
    php, мы должны его настроить. Создаем файл blabla.txt и вписываете в него строку:
    AddType application/x-httpd-php .png
    Тоже заливаем его на сервер. Теперь переименовываем его в ".htaccess".
    Он становится скрытым и больше не мешает.

    Заключение
    ##########

    Всё, скрипт готов. Можно размещать в качестве аваторов/подписей на форумах или
    делать с ним то, для чего вы его делали.
    Но тут у вас простор для творчества: скриптик этот может обрабатывать cookies,
    что поможет вам сделать что-то типа аваторки с бомбой, шнур которой будет уменьшаться.
    или показывать текущее время. Короче думайте и творите!


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

    Динамическая картинка в подписи. Часть 2.
    Делаем эксклюзивную "линейку".

    автор © salamander


    Данная статья является прямым продолжением и дополнением к статье nerezus'a — "Подпись на PHP". Если вы еще не читали ее, рекомендую это сделать.

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

    :: Предисловие

    Итак, в последнее время в интернете, особенно на форумах, получили распространение так называемые "линейки" — динамические картинки, изменяющиеся в зависимости от текущего времени и показывающие, скажем, количество лет, месяцев и дней от какой-либо даты... В основном это: "Я на форуме уже ....", "Живу в стране уже ...", "Женат уже ..." и т. д. Поставить себе такую линейку в подпись может каждый — благо, таких сервисов развелось немало. Посмотреть, что они нам предлагают, можно, например, здесь.

    НО! Хочется эксклюзива... =) Даже беглого взгляда на сайт хватит, чтобы понять, насколько местные линейки жлобские. А если учесть, что каждую из них уже юзает огромное количество людей, становится и вовсе стрёмно... Впрочем, за бесплатно вам ничего лучше не предложат. Поэтому единственный выход — действовать самому. Собственно, этому и посвящено следующее руководство.


    :: Что нам надо?

    Ко всему нужно подходить с пониманием, к творческой работе — тем более =) Перечислим то, что стоит приготовить, прежде чем приступать к работе.

    Графический редактор. В зависимости от сложности поставленной перед вами задачи, это может быть как MS Paint, так и Adobe Photoshop. Я все же склоняюсь к последнему...
    Текстовый редактор. Подойдет и "Блокнот", но при наличии навороченного кода ГОРАЗДО удобней писать и редактировать его в специализированных программах. Один из самых удобных продуктов для этой цели — прога Edit Plus.
    Хостинг. Картинку надо будет где-то поместить, поэтому позаботьтесь о наличии хоста с поддержкой PHP. Подойдет, например, hut.ru.
    Знания, умения и креативность. Основной пункт! Мы будем использовать язык PHP, следовательно, если вы никогда не писали сценариев на PHP, ознакомьтесь хотя бы с его синтаксисом — это может весьма облегчить вашу работу. Если же вы обладаете достаточным знанием языка, просто откройте какой-нибудь справочник по его функциям или же используйте официальный сайт php.net. Умению рисовать, хорошему вкусу, а также элементарной сообразительности, к сожалению, научиться тяжелее, поэтому придется довольствоваться тем, чем "наградил" Бог =)

    Подготовились? Читайте дальше.


    :: Поехали!

    Начнем с того, что определимся с идеей. Зачастую, оригинальный задум компенсирует не самое лучшее исполнение. Я, в свою очередь, не буду сверхоригинальным и буду описывать процесс на примере весьма заезженной темы "Я <там-то> уже <столько-то>", но с Веб-Хаковсксим дизайном =)

    Далее заготовим картинку, которая будет служить нам фоном. Размер — не более 400х80 пикселей. Назовем ее "bg.jpg". Оформление картинки — на ваше усмотрение. В моем примере (для простоты) это всего лишь кусок логотипа web-hack'a с главной страницы: фон. Как вы уже догадались, наша надпись разместится внизу картинки =)

    Теперь выберем шрифт, которым мы будем "писать". Где взять шрифты — не мне вам рассказывать =) Прощего всего заглянуть в папку "WINDOWS\Fonts" (если вы под Виндой) и скопировать оттуда в папку с картинкой нужный ttf-файл. Не хотите стандартных шрифтов? Гугл к вашим услугам!

    Создайте теперь файл index.php (потом поймете, почему именно "индекс") и откройте его в вашем любимом текстовом редакторе. Отсюда и начинается основная работа...


    :: Работа с датами и временем.

    В любом учебнике по PHP есть раздел с таким названием. Просмотрите его еще раз, так как мы будем активно использовать функции по работе с датами.

    Наша основная цель — правильно сформировать строку, выводимую на картинку. Допустим, мы хотим написать "Тусуюсь на Веб-Хаке уже X лет Y дней". Мы должны позаботиться не только о правильном подсчете количества дней, прошедших со дня регистрации, но и о правильном отображении слов: "год/года/лет", "день/дня/дней". Согласитесь, надпись "5 года и 103 дней" выглядит некрасиво... Начнем с первого, а дальше — дело техники ;-)

    Вот две основные функции, необходимые нам для построения правильной даты:

    string date(string $format [, int $timestamp])
    int strtotime(string $time [, int $timestamp])

    За подробным их описанием обратитесь в мануал =)

    Идея такая: в переменную $days пишем количество выводимых дней, в $years — лет, а в $out — уже полностью сформированную строку, готовую для вывода на экран. Алгоритмов получения этих значений — множество. Главное, чтобы считало правильно, а о простоте кода пока не беспокойтесь =)

    Полагаясь на вышенаписанное, может иметь место следующий код, написанный мной "на коленке":

    CODE

    $stamp=strtotime("30 September 2004"); //$timestamp даты, от который ведем отсчет (большое целое число)
    $start_day=date("z",$stamp); //Номер "стартового" дня в году начиная с 01.01 (1-365)
    $start_year=date("Y",$stamp); //"Стартовый" год

    $now_year=date("Y"); //Текущий год
    $now_day=date("z"); //Номер текущего дня в году

    $years=$now_year-$start_year; //Количество неполных лет, прошедших с точки отсчета
    if($now_day<$start_day) //Если годовщины в этом году еще не было, ...
    {
    if($years>0) $years--; //...отнимаем один год
    $days=365-$start_day+$now_day; //А тут попробуйте догадаться сами =)
    }
    else $days=$now_day-$start_day; //В противном случае считаем разность между текущим и "стартовым" днями


    Как видите, все просто... "Цифры" у нас уже есть в соответствующих переменных, поэтому перейдем к корректному выводу их на экран.


    :: Грамматика — наше всё =)

    Заведем еще две строковые переменные:
    $y — может принимать значения {"год", "года", "лет"}
    $d — может принимать значения {"день", "дня", "дней"}

    Пораскинув мозгами, мы понимаем, что $y должно принять значение:
    "год" — только тогда, когда в переменной $years записано любое (кроме 11) число, заканчивающееся на "1": "1 год", "31 год", "991 год" и т. д.
    "года" — только тогда, когда в переменной $years записано любое (кроме 12, 13, 14) число, заканчивающееся на "2", "3", "4": "2 года", "3 года", "104 года" и т. д.
    "лет" — в остальных случаях...

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

    CODE

    //годы
    $buf1=$years%10; $buf2=$years%100;
    if($buf1==2 || $buf1==3 || $buf1==4 && $buf2!=12 && $buf2!=13 && $buf2!=14) $y="года";
    elseif($buf1==1 && $buf2!=11) $y="год";
    else $y="лет";

    //дни
    $buf1=$days%10; $buf2=$days%100;
    if($buf1==2 || $buf1==3 || $buf1==4 && $buf2!=12 && $buf2!=13 && $buf2!=14) $d="дня";
    elseif($buf1==1 && $buf2!=11) $d="день";
    else $d="дней";

    Не буду объяснять каждую строку — он не настолько сложен, чтобы не понять его...

    Итак, мы имеем ВСЁ для того, чтобы сформировать корректную выходную строку $out!

    CODE

    $out="Тусуюсь на Веб-Хаке уже ";
    if($years) $out.=$years." ".$y." ";
    $out.=$days." ".$d;

    Осталось вывести это на картинку нужным шрифтом, нужного цвета и размера! Но есть еще одна проблема...


    :: Отображение кириллицы.

    Чтобы вывести русский текст таким, какой он есть, надо перекодировать его в Unicode-представление.
    Для этого, не мудрствуя лукаво, заюзаем функцию toUnicodeEntities($string cyr), написанную кем-то (не мной:(

    CODE

    function toUnicodeEntities($text, $from="w")
    {
    $text = convert_cyr_string($text, $from, "i");
    $uni = "";
    for ($i=0, $len=strlen($text); $i<$len; $i++)
    {
    $char = $text{$i};
    $code = ord($char);
    $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;
    }
    return $uni;
    }


    Теперь вместо написать($что-то) мы будем использовать написать(toUnicodeEntities($что-то)) и будем уверены, что текст отобразится правильно =) Впрочем, если текст набран только цифрами и латинскими буквами — конвертировать ничего не нужно...


    :: Работа с изображениями.

    Теперь мы точно на финишной прямой — осталось только сделать штамп печатью с заготовленным текстом в нужном месте =)
    Поскольку мы используем шрифты True Type, должны существовать специальные функции для работы с ними. Нам пригодится только одна из них:

    list imageTtfText(int $im, int $size, int $angle, int $x, int $y, int $col, string $fontfile, string $text)

    Мда, 8 параметров... Ну ничего, переживем. Вот что означает каждый из них:
    $im — наш рисунок.
    $size — размер шрифта.
    $angle — угол наклона шрифта (рекомендую юзать 0).
    ($x, $y) — координаты левого нижнего угла прямоугольника, в который вписывается текст.
    $col — цвет текста.
    $fontfile — ПОЛНЫЙ путь к ttf-файлу со шрифтом.
    $text — собственно, текст.

    Ну что ж... Последние штрихи:

    CODE

    $im=imageCreateFromJpeg("bg.jpg");
    $col=imageColorAllocate($im, 0, 160, 0);
    imageTtfText($im, 6, 0, 70, 52, $col, realpath("your_font.ttf"), toUnicodeEntities($out));
    Header("Content-type: image/gif");
    imageGif($im);


    Мы открыли наш фон, написали на нем строку $out зеленым цветом и вывели получившуюся картику на экран, сжав ее в *.gif.


    :: Размещение файлов на удаленном хосте.

    Готово! Заливаем это дело на сервер... Создайте папку с названием "ruler.gif" (теперь понятно, почему файл скрипта должен был называться index.php?) и в нее загрузите файлы "bg.jpg", "index.php" и "font.ttf" (font — название КОНКРЕТНОГО шрифта: Arial, Tahoma etc.)


    Теперь, написав у себя в подписи [img_]http://your_host/ruler.gif[/img_] вы увидите вашу картинку! Поэкспериментируйте со шрифтами, размерами, цветами — добейтесь наилучшего вида =) Ну и конечно же, никто не запрещает вам редактировать мой скрипт под свои условия, поскольку это только шаблон ;-)


    :: В завершение...

    Выкладываю пример ГОТОВОГО скрипта (вместе с фоном и файлом шрифта), результат работы которого вы можете посмотреть тут.


    Прошу заметить, что я выбрал простейший "Arial Black" — выбрав шрифт попонтовей, вы обеспечите более симпатичную картинку. Ну а если оригинально отфотошопить наш бэкграунд, результат окажется и вовсе на порядок интересней. Также вы можете переделать ЭТО под линейку в чистом виде: с указателем, бегающим по символическому отрезку с делениями, отвечающими за годы, месяцы или дни... Как это сделать? Юзайте другие функции по работе с графикой в PHP (см. мануал) и, что самое главное, ВАШУ ФАНТАЗИЮ! ;-)


    УДАЧИ!
     
    pslava, d1avol и yasa нравится это.
  2. Axi0Z

    Axi0Z Постоялец

    Регистр.:
    29 июл 2007
    Сообщения:
    104
    Симпатии:
    13
    Этот драный копипаст уже задрал. Ты хоть бы как-то красиво оформил текст.
     
  3. fuck_r1der

    fuck_r1der Читатель

    Заблокирован
    Регистр.:
    23 июл 2007
    Сообщения:
    77
    Симпатии:
    1
    блин лучшеб ты просто линки давал;)
     
  4. ASD

    ASD Постоялец

    Регистр.:
    27 июл 2007
    Сообщения:
    59
    Симпатии:
    23
    статья взята с вебхака,а откуда именно хз непомню,мне нужно было только узнать принцип генерации,думаю в этом то и ценность этой статьи.
    Тот кто решил замутить подписи на своем ресурсе найдет все необходимое.
     
  5. Cyon

    Cyon Постоялец

    Регистр.:
    20 июл 2007
    Сообщения:
    65
    Симпатии:
    5
    Да статья конечно зверски передернута, но важность ее отсается. Спасибо автору - давно искал нечто подобное... теперь буду творить.
     
  6. kalabro

    kalabro Постоялец

    Регистр.:
    11 авг 2007
    Сообщения:
    74
    Симпатии:
    6
    а мне так кажется что если у тебя есть доступ к FTP сайта и возможность творить с .htaccess, то можно для себя финтифлюшек накрутить и без кода php в .png (если конечно делать больше нечего). Если ты просто рядовой пользователь форума, тебе никто не даст FTP
     
  7. kalabro

    kalabro Постоялец

    Регистр.:
    11 авг 2007
    Сообщения:
    74
    Симпатии:
    6
    я на punBB своем попробовала, авик не идет, а в подписи идет 2ым способом.
     
  8. Axi0Z

    Axi0Z Постоялец

    Регистр.:
    29 июл 2007
    Сообщения:
    104
    Симпатии:
    13
    VB не принимает аватарку..
     
  9. DeadStudent

    DeadStudent Постоялец

    Регистр.:
    20 ноя 2006
    Сообщения:
    69
    Симпатии:
    6
    Вообще эта статья для подписей а не для аватаров))))
     
  10. yasa

    yasa Писатель

    Регистр.:
    1 май 2006
    Сообщения:
    9
    Симпатии:
    0
    Сохранил статейку... Про линейки было интересно почитать, давно думал откуда оно идет ...

    Вообще просто если копи-пейстом заниматься, то для приличия ссылку на первоисточник можно указать... А так спасибо!
     
Статус темы:
Закрыта.