Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: API ВКонтакте PHP для Standalone приложения. НУЖНА ПОМОЩЬ!!!

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите пожалуйста разобраться с кодом, все работает кроме самих запросов к API.
hiddensy
Отправлено: 25 Сентября, 2014 - 13:50:44
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Всем привет.
На просторах сети нашел PHP код для авторизации на сайте Вконтакте. Код рабочий, немного допилил, но сделать запросы к API соц. сети не получается.

Смысл работы скрипта в следующем.
1. Создаем Standalone приложение. (у меня создано, ID приложения и Защищенный ключ уже есть в коде)
2. Авторизация происходит по логину и паролю от Вконтакте. (свои данные удалил ;)))))
3. Отрабатывая скрипт выдаёт: access_token, expires_in, user_id, email, secret

access_token - постоянный, т.к. expires_in = 0

Вопрос: Как имея эти данные, обратится к API Вконтакте?

Код:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.         //Как получить токен ВКонтакте
  4.         require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'Http.php';
  5.  
  6.     function mPrint($st){
  7.         echo("<pre>");
  8.         print_r($st);
  9.         echo("</pre>");
  10.     }
  11.    
  12.         $http= new HttpTools();
  13.  
  14.     $login = "Ваш логин в Вконтакте";
  15.         $password = "Ваш пароль от Вконтакте";
  16.    
  17.         //Id приложения
  18.         $client_id = "4559692";
  19.         $secret_key = '2PjdTT7RNcCgAMjs8jPG';
  20.         //Необходимые приложению права
  21.         $scope = "notify,friends,photos,audio,video,docs,notes,pages,status,offers,questions,wall,groups,mail,messages,notifications,stats,ads,offline,nohttps";
  22.                        
  23.         //Первый запрос
  24.         $url  = 'https://oauth.vk.com/authorize?';
  25.         $url .= 'client_id=' . $client_id;
  26.         $url .= '&scope=' . $scope;
  27.         $url .= '&redirect_uri=http://oauth.vk.com/blank.html';
  28.         $url .= '&display=mobile';
  29.     $url .= '&v=5.24';
  30.         $url .= '&response_type=token';
  31.     $url .= '&revoke=1';
  32.        
  33.     mPrint("Send GET request 1: ".$url);
  34.        
  35.         $html = $http->sendGetRequest($url, '', false);
  36.                
  37.         $_origin = $http->parseParam($html, '<input type="hidden" name="_origin" value="','">');
  38.         $ip_h = $http->parseParam($html, '<input type="hidden" name="ip_h" value="','" />');
  39.         $to = $http->parseParam($html, '<input type="hidden" name="to" value="','">');
  40.        
  41.         //Второй запрос
  42.         $url2  = 'https://login.vk.com/?act=login&soft=1&utf8=1';
  43.         $url2 .= '&ip_h=' . $ip_h;
  44.         $url2 .= '&to=' . $to;
  45.         $url2 .= '&_origin=' . $_origin;
  46.         $url2 .= '&email=' . $login;
  47.         $url2 .= '&pass=' . $password;
  48.        
  49.     mPrint("Send POST request 2: ".$url2);
  50.        
  51.         list($headers, $reply) = $http->sendPostRequest($url2, '', true);      
  52.                
  53.         //Третий запрос
  54.         $cookies1 = $http->getPageCookies($headers);
  55.         $headers = $http->formatHeadersArray($headers);
  56.         $location = @$headers['Location'];
  57.        
  58.     mPrint("Send GET request 3: ".$location);
  59.        
  60.         list($headers, $html) = $http->sendGetRequest($location, '', true);            
  61.                
  62.         $confirmUrl = $http->parseParam($html, '<form method="post" action="','">');           
  63.         $cookies = $http->getPageCookies($headers);
  64.                
  65.         $http->setCookie('remixsid='.$cookies['remixsid'].';remixlang=3'.';s='.$cookies1['s'].';l='.$cookies1['l'].';p='.$cookies1['p'].';h='.$cookies1['h']);
  66.        
  67.     mPrint("Send POST request 4: ".$confirmUrl);
  68.        
  69.         list($headers, $reply)  = $http->sendPostRequest($confirmUrl, '', true);                               
  70.         $headers = $http->formatHeadersArray($headers);        
  71.         $location = trim(@$headers['Location']);
  72.  
  73.         $token      = $http->parseParam($location, 'https://oauth.vk.com/blank.html#access_token=','&expires_in');
  74.     mPrint("access_token: ".$token);
  75.    
  76.     $expires_in = $http->parseParam($location, 'expires_in=','&user_id');
  77.     mPrint("expires_in: ".$expires_in);
  78.    
  79.     $user_id    = $http->parseParam($location, 'user_id=','&email');
  80.     mPrint("user_id: ".$user_id);
  81.    
  82.     $email      = $http->parseParam($location, 'email=','&secret');
  83.     mPrint("email: ".$email);
  84.    
  85.     $secret     = $http->parseParam($location, 'secret=','');
  86.     mPrint("secret: ".$secret);
  87.  
  88.   /*==============================*
  89.   | Ниже этой строчки не работает |
  90.   *==============================*/
  91.         //Запрос users.get
  92.         $url3  = '/method/users.get?';
  93.         $url3 .= 'uid=' . $user_id;
  94.     $url3 .= '&v=5.24';
  95.         $url3 .= '&access_token=' . $token;
  96.    
  97.     $Sig = md5('$url3.$secret');
  98.     mPrint("url3 + secret: ".$url3."<b>".$secret."</b>");
  99.    
  100.     $url3 .= '&sig=' . $Sig;
  101.    
  102.     mPrint("Send GET request users.get: ".$url3);
  103.        
  104.         $html2 = $http->sendGetRequest("https://api.vk.com".$url3, '', false);
  105.    
  106.     mPrint($html2);
  107.  
  108.   /*================================*
  109.   | Скрипт выводит следующие данные |
  110.   *================================*/
  111. // Send GET request 1:  https://oauth.vk.com/authorize?client_id=4559692&scope=notify,friends,photos,audio,video,docs,notes,pages,status,offers,questions,wall,groups,mail,messages,notifications,stats,ads,offline,nohttps&redirect_uri=http://oauth.vk.com/blank.html&display=mobile&v=5.24&response_type=token&revoke=1
  112. // Send POST request 2: https://login.vk.com/?act=login&soft=1&utf8=1&ip_h=2db93bac25f80608f0&to=aHR0cHM6Ly9vYXV0aC52ay5jb20vYXV0aG9yaXplP2NsaWVudF9pZD00NTU5NjkyJnJlZGlyZWN0X3VyaT1odHRwJTNBJTJGJTJGb2F1dGgudmsuY29tJTJGYmxhbmsuaHRtbCZyZXNwb25zZV90eXBlPXRva2VuJnNjb3BlPTIwNzk5OTkmdj01LjI0JnN0YXRlPSZyZXZva2U9MSZub2h0dHBzPTEmZGlzcGxheT1tb2JpbGU-&_origin=https://oauth.vk.com&email=?????@yandex.ru&pass=*********
  113. // Send GET request 3:  https://oauth.vk.com/authorize?client_id=4559692&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&response_type=token&scope=2079999&v=5.24&state=&revoke=1&nohttps=1&display=mobile&__q_hash=640da9d4180222f9a56ba98e5b56b1c3
  114. // Send POST request 4: https://login.vk.com/?act=grant_access&client_id=4559692&settings=2079999&redirect_uri=http%3A%2F%2Foauth.vk.com%2Fblank.html&response_type=token&direct_hash=0fe500e8c4829c2707&token_type=1&v=5.24&state=&display=mobile&ip_h=2db93bac25f80608f0&hash=1b3da1a03dd035d244&https=1
  115. // token: 5b6058ec33f60ac4814c6e76017052fc0685dcd57eb7e150d78eddf0357b1df517f25f06260352c81defd
  116. // expires_in: 0
  117. // user_id: 223???049
  118. // email: ?????@yandex.ru
  119. // secret: 993e25be49d1daaea7
  120. // url3 + secret: /method/users.get?uid=223???049&v=5.24&access_token=5b6058ec33f60ac4814c6e76017052fc0685dcd57eb7e150d78eddf0357b1df517f25f06260352c81defd993e25be49d1daaea7
  121. // Send GET request users.get: /method/users.get?uid=223???049&v=5.24&access_token=5b6058ec33f60ac4814c6e76017052fc0685dcd57eb7e150d78eddf0357b1df517f25f06260352c81defd&sig=7962ad18fb3c7bfba8000edbc7e7f474
  122. // {"error":{"error_code":5,"error_msg":"User authorization failed: sig param is incorrect, sig=md5('\/method\/users.get?uid=223???049&v=5.24&access_token=5b6058ec33f60ac4814c6e76017052fc0685dcd57eb7e150d78eddf0357b1df517f25f06260352c81defd'+SECRET)","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"users.get"},{"key":"uid","value":"223675049"},{"key":"v","value":"5.24"},{"key":"access_token","value":"5b6058ec33f60ac4814c6e76017052fc0685dcd57eb7e150d78eddf0357b1df517f25f06260352c81defd"},{"key":"sig","value":"7962ad18fb3c7bfba8000edbc7e7f474"}]}}
  123. ?>
  124.  


