Помогите, уже не знаю как же сделать, я в тупике

12
[Удален]
#11

Да я уже нашёл, почти сразу после того, как отправил сообщение

http://www.phpclub.net/manrus/f/preg-match-all.html

http://php.su/lessons/?lesson_17

Спасибо всем)

N
На сайте с 05.11.2010
Offline
0
#12


if(!preg_match('/capthaImagesContainer.+src="(.+)"/Uis', $in, $captcha_url)) {
die("Couldn't parse captcha's URL");
}
$captcha_url = sprintf('http://win.mail.ru/cgi-bin/%s', $captcha_url[1]);

$in - исходник скачанной (кУРЛом или ещё чем) страницы

siv1987
На сайте с 02.04.2009
Offline
427
#13
nomadsolutions:

$in - исходник скачанной (кУРЛом или ещё чем) страницы

Там три src отвечающие за вывод капчи)))

programm, тебе подсказка по регулярному выражению, каждый кусок рисунка начинается с x_image.

Заодно и регулярки подучишь, а то ходишь позоришь всех с таким ником)))))))

[Удален]
#14

programm, тебе подсказка по регулярному выражению, каждый кусок рисунка начинается с x_image.

А это я знаю) Почти сделал но потом забросил эту идею. Всё дело в шляпе

N
На сайте с 05.11.2010
Offline
0
#15
siv1987:
Там три src отвечающие за вывод капчи)))
programm, тебе подсказка по регулярному выражению, каждый кусок рисунка начинается с x_image.
Заодно и регулярки подучишь, а то ходишь позоришь всех с таким ником)))))))

Вы заблуждаетесь, как в количестве картинок, так и в группе символов основного паттерна.

Для одного IP:


<div id="capthaImagesContainer">
<img alt="" style="border: 1px solid gray;" src="x_get_image_v3?17856759656&x_reg_id=regV3_Yjg4FiP" height="240" width="360">
</div>

для другого ИП после рефреша:


<table id="capthaImagesContainer" cellpadding="0" cellspacing="0">
<tbody><tr>
<td><img src="x_image?498740637&num=1&x_reg_id=ErkdYUWs" alt="" height="51" width="75"></td>
<td><img src="x_image?937473694&num=2&x_reg_id=ErkdYUWs" alt="" height="51" width="75"></td>
<td><img src="x_image?337264564&num=3&x_reg_id=ErkdYUWs" alt="" height="51" width="75"></td>
</tr>
</tbody></table>

Поскольку скрипт может находиться на сервере в какой угодно стране, то для рабочего примера нахождения требуемых УРЛов на капчи, следует использовать разбор DOM-дерева вместо регулярок, например так:


$ch = curl_init('http://win.mail.ru/cgi-bin/signup'); // Обработку куков и "беспалевный" квери_стринг я выкладывать не буду ;)
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);

$in = curl_exec($ch);
curl_close($ch);

$query_parts = '//*[@id="capthaImagesContainer"]//img';

$captcha_cntr_id = 'capthaImagesContainer'; //id елемента-родителя для img с капчей(частями капчи)
$doc = new DOMDocument();
$doc->validate = true;
$doc->strictErrorChecking = false;
@$doc->loadHTML($in);
$doc->normalizeDocument();

$xp = new DOMXPath($doc);
$captcha_parts = $xp->query($query_parts);
$captcha_urls = array();
foreach($captcha_parts as $captcha_part) {
array_push($captcha_urls, 'http://win.mail.ru/cgi-bin/' . $captcha_part->getAttribute('src'));
}

// $captcha_urls содержит УРЛ на всю картинку или её части (в зависимости от того, с какого ИПа был запрос)

ТСу же, был показан просто пример, от которого он бы мог оттолкнуться в играх с регулярками, но опять таки повторюсь - решение, используешее регулярные выражения, в данном случае будет не универсально, либо слишком громоздко, кроме того, мейл ру может использовать любой другой тэг, в котором может быть находиться капча, а в случае разбора DOM мы вяжемся только к id элемента, который, в случае чего может быстро подстраиваться в конфиге либо вычисляться ещё как-то эмпирически, в зависимости от изменения процесса регистрации.

Но если разбор именно регулярками для ТС принципиален, то можно получить ноду контейнера ($doc->getElementById('capthaImagesContainer')) и уже после этого парсить регулркой её значение (там будет или сразу <img> или <tr><td><img>... или ещё что), но вариант с xpath, имхо, более универсальней.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий