За последние 24 часа нас посетили 23630 программистов и 1815 роботов. Сейчас ищут 1168 программистов ...

Класс для работы с сетью ВКонтакте

Тема в разделе "Решения, алгоритмы", создана пользователем Ensiferum, 4 окт 2010.

  1. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Мой первый написанный класс. На что он способен, написано в комментах к функциям. Просьба оценить слабые моменты в плане реализции. Что стоит улучшить и переделать?

    PHP:
    1. <?php
    2. class VkontakteAPI {
    3.     public $email = '';         // Логин
    4.     public $password = '';      // Пароль
    5.     public $pageBody = '';      // страница с результатом действия
    6.     public $mainBody = '';      // Главная страница
    7.     public $userID = '';        // ID юзера
    8.     public $activityhash = '';  // хэш юзера
    9.     public $cookie = '';        // печеньки
    10.     public $proxy = '';         // адрес прокси
    11.  
    12.     function __construct($email, $password,$cookie='',$proxy='') {
    13.         $this->email    = $email;
    14.         $this->password = $password;
    15.         if ($cookie!='')
    16.             $this->cookie = $cookie;    // М-м-м-м... печеньки...
    17.         if ($proxy!='')
    18.             $this->proxy = $proxy;
    19.     }  
    20.  
    21.     // Авторизация Вконтакте
    22.     function auth() {
    23.        
    24.         $this->pageBody = $this->get('http://vkontakte.ru/login.php',0);
    25.         $this->getCookies($this->pageBody);
    26.         $this->pageBody = $this->post('http://vkontakte.ru/login.php','op=a_login_attempt',0);
    27.         $this->pageBody = $this->post('http://login.vk.com/','act=login&success_url=&fail_url=&try_to_login=1&to=&vk='.'&email='.$this->email.'&pass='.$this->password.'&expire=',0);
    28.         $this->getCookies($this->pageBody);
    29.  
    30.         preg_match_all("|<input\stype=\'hidden\'\sname=\'s\'\svalue=\'(.+)\'\s/>|U", $this->pageBody, $s);
    31.        
    32.         // Если нет заветной переменной, выдаём false
    33.         if (!isset($s[1][0]))
    34.             return false;
    35.        
    36.         $this->pageBody = $this->get('http://vkontakte.ru/login.php?op=slogin&redirect=1&expire=0&to=&s='.$s[1][0],0);
    37.         $this->cookie = '';
    38.         $this->getCookies($this->pageBody);
    39.         $this->pageBody = $this->get('http://vkontakte.ru/');
    40.  
    41.         // Если есть запись о смене пароля, выдаём false
    42.         if (strpos($this->pageBody,'Смена пароля') !== false)
    43.             return false;
    44.  
    45.         $this->mainBody = $this->pageBody;
    46.  
    47.         preg_match_all('|<input type="hidden" id="mid" value="(.+)"|U', $this->pageBody, $arr);
    48.         if (isset($arr[1][0]))
    49.             $this->userID = $arr[1][0];
    50.  
    51.         preg_match_all("|<input type='hidden' id='activityhash' value='(.+)'|U", $this->pageBody, $arr);
    52.         if (isset($arr[1][0]))
    53.             $this->activityhash = $arr[1][0];
    54.  
    55.         return true;
    56.     }
    57.  
    58.     function get($url, $follow=1) {
    59.         $process = curl_init($url);
    60.         curl_setopt($process, CURLOPT_HEADER, 1);
    61.         curl_setopt($process, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.10) Gecko/20100914 MRA 5.6 (build 03402) Firefox/3.6.10');
    62.         curl_setopt($process, CURLOPT_COOKIE,$this->cookie);
    63.         curl_setopt($process, CURLOPT_TIMEOUT, 15);
    64.         curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
    65.         curl_setopt($process, CURLOPT_FOLLOWLOCATION, $follow);
    66.         if ($this->proxy)
    67.             curl_setopt($process, CURLOPT_PROXY, $this->proxy);
    68.  
    69.         $return = curl_exec($process);
    70.         curl_close($process);
    71.         return $return;
    72.     }
    73.  
    74.     function post($url, $data, $follow=1) {
    75.         $process = curl_init($url);
    76.         curl_setopt($process, CURLOPT_HEADER, 1);
    77.         curl_setopt($process, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.10) Gecko/20100914 MRA 5.6 (build 03402) Firefox/3.6.10');
    78.         curl_setopt($process, CURLOPT_COOKIE,$this->cookie);
    79.         curl_setopt($process, CURLOPT_TIMEOUT, 15);
    80.         curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
    81.         curl_setopt($process, CURLOPT_FOLLOWLOCATION, $follow);
    82.         curl_setopt($process, CURLOPT_POSTFIELDS, $data);    
    83.         curl_setopt($process, CURLOPT_POST, 1);
    84.         if ($this->proxy)
    85.             curl_setopt($process, CURLOPT_PROXY, $this->proxy);
    86.  
    87.         $return = curl_exec($process);
    88.         curl_close($process);
    89.         return $return;
    90.     }
    91.  
    92.     // Функция достаёт статус с главной страницы пользователя
    93.     function getStatus() {
    94.         preg_match_all('|this.style.textDecoration = \'none\';">(.+)<|U', $this->mainBody, $arr);
    95.         if (isset($arr[1][0]))
    96.             return substr($arr[1][0], 0, strlen($arr[1][0]) - 1);
    97.         else
    98.             return false;
    99.     }
    100.  
    101.     // Функция достаёт количество друзей пользователя
    102.     function getCountFriends() {
    103.         preg_match('#<h2>Друзья <span>\((.*)\)</span></h2>#Us', $this->mainBody, $arr);
    104.         if (isset($arr[1]))
    105.             return ($arr[1]!='')? $arr[1] : 0;
    106.         else
    107.             return false;
    108.     }
    109.  
    110.     // Функция возвращает пол пользователя
    111.     function getSex() {
    112.         preg_match('#\<a href=\'/gsearch.php\?from=people&c\[sex\]=\d\'\>(.*)\</a\>#Us', $this->mainBody, $arr);
    113.         if (isset($arr[1]))
    114.             return $arr[1];
    115.         else
    116.             return false;
    117.     }
    118.  
    119.     // Функция установки статуса текущему ID
    120.     function setStatus($text) {
    121.         $this->pageBody = $this->post('http://vkontakte.ru/profile.php','setactivity='.$this->utf($text).'&activityhash='.$this->activityhash);
    122.     }
    123.  
    124.     // Функция заходит в группу по заданному ID группы
    125.     function enterGroup($groupID) {
    126.         $this->pageBody = $this->get('http://vkontakte.ru/club'.$groupID);
    127.         sleep(1);
    128.  
    129.         preg_match('#enterGroup\('.$groupID.', "(.*)"#Us',$this->pageBody,$match);
    130.         if (isset($match[1])) {
    131.             $this->pageBody = $this->post('http://vkontakte.ru/groups_ajax.php','act=a_enter&gid='.$groupID.'&hash='.$match[1]);
    132.             usleep(500);
    133.             return true;
    134.         }
    135.  
    136.         return false;
    137.     }
    138.  
    139.     // Функция проверки домена. Если домен занесён в подозрительные, возвращает FALSE
    140.     function checkDomain($domain) {
    141.         $this->pageBody = $this->get('http://vkontakte.ru/away.php?to=http://'.$domain);
    142.         if (strpos($this->pageBody, 'ВКонтакте | Ссылка на подозрительный сайт'))
    143.             return FALSE;
    144.         else
    145.             return TRUE;
    146.     }
    147.  
    148.     // Функция проверки группы по ID. Если группа заблокирована или удалена, возвращает FALSE
    149.     function checkGroup($groupID) {
    150.         $this->pageBody = $this->get('http://vkontakte.ru/club'.$groupID);
    151.         if (strpos($this->pageBody, 'Страница заблокирована') || strpos($this->pageBody,'Группа не найдена'))
    152.             return FALSE;
    153.         else
    154.             return TRUE;
    155.     }
    156.  
    157.     // Пишем заданному ID текст на стену
    158.     function addWallText($id,$text) {
    159.         $this->pageBody = $this->get('http://vkontakte.ru/'.$id);
    160.         sleep(1);
    161.  
    162.         // Если сообщение на стенку пользователя
    163.         if (substr($id,0,2) == 'id') {
    164.             preg_match('#postWall\((.*), \'(.*)\'\)#Us',$this->pageBody,$match);
    165.             if (isset($match[0])) {
    166.                 $this->pageBody = $this->post('http://vkontakte.ru/wall.php','act=a_post_wall&hash='.$this->decodeHash($match[2]).'&message='.$this->utf($text).'&to_id='.$match[1].'&top_id=&type=0');
    167.                 usleep(500);
    168.                 return true;
    169.             }
    170.         }
    171.  
    172.         // Если сообщение на стенку группы
    173.         else if (substr($id,0,4) == 'club') {
    174.             preg_match('#\{act\: \'a_post_wall\', hash\: decodehash\(\'(.*)\'\), message\: txt, to_id\:(.*)\}#Us',$this->pageBody,$match);
    175.             if (isset($match[0])) {
    176.                 $this->pageBody = $this->post('http://vkontakte.ru/wall.php','act=a_post_wall&hash='.$this->decodeHash($match[1]).'&message='.$this->utf($text).'&to_id='.$match[2]);
    177.                 usleep(500);
    178.                 return true;
    179.             }
    180.         }
    181.  
    182.         return false;
    183.     }
    184.  
    185.     // Отправка сообщений заданному ID
    186.     function sendMessage($id,$text,$subject) {
    187.         $this->pageBody = $this->get('http://vkontakte.ru/mail.php?act=write&to='.$id);
    188.         usleep(500);
    189.  
    190.         preg_match('#id="chas" name="chas" value="(.*)"#Us',$this->pageBody,$match);
    191.         if (isset($match[1])) {
    192.             $this->pageBody = $this->post('http://vkontakte.ru/mail.php','act=sent&aid=&ajax=1&chas='.$this->decodeHash($match[1]).'&fid=&from_box=1&message='.$this->utf($text).'&oid=&title='.$this->utf($subject).'&to_id='.$id.'&vid=');
    193.             usleep(500);
    194.             return true;
    195.         }
    196.  
    197.         return false;
    198.     }
    199.  
    200.     // Добавляемся в друзья к указанному ID с заданным текстом
    201.     function addToFriend($id,$text) {
    202.         $this->pageBody = $this->post('http://vkontakte.ru/friends_ajax.php','act=request_form&fid='.$id);
    203.         sleep(1);
    204.  
    205.         preg_match('#id=\\\"hash\\\" value=\\\"(.*)\\\"#Us',$this->pageBody,$match);
    206.         if (isset($match[0])) {
    207.             $this->pageBody = $this->post('http://vkontakte.ru/friends_ajax.php','act=accept_friend&fid='.$id.'&hash='.$this->decodeHash($match[1]).'&cats=&verbose=1&message='.$this->utf($text));
    208.             sleep(1);
    209.             return true;
    210.         }
    211.  
    212.         return false;
    213.     }
    214.  
    215.     // Становимся поклонником выбранного ID
    216.     function addFavorite($id) {
    217.         $this->pageBody = $this->post('http://vkontakte.ru/rate.php','act=a_be_fan&mid='.$id);
    218.         sleep(1);
    219.  
    220.         preg_match('#hash=(.*)\'#Us',$this->pageBody,$match);
    221.         if (isset($match[0])) {
    222.             $this->pageBody= $this->post('http://vkontakte.ru/rate.php','act=do_be_a_fan&mid='.$id.'&hash='.$match[1]);
    223.             sleep(1);
    224.             return true;
    225.         }
    226.  
    227.         return false;
    228.     }
    229.  
    230.     // Удаляемся из поклонников выбранного ID
    231.     function deleteFavorite($id) {
    232.         $this->pageBody = $this->post('http://vkontakte.ru/rate.php','act=a_not_fan&mid='.$id);
    233.         sleep(1);
    234.  
    235.         preg_match('#hash=(.*)\'#Us',$this->pageBody,$match);
    236.  
    237.         if (isset($match[0])) {
    238.             $this->pageBody= $this->post('http://vkontakte.ru/rate.php','act=do_not_fan&mid='.$id.'&hash='.$match[1]);
    239.             sleep(1);
    240.             return true;
    241.         }
    242.  
    243.         return false;
    244.     }
    245.  
    246.     // Декодер хэшей
    247.     function decodeHash($hash) {
    248.         $h = '';
    249.         $temp = substr($hash,strlen($hash)-5) . substr($hash,4,strlen($hash)-12);
    250.         for ($i=0 , $l = strlen($temp); $i < $l; ++$i)
    251.             $h .= substr($temp,$l-$i-1,1);
    252.  
    253.         return $h;
    254.     }
    255.  
    256.     // Меняем кодировку, используется при запросах
    257.     function utf($text) {
    258.         return iconv('WINDOWS-1251','UTF-8',$text);
    259.     }
    260.  
    261.     // Возвращает текст ответа сервера без заголовка
    262.     function getBody($text) {
    263.         return array_pop(explode(PHP_EOL.PHP_EOL,$text));
    264.     }
    265.  
    266.     // Достаем из запроса кукисы
    267.     function getCookies($data) {
    268.         preg_match_all('#Set-Cookie: (.*);#Us',$data,$match);
    269.         if (isset($match[1]))
    270.             $this->cookie .= implode('; ',$match[1]);
    271.     }
    272. }
    273. ?>
     
  2. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    В коде разные отступы, так как отступы в netbeans не в ладах с отступами в notepad++. Кто-нибудь знает решение этой проблемы?
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    В смысле "не в ладах?".
    Вообще в notepad++ отступы настраиваются.
    Думаю в NetBeans должно тоже что-то подобное быть.
     
  4. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    В Notpad++ При нажатии таба, а затем стиралки, курсор встает на первоначальное положение. В нетбинсе при тех же манипуляциях курсор сдвигается лишь на одну позицию влево, как будто до этого я набирал пробелы, а не таб.
     
  5. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    В нетбинсе табуляция - 5 пробелов. Или 6, не суть важно. По умолчанию. А в нотепаде++ табуляция - это табуляция. И там, и там всё настраивается.
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ensiferum
    В настройках Notepad++ есть "заменять табы пробелами". И где-то на форуме мелькали вопросы как это сделать.
     
  7. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Hight
    ок, щас поковыряюсь в настройках
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1) А у вконтакта нет API?
    2)
    Код (Text):
    1. preg_match('#<h2>Друзья <span>\((.*)\)</span></h2>#Us', $this->mainBody, $arr);
    А нельзя ли привязаться не к тексту, а к атрибутам элемента? А то завтра они решат назвать друзей "камрадами" и ой...
     
  9. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Volt(220)
    Мне как раз обратное сделать нужно - сделать табы табами в нетбинсе
     
  10. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Volt(220)
    1) Есть, но исползуется для другого. Мой класс для имитаций действий человека, то бишь для написания бота

    2) М-м, не думал над этим. Сделаю
     
  11. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Ensiferum
    Сервис -> настройки -> редактор -> форматирование
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    задается размер отступа + возможность использовать для этого либо пачки пробелов либо таб. так что тыкни пару раз в настройки - все должно будет ободинаковиться.
     
  13. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Hight
    Спасибо огромное за помощь
     
  14. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    оффтопа капец многа
     
  15. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    MaXyC_Web_Studio
    и маты даже есть..
     
  16. Fenec

    Fenec Активный пользователь

    С нами с:
    1 ноя 2010
    Сообщения:
    5
    Симпатии:
    0
    В чем преимущество такого класса перед тем же фукнционалом, написанным процедурным стилем? Тут неприменимо ни наследование, ни абстракция.
     
  17. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Fenec
    Не было бы мне удобно - не писал бы классом.
     
  18. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    главным образом в этом:
     
  19. 4j9

    4j9 Активный пользователь

    С нами с:
    21 дек 2010
    Сообщения:
    2
    Симпатии:
    0
    Из-за обновления, функция addWallText перестала работать. Исправил часть отвечающую за стену пользователя:
    PHP:
    1.  
    2. <?php
    3.      function addWallText($id,$text) {
    4.          $this->pageBody = $this->get('http://vkontakte.ru/'.$id);
    5.          sleep(1);
    6.          // Если сообщение на стенку пользователя
    7.          if (substr($id,0,2) == 'id') {
    8.              preg_match('/"post_hash":"([0-9a-f]*?)"/si', $this->pageBody, $match);          
    9.              if (isset($match[1])) {
    10.                  $this->pageBody = $this->post('http://vkontakte.ru/al_wall.php',
    11.                          'act=post&al=1&hash='.$match[1].'&message='.$this->utf($text)
    12.                          .'&to_id='.preg_replace('/^id/si', '', $id).'&note_title=&status_export=');
    13.                  usleep(500);                
    14.                  return true;
    15.              }
    16.          }
    17.  
    18.          // Если сообщение на стенку группы
    19.          else if (substr($id,0,4) == 'club') {
    20.              preg_match('#\{act\: \'a_post_wall\', hash\: decodehash\(\'(.*)\'\), message\: txt, to_id\:(.*)\}#Us',$this->pageBody,$match);
    21.              if (isset($match[0])) {
    22.                  $this->pageBody = $this->post('http://vkontakte.ru/wall.php','act=a_post_wall&hash='.$this->decodeHash($match[1]).'&message='.$this->utf($text).'&to_id='.$match[2]);
    23.                  usleep(500);
    24.                  return true;
    25.              }
    26.          }
    27.  
    28.          return false;
    29.      }
    Аналогична ситуация с setStatus:
    PHP:
    1.  
    2. <?
    3.      // Функция установки статуса текущему ID
    4.      function setStatus($text) {
    5.          $this->pageBody = $this->post('http://vkontakte.ru/al_profile.php',
    6.              'act=current_info&al=1&hash='.preg_replace('/.*"info_hash":"([0-9a-f]*?)".*/si', '$1', $this->mainBody)
    7.              .'&info='.$this->utf($text));
    8.      }
    9.  
     
  20. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Добавлялку в други они тоже переделали.
    PHP:
    1. <?
    2.     // Добавляемся в друзья к указанному ID с заданным текстом
    3.     public function addToFriend($id,$text) {
    4.         $this->pageBody = $this->post('http://vkontakte.ru/al_friends.php','act=add_box&al=1&mid='.$id);
    5.         sleep(1);
    6.  
    7.         if (preg_match('#hash: \'(.*)\'#Us',$this->pageBody,$match)) {
    8.             $this->pageBody = $this->post('http://vkontakte.ru/al_friends.php','act=add&al=1&cats=&hash='.$match[1].'&message='.$this->utf($text).'&mid='.$id);
    9.             $temp = explode('<!>',$this->pageBody);
    10.             if ($temp[4] == '2') {
    11.                 if ($this->antigateHash) {
    12.                     $dir = dirname($_SERVER['SCRIPT_FILENAME']) . DIRECTORY_SEPARATOR . 'captcha' . DIRECTORY_SEPARATOR;
    13.                    
    14.                     $t = $this->getBody($this->get('http://m.vkontakte.ru/captcha?s=1&sid='.$temp[5]));
    15.                     file_put_contents($dir . $temp[5] . '.jpg', $t);
    16.                     $t = $this->captcha($dir . $temp[5] . '.jpg');
    17.                    
    18.                     $this->pageBody = $this->post('http://vkontakte.ru/al_friends.php','act=add&al=1&cats=&hash='.$match[1].'&message='.$this->utf($text).'&mid='.$id.'&captcha_key='.$t.'&captcha_sid='.$temp[5]);
    19.                 }
    20.             }
    21.             $temp = explode('<!>',$this->pageBody);
    22.             if ($temp[4] == '0')
    23.                 return true;
    24.             else
    25.                 return false;
    26.         }
    27.  
    28.         return false;
    29.     }
    30. ?>
    так же сделал работу с антигейтом

    PHP:
    1. <?public function captcha($captchaFile) {
    2.         $rtimeout = 5;
    3.         $mtimeout = 90;
    4.         $postdata = array(
    5.             'method'    => 'post',
    6.             'key'       => $this->antigateHash,
    7.             'file'      => '@'.$captchaFile,
    8.             'phrase'    => 0,
    9.             'regsense'  => 1,
    10.             'numeric'   => 0,
    11.             'min_len'   => 4,
    12.             'max_len'   => 7
    13.         );
    14.  
    15.         $result = $this->post('http://www.antigate.com/in.php', $postdata);
    16.  
    17.         if (strpos($result, "ERROR")!==false) {
    18.             $this->captchaDebug = $this->getBody($result);
    19.             return false;
    20.            
    21.         } else {
    22.             $ex = explode("|", $result);
    23.             $captcha_id = $ex[1];
    24.             $waittime = 0;
    25.             sleep($rtimeout);
    26.             while(true) {
    27.                 $result = @file_get_contents('http://antigate.com/res.php?key='.$this->antigateHash.'&action=get&id='.$captcha_id);
    28.                 if (strpos($result, 'ERROR')!==false) {
    29.                     return false;
    30.                 }
    31.                 if ($result=="CAPCHA_NOT_READY") {
    32.                     $waittime += $rtimeout;
    33.                     if ($waittime>$mtimeout) {
    34.                         break;
    35.                     }
    36.                     sleep($rtimeout);
    37.                 }
    38.                 else {
    39.                     $ex = explode('|', $result);
    40.                     if (trim($ex[0])=='OK') {
    41.                         return trim($ex[1]);
    42.                     }
    43.                 }
    44.             }
    45.             return false;
    46.         }
    47.     }
    48. ?>
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  22. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    [vs]
    Класс используется для другого =) Кто в теме, тот поймет.
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ensiferum
    Невнимательно посмотрел =)
    Но случаев, когда использование приложения невозможно, по-моему очень мало
     
  24. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    [vs]
    Ну вот допустим сейчас на основе класса сделал бекапер альбомов групп. За 10 минут сервер грабит ~ 1500 фоток, за то же время переносит альбомы в любую другую группу.
     
  25. 4j9

    4j9 Активный пользователь

    С нами с:
    21 дек 2010
    Сообщения:
    2
    Симпатии:
    0
    API, по-моему, для этого и нужно, но они зачем-то запретили использование всех методов, кроме имеющих префикс secure. с сервера. Сам кучу времени убил пока не нашёл обсуждение.