опрелеление текущего курса доллара и евро

<?php
/*
*Опрелеление текущего курса доллара и евро
*взято из книги "Головоломки на PHP для хакера
*10.09.07
*
*/
// Ссылка на XML-файл
$url = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=".date("d/m/Y");
// Загружаем файл
$content = file_get_contents($url);
// Регулярное выражение
$pattern = "|<valute id=\"([^\"]+)\">[\s]*<NumCode>([^<]+)</NumCode>[\s]*<CharCode>([^<]+)</CharCode>[\s]*<Nominal>([^<]+)</Nominal>[\s]*<Name>([^<]+)</Name>[\s]*<Value>([^<]+)</Value>[\s]*</Valute>|is";
preg_match_all($pattern, $content, $out);
for($i = 0; $i < count($out[1]); $i++)
{
    $out[6][$i] = str_replace(",",".",$out[6][$i]);
    if($out[3][$i] == "USD") echo "Доллар - ".sprintf("%3.2f",$out[6][$i]/$out[4][$i])."<br>";
    if($out[3][$i] == "EUR") echo "Евро - ".sprintf("%3.2f",$out[6][$i]/$out[4][$i])."<br>";
}
?>
10 сентября 2007, 16:59

получение страницы по https через socket

<?php
/*
*получение страницы по https через socket
*автор: disable
*09.09.07
*/

//хостинг должен поддерживать ssl соединение!

$sock = fsockopen("ssl://security.webmoney.ru", 443, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)\n");

fputs($sock, "GET /asp/default.asp HTTP/1.0\r\n");
fputs($sock, "Host: security.webmoney.ru\r\n");
fputs($sock, "Accept: */*\r\n");
fputs($sock, "\r\n");

$headers = "";

while ($str = trim(fgets($sock, 4096)))
$headers .= "$str\n";

$body = "";

while (!feof($sock))
$body.= fgets($sock, 4096);
fclose($sock);

echo '<div>'.$headers.'</div>';
echo '<div>'.$body.'<div>';

//как видим, отличий не много.

?>
9 сентября 2007, 12:31

выяснение адресов почтовых ретрансляторов

<?php  
/*
*Выяснение адресов почтовых ретрансляторов
*взято из книги
* "Головоломки на PHP для хакера
*07.09.07
*/

$email="example@mail.ru";

$host = strtok($email,'@');
getmxrr($host, $mxhostsarr, $weight);
echo "На $email письма могут отправляться через следующие хосты:<br />";
for ($i=0; $i < count($mxhostsarr); $i++)
{
    echo ("$mxhostsarr[$i] (приоритет: $weight[$i])<br />");
}
?>
7 сентября 2007, 19:28

получение письма по протоколу pop3

<?php
/*
*получение письма по протоколу pop3
*автор: disable
*07.09.07
*/

//задаем форматированный вывод, чтобы удобнее было читать ответы по строкам
echo '<pre>';

$login='example@mail.ru';
$pass='*******';

//подключаемся к серверу
$f=fsockopen('pop.mail.ru',110,$errno,$errstr,10);
if(!$f)
{
    die("Не удается подключиться к pop.mail.ru: [$errno] $errstr");
}

/*
*читаем статус ответа, он может быть либо +OK, либо -ERR
*/
echo $s=fgets($f);
if (strpos($s,'+OK')!==0) die('ошибка подключения');

//авторизируемся, для этого надо отправить имя пользователя
fwrite($f,"USER $login\r\n");

//отправляем пароль
fwrite($f,"PASS $pass\r\n");

echo $s=fgets($f);

/*
*если авторизация успешна, то сервер выбросит сколько писем в ящике,
*иначе будет ошибка авторизации
*/
echo $s=fgets($f);
if (strpos($s,'+OK')!==0) die('ошибка авторизации');

//для примера получим первое сообщение командой TOP 1 1000(если задать много строк, то возвратится все сообщение.
// Для получения сообщения целиком можно также воспользоваться командой RETR 1, в данном случаи, если сообщение короче 1000 строк это тоже самое) 
//сначала будут идти заголовки, потом пуcтая строка \r\n, потом само сообщение
//многострочные ответы почтовый сервер завершает строкой .\r\n