Подключаемый class файл Http.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class HttpTools {    
  4.         const DEFAULT_HEADER = "User-Agent: Mozilla/5.0+(Windows+NT+6.2;+WOW64)+AppleWebKit/537.11+(KHTML,+like+Gecko)+Chrome/23.0.1271.95+Safari/537.11\r\nConnection: Close\r\n";
  5.    
  6.     protected $defaultHeaders;
  7.     protected $cookie;
  8.  
  9.     public function __construct($headers = self::DEFAULT_HEADER) {
  10.         $this->defaultHeaders = $headers;
  11.         $this->cookie = '';
  12.     }
  13.  
  14.     public function getCookie() {
  15.         return $this->cookie;
  16.     }
  17.     public function setCookie($cookie) {
  18.         $this->cookie = null == $cookie || '' == $cookie ? $cookie :
  19.             'Cookie: ' . (is_array($cookie) ?
  20.                 implode("\r\nCookie: ", $cookie) :
  21.                 str_replace('Cookie: ', '', $cookie)) . "\r\n";
  22.     }
  23.  
  24.     public function sendGetRequest($url, $headerExtra = '', $returnHeaders = false, $redirects = null) {
  25.         $parsedUrl = parse_url($url);
  26.         $host = $parsedUrl['host'];
  27.         //$url  = $this->resolveNames($url, $host);
  28.  
  29.         $header  = "Host: $host\r\n";
  30.         $header .= $this->defaultHeaders;
  31.         $header .= $headerExtra;
  32.         if (isset($this->cookie) && '' != $this->cookie) {
  33.             $header .= $this->cookie;
  34.         }
  35.  
  36.         $http = array('method'  => 'GET', 'header'  => $header);
  37.         if (isset($redirects)) {
  38.             $http['max_redirects'] = $redirects;
  39.         }
  40.         $context = stream_context_create(array('http' => $http));
  41.  
  42.         $response = @file_get_contents($url, false, $context);
  43.         if (false === $response || '' === $response) {
  44.             if (! isset($http_response_header)) {
  45.                 throw new NetworkException($host);
  46.             }
  47.             if (isset($redirects) && $redirects > 0) {
  48.                 $headers = $this->formatHeadersArray($http_response_header);
  49.                 $location = trim(@$headers['Location']);
  50.                 if (! empty($location)) {
  51.                     if (0 !== strpos($location, 'http')) {
  52.                         $location = 'http://' . $host . $location;
  53.                     }
  54.                     return $this->sendGetRequest($location, $headerExtra,
  55.                         $returnHeaders, $redirects-1);
  56.                 }
  57.             }
  58.             $response = '<error>' . $this->getHttpCode($http_response_header) . '</error>';
  59.         }
  60.         return ! $returnHeaders ? $response :
  61.             array($http_response_header, $response);
  62.     }
  63.  
  64.     public function sendPostRequest($url, $headerExtra = '', $returnHeaders = false) {
  65.         $parsedUrl = parse_url($url);
  66.         $host   = $parsedUrl['host'];
  67.         $params = isset($parsedUrl['query']) ? $parsedUrl['query'] : null;
  68.         //$url    = $this->resolveNames($url, $host);
  69.  
  70.         $header  = "Host: $host\r\n";
  71.         $header .= $this->defaultHeaders;
  72.         $header .= $headerExtra;
  73.         if (isset($this->cookie) && '' != $this->cookie) {
  74.             $header .= $this->cookie;
  75.         }
  76.  
  77.         $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  78.         $context = stream_context_create(array(
  79.             'http' => array(
  80.                 'protocol_version' => 1.1,
  81.                 'max_redirects' => 1,
  82.                 'method'  => 'POST',
  83.                 'timeout' => 50,
  84.                 'content' => $params,
  85.                 'header'  => $header)));
  86.  
  87.         $url = str_replace("?$params", '', $url);
  88.         $response = @file_get_contents($url, false, $context);
  89.         if (false === $response || '' === $response) {
  90.             if (! isset($http_response_header)) {
  91.                 throw new NetworkException($host);
  92.             }
  93.             $response = '<error>' . $this->getHttpCode($http_response_header) . '</error>';
  94.         }
  95.         return ! $returnHeaders ? $response :
  96.             array($http_response_header, $response);
  97.     }
  98.  
  99.     public function sendMixedPostRequest($url, $params, $headerExtra = '', $returnHeaders = false) {
  100.         $parsedUrl = parse_url($url);
  101.         $host = $parsedUrl['host'];
  102.  
  103.         $header  = "Host: $host\r\n";
  104.         $header .= $this->defaultHeaders;
  105.         $header .= $headerExtra;
  106.         if (isset($this->cookie) && '' != $this->cookie) {
  107.             $header .= $this->cookie;
  108.         }
  109.  
  110.         $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  111.         $context = stream_context_create(array(
  112.             'http' => array(
  113.                 'protocol_version' => 1.1,
  114.                 'method'  => 'POST',
  115.                 'timeout' => 50,
  116.                 'content' => $params,
  117.                 'header'  => $header)));
  118.  
  119.         $response = @file_get_contents($url, false, $context);
  120.         if (false === $response || '' === $response) {
  121.             $response = '<error>' . $this->getHttpCode($http_response_header) . '</error>';
  122.         }
  123.         return ! $returnHeaders ? $response :
  124.             array($http_response_header, $response);
  125.     }
  126.  
  127.     protected function getHttpCode($headers, $takeLast = true) {
  128.         if ($takeLast) {
  129.             $headers = array_reverse($headers);
  130.         }
  131.         foreach ($headers as $header) {
  132.             if (0 === strpos($header, 'HTTP/')) {
  133.                 return $header;
  134.             }
  135.         }
  136.         return null;
  137.     }
  138.  
  139.     # temporary solution for vk.com problem
  140.    protected function resolveNames($url, $host) {
  141.         if (false !== strpos($host, 'vk.com')) {
  142.             $ip = @gethostbyname($host);
  143.             if (empty($ip) || $ip == $host) {
  144.                 $url = str_replace('login.vk.com', '87.240.131.120', $url);
  145.                 $url = str_replace('vk.com', '87.240.131.119', $url);
  146.             }
  147.         }
  148.         return $url;
  149.     }
  150.  
  151.     public function getPageCookies($headers) {
  152.         $cookies = array();
  153.         foreach ($headers as $header) {
  154.             if (0 === strpos($header, 'Set-Cookie: ')) {
  155.                 $cookie = substr($header, strlen('Set-Cookie: '));
  156.                 if (false !== strpos($cookie, ';')) {
  157.                     $cookie = substr($cookie, 0, strpos($cookie, ';'));
  158.                 }
  159.                 list($name, $value) = explode('=', $cookie);
  160.                 if (isset($cookies[$name])) {
  161.                     for ($i = 1; isset($cookies[$name . $i]); $i++);
  162.                     $name .= $i;
  163.                 }
  164.                 $cookies[$name] = $value;
  165.             }
  166.         }
  167.         return $cookies;
  168.     }
  169.  
  170.     public function formatHeadersArray($headers) {
  171.         $newHeaders = array();
  172.         foreach ($headers as $header) {
  173.             if (false === strpos($header, ': ')) {
  174.                 $newHeaders[] = $header;
  175.             } else {
  176.                 list($key, $value) = explode(': ', $header, 2);
  177.                 $newHeaders[$key] = $value;
  178.             }
  179.         }
  180.         return $newHeaders;
  181.     }
  182.  
  183.     public static function checkUrl($url) {
  184.         $headers = get_headers($url);
  185.         return ! empty($headers) && false !== strpos($headers[0], "200 OK");
  186.     }
  187.        
  188.         public function parseParam($scope, $prefix, $suffix, $default = null, $occurence = 1) {
  189.                 if (! isset($scope) || ! is_string($scope)) {
  190.             return $default;
  191.         }
  192.         for ($start = 0; $occurence > 0; $occurence--) {
  193.             $start = null == $prefix || '' == $prefix ? 0 :
  194.                strpos($scope, $prefix, $start);
  195.             if (false === $start) {
  196.                 return $default;
  197.             }
  198.             $start += strlen($prefix);
  199.         }
  200.         $stop =  null == $suffix || '' == $suffix ? strlen($scope) :
  201.             strpos($scope, $suffix, $start);
  202.         if (false === $stop) {
  203.             return $default;
  204.         }              
  205.         return substr($scope, $start, $stop - $start);
  206.     }  
  207. }
  208. ?>
  209.  


