Скрипт для проверки местонахождения и статуса посылок
Для отслеживания почтовых отправлений на сайте Почты России сделана специальная страничка. Когда вы ждете одну-две посылки, то можно воспользоваться ей. Для автоматического отслеживания нескольких посылок также есть специальные сервисы, они самостоятельно опрашивают сайт Почты и сохраняют полученные результаты у себя в базе. Но для отслеживания большого числа посылок, как правило, на подобных сервисах требуется переходить на платные тарифы. Когда я столкнулся с такой ситуацией, то вариант с оплатой, естественно, сразу же был отвергнут как неприемлемый. Проще было самому написать некое подобие такого сервиса, но заточенного под свои нужды. Вот что у меня получилось:Code (PHP) : Убрать нумерацию
- <?
- // Массив с трек-номерами посылок
- // заполняйте его по аналогии трек-номерами своих посылок
- $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);
- ?>
Данные, полученные в массиве $status вы можете обрабатывать как считаете нужным: вывести на экран, записать в базу, отправить себе на электронную почту и т.п. Хотя блокировки по IP и подобных санкций на сервере почтовой службы замечено не было, слишком часто грузить его запросами лучше не надо. Также имейте в виду, что иногда сервер Почты бывает недоступен. В этом варианте скрипта не предусмотрена обработка ошибок в этом случае, так что не забудьте добавить свои обработчики, если будете использовать его в проектах, где требуется максимальная корректность информации.
Просмотров: 10665 | Комментариев: 20
Метки: PHP
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(16.02.2013 в 18:21):
Плохо читал.
Игорь
(16.02.2013 в 18:16):
Комменты почитал - не помогло.
Это вообще непонятно: "все дальнейшие запросы можно выполнять старым скриптом, просто добавив там "www." в ссылку"
Какой скрипт старый, какой новый? В какую ссылку "www." добавлять?
Если в $link - то там www уже есть.
Это вообще непонятно: "все дальнейшие запросы можно выполнять старым скриптом, просто добавив там "www." в ссылку"
Какой скрипт старый, какой новый? В какую ссылку "www." добавлять?
Если в $link - то там www уже есть.
ManHunter
(16.02.2013 в 18:05):
Еще один кандидат на бан? Глазки открой, камменты прочитай.
Игорь
(16.02.2013 в 13:58):
У меня почему-то этот скрипт не работает. Для любых треков выдаёт
"action"]=> string(20) "Неизвестно" ["date"]=> string(2) "--" ["where"]=> string(2) "--"
"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']='--';
}
Опять почта что-то пофиксила? Или только у меня работает?
// Ошибка на сервере или статус посылки еще не определен
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;
Сделал) Спасибо Вам за скрипт)
$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, кстати, до сих пор не обновился и не мониторит Порчу России. ГдеПосылка по внутренним трекам ожил только на второй день после восстановления работы сайта ПР. Это возвращаясь к вопросу о доверии, "куче сервисов" и "нечем заняться". Хочешь сделать хорошо - сделай это сам.
TrackChecker, кстати, до сих пор не обновился и не мониторит Порчу России. ГдеПосылка по внутренним трекам ожил только на второй день после восстановления работы сайта ПР. Это возвращаясь к вопросу о доверии, "куче сервисов" и "нечем заняться". Хочешь сделать хорошо - сделай это сам.
Mike
(24.08.2012 в 14:33):
Гранд мерси! Я уже опустил руки, подумал что Почта России режет все POST запросы, которые пришли не от localhost-a.
ManHunter
(23.08.2012 в 00:19):
Да, выложил исправленный вариант.
Илья
(22.08.2012 в 21:09):
Добрый день!
К сожалению после 18 августа 2012 года скрипт перестал работать. Видимо на Почте России произошли изменения!
К сожалению после 18 августа 2012 года скрипт перестал работать. Видимо на Почте России произошли изменения!
Юра
(30.07.2012 в 08:21):
Спасибо, работает на ура, только функция eregi_replace уже считается устаревшей в php 5.3
заменил так:
// Вырезаем ссылки, оставляя текст
$grab = preg_replace('|<a.* href=(.*)>(.*)</a>|U', '\2', $grab);
заменил так:
// Вырезаем ссылки, оставляя текст
$grab = preg_replace('|<a.* href=(.*)>(.*)</a>|U', '\2', $grab);
Vlad
(09.07.2012 в 19:36):
Для меня самая удобная, а главное бесплатная программа TrackChecker - огромное количество почтовых сервисов. + есть portable версия. Существует аналог под андроид и яблофон :)
http://www.trackchecker.info/
Вес около 1 мб. еще один плюс -обходит капчу на китай-сервере (ChinaPost) - только китайцы ответ иероглифами стали выдавать (приходится потом переводчиком пользоваться).
Но Manhunter привык доверять только своим программам :-)
http://www.trackchecker.info/
Вес около 1 мб. еще один плюс -обходит капчу на китай-сервере (ChinaPost) - только китайцы ответ иероглифами стали выдавать (приходится потом переводчиком пользоваться).
Но Manhunter привык доверять только своим программам :-)
huken do
(21.06.2012 в 14:46):
вот вам реализация на ruby
для консоли http://pastebin.com/NZJW2wGV
для консоли http://pastebin.com/NZJW2wGV
Voffka
(20.06.2012 в 18:12):
У меня один раз керамический нож начал трекатся на russianpost только после того как я его уже получил.
ManHunter
(20.06.2012 в 15:20):
Voffka, вся эта "куча сервисов" работает точно так же, соответственно, результаты те же самые, только обернуты в красивый дизайн. А смс мне нафиг не нужны.
Voffka
(20.06.2012 в 15:11):
Вот те заняться нечем, существует куча сервисов которые более правильно отслеживают посылки, а при небольшой доплале еще и смс высылают.
Добавить комментарий
Заполните форму для добавления комментария