//посылка команды
fwrite($f,"TOP 1 1000\r\n");

$msg='';
$head='';

//чтение ответа
while (false!==($s=fgets($f)))
{
    //строка .\r\n данные закончились
    if ($s===".\r\n") break;

    //строка \r\n, заголовки закончились
    if ($s=="\r\n" && !$msg)
    $msg=' ';

    if (!$msg) $head.=$s;
    else $msg.=$s;
}

//выводим сообщение и заголовки
echo trim($head);
echo "\n\n---конец заголовков---\n\n";
echo trim($msg);

?>
7 сентября 2007, 19:08

pop3 авторизация

<?php
/*
*pop3 авторизация и получение информации о количесве писем в ящике
*автор: disable
*07.09.07
*/

$login='example@mail.ru';
$pass='*****';

//подключаемся к серверу
$f=fsockopen('pop.mail.ru',110,$errno,$errstr,10);
if(!$f)
{
    die("Не удается подключиться к pop.mail.ru: [$errno] $errstr");
}

/*
*читаем статус ответа, он может быть либо +OK, либо -ERR
*/
echo $s=fgets($f).'<br />';
if (strpos($s,'+OK')!==0) die('ошибка подключения');

//авторизируемся, для этого надо отправить имя пользователя
fwrite($f,"USER $login\r\n");

//отправляем пароль
fwrite($f,"PASS $pass\r\n");

echo $s=fgets($f).'<br />';

/*
*если авторизация успешна, то сервер выбросит сколько писем в ящике, 
*иначе будет ошибка авторизации
*/
echo $s=fgets($f).'<br />--<br />';
if (strpos($s,'+OK')!==0) die('ошибка авторизации');

//определим, сколько же у нас новых писем
preg_match('|maildrop has (\d+) messages \((\d+) octets\)|',$s,$num);
$messages=$num[1];
$octets=$num[2];

echo "в ящике писем: $messages<br />
общий размер: $octets байт";

?>
7 сентября 2007, 17:50

Функция перекодировки utf-8 в windows-1251

<?php
/*
*Функция перекодировки utf-8 -> windows-1251
*автор: PHPInside №8
*30.08.07
*/

function utf8win1251($s){
    $out = $c1 = "";
    $byte2=false;
    for ($c=0;$c<strlen($s);$c++){
        $i=ord($s[$c]);
        if ($i<=127) $out.=$s[$c];
        if ($byte2){
            $new_c2=($c1&3)*64+($i&63);
            $new_c1=($c1>>2)&5;
            $new_i=$new_c1*256+$new_c2;
            if ($new_i==1025){ $out_i=168; }
            else{
                if ($new_i==1105){
                    $out_i=184; }
                    else {
                        $out_i=$new_i-848;
                    }
            }
            $out.=chr($out_i);
            $byte2=false;
        }
        if (($i>>5)==6) {
            $c1=$i;
            $byte2=true;
        }
    }
    return $out;
}

//пример
echo utf8win1251('текст в utf-8');
?>
31 августа 2007, 12:29

Функция перекодировки windows-1251 в utf-8

<?php
/*
*Функция перекодировки windows-1251 -> utf-8
*автор: ?
*31.08.07
*/

function win2utf($str)
{
    static $table = array(
    "\xA8" => "\xD0\x81",
    "\xB8" => "\xD1\x91",
    "\xA1" => "\xD0\x8E",
    "\xA2" => "\xD1\x9E",
    "\xAA" => "\xD0\x84",
    "\xAF" => "\xD0\x87",
    "\xB2" => "\xD0\x86",
    "\xB3" => "\xD1\x96",
    "\xBA" => "\xD1\x94",
    "\xBF" => "\xD1\x97",
    "\x8C" => "\xD3\x90",
    "\x8D" => "\xD3\x96",
    "\x8E" => "\xD2\xAA",
    "\x8F" => "\xD3\xB2",
    "\x9C" => "\xD3\x91",
    "\x9D" => "\xD3\x97",
    "\x9E" => "\xD2\xAB",
    "\x9F" => "\xD3\xB3",
    );
    return preg_replace('#[\x80-\xFF]#se',
    ' "$0" >= "\xF0" ? "\xD1".chr(ord("$0")-0x70) :
                       ("$0" >= "\xC0" ? "\xD0".chr(ord("$0")-0x30) :
                        (isset($table["$0"]) ? $table["$0"] : "")
                       )',
    $str
    );
}

