Задать вопрос

Как парсить почту Украины?

Добрый день, до недавнего времени посылал гет запрос на ip адрес (к сожалению так не могу сказать на какой, код на другом компьютере) с указанием трэк номера, на выходе загружалась страничка с текущим местоположением посылки, эту страничку парсил и заносил нужные данные в систему.
Недавно обнаружил что данный метод не работает и редиректит на эту страничку. А как её разобрать не понимаю (в POST запросе много непонятных данных, состояние посылки появляется после 3х внутренних переходов, судя по FireBug).
Может у них есть адекватное API? Или кто подскажет как такие запросы делать?
Если что не понятно, уточняйте пожалуйста.
  • Вопрос задан
  • 3566 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@sashok1337
Недавно на своём личном трекере посылок тоже обнаружил эту проблему. Там теперь используется какая-то хитрая система с редиректами.

В итоге решил проще - там есть отслеживание треков из файла (до 200т шт). Я эмулирую отправку файла, в который записываю все треки, и потом парсером вытягиваю из таблицу нужные значения.

Вот код (php, YII):
protected static $apiURL = 'http://services.ukrposhta.com/barcodestatistic/Default.aspx';

    public static function updateTrackingInfo($sendEmail = false) {
        Yii::import('application.lib.simpleHtmlDom.*');

        $packages = Tracking::model()->findAll();
        if (empty($packages)) {
            return;
        }

        $ttns = array();
        $ttnsObj = array();
        foreach ($packages as $package) {
            $ttns[] = $package->tr_num;
            $ttnsObj[$package->tr_num] = $package;
        }

        $result = self::uploadTTNs($ttns);
        
        if(empty($result)){
          return;
        }
        
        $html = new simple_html_dom();
        $html->load($result);
        $rows = $html->find('#ctl00_centerContent_ListBarcodes tr');
        foreach ($rows as $row) {
            $trackNum = trim($row->find('td', 0)->plaintext);
            $package = $ttnsObj[$trackNum];
            if (!empty($trackNum) && !empty($package)) {
                $status = trim($row->find('td', 3)->plaintext);

                if ($status !== $package->last_status) {
                    $package->last_status = $status;
                    $package->last_update = time();
                    $package->notified = 0;
                }
                
                $package->save();
            }
        }        
    }

    public static function uploadTTNs($ttns) {
        if (0 === count($ttns))
            return FALSE;

        $fields = array(
            '__VIEWSTATE' => array(
                'content' => ''
            ),
            'ctl00$centerContent$btnUpload' => array(
                'content' => 'Пошук'
            ),
            'ctl00$centerContent$fileUploadXmlBarcodes' => array(
                'filename' => 'ttn.txt',
                'type' => 'text/plain',
                'content' => implode("\r\n", $ttns)
            ),
        );

        $data = '';
        $delimiter = '-------------' . uniqid();

        foreach ($fields as $name => $field) {
            $data .= "--" . $delimiter . "\r\n";

            $data .= 'Content-Disposition: form-data; name="' . $name . '"';

            if (!empty($field['filename'])) {
                $data.= '; filename="' . $field['filename'] . '"' . "\r\n";
                $data .= 'Content-Type: ' . $field['type'];
            }
            $data .= "\r\n\r\n";

            $data .= $field['content'] . "\r\n";
        }
        $data .= "--" . $delimiter . "--\r\n";

        $handle = curl_init(self::$apiURL);

        $options = array(
            CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => $data,
            CURLOPT_HTTPHEADER => array(
                'Content-Type: multipart/form-data; boundary=' . $delimiter,
                'Content-Length: ' . strlen($data))
        );
        curl_setopt_array($handle, $options);

        $result = curl_exec($handle);
        curl_close($handle);

        return $result;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dm4k
А вам, для сервиса своего, или для себя?
Почему бы не использовать существующие сервисы?
Я например пользуюсь вот этим: post-tracker.ru
кстати, в новостях трекера:
16.11.2013
Исправлен парсер Почты Украины

Вероятно о том же ;)
Можете попробовать к разработчику за советом обратиться, может человек адекватный окажется)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы