Как сделать регистрацию ICQ на php?

Discussion in 'PHP' started by Linuxoid, 23 Aug 2009.

  1. Linuxoid

    Linuxoid Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    200
    Likes Received:
    28
    Reputations:
    0
    В общем возникла необходимость сделать сдел. вещь: при регистрации на неком сайте скрипт автоматически регистрирует человека в аське. Зачем - это, по сути не важно.
    Примерный принцип работы: скрипт передает на страницу регистрации аськи (icq.com) пароль, забирает от туда капчу и выдает ее пользователю. Пользователь вводит капчу, скрипт передает это значение обратно на сайт аськи и непосредственно отдает пользователю готовый номер.
    Предположительно это делается с использованием курла (нет?).
    Интересует вариант как это сделать... Особенно интересует как правильно забрать капчу, а потом передать введенное пользователем значение с нее на сайт icq.com.
    Буду благодарен за любые советы.
     
  2. SVAROG

    SVAROG Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    юзай курл, имхо легче будет
    http://ru.php.net/manual/en/book.curl.php
     
  3. Linuxoid

    Linuxoid Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    200
    Likes Received:
    28
    Reputations:
    0
    Курл - это ясно. Как сперва сохранить капчу в тмп и выдать ее пользователю, а потом вернуть ответ, что бы там капча не изменилась? Просто сохраняю куки с этого сайта - не помогает, все равно картинка уже другая. Пример кода можно? Конкретно того куска, который забирает капчу и возвращает введенный результат.
     
  4. SVAROG

    SVAROG Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    и что-то мне кажется там лимит стоит на регистрацию с одного ип, так что запасайся проксиками, ещё не проверял но по любому должен быть
     
  5. SVAROG

    SVAROG Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    возми сниффер пакетв, и наблюдай, может там ещё параметры какие нибудь передаются,
    вот у меня капча там появилась
    https://www.icq.com/img/aa_img.php?gnm=1A512ADD39032F0B2BB0B6A7463BA4AE3B60B11CD19F481EB5BA751506DD7AABA8D85D1253F6DEC52E64A92211A54D7D
    и она не меняется, так что ты просто ссыль эту пользователю даёшь и все
     
  6. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    При получении капчи нужно сохранить сессию, а затем отправить капчу с этой сессией. Вот я делал на питоне для 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()
    
     
  7. SVAROG

    SVAROG Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    он же писал что сессии сохранял, так что скорее всего у него в коде ошибка
     
  8. e4key

    e4key New Member

    Joined:
    24 Jul 2009
    Messages:
    24
    Likes Received:
    1
    Reputations:
    0
    где?
     
  9. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Вот писал когдато, но времени никак нету доделать по человечески, регает 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($chCURLOPT_SSL_VERIFYPEER0);
    curl_setopt($chCURLOPT_USERAGENT$ua);
    curl_setopt($chCURLOPT_COOKIEJAR'./cook.txt');
    curl_setopt($chCURLOPT_COOKIEFILE'./cook.txt');
    #curl_setopt($ch, CURLOPT_REFERER, 'https://www.icq.com/register/');
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    $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($chCURLOPT_SSL_VERIFYPEER0);
                
    curl_setopt($chCURLOPT_USERAGENT$ua);
                
    curl_setopt($chCURLOPT_COOKIEJAR'./cook.txt');
                
    curl_setopt($chCURLOPT_COOKIEFILE'./cook.txt');
                
    curl_setopt($chCURLOPT_REFERER'https://www.icq.com/register/index.php');
                
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
                
    $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($chCURLOPT_SSL_VERIFYPEER0);

    curl_setopt($chCURLOPT_NOPROGRESS0);
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);



    curl_setopt($chCURLOPT_USERAGENT$ua);
    curl_setopt($chCURLOPT_COOKIEJAR'./cook.txt');
    curl_setopt($chCURLOPT_COOKIEFILE'./cook.txt');
    curl_setopt($chCURLOPT_REFERER'https://www.icq.com/register/index.php');
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_POSTFIELDS$post);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    $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
     
    1 person likes this.
  10. Linuxoid

    Linuxoid Elder - Старейшина

    Joined:
    13 Feb 2007
    Messages:
    200
    Likes Received:
    28
    Reputations:
    0
    Так. Давайте не будем рассматривать конкретно сайт icq.com. Я не могу просто понять как работать с капчей. Как просто взять с одного сайта капчу курлом, передать пользователю и на основе введенного заполнить форму? Подобному Скрипту можно кучу применений придумать, для одновременной регистрации на куче сайтов.
     
  11. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    1. Отправляешь запрос на страницу с капчей.
    2. Регулярками выдираешь линк на каптчу, скачиваешь её.
    3. Показываешь эту каптчу пользователю.
    4. Пользователь вводит каптчу.
    5. Отсылаешь запрос на сервер с введенной каптчей.

    Это алгоритм. Код напишешь сам.