//пример
echo win2utf('тест в windows-1251');
?>
31 августа 2007, 12:29

загрузка нескольких файлов на сервер (upload)

<?php
/*
*Загрузка нескольких файлов на сервер (upload)
*автор: nc_soft
*29.08.07
*/

//соответственно состоит из формы и обработчика
if (isset($_FILES))
{
    foreach ($_FILES['file']['name'] as $k=>$v)
    {
        if (move_uploaded_file($_FILES['file']['tmp_name'][$k],'./'.$v))
        {
            echo 'файл загружен в папку скрипта, этот пример создан лишь для демонстративных целей, потому что
            он не проверяет сами файлы, а сохраняет их в том же виде, как и при отправке.<br />';
        }
    }
}

//ну и сама форма для загрузки, обратите внимание на name="file[]"
?>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input name="file[]" type="file" /><br />
<input name="file[]" type="file" /><br />
<input name="file[]" type="file" /><br />
<input type="submit" value="Upload" />
</form>
29 августа 2007, 01:14

GET запрос при помощи file_get_contents

<?php
/*
*GET запрос с посылкой http заголовков при помощи file_get_contents
*автор: nc_soft
*29.08.07
*/

/*задать необходимые заголовки можно в массиве http, для примера посланы 2 заголовка
User-Agent и Connection
*/

//заздаем контекст :)
$context = stream_context_create(
array(
        'http'=>array(
                        'header' => "User-Agent: Brauzer 2/0\r\nConnection: Close\r\n\r\n"
                     )
    )
);

$contents = file_get_contents("http://wen.ru", false ,$context);
echo $contents;
?>
28 августа 2007, 15:16

POST запрос при помощи file_get_contents

<?php
/*
*POST запрос при помощи file_get_contents
*автор: nc_soft
*29.08.07
*/

/*задать необходимые заголовки можно в массиве http, для примера посланы 2 заголовка
User-Agent и Connection
*/

//строка с POST данными
$data='a=1&b=2';

//задаем контекст
$context = stream_context_create(
array(
        'http'=>array(
                        'header' => "User-Agent: Brauzer 2/0\r\nConnection: Close\r\n\r\n",
                        'method' => 'POST',
                        'content' => $data                
                     )
    )
);

$contents = file_get_contents("http://wen.ru", false ,$context);
echo $contents;
?>
28 августа 2007, 15:16

upload файла на удаленный сервер через socket

<?php
/*
*Upload файла на удаленный сервер через socket
*автор: nc_soft
*28.08.07
*/

//генерация разделителя
$boundary = md5(time());

//отправляем файл (например example.jar )

//имя пересылаемого файла
$file_name = 'example.jar';

//MIME тип пересылаемого файла
$application = 'application/java-archive';

//запись в переменную
$bufer = file_get_contents('./example.jar');

$form_file_name = 'file1'; //это имя у поля формы <input type="file" name="******">

//формируем тело запроса
$post_str = '';
$post_str .= "--$boundary\r\n";
$post_str .= "Content-Disposition: form-data; name=\"$form_file_name\"; filename=\"$file_name\"\r\n";
$post_str .= "Content-Type: $application\r\n";
$post_str .= "Content-Transfer-Encoding: binary\r\n\r\n";
$post_str .= "$bufer\r\n";
$post_str .= "--$boundary--\r\n";


//сайт
$host = 'site.ru';

//обработчик формы
$path = 'handler.php';

//открываем сокет
$fp = @fsockopen("tcp://".$host, 80, $errno, $errstr, 10);
if (!$fp)
{
    die($errstr.':'.$errno);
}
else
{
    $header  = "POST $path HTTP/1.0\r\n";
    $header .= "Host: $host\r\n";
    
    //указываем что это пост данные с вложенным файлом
    $header .= "Content-Type: multipart/form-data; boundary=$boundary\r\n";
    $header .= "Content-Length: ".strlen($post_str)."\r\n\r\n";

    //посылаем данные
    fwrite($fp, $header.$post_str);

    $headers='';

    //читаем заголовки
    while ($str = trim(fgets($fp, 4096)))
    $headers .= "$str\n";

    $body='';

    //читаем ответ
    while (!feof($fp))
    $body.= fgets($fp, 4096);

    //закрываем сокет
    fclose($fp);
}

//выводим данные
echo $headers.'<hr/>'.$body;

?>
28 августа 2007, 12:16

upload файла на kmx.ru при помощи socket

<?php
/*
*Upload файла на kmx.ru через socket
*автор: nc_soft
*28.08.07
*/

/*для uploada нам потребуется изучить структуру форм и заголовки по адресу
http://wap.kmx.ru/upload
после изучения страницы можно заметить, что чтобы попасть на форму с аплоадом,
необходимо всего лишь послать такую куку
uploadkey=284891272; expires=Thu, 31-Dec-2009 21:00:00 GMT
(где цифры как вы правильно догадались это секретный ключ), далее изучаем саму форму и
приходим к выводу, что необходимо послать следующие данные:
dir (имя директории в которую сохранить)
file1 (первый файл)
file2 (второй файл) итд*/

//имя директории в которую грузим
$dir='/';

//имя пересылаемого файла
$file_name = 'example.jar';

//MIME тип пересылаемого файла
$application = 'application/java-archive';

//запись файла в переменную
$bufer = file_get_contents('./example.jar');

//имя поля формы для файла
$form_file_name = 'file1';

//генерация разделителя
$boundary = md5(time());

//формируем POST данные
$post_str = '';
$post_str .= "--$boundary\r\n";
$post_str .="Content-Disposition: form-data; name=\"dir\"\r\n\r\n"; 
$post_str .= "$dir\r\n";

//формируем отправку файла
$post_str .= "--$boundary\r\n";
$post_str .= "Content-Disposition: form-data; name=\"$form_file_name\"; filename=\"$file_name\"\r\n";
$post_str .= "Content-Type: $application\r\n";
$post_str .= "Content-Transfer-Encoding: binary\r\n\r\n";
$post_str .= "$bufer\r\n";
$post_str .= "--$boundary--\r\n";


//сайт
$host='wap.kmx.ru';

//обработчик формы
$path='/upload';

//открываем сокет
$fp = @fsockopen("tcp://".$host, 80, $errno, $errstr, 10);
if (!$fp)
{
    die($errstr.':'.$errno);
}
else
{
    $header  = "POST $path HTTP/1.0\r\n";
    $header .= "Host: $host\r\n";
    
    //подделываем  кукис
    $header .= "Cookie: uploadkey=284891272; expires=Thu, 31-Dec-2009 21:00:00 GMT\r\n";
    
    //указываем что это пост данные с вложенным файлом
    $header .= "Content-Type: multipart/form-data; boundary=$boundary\r\n";
    $header .= "Content-Length: ".strlen($post_str)."\r\n\r\n";

    //посылаем данные
    fwrite($fp, $header.$post_str);

    $headers='';

    //читаем заголовки
    while ($str = trim(fgets($fp, 4096)))
    $headers .= "$str\n";

    $body='';

    //читаем ответ
    while (!feof($fp))
    $body.= fgets($fp, 4096);

    //закрываем сокет
    fclose($fp);
}

//выводим данные
echo $headers.'<hr/>'.$body;

?>
28 августа 2007, 12:16

upload файла на kmx.ru при помощи CURL

<?php
/*
*Upload файла на kmx.ru при помощи CURL
*автор: nc_soft
*28.08.07
*/

/*подготовим данные для отправки
dir директория куда сохраняем
file1 файл1
file2 файл2 итд
*/

$params = array(
'dir'=>'/',
'file1' => '@z:/home/snippets/www/articles/http/example.jar'
);

/*обратите внимание, что путь к файлу необходимо указать абсолютный,
его можно сформировать и так $_SERVER['DOCUMENT_ROOT'].'/example.jar'
также необходимо поставить @ перед адресом файла
*/

//инициализируем сеанс cURL
$ch = curl_init();

//задаем адрес
curl_setopt ($ch, CURLOPT_URL, 'http://wap.kmx.ru/upload');

//устанавливаем кукис (если необходимо)
curl_setopt($ch,CURLOPT_COOKIE,'uploadkey=284891272; expires=Thu, 31-Dec-2009 21:00:00 GMT');

//указываем что это POST данные
curl_setopt ($ch, CURLOPT_POST, 1);

//отправляем POST запрос
curl_setopt ($ch, CURLOPT_POSTFIELDS, $params);

//выводим данные в переменную
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);

$buf = curl_exec($ch);

//закрываем CURL
curl_close($ch);

//выводим результат
echo $buf;
?>
28 августа 2007, 12:15

перекодировка из hex-unicode

<?php
/*
*перекодировка из hex-unicode
*автор: nc_soft
*28.08.07
*/

//в переменную s добавляется строка для перевода
//пара символов для теста:
$s='АБВ';

//регулярное выражение
$s=preg_replace_callback("|&#x(.{3});|is","unicode2win",$s);

//вывод обрабатываемой строки в кодировке виндовс-1251
echo $s;

//функция обратного вызова для обработки
function unicode2win($val)
{
    $val=hexdec($val[1]);
    if ($val==401) return "Ё";
    if ($val==451) return "ё";
    return chr($val-848);
}
?>
28 августа 2007, 07:39

создание таблицы в mysql

<?php
/*
*создание таблицы в БД
*автор: nc_soft
*25.08.07
*/

//подключаем файл конфигурации
require_once('mysql.php');

/*формируем запрос
*таблица будет состоять всего из 2 полей,
*(имя юзера и ключа)
*кодировку установим utf-8
*/

$q="CREATE TABLE `test_table` (
                        `id` INT(7) NOT NULL AUTO_INCREMENT,
                        `user` TINYTEXT NOT NULL,
                        PRIMARY KEY (`id`) ) TYPE=MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci; ";

//выполняем запрос
if (false==mysql_query($q))
{
    //в случаи ошибки выводим информацию
    die(mysql_error());
}
else 
{
    //если нет ошибки, то запрос прошел удачно
    echo 'ok';
}

?>
26 августа 2007, 02:38

подключение к сайту через proxy с использованием socket

<?php
/*
*подключение к сайту через прокси с использованием socket
*автор: nc_soft
*25.08.07
*/

//используем прокси
$proxy='165.228.130.10';

//порт для прокси
$port='3128';

//сайт
$host='wen.ru';

//запрашиваемая страница
$path='/';

//открываем сокет
$fp = fsockopen("tcp://".$proxy, $port, $errno, $errstr, 10);
if (!$fp)
{
    die("$errstr:$errno");
}
else
{
    //формируем заголовки
    $out  = "GET http://$host$path HTTP/1.0\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n";
    $out .= "\r\n";

    //отправляем запрос
    fwrite($fp, $out);

    //читаем ответ
    while (!feof($fp))
    {
        echo fgets($fp, 1024);
    }

    //закрываем сокет
    fclose($fp);
}

/*
на момент написания snippet этот проксик работал, обычно бесплатные прокси живут не долго, 
поэтому для теста надо найти рабочий
*/

?>
26 августа 2007, 02:17

подключение к сайту через proxy с использованием CURL

<?php
/*
*подключение к сайту через прокси с использованием  CURL
*автор: nc_soft
*25.08.07
*/

//сайт
$url='http://wen.ru';

//прокси
$proxy='165.228.130.10:3128';

//открываем сеанс
$ch = curl_init();

//устанавливаем прокси
curl_setopt($ch, CURLOPT_PROXY, $proxy);

