Blog. Just Blog

Скрипт для проверки местонахождения и статуса посылок

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Для отслеживания почтовых отправлений на сайте Почты России сделана специальная страничка. Когда вы ждете одну-две посылки, то можно воспользоваться ей. Для автоматического отслеживания нескольких посылок также есть специальные сервисы, они самостоятельно опрашивают сайт Почты и сохраняют полученные результаты у себя в базе. Но для отслеживания большого числа посылок, как правило, на подобных сервисах требуется переходить на платные тарифы. Когда я столкнулся с такой ситуацией, то вариант с оплатой, естественно, сразу же был отвергнут как неприемлемый. Проще было самому написать некое подобие такого сервиса, но заточенного под свои нужды. Вот что у меня получилось:
  1. <?
  2. // Массив с трек-номерами посылок
  3. // заполняйте его по аналогии трек-номерами своих посылок
  4. $codes=array('RA111111111CN''RA222222222CN''RA33333333CN');
  5.  
  6. // Массив с результатами отслеживания
  7. $status=array();
  8.  
  9. $link='http://www.russianpost.ru/resp_engine.aspx?Path='.
  10.       'rp/servise/ru/home/postuslug/trackingpo';
  11.  
  12. foreach ($codes as $code) {
  13.     // Подготовка запроса cURL
  14.     $ch curl_init();
  15.     curl_setopt($chCURLOPT_URL$link);
  16.     curl_setopt($chCURLOPT_HEADER0);
  17.     curl_setopt($chCURLOPT_POST1);
  18.     curl_setopt($chCURLOPT_RETURNTRANSFER1);
  19.     curl_setopt($chCURLOPT_POSTFIELDS'entryBarCode='.$code.
  20.                 '&BarCode='.$code.'&searchsign=1');
  21.  
  22.     // Отправка POST-запроса на сервер и получение страницы результата
  23.     $grab=curl_exec($ch);
  24.  
  25.     if (eregi('value="([0-9]+)"',$grab,$pocket)) {
  26.         // установка URL и других необходимых параметров
  27.         curl_setopt($chCURLOPT_URL$link);
  28.         curl_setopt($chCURLOPT_HEADER1);
  29.         curl_setopt($chCURLOPT_POST1);
  30.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  31.         curl_setopt($chCURLOPT_POSTFIELDS'key='.$pocket[1]);
  32.  
  33.         // загрузка страницы
  34.         $grab=curl_exec($ch);
  35.  
  36.         // установка URL и других необходимых параметров
  37.         curl_setopt($chCURLOPT_URL$link);
  38.         curl_setopt($chCURLOPT_HEADER1);
  39.         curl_setopt($chCURLOPT_POST1);
  40.         curl_setopt($chCURLOPT_RETURNTRANSFER1);
  41.         curl_setopt($chCURLOPT_POSTFIELDS'entryBarCode='.$code.
  42.                     '&BarCode='.$code.'&searchsign=1');
  43.  
  44.         // загрузка страницы
  45.         $grab=curl_exec($ch);
  46.     }
  47.  
  48.     // Фикс кодировки полученной страницы
  49.     $grab=mb_convert_encoding($grab'Windows-1251''UTF-8');
  50.  
  51.     // Небольшой фикс для упрощения парсинга страницы
  52.     $grab=eregi_replace('<a href=javascript\:Wind\([^\(]*\)>','',$grab);
  53.  
  54.     preg_match_all('/<tr align="center"><td>([^<]+)<\/td><td>([^<]+)'.
  55.       '<\/td><td>[^<]*<\/td><td>([^<]+)<\/td><td>([^<]*)<\/td>/',$grab,$matches);
  56.  
  57.     $st=array();
  58.     $st['code']=$code;
  59.     // Если получен какой-то результат
  60.     if (count($matches[1])) {
  61.         // Последнее действие
  62.         if ($matches[4][count($matches[1])-1]) {
  63.             $st['action']=$matches[4][count($matches[1])-1];
  64.         }
  65.         else {
  66.             $st['action']=$matches[1][count($matches[1])-1];
  67.         }
  68.         // Дата последнего действия
  69.         $st['date']=$matches[2][count($matches[1])-1];
  70.         // Местонахождение посылки
  71.         $st['where']=$matches[3][count($matches[1])-1];
  72.     }
  73.     // Ошибка на сервере или статус посылки еще не определен
  74.     else {
  75.         $st['action']='Неизвестно';
  76.         $st['date']='--';
  77.         $st['where']='--';
  78.     }
  79.  
  80.     // Записать результат в массив
  81.     $status[]=$st;
  82.  
  83.     curl_close($ch);
  84. }
  85. // Теперь в массиве $status содержится информация по всем посылкам
  86. var_dump($status);
  87. ?>
Настраивать скрипт очень легко. В массив $codes по аналогии добавляете трек-номера своих посылок. Поддерживаются коды Международной почты (Universal Post Union) и внутренние номера отслеживания почты России. После этого скрипт можно заливать на сервер. Хостинг, где будет размещен скрипт, должен поддерживать cURL и обращение к удаленным серверам, но даже на минимальных тарифах на платных хостингах обычно с этим никаких проблем нет. Единственное ограничение - время выполнения скрипта, при опросе статуса очень большого количества посылок он может отваливаться по лимиту времени, установленному на хостинговом сервере. На практике статусы двух десятков посылок опрашиваются около 10 секунд.