P.S. Перепробовал кучу сторонних слассов, перечитал кучу статей и ничего не выходит. Проблема по моему мнению зарыта вот тут http://vk.com/dev/api_nohttps, но разобраться не получается.
 
 Top
RickMan
Отправлено: 25 Сентября, 2014 - 14:11:38
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Цитата:
Доступ к API ВКонтакте может быть получен из автономной программы на компьютере или мобильном устройстве пользователя.

А если быть еще точнее, то это приложение которое может порадить в себе окно браузера, которое в итоге вернет токет. В браузере такого вы делать не сможете. Вам не standalone приложение надо делать. И вообще, ползуйтесь документацией для разработчиков от ВК, Там ясно все описанно, и примеры кода есть.
 
 Top
hiddensy
Отправлено: 25 Сентября, 2014 - 14:21:21
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




RickMan пишет:
А если быть еще точнее, то это приложение которое может порадить в себе окно браузера, которое в итоге вернет токет. В браузере такого вы делать не сможете. Вам не standalone приложение надо делать. И вообще, ползуйтесь документацией для разработчиков от ВК, Там ясно все описанно, и примеры кода есть.


Я пытаюсь сделать эмуляцию standalone на php. Методы описанные в руководстве безусловно рабочие и их я читал и пробывал. Если уж скрипт получил бессрочный access_token, то и общаться с API как то же можно....

