Ответы пользователя по тегу Электронная почта
  • Как парсить почту Украины?

    @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;
        }
    Ответ написан
    7 комментариев