Данные, полученные в массиве $status вы можете обрабатывать как считаете нужным: вывести на экран, записать в базу, отправить себе на электронную почту и т.п. Хотя блокировки по IP и подобных санкций на сервере почтовой службы замечено не было, слишком часто грузить его запросами лучше не надо. Также имейте в виду, что иногда сервер Почты бывает недоступен. В этом варианте скрипта не предусмотрена обработка ошибок в этом случае, так что не забудьте добавить свои обработчики, если будете использовать его в проектах, где требуется максимальная корректность информации.

Поделиться ссылкой ВКонтакте
Просмотров: 10665 | Комментариев: 20

Метки: PHP
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (16.02.2013 в 18:21):
Плохо читал.
ЦитатаManHunter (05.12.2012 в 22:32)
"Зайди да посмотри, там уже месяц как капча висит."
Игорь (16.02.2013 в 18:16):
Комменты почитал - не помогло.
Это вообще непонятно: "все дальнейшие запросы можно выполнять старым скриптом, просто добавив там "www." в ссылку"
Какой скрипт старый, какой новый? В какую ссылку "www." добавлять?
Если в $link - то там www уже есть.
ManHunter (16.02.2013 в 18:05):
Еще один кандидат на бан? Глазки открой, камменты прочитай.
Игорь (16.02.2013 в 13:58):
У меня почему-то этот скрипт не работает. Для любых треков выдаёт
"action"]=> string(20) "Неизвестно" ["date"]=> string(2) "--" ["where"]=> string(2) "--"
artem (05.12.2012 в 22:54):
ManHunter, извени, не подскажешь как добавить капчу на страницу, т.е чтобы при вводе капчи выдавался результат массива...
ManHunter (05.12.2012 в 22:32):
Зайди да посмотри, там уже месяц как капча висит.
artem (05.12.2012 в 22:26):
Что-то не работает, при любом значении массивы выдает:
// Ошибка на сервере или статус посылки еще не определен
  else {
         $st['action']='Неизвестно';
         $st['date']='--';
         $st['where']='--';
       }
Опять почта что-то пофиксила? Или только у меня работает?
Forekk (18.10.2012 в 23:55):
Спасибо, очень помог код!
Alexander (09.09.2012 в 08:33):
Здравствуйте. Как избавить массив $status от лишней информации? Например $status['date'], у меня выдает: array(1) { [0]=> string(16) "01.07.2012 05:49" }, как оставить только одну дату?

$date=$st['date'];
$action=$st['action'];
$code=$st['code'];
$where=$st['where'];
   
curl_close($ch);
}

echo $action . " " . $where . " " . $date;

Сделал) Спасибо Вам за скрипт)
Илья (24.08.2012 в 19:21):
Спасибо большое!
Очень помог Ваш скрипт!
ManHunter (24.08.2012 в 14:37):
Не совсем так. При обращении к новому адресу чекера, все ip по дефолту находятся в черном списке. Поэтому первый раз в браузер возвращается форма с ключом-подтверждением и тут же самбитится. Это разблокирует ip, с которого шло обращение к сервису, и все дальнейшие запросы можно выполнять старым скриптом, просто добавив там "www." в ссылку. В случае с динамическим ip, наверное, блок подтверждения лучше оставить.

TrackChecker, кстати, до сих пор не обновился и не мониторит Порчу России. ГдеПосылка по внутренним трекам ожил только на второй день после восстановления работы сайта ПР. Это возвращаясь к вопросу о доверии, "куче сервисов" и "нечем заняться". Хочешь сделать хорошо - сделай это сам.
Mike (24.08.2012 в 14:33):
Гранд мерси! Я уже опустил руки, подумал что Почта России режет все POST запросы, которые пришли не от localhost-a.
ManHunter (23.08.2012 в 00:19):
Да, выложил исправленный вариант.
Илья (22.08.2012 в 21:09):
Добрый день!
К сожалению после 18 августа 2012 года скрипт перестал работать. Видимо на Почте России произошли изменения!
Юра (30.07.2012 в 08:21):
Спасибо, работает на ура, только функция eregi_replace уже считается устаревшей в php 5.3
заменил так:
// Вырезаем ссылки, оставляя текст
$grab = preg_replace('|<a.* href=(.*)>(.*)</a>|U', '\2', $grab);
Vlad (09.07.2012 в 19:36):
Для меня самая удобная, а главное бесплатная программа TrackChecker - огромное количество почтовых сервисов. + есть portable версия. Существует аналог под андроид и яблофон :)
http://www.trackchecker.info/
Вес около 1 мб. еще один плюс -обходит капчу на китай-сервере (ChinaPost) - только китайцы ответ иероглифами стали выдавать (приходится потом переводчиком пользоваться).

Но Manhunter привык доверять только своим программам :-)
huken do (21.06.2012 в 14:46):
вот вам реализация на ruby
для консоли http://pastebin.com/NZJW2wGV
Voffka (20.06.2012 в 18:12):
У меня один раз керамический нож начал трекатся на russianpost только после того как я его уже получил.
ManHunter (20.06.2012 в 15:20):
Voffka, вся эта "куча сервисов" работает точно так же, соответственно, результаты те же самые, только обернуты в красивый дизайн. А смс мне нафиг не нужны.
Voffka (20.06.2012 в 15:11):
Вот те заняться нечем, существует куча сервисов которые более правильно отслеживают посылки, а при небольшой доплале еще и смс высылают.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0043 сек.) / Память: 4.5 Mb
Наверх