как сделать парсер почты?

Тема в разделе "Как сделать...", создана пользователем Дмитрий Кесаев, 2 май 2012.

Статус темы:
Закрыта.
  1. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.265
    Почта находится на домене mail.com
    нужно спарсить только одну строку, красным выделил
    PHP:
    <title>
          
    Mail.com Почтовый ящик
          
    (1)
        </
    title>
    [​IMG]

    Авторизация не проходит - если запускать обычный парсер (а-ля yandex.ru)

    Редиректит автоматом на http://web.mail.com/message_box/folders/SU5CT1g=?first_view=true#.671902-header-login1-1

    вход: http://mail.com
    логин: skatina@usa.com
    пасс: skatina123456
    НИД ХЕЛП:thenks:
     
  2. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.265
    PHP:
    <?php
    // выдернул снифером http://web.mail.com/login?user[email]=@mail&user[password]=7ytJdqcxThScB-3vC8CQixND2PDUcA
    $url "http://service.mail.com/login.html#.671918-header-login1-1"//УРЛ, куда отправлять данные
    $login 'skatina@usa.com'//Логин
    $password 'skatina123456'//Пароль
    $user_cookie_file $_SERVER['DOCUMENT_ROOT'].'/555/cookies.txt'//Полный путь до файла, где будем хранить куки
    $idkey '3121235564020nVDfxvth2'//Хрен знает что
    $rdirurl 'http://www.mail.com/ru/'//Откуда мы пришли на страницу авторизации
    $timestamp ''//Хрен знает что
    $In 'Вход'//Кнопка входа
    function auth($url) {
    global 
    $user_cookie_file$idkey$rdirurl$timestamp$login$password$In// Получаем все POST данные
    $ch curl_init($url);
    curl_setopt($chCURLOPT_URL,$url);
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
    curl_setopt($chCURLOPT_COOKIEFILE$user_cookie_file); //Куки раз
    curl_setopt($chCURLOPT_COOKIEJAR$user_cookie_file); //Куки два
    curl_setopt($chCURLOPT_POST,1); //Будем отправлять POST запрос
    curl_setopt($chCURLOPT_POSTFIELDS,"user[email]=@mail&user[password]=7ytJdqcxThScB-3vC8CQixND2PDUcA&In=$In");
    $html curl_exec($ch);
    curl_close($ch);
    return 
    $html//Возвращаем ответ
    }
    auth($url); // Авторизируемся.
    ?>
    куда копать дальше?
     
  3. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    PHP:
    <?php
    $login 
    'skatina@usa.com';
    $passwd 'skatina123456';
     
     
     
    header("Content-Type: text/html;charset=utf-8");
    define ('DS',DIRECTORY_SEPARATOR);
     
    // Сама функция обработки запросов...
    function GO($url$post=false$header=false)
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_COOKIEJARgetcwd().DS.'cookie.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILEgetcwd().DS.'cookie.txt');
        
    curl_setopt($chCURLOPT_USERAGENT'Opera 10.00');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20);
        
    curl_setopt($chCURLOPT_TIMEOUT20);
        
    curl_setopt($chCURLOPT_AUTOREFERER1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_MAXREDIRS10);
     
        if (
    $post!==false)
        {
            
    curl_setopt($chCURLOPT_POST1);
            
    curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post));
        }
     
        if (
    $header!==false)
            
    curl_setopt($chCURLOPT_HTTPHEADER$header);
     
        
    $res curl_exec($ch);
        
    curl_close($ch);
        return 
    $res;
    }
     
    // Постим данные для авторизации.
    $page=GO('http://service.mail.com/login.html',
    array(
    'rdirurl' => 'http://www.mail.com/ru/',
    'edition' => 'ru',
    'lang' => 'ru',
    'device' => 'desktop',
    'usertype' => 'standard',
    'login' => $login,
    'password' => $passwd,
    'btnLogin' => 'Вход'
    )
    );
     
    if (
    preg_match('#<title>.+\((\d+)\).+</title>#smiU'$page$n))
    echo 
    'В почтовом ящике '.$login.' писем: '.$n[1];
    else
    echo 
    'Какието проблемы O_o';
     
    ?>
     
    Zlobniy Babko нравится это.
  4. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.265
    to Inviseble_Demon
    Спасибо - работает!

    Назвал файл crone.php
    to all
    Не работает на хостинге. На 2х проверял - не прет(((

    HTML:
    
    Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /home/sssssssss/public_html/ssssssss.ru/crone.php on line 17
    Какието проблемы O_o
    open_basedir - хостеры не включат!

    Зато на денвере - вуаля... Пашет на ура.

    Как починить?
    может это? http://www.snippy.ru/snippet/1239-yemuliruem-curlopt_followlocation-php/
     
  5. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    624
    Симпатии:
    1.379
    угу... это самое...
    я пользую указанный выше пример и нареканий никаких не вызывает
    curl_exec($ch); заменить на curl_redir_exec($ch);
     
  6. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.265
    Не прет... Пишет какие-то проблемы

    PHP:
    <?php
    $login 
    'skatina@usa.com';
    $passwd 'skatina123456';
    header("Content-Type: text/html;charset=cp1251");
    define ('DS',DIRECTORY_SEPARATOR);
    function 
    GO($url$post=false$header=false)
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_COOKIEJARgetcwd().DS.'/cookie.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILEgetcwd().DS.'/cookie.txt');
        
    curl_setopt($chCURLOPT_USERAGENT'Opera 10.00');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20);
        
    curl_setopt($chCURLOPT_TIMEOUT20);
        
    curl_setopt($chCURLOPT_AUTOREFERER1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_MAXREDIRS10);
     
        if (
    $post!==false)
        {
            
    curl_setopt($chCURLOPT_POST1);
            
    curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post));
        }
     
        if (
    $header!==false)
            
    curl_setopt($chCURLOPT_HTTPHEADER$header);
     
     
        function 
    curl_redir_exec($ch
        { 
            static 
    $curl_loops 0
            static 
    $curl_max_loops 20
            if (
    $curl_loops  >= $curl_max_loops
            { 
            
    $curl_loops 0
                return 
    FALSE
            } 
            
    curl_setopt($chCURLOPT_HEADERtrue); 
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
            
    $data curl_exec($ch); 
            list(
    $header$data) = explode("\n\n"$data2); 
            
    $http_code curl_getinfo($chCURLINFO_HTTP_CODE); 
            if (
    $http_code == 301 || $http_code == 302
            { 
            
    $matches = array(); 
                
    preg_match('/Location:(.*?)\n/'$header$matches); 
            
    $url = @parse_url(trim(array_pop($matches))); 
                if (!
    $url
            { 
                
    //couldn't process the url to redirect to 
                
    $curl_loops 0
                return 
    $data
                } 
            
    $last_url parse_url(curl_getinfo($chCURLINFO_EFFECTIVE_URL)); 
            if (!
    $url['scheme']) 
                
    $url['scheme'] = $last_url['scheme']; 
            if (!
    $url['host']) 
                
    $url['host'] = $last_url['host']; 
            if (!
    $url['path']) 
                
    $url['path'] = $last_url['path']; 
            
    $new_url $url['scheme'] . '://' $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:''); 
            
    curl_setopt($chCURLOPT_URL$new_url); 
            
    //debug('Redirecting to', $new_url); 
            
    return curl_redir_exec($ch); 
            }  else { 
                
    $curl_loops=0
                return 
    $data
                } 
        } 
     
        
    $res curl_redir_exec($ch);
        
    curl_close($ch);
        return 
    $res;
    }
    $page=GO('http://service.mail.com/login.html',
    array(
    'rdirurl' => 'http://www.mail.com/ru/',
    'edition' => 'ru',
    'lang' => 'ru',
    'device' => 'desktop',
    'usertype' => 'standard',
    'login' => $login,
    'password' => $passwd,
    'btnLogin' => 'Вход'
    )
    );
     
    if (
    preg_match('#<title>.+\((\d+)\).+</title>#smiU'$page$n))
    echo 
    'В почтовом ящике '.$login.' писем: '.$n[1];
    else
    echo 
    'Какието проблемы O_o';
     
    ?>
     
  7. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Да... материстая функция повтора обработки location.
    Но в ней 1 проблемка.... она html коцает.
    Я не стал разбираться в чем проблема... но в итоге все свелось к тому что верхушку она срезала в заголовки следовательно потерялся title а там нужная нам инфа.

    Я использую махонькую функцию она конечно не повторяет всего требуемого но как таковая меня не подводила ещё. Но опять токи скажу - да тот приведенный пример намного лучше моего! Все что нужно это разобраться и поправить баг с подрезкой html.

    Как таковая проблема скорее всего в том что заголовок обрезается по \n\n обычно это \r\n\r\n но верное решение это резать по количеству символов указанных в курл инфо.

    Вот что в итоге выходит.

    PHP:
    <?php
    $login 
    'skatina@usa.com';
    $passwd 'skatina123456';
    header("Content-Type: text/html;charset=cp1251");
    define ('DS',DIRECTORY_SEPARATOR);
     
     
    function 
    GO($url$post=false$header=false)
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_COOKIEJARgetcwd().DS.'/cookie.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILEgetcwd().DS.'/cookie.txt');
        
    curl_setopt($chCURLOPT_USERAGENT'Opera 10.00');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20);
        
    curl_setopt($chCURLOPT_TIMEOUT20);
      
    curl_setopt($chCURLOPT_HEADER1);
     
     
        if (
    $post!==false)
        {
            
    curl_setopt($chCURLOPT_POST1);
            
    curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post));
        }
     
        if (
    $header!==false)
            
    curl_setopt($chCURLOPT_HTTPHEADER$header);
     
     
        
    $res curl_exec($ch);
        
    curl_close($ch);
    return 
    FOLLOWLOCATION($res$url);
    }
     
    function 
    FOLLOWLOCATION($str$host)
    {
    if (
    preg_match("#Location: ?(.*)#i"$str$match))
    {
    if (!
    preg_match('#http://|https://#'trim($match[1])))
    {
    $host=parse_url($host);
    if (
    substr(trim($match[1]), 01) !='/'$match[1]='/'.$match[1];
    $match[1]=$host['scheme'].'://'.$host['host'].trim($match[1]);
    }
    return (
    GO(trim($match[1])));
    }
    else
    return 
    $str;
    }
     
     
    echo 
    $page=GO('http://service.mail.com/login.html',
    array(
    'rdirurl' => 'http://www.mail.com/ru/',
    'edition' => 'ru',
    'lang' => 'ru',
    'device' => 'desktop',
    'usertype' => 'standard',
    'login' => $login,
    'password' => $passwd,
    'btnLogin' => 'Вход'
    )
    );
     
    if (
    preg_match('#<title>.+\((\d+)\).+</title>#smiU'$page$n))
    echo 
    'В почтовом ящике '.$login.' писем: '.$n[1];
    elseif (
    preg_match('#BorderBoxDataCollection:ButtonSkip#'$page))
    {
    echo 
    'Проблемка КЕП, донор просит указать вторичный E-MAIL.';
    }
    else
    echo 
    'Какието проблемы O_o';
     
    ?>
    PS. Так же имеется проблема с тем что донор просит указать вторизный e-mail это уже вам нужно отправить по условию форма отказа. Иначе все напишется без вас и вы так и не разберетесь ни в чем.
     
    Zlobniy Babko нравится это.
  8. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Все таки решил поправить...
    В итоге как то так выходит.
    Только вот меня напрягает делать это через substr. Может есть вариант лучше ? Я сонный в бошку не лезит но чую есть ))

    PHP:
        function curl_redir_exec($ch)
        {
            static 
    $curl_loops 0;
            static 
    $curl_max_loops 20;
            if (
    $curl_loops  >= $curl_max_loops)
            {
            
    $curl_loops 0;
                return 
    FALSE;
            }
            
    curl_setopt($chCURLOPT_HEADERtrue);
            
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
            
    $data curl_exec($ch);
     
            
    $header=substr($data0curl_getinfo($chCURLINFO_HEADER_SIZE));
            
    $data=substr($datacurl_getinfo($chCURLINFO_HEADER_SIZE), strlen($data));
            
    $http_code curl_getinfo($chCURLINFO_HTTP_CODE);
     
            if (
    $http_code == 301 || $http_code == 302)
            {
            
    $matches = array();
                
    preg_match('/Location:(.*?)\n/'$header$matches);
            
    $url = @parse_url(trim(array_pop($matches)));
                if (!
    $url)
            {
                
    //couldn't process the url to redirect to
                
    $curl_loops 0;
                return 
    $data;
                }
            
    $last_url parse_url(curl_getinfo($chCURLINFO_EFFECTIVE_URL));
            if (!
    $url['scheme'])
                
    $url['scheme'] = $last_url['scheme'];
            if (!
    $url['host'])
                
    $url['host'] = $last_url['host'];
            if (!
    $url['path'])
                
    $url['path'] = $last_url['path'];
            
    $new_url $url['scheme'] . '://' $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
            
    curl_setopt($chCURLOPT_URL$new_url);
            
    //debug('Redirecting to', $new_url);
            
    return curl_redir_exec($ch);
            }  else {
                
    $curl_loops=0;
                return 
    $data;
                }
        }
     
    Zlobniy Babko нравится это.
  9. Дмитрий Кесаев

    Дмитрий Кесаев aka Zlobniy Babko

    Заблокирован
    Регистр.:
    10 май 2007
    Сообщения:
    1.332
    Симпатии:
    1.265
    а можно как-то обойти проверку подтверждения почты?

    Проблемка КЕП, донор просит указать вторичный E-MAIL.

    [​IMG]
     
  10. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    350
    Да, можно конечно.

    1) Указать его и забыть.
    2) Уже есть условие детекта этой фигни. Нудно только форму засомбитеть.
    Я предлогаю разобраться вам самим. Иначе вопрос у вас так и не снимится. Просто посмотрите в снифере какие поля ухоят при отправки отказа. Далее если там поля динамические скрытые выпарсить их и отправить.

    Я могу реализовать это, но нужно ли это ? Просто право вопрос переростет не в как сделать и помогите а в сделайте что бы работало.
     
    Zlobniy Babko нравится это.
Статус темы:
Закрыта.