(Отредактировано автором: 25 Сентября, 2014 - 14:22:05)

 
 Top
RickMan
Отправлено: 25 Сентября, 2014 - 14:31:19
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Вы не сможете в браузеле сэмулировать вызов окна браузера, которым сможете управлять так же, как это делают приложения на телефоне. Поэтому советую вам не изобретать неведомо что, а пользоваться тем, что дали.
https://vk[dot]com/dev/auth_sites
https://vk[dot]com/dev/openapi

(Отредактировано автором: 25 Сентября, 2014 - 14:31:54)

 
 Top
hiddensy
Отправлено: 25 Сентября, 2014 - 15:37:47
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




RickMan пишет:
Вы не сможете в браузеле сэмулировать вызов окна браузера, которым сможете управлять так же, как это делают приложения на телефоне.


RickMan, Вы сильно ошибаетесь, т.к. Вы ограничены документацией которую Вам дали разработчики BK. Есть рабочие методы для моего варианта.
 
 Top
RickMan
Отправлено: 25 Сентября, 2014 - 16:03:11
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




hiddensy пишет:
RickMan пишет:
Вы не сможете в браузеле сэмулировать вызов окна браузера, которым сможете управлять так же, как это делают приложения на телефоне.


RickMan, Вы сильно ошибаетесь, т.к. Вы ограничены документацией которую Вам дали разработчики BK. Есть рабочие методы для моего варианта.


Я делаю так как написанно в документации и уверен, что эти методы не будут прикрыты в любой момент) Прежде чем использовать методы которые работают в обход документации, подумайте, почему это не описанно в документации.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB