Речь идет про [Ссылки могут видеть только зарегистрированные пользователи. ]!
Предисловие:
Захотелось как-то набросать скрипт который будет выполнять авторизацию пользователя в приложении. Получать ключ(acces_token) и работать с ним.
Так вот это не так уж и сложно, причем если у нас в запасе есть [Ссылки могут видеть только зарегистрированные пользователи. ]
В него нам понадобиться положить константой ссылку на авторизацию в приложени(страницу где пользователь подтверждает то, что согласен позволить приложению выполнять определенные действия) [Ссылки могут видеть только зарегистрированные пользователи. ]
У меня вышла вот такая:
Код:
public $UrlOAuth = "https://oauth.vk.com/authorize?client_id=3890571&scope=15391&redirect_uri=blank.html&display=mobile&v=5.1&response_type=token";
Еще нужны переменные для хранения Логина, Пароля, Куков и Ключа доступа и просто переменная для установки состояния авторизации:
Код:
//Переменная для хранения куков
public $Cookie = null;
//Переменная для хранения ключа доступа
public $Acces = null;
// Переменная хранит логин
public $Login = null;
//Пароль
public $Password = null;
//Авторизован?
public $AuthInVk = false;
Создадим простенький конструктор нашего класса:
Код:
//Конструктор класса
public function VkApi($login,$pass)
{
$this->Login = $login;
$this->Password = $pass;
//Функция авторизации описана в гайде ниже
$this->Login();
}
Нам понадобиться:
Функция для парсинга (что бы доставать из запроса нужные части)
Функция отправки HTTP запросов к серверу vk.api с помощью curl
Функция отправки метода к vk.api
Функция парсинга проста и имеет вид (описывать ее не вижу смысла, если вы не понимаете этого - читайте книги и изучайте):
Отправка запросов (все ищите в описании библиотеки) но параметры передаваемые понятны как никогда (все брал из примера использовани и таблицы параметров):
//Функция для отправки метода вк
function Method($name, $params)
{
//Записываем на отправку ключ доступа и данные переданные функцие
$MethodData = "access_token=".$this->Acces.$params;
//Отправляем запросс
$some = $this->SendMassege("https://api.vk.com/method/".$name."?".$MethodData,null);
//Возвращаем ответ
return $some;
}
И конечно же функция авторизации и получения ключа (все описано в коментариях):
Код:
function Login()
{
$text = $this->SendMassege("http://m.vk.com/");
//Получаем ссылку на вторизацию
$some = $this->Parse($text, "<form method=\"post\" action=\"", "\"");
$action = $some[0];
//Составляем данные на отправку
$toSend = "email=".$this->Login."&pass=".$this->Password;
//Отправляем запросс авторизации
$text = $this->SendMassege($action,$toSend);
$arr_cook = $this->Parse($text, "Set-Cookie: ", ";");
//Записываем куки в нашу переменную
if (is_array($arr_cook))
{
foreach($arr_cook as $st)
{
$this->Cookie .= $st.";";
}
}
//Отправляем запросс на автризацию в приложении
$text = $this->SendMassege($this->UrlOAuth,"").'\r\n';
//Получаем ссылку на авторизацию
$some = $this->Parse($text, "<form method=\"post\" action=\"", "\"");
//Отправляем запросс
$text = $this->SendMassege($some[0],"").'\r\n';
//Получаем ключ доступа
$some = $this->Parse($text, "access_token=", "&");
//Сохраняем ключ
$text = $this->SendMassege("http//vk.com/login.php?act=security_check&to=&al_page=","");
$this->Acces = $some[0];
echo "Key = ".$this->Acces."<br />";
}
Все мы получили полноценный класс для работы с VkApi мы его можем улучшать как угодно и добавлять функции для работы с определенными запросами к апи: VkApi.php
Код:
<?php
/**
* @author Boxya
* @copyright 2013
*/
class VkApi{
//Ссылка на оконо автоиизации приложения
public $UrlOAuth = "https://oauth.vk.com/authorize?client_id=3890571&scope=15391&redirect_uri=blank.html&display=mobile&v=5.1&response_type=token";
//Переменная для хранения куков
public $Cookie = null;
//Переменная для хранения ключа доступа
public $Acces = null;
// Переменная хранит логин
public $Login = null;
//Пароль
public $Password = null;
//Авторизован ли в вк
public $AuthInVk = false;
//Конструктор класса
public function VkApi($login,$pass)
{
$this->Login = $login;
$this->Password = $pass;
}
//Функция парсинга
function Parse($what, $start, $end)
{
$i=0;
while (true)
{
$pos1 = strpos($what,$start);
if ($pos1 == FALSE)
break;
$pos1 =$pos1 + strlen($start);
$pos2 = strpos($what,$end,$pos1);
if ($pos2 == FALSE)
{
break;
}
$arr[$i] = substr($what,$pos1,$pos2-$pos1);
$i++;
$what = substr($what,$pos1);
}
return $arr;
}
//Функция авторизации
function Login()
{
$text = $this->SendMassege("http://m.vk.com/");
//Получаем ссылку на вторизацию
$some = $this->Parse($text, "<form method=\"post\" action=\"", "\"");
$action = $some[0];
//Составляем данные на отправку
$toSend = "email=".$this->Login."&pass=".$this->Password;
//Отправляем запросс авторизации
$text = $this->SendMassege($action,$toSend);
$arr_cook = $this->Parse($text, "Set-Cookie: ", ";");
//Записываем куки в нашу переменную
if (is_array($arr_cook))
{
foreach($arr_cook as $st)
{
$this->Cookie .= $st.";";
}
}
//Отправляем запросс на автризацию в приложении
$text = $this->SendMassege($this->UrlOAuth,"").'\r\n';
//Получаем ссылку на авторизацию
$some = $this->Parse($text, "<form method=\"post\" action=\"", "\"");
//Отправляем запросс
$text = $this->SendMassege($some[0],"").'\r\n';
//Получаем ключ доступа
$some = $this->Parse($text, "access_token=", "&");
//Сохраняем ключ
$text = $this->SendMassege("http//vk.com/login.php?act=security_check&to=&al_page=","");
$this->Acces = $some[0];
echo "Key = ".$this->Acces."<br />";
}
function ChangeStatusOnUnixTime()
{
$resp = $this->Method("status.set","&text=".time());
echo "Response on status change = ".$resp;
}
//Функция для отправки метода вк
function Method($name, $params)
{
//Записываем на отправку ключ доступа и данные переданные функцие
$MethodData = "access_token=".$this->Acces.$params;
//Отправляем запросс
$some = $this->SendMassege("https://api.vk.com/method/".$name."?".$MethodData,null);
//Возвращаем ответ
return $some;
}
//Функция отправки запросса
function SendMassege($url, $post=null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'FIREFOX');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_POST, ($post==null)? 0:1);
if($post!=null)
{
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
}
if($this->Cookie!=null)
{
curl_setopt($ch, CURLOPT_COOKIE, $this->Cookie);
}
$res=curl_exec($ch);
curl_close($ch);
if(strpos($res,"Location:")===false)
null;
// Проверка на смену локации
else
{
$location = $this->Parse($res,"Location: ","\r\n");
if($location[0] != "/")
$res .=$this->SendMassege($location[0]);
}
return $res;
}
}
?>
Послесловие:
Парсинг JSON я не описывал, но он у меня есть. Кому нужно могу дать, причем в PHP есть функция
Код:
json_decode($parametr);
Проверить очень просто:
Код:
$test = new VkApi("login","password");
$test->ChangeStatusOnUnixTime();
[Ссылки могут видеть только зарегистрированные пользователи. ]
Результат
Код:
{"response" : 1}
говорит о том, что все прошло удачно!
На странице будет установлен статус, в котором написано юникс время.
Спасибо за внимание. Код писал сам, все у кого есть исправления по коду пишите. Буду рад вас выслушать
Пример кода, который ставит в статус количество дней, минут и секунд оставшихся до нового года:
Код:
function SetStatusNewYearTime()
{
$realtime = mktime(0, 0, 0, 01, 01, date('Y')+1);
$futuretime = $realtime - time();
$resp = $this->Method("status.set","&text=".urlencode(date("New Year: j days h hours i minutes s seconds", $futuretime)));
}
Только вопрос, чем стандартный конструктор хуже(который создается при создание класса) __construct(#параметры){#code}
вроде нет никакого переопределения методов далее в коде
Только вопрос, чем стандартный конструктор хуже(который создается при создание класса) __construct(#параметры){#code}
вроде нет никакого переопределения методов далее в коде
Кто создается? Где создается?
Конструктор __construct ничем не отличается от моего, у вас наверное IDE которая создает автоматически, а я пишу в Notepad++.
[Ссылки могут видеть только зарегистрированные пользователи. ].
________________
Разработка программ на заказ, все вопросы skype - the-boxi, ICQ - 616027961
Последний раз редактировалось the-boxi; 03.02.2014 в 11:55.