В общем возникла необходимость сделать сдел. вещь: при регистрации на неком сайте скрипт автоматически регистрирует человека в аське. Зачем - это, по сути не важно. Примерный принцип работы: скрипт передает на страницу регистрации аськи (icq.com) пароль, забирает от туда капчу и выдает ее пользователю. Пользователь вводит капчу, скрипт передает это значение обратно на сайт аськи и непосредственно отдает пользователю готовый номер. Предположительно это делается с использованием курла (нет?). Интересует вариант как это сделать... Особенно интересует как правильно забрать капчу, а потом передать введенное пользователем значение с нее на сайт icq.com. Буду благодарен за любые советы.
Курл - это ясно. Как сперва сохранить капчу в тмп и выдать ее пользователю, а потом вернуть ответ, что бы там капча не изменилась? Просто сохраняю куки с этого сайта - не помогает, все равно картинка уже другая. Пример кода можно? Конкретно того куска, который забирает капчу и возвращает введенный результат.
и что-то мне кажется там лимит стоит на регистрацию с одного ип, так что запасайся проксиками, ещё не проверял но по любому должен быть
возми сниффер пакетв, и наблюдай, может там ещё параметры какие нибудь передаются, вот у меня капча там появилась https://www.icq.com/img/aa_img.php?gnm=1A512ADD39032F0B2BB0B6A7463BA4AE3B60B11CD19F481EB5BA751506DD7AABA8D85D1253F6DEC52E64A92211A54D7D и она не меняется, так что ты просто ссыль эту пользователю даёшь и все
При получении капчи нужно сохранить сессию, а затем отправить капчу с этой сессией. Вот я делал на питоне для free-uin.org: Code: #!/usr/bin/python # -*- coding: utf-8 -*- import re import time import urllib import urllib2 import httplib import cookielib def load_captcha(): global cookies cookiejar = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar)) image = opener.open('http://www.free-uin.org/r/img.php?regen=y').read() for i in cookiejar: cookies = 'PHPSESSID=' + i.value + ';SMFCookie988=a%3A4%3A%7Bi%3A0%3Bs%3A4%3A%227054%22%3Bi%3A1%3Bs%3A40%3A%22c06d8bdaaa9f9f459b37534288532ec5b36d8c51%22%3Bi%3A2%3Bi%3A1436452120%3Bi%3A3%3Bi%3A0%3B%7D' return image def main(): while True: image = load_captcha() key = 'key_here' results = open('uins.txt', 'w') cap_id = send_cap(key, image) if not cap_id: print 'Not send...' return status, text= get_cap_text(key, cap_id) if status == 'OK': data = urllib.urlencode({'code': text, 'btnI': ''}) req = urllib2.Request('http://www.free-uin.org/r/mnlxswrt.php', data) req.add_header('Cookie', cookies) page = urllib2.urlopen(req).read() uin = re.findall('([0-9]+;[a-zA-Z0-9]+)\n', page) if len(uin) != 0: print 'Hehe: ' + uin[0] results.write(uin[0] + '\n') results.fluch() else: if len(re.findall('<br><br> <a', page)) != 0: bad_url = 'http://anti-captcha.com/res.php' bad_data = urllib.urlencode({'key': key, 'action': 'reportbad', 'id': cap_id}) bad = urllib.urlopen(bad_url, bad_data) print 'Incorrect code!' else: print 'Do not lucky ...' def get_cap_text(key, cap_id): time.sleep(5) res_url = 'http://ac-service.info/res.php' res_url += "?" + urllib.urlencode({'key': key, 'action': 'get', 'id': cap_id}) while 1: res = urllib.urlopen(res_url).read() if res == 'CAPCHA_NOT_READY': time.sleep(1) continue break res = res.split('|') if len(res) == 2: return tuple(res) else: return ('ERROR', res[0]) def send_cap(key, data): boundary = '----------OmNaOmNaOmNamo' body = '''--%s Content-Disposition: form-data; name="method" post --%s Content-Disposition: form-data; name="key" %s --%s Content-Disposition: form-data; name="file"; filename="capcha.jpg" Content-Type: image/pjpeg %s --%s-- ''' % (boundary, boundary, key, boundary, data, boundary) headers = {'Content-type' : 'multipart/form-data; boundary=' + boundary} h = httplib.HTTPConnection('ac-service.info') h.request("POST", "/in.php", body, headers) resp = h.getresponse() data = resp.read() h.close() if resp.status == 200: cap_id = int(data.split('|')[1]) return cap_id else: return False if __name__ == '__main__': main()
Вот писал когдато, но времени никак нету доделать по человечески, регает 3 или 5 асек за которткий промежуток времени, потом идет бан минут на 15-30 уже не помню точно. icq.com.php PHP: <?php ### SETTINGS $url = 'https://www.icq.com/register/index.php'; $pass = '123123'; $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1) Gecko/20090624 Firefox/3.5'; $email = '[email protected]'; $secret_answer = 'your_answer'; #What is your pet's name $ch = curl_init($url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_COOKIEJAR, './cook.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, './cook.txt'); #curl_setopt($ch, CURLOPT_REFERER, 'https://www.icq.com/register/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); if(preg_match('#name="icq_ln" value="(.*?)"#',$res,$matches)) { $icq_ln = $matches[1]; if(preg_match('#name="gnm" value="(.*?)"#',$res,$matches)) { $gnm = $matches[1]; if(preg_match('#gnm=(.*?)"#',$res,$matches)) { $captcha_link = $matches[1]; $ch = curl_init("https://www.icq.com/img/aa_img.php?gnm=$captcha_link"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_COOKIEJAR, './cook.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, './cook.txt'); curl_setopt($ch, CURLOPT_REFERER, 'https://www.icq.com/register/index.php'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); file_put_contents('cap.gif',$res); $rand = rand(0,999); echo "<img src=\"cap.gif?$rand\" />"; echo ' <form action="do.php" method="post" enctype="application/x-www-form-urlencoded"> <input type="text" name="captcha" value=""><br /> <input type="hidden" value="'.$gnm.'" name="gnm" /> <input type="hidden" value="'.$icq_ln.'" name="icq_ln" /> <input type="submit" value="REG" /> </form>'; } } } ?> do.php PHP: <?php $url = 'https://www.icq.com/register/index.php'; $pass = '123123'; $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1) Gecko/20090624 Firefox/3.5'; $email = '[email protected]'; $secret_answer = 'answer'; #What is your pet's name $nick = 'nick'; if(!empty($_POST['captcha'])) { $captcha = $_POST['captcha']; $gnm = $_POST['gnm']; $icq_ln = $_POST['icq_ln']; $post = "service=30&lg_id=&qtype=&icq_ln=$icq_ln&nickname=$nick&fname=&lname=&email=$email&gender=0&age=13&password=$pass&password_confirm=$pass&qa1=What+is+your+pet%27s+name%3F&userq1=&answer1=$secret_answer&gnm=$gnm&word=$captcha&key=&lang=en"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_NOPROGRESS, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_USERAGENT, $ua); curl_setopt($ch, CURLOPT_COOKIEJAR, './cook.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, './cook.txt'); curl_setopt($ch, CURLOPT_REFERER, 'https://www.icq.com/register/index.php'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($ch); if(preg_match('#id="uin">([0-9]{9})\.#',$res,$matches)) { file_put_contents('uins.txt',$matches[1]."\r\n",FILE_APPEND); header("Location: icq.com.php"); } if(preg_match('#please try again later#',$res)) { echo 'BAN'; } } ?> Аськи будут записыватся в uins.txt
Так. Давайте не будем рассматривать конкретно сайт icq.com. Я не могу просто понять как работать с капчей. Как просто взять с одного сайта капчу курлом, передать пользователю и на основе введенного заполнить форму? Подобному Скрипту можно кучу применений придумать, для одновременной регистрации на куче сайтов.
1. Отправляешь запрос на страницу с капчей. 2. Регулярками выдираешь линк на каптчу, скачиваешь её. 3. Показываешь эту каптчу пользователю. 4. Пользователь вводит каптчу. 5. Отсылаешь запрос на сервер с введенной каптчей. Это алгоритм. Код напишешь сам.