Для отслеживания почтовых отправлений на сайте Почты России сделана специальная страничка. Когда вы ждете одну-две посылки, то можно воспользоваться ей. Для автоматического отслеживания нескольких посылок также есть специальные сервисы, они самостоятельно опрашивают сайт Почты и сохраняют полученные результаты у себя в базе. Но для отслеживания большого числа посылок, как правило, на подобных сервисах требуется переходить на платные тарифы. Когда я столкнулся с такой ситуацией, то вариант с оплатой, естественно, сразу же был отвергнут как неприемлемый. Проще было самому написать некое подобие такого сервиса, но заточенного под свои нужды. Вот что у меня получилось:
<?
// Массив с трек-номерами посылок
// заполняйте его по аналогии трек-номерами своих посылок
$codes=array('RA111111111CN', 'RA222222222CN', 'RA33333333CN');
// Массив с результатами отслеживания
$status=array();
$link='http://www.russianpost.ru/resp_engine.aspx?Path='.
'rp/servise/ru/home/postuslug/trackingpo';
foreach ($codes as $code) {
// Подготовка запроса cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $link);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'entryBarCode='.$code.
'&BarCode='.$code.'&searchsign=1');
// Отправка POST-запроса на сервер и получение страницы результата
$grab=curl_exec($ch);
if (eregi('value="([0-9]+)"',$grab,$pocket)) {
// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, $link);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'key='.$pocket[1]);
// загрузка страницы
$grab=curl_exec($ch);
// установка URL и других необходимых параметров
curl_setopt($ch, CURLOPT_URL, $link);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'entryBarCode='.$code.
'&BarCode='.$code.'&searchsign=1');
// загрузка страницы
$grab=curl_exec($ch);
}
// Фикс кодировки полученной страницы
$grab=mb_convert_encoding($grab, 'Windows-1251', 'UTF-8');
// Небольшой фикс для упрощения парсинга страницы
$grab=eregi_replace('<a href=javascript\:Wind\([^\(]*\)>','',$grab);
preg_match_all('/<tr align="center"><td>([^<]+)<\/td><td>([^<]+)'.
'<\/td><td>[^<]*<\/td><td>([^<]+)<\/td><td>([^<]*)<\/td>/',$grab,$matches);
$st=array();
$st['code']=$code;
// Если получен какой-то результат
if (count($matches[1])) {
// Последнее действие
if ($matches[4][count($matches[1])-1]) {
$st['action']=$matches[4][count($matches[1])-1];
}
else {
$st['action']=$matches[1][count($matches[1])-1];
}
// Дата последнего действия
$st['date']=$matches[2][count($matches[1])-1];
// Местонахождение посылки
$st['where']=$matches[3][count($matches[1])-1];
}
// Ошибка на сервере или статус посылки еще не определен
else {
$st['action']='Неизвестно';
$st['date']='--';
$st['where']='--';
}
// Записать результат в массив
$status[]=$st;
curl_close($ch);
}
// Теперь в массиве $status содержится информация по всем посылкам
var_dump($status);
?>
Настраивать скрипт очень легко. В массив $codes по аналогии добавляете трек-номера своих посылок. Поддерживаются коды Международной почты (Universal Post Union) и внутренние номера отслеживания почты России. После этого скрипт можно заливать на сервер. Хостинг, где будет размещен скрипт, должен поддерживать cURL и обращение к удаленным серверам, но даже на минимальных тарифах на платных хостингах обычно с этим никаких проблем нет. Единственное ограничение - время выполнения скрипта, при опросе статуса очень большого количества посылок он может отваливаться по лимиту времени, установленному на хостинговом сервере. На практике статусы двух десятков посылок опрашиваются около 10 секунд.
Данные, полученные в массиве $status вы можете обрабатывать как считаете нужным: вывести на экран, записать в базу, отправить себе на электронную почту и т.п. Хотя блокировки по IP и подобных санкций на сервере почтовой службы замечено не было, слишком часто грузить его запросами лучше не надо. Также имейте в виду, что иногда сервер Почты бывает недоступен. В этом варианте скрипта не предусмотрена обработка ошибок в этом случае, так что не забудьте добавить свои обработчики, если будете использовать его в проектах, где требуется максимальная корректность информации.