curl_setopt($ch, CURLOPT_URL, $url);

//смотрим заголовки (ради интереса :) )
curl_setopt($ch, CURLOPT_HEADER, 1);

//выводим в переменную
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);

curl_close($ch);

//смотрим что получилось
echo $result;

/*
на момент написания snippet этот проксик работал, обычно бесплатные прокси живут не долго, 
поэтому для теста надо найти рабочий
*/

?>
26 августа 2007, 02:05

генерация случайного числа на картинке

<?php
/*
*Генерация случайного числа на картинке
*автор: nc_soft
*25.08.07
*/

$rand = mt_rand(10000,99999);  //случайное число

$img = "fone.jpg"; //фон (jpg файл) 90*68

$pic = imageCreateFromjpeg($img); //создаем картинку

$size = 24; //размер шрифта

$angle = rand (-10, 10); //угол поворота
$x = rand(-2,15); //смещение по оризонтали
$y = rand(35,60); //смещение по вертикали
$color = rand(1000,9999999); //случайный цвет 

$font = 'times'; //шрифт

ImageTTFtext($pic, $size, $angle , $x, $y, $color, $font, $rand);

/*
imagettftext(image, size, angle, x, y, col, fontfile, text)

Итак, size — размер шрифта текста в пикселях,
angle — угол наклона текста в градусах (0 — нормальный горизонтальный вывод слева направо, 90, к примеру — снизу вверх, и так далее по кругу против часовой стрелки).
Параметр fontfile — путь к самому .ttf файлу шрифта и, наконец, 
text — строка, представляющая выводимый текст,
функция предусматривает возможность переноса строк,
тоесть удобна для вывода именно текста. 
Для переноса нужно вставить последовательность символов \n\r (перенос строки и возврат каретки).
*/

//выдача
header('Content-type:image/jpeg');
imagejpeg($pic);
imagedestroy($pic);
?>
26 августа 2007, 01:36

подключение к mysql

<?php
/*
*Пример подключения к БД с установкой нужной кодировки
автор: nc_soft
*25.08.07
*/

$dblocation='localhost';
$dbname='имя базы';
$dbuser='имя юзера';
$dbpasswd='пароль';

//подключаемся
$dbcnx=mysql_connect($dblocation,$dbuser,$dbpasswd);

if (!$dbcnx)
die('база данных недоступна!');

//выбираем базу
mysql_select_db($dbname,$dbcnx);

//устанавливаем кодировку
mysql_unbuffered_query("SET `character_set_client` = 'utf8';"); 
mysql_unbuffered_query("SET `character_set_results` = 'utf8';");  
mysql_unbuffered_query("SET `collation_connection` = 'utf8_general_ci';");

/*
можно сохранить этот файл как mysql.php и подключать к файлам проекта, где требуется работа с БД
*/

?>
26 августа 2007, 00:13

email с любым обратным адресом

<?php
/*
*отправка письма с любым обратным адресом
*25.08.07
*/

if (!empty($_POST))
{
//От кого
$from=$_POST['from'];

//кому
$to=$_POST['to'];

//тема
$thm=$_POST['thm'];

//текст
$txt=$_POST['txt'];

//отправляем
mail($to,$thm,$txt,"From: <$from>\r\nContent-type:text/plain;charset=utf-8");

/*
*p.s Если внимательно рассмотреть заголовки в своем любимом почтовом клиенте, то такая подстава присекается довольно быстро
*/

header ('Location: '.$_SERVER['SCRIPT_NAME'].'?ok=1');
die();
}

if (isset($_GET['ok']))
echo '<p>письмо отправлено</p>';

//форма
?>
<form action="<?=$_SERVER['SCRIPT_NAME'];?>" method="post">
<p>
кому<br />
<input name="to" /><br />
от кого<br />
<input name="from" /><br />
тема<br />
<input name="thm" /><br />
текст<br />
<textarea name="txt" cols="20" rows="5"></textarea><br />
<input type="submit" value="отправить" />
</p>
</form>
26 августа 2007, 00:07