/** * @param integer $appId VK Application ID * @param string $email Email used to login * @param string $password Password used to login * @param integer $scope Access rights bit mask * @param string $devNull URL to dummy file. File must exists and be visible to script. * @throws Exception */ function __construct($appId, $email, $password, $scope, $devNull) { $query = array('client_id' => $appId, 'scope' => $scope, 'redirect_uri' => $devNull, 'display' => 'popup', 'response_type' => 'token', '_hash' => 0); $queryString = http_build_query($query); $oauthPage = CurlHelper::getUrl("http://oauth.vk.com/oauth/authorize?{$queryString}", array(CURLOPT_COOKIESESSION => true)); $phpQueryObject = phpQuery::newDocumentHTML($oauthPage); if ($phpQueryObject->find("form input[name=email]")->count() == 1) { $formData = array(); foreach ($phpQueryObject->find("form input") as $node) { $jNode = pq($node); $formData[$jNode->attr('name')] = $jNode->attr('value'); } $formData['email'] = $email; $formData['pass'] = $password; $formAction = $phpQueryObject->find("form")->attr('action'); $cookieFile = tempnam(sys_get_temp_dir(), 'vkCookie'); $loginData = CurlHelper::postUrl($formAction, $formData, array(CURLOPT_HEADER => 1, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_COOKIEJAR => $cookieFile, CURLOPT_COOKIEFILE => $cookieFile)); if (preg_match('#access_token=(\\w+)#', $loginData, $matches)) { $this->accessToken = $matches[1]; unlink($cookieFile); return; } elseif (preg_match('#onclick\\s*=\\s*"\\s*return\\s+allow\\s*\\(\\s*\\);?\\s*"#', $loginData, $matches)) { // we need approve application if (!preg_match('#function\\s+allow\\s*\\(\\s*\\)\\s*{.*?"(https://[^"]+)"#s', $loginData, $matches)) { throw new Exception('can\'t get access token'); } $loginData = CurlHelper::getUrl($matches[1], array(CURLOPT_HEADER => 1, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_COOKIEJAR => $cookieFile, CURLOPT_COOKIEFILE => $cookieFile)); if (preg_match('#access_token=(\\w+)#', $loginData, $matches)) { $this->accessToken = $matches[1]; unlink($cookieFile); return; } } elseif ($phpQueryObject->find("form input[name=email]")->count() == 1) { throw new Exception('wrong login/password'); } } throw new Exception('can\'t get access token'); }