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

Статус
В этой теме нельзя размещать новые ответы.

Дмитрий Кесаев

aka Zlobniy Babko
Заблокирован
Регистрация
10 Май 2007
Сообщения
1.332
Реакции
1.235
  • Автор темы
  • Заблокирован
  • #1
Почта находится на домене mail.com
нужно спарсить только одну строку, красным выделил
PHP:
<title>
      Mail.com - Почтовый ящик
      (1)
    </title>

Bezimyanni_1715222_4688845.png


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

Редиректит автоматом на Для просмотра ссылки Войди или Зарегистрируйся

вход: Для просмотра ссылки Войди или Зарегистрируйся
логин: skatina@usa.com
пасс: skatina123456
НИД ХЕЛП:thenks:
 
  • Автор темы
  • Заблокирован
  • #2
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($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)");
curl_setopt($ch, CURLOPT_COOKIEFILE, $user_cookie_file); //Куки раз
curl_setopt($ch, CURLOPT_COOKIEJAR, $user_cookie_file); //Куки два
curl_setopt($ch, CURLOPT_POST,1); //Будем отправлять POST запрос
curl_setopt($ch, CURLOPT_POSTFIELDS,"user[email]=@mail&user[password]=7ytJdqcxThScB-3vC8CQixND2PDUcA&In=$In");
$html = curl_exec($ch);
curl_close($ch);
return $html; //Возвращаем ответ
}
auth($url); // Авторизируемся.
?>

куда копать дальше?
 
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($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().DS.'cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().DS.'cookie.txt');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Opera 10.00');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
 
    if ($post!==false)
    {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    }
 
    if ($header!==false)
        curl_setopt($ch, CURLOPT_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';
 
?>
 
  • Автор темы
  • Заблокирован
  • #4
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 - хостеры не включат!

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

Как починить?
может это? Для просмотра ссылки Войди или Зарегистрируйся
 
  • Автор темы
  • Заблокирован
  • #6
Не прет... Пишет какие-то проблемы

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($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().DS.'/cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().DS.'/cookie.txt');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Opera 10.00');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
 
    if ($post!==false)
    {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    }
 
    if ($header!==false)
        curl_setopt($ch, CURLOPT_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($ch, CURLOPT_HEADER, true); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
        $data = curl_exec($ch); 
        list($header, $data) = explode("\n\n", $data, 2); 
        $http_code = curl_getinfo($ch, CURLINFO_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($ch, CURLINFO_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($ch, CURLOPT_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';
 
?>
 
Да... материстая функция повтора обработки 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($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().DS.'/cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().DS.'/cookie.txt');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Opera 10.00');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  curl_setopt($ch, CURLOPT_HEADER, 1);
 
 
    if ($post!==false)
    {
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    }
 
    if ($header!==false)
        curl_setopt($ch, CURLOPT_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]), 0, 1) !='/') $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 это уже вам нужно отправить по условию форма отказа. Иначе все напишется без вас и вы так и не разберетесь ни в чем.
 
Все таки решил поправить...
В итоге как то так выходит.
Только вот меня напрягает делать это через 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($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $data = curl_exec($ch);
 
        $header=substr($data, 0, curl_getinfo($ch, CURLINFO_HEADER_SIZE));
        $data=substr($data, curl_getinfo($ch, CURLINFO_HEADER_SIZE), strlen($data));
        $http_code = curl_getinfo($ch, CURLINFO_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($ch, CURLINFO_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($ch, CURLOPT_URL, $new_url);
        //debug('Redirecting to', $new_url);
        return curl_redir_exec($ch);
        }  else {
            $curl_loops=0;
            return $data;
            }
    }
 
  • Автор темы
  • Заблокирован
  • #9
а можно как-то обойти проверку подтверждения почты?

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

Bezimyanni_8850202_4704166.png
 
Да, можно конечно.

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

Я могу реализовать это, но нужно ли это ? Просто право вопрос переростет не в как сделать и помогите а в сделайте что бы работало.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху