Что нового

Обращение к API ВКонтакте

Коршун

Новичок
Сообщения
58
Репутация
1
Re: Обращение к API vk.com и обработка полученных данных

Работает!

Не очень понял что с авторизацией намудрил, хэш получил по старой схеме
По-моему перемудрил с массивом $pURLs
И почему тип файла "file", вместо "photo" при загрузке?
Не забудь про описание фото при сохранении ;)

А вообще - спасибо большое за труд!
Как всегда - красавец)) :IL_AutoIt_1:
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Re: Обращение к API vk.com и обработка полученных данных

Коршун сказал(а):
Не очень понял что с авторизацией намудрил, хэш получил по старой схеме
Если сравнивать "1.2.2.1 (rc1)" с версией "1.1.3.1 (beta)", то различия небольшие:
1.1.3.1 (beta):
Код:
_VK_API_OAuth($VK_LogIN, $VK_PassWORD, $VK_API_ID, $VK_Scope = 2015231)

$VK_LogIN - логин
$VK_PassWORD - пароль
$VK_API_ID - ID приложения
$VK_Scope - права доступа (по-умолчанию: 2015231)

1.2.2.1 (rc1):
Код:
_VK_API_OAuth($VK_LogIN, $VK_PassWORD, $VK_Cookie = False, $VK_API_ID = Default, $VK_Scope = 2015231)

$VK_LogIN - логин
$VK_PassWORD - пароль
$VK_Cookie - использование куков (по-умолчанию: нет)
$VK_API_ID - ID приложения (по-умолчанию: Default = 2987875)
$VK_Scope - права доступа (по-умолчанию: 2015231)

Если тебя смущают куки и используешь свое приложение:
Код:
_VK_API_OAuth($VK_LogIN, $VK_PassWORD, False, "0123456789")

*** 0123456789 - ID приложения

Коршун сказал(а):
По-моему перемудрил с массивом $pURLs
Теоретически не мог перемудрить... это ответ от сервера, в котором мы берем ссылку
Коршун сказал(а):
И почему тип файла "file", вместо "photo" при загрузке?
Тестировал отправку запроса изображений через раздел для разработчиков - Charles показал в запросе "file". Соответственно решил его и оставить, но возможно с "photo" так же работает
Коршун сказал(а):
Не забудь про описание фото при сохранении ;)
Не помню я уже как добавлять описание к фотографиям. Да и не помню делал ли...
Если будет время - сделаю и описание.

На счет описания к загрузке фото:
Код:
...
$VK_group_id = ""
$sCaption = "Здесь описание к фото"
...
If StringInStr($WinHTTPFileUpload, 'photos_list') Then
...
_VK_GetMethod("photos.save", $_VK_GetQ&"&server="&$sServer&"&photos_list="&$sPhotos_list&"&hash="&$sHash&"&caption="&$sCaption)
EndIf
...
 

Коршун

Новичок
Сообщения
58
Репутация
1
Re: Обращение к API vk.com и обработка полученных данных

---Zak--- сказал(а):
1.2.0.1 (rc1):
Код:
_VK_API_OAuth($VK_LogIN, $VK_PassWORD, $VK_Cookie = False, $VK_API_ID = Default, $VK_Scope = 2015231)
Может лучше было не менять последовательность? Ерунда, но меня ввела в ступор))
Код:
_VK_API_OAuth($VK_LogIN, $VK_PassWORD, $VK_API_ID = Default, $VK_Cookie = False, $VK_Scope = 2015231)


---Zak--- сказал(а):
Тестировал отправку запроса изображений через раздел для разработчиков - Charles показал в запросе "file". Соответственно решил его и оставить, но возможно с "photo" так же работает
В методах API VK указано "photo", думаю разницы нет сегодня, но может появиться "завтра" :scratch:

---Zak--- сказал(а):
Если все будет хорошо и будет работать - переделаю это все в божеское состояние и уже закину функцию в "VK_Desktop_API".
Вроде все хорошо, буду ждать библиотеку. Спасибо!!! :beer:
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Re: Обращение к API vk.com и обработка полученных данных

Как быть с двухэтапной аутентификацией? Поддержка намечается?)
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Re: Обращение к API vk.com и обработка полученных данных

SECTOR сказал(а):
Как быть с двухэтапной аутентификацией? Поддержка намечается?)
Я уже думал это никому не надо и никто не использует... за исключением Коршун'а.

Двухэтапная - если необходимо можно попробовать реализовать. Если это нужно.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Re: Обращение к API vk.com и обработка полученных данных

---Zak--- сказал(а):
Двухэтапная - если необходимо можно попробовать реализовать. Если это нужно.
Вот мои попытки реализации этого: тема ...

Код:
#include <GUIConstants.au3>
#include <IE.au3>
Global $iAppID, $access_token

$iAppID = 4923780

$access_token = _VKAuth($iAppID, "offline,photos")
If Not @error Then
	MsgBox(0, "Auth OK! Access_token", $access_token, 30)
Else
	MsgBox(16, "Auth Error", "error#" & @error, 30)
EndIf

;========================================;
Func _VKAuth($aid, $scope = "offline")
	Local $gui, $oIE, $sAuthURL, $url, $flag, $token
	$sAuthURL = "https://oauth.vk.com/authorize?client_id=" & $aid & "&scope=" & $scope & "&redirect_uri=https://oauth.vk.com/blank.html&display=mobile&v=5.33&response_type=token"
	$oIE = _IECreateEmbedded()
	If Not IsObj($oIE) Then Return SetError(1, 0, 0)
	$gui = GUICreate("VK API авторизация", 640, 580, (@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
	GUICtrlCreateObj($oIE, 10, 40, 600, 360)
	GUISetState(@SW_SHOW)
	_IENavigate($oIE, $sAuthURL)
	If @error Then
		GUIDelete($gui)
		Return SetError(2, 0, 0)
	EndIf
	$flag = 0
	While 1
		$url = _IEPropertyGet($oIE, "locationurl")
		If StringInStr($url, '/blank.html#') Then
			ConsoleWrite("URL: " & $url & @CRLF)
			$token = StringRegExpReplace($url, '.*?access_token=([^&]+).*', '$1')
			If @extended = 0 Then $token = ""
			$expires = StringRegExpReplace($url, '.*?expires_in=([\d]+).*', '$1')
			If @extended = 0 Then $expires = 0
			$uid = StringRegExpReplace($url, '.*?user_id=([\d]+).*', '$1')
			If @extended = 0 Then $uid = 0
			If $token <> "" Then $flag = 1
			ConsoleWrite(StringFormat("Info: token: %s; expires: %s; user ID: %s\r\n", $token, $expires, $uid))
			ExitLoop
		EndIf
		If GUIGetMsg() = $GUI_EVENT_CLOSE Then ExitLoop
	WEnd
	GUIDelete($gui)
	If $flag = 1 Then
		Return $token
	Else
		Return SetError(3, 0, 0)
	EndIf
EndFunc   ;==>_VKAuth
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Re: Обращение к API vk.com и обработка полученных данных

Временно использую этот метод
Код:
Func _VK_API_OAuth_IE($VK_API_ID,$VK_Scope = 2015231)

	Local $oIE = _IECreateEmbedded()
	If @error Then Return __vk_ErrorReport("_IECreateEmbedded Error")

	Local $iOpt = Opt("GUIOnEventMode",0)

	Local $hGUI = GUICreate("VK",600,500,-1,-1,0x00080000+0x00040000)
	GUICtrlCreateObj($oIE,0,0,600,500)
	GUICtrlSetResizing(-1,1)
	_IENavigate($oIE,'http://oauth.vk.com/authorize?client_id='&$VK_API_ID&'&redirect_uri=http://api.vk.com/blank.html&scope='&$VK_Scope&'&display=wap&response_type=token',1)
	GUISetState()

	Local $url = ""
	While 1
		$url = _IEPropertyGet($oIE,"locationurl")

		If StringInStr($url,"access_token=") <> 0 Then ExitLoop
		If StringInStr($url,"error=") <> 0 Then
			GUIDelete()
			Opt("GUIOnEventMode",$iOpt)
			Return -1
		EndIf

		Switch GUIGetMsg()
			Case -3
				GUIDelete()
				Opt("GUIOnEventMode",$iOpt)
				Return -1
		EndSwitch
	WEnd

	GUIDelete()
	Opt("GUIOnEventMode",$iOpt)

	$vAT = __responseParse($url)
	$url = ''
	If IsArray($vAT) And $vAT[1][0] = "access_token" Then
		$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1')
		If @error Then
			_VK_API_Error(100)
		EndIf
		$oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc')
		$oRequest.Option(6) = False ;WinHttpRequestOption_EnableRedirects
		Return $vAT
	Else
		Return -1
	EndIf

EndFunc

Func __vk_ErrorReport($sText)

	Local $sTime = _NowCalc()
	FileWriteLine(@ScriptDir&"\VkError.log",$sTime&" :: "&$sText)
	ConsoleWrite("---------------------"&@CRLF&"! Vk - "&$sText&@CRLF&"-+++++++++++++++++++"&@CRLF)

EndFunc


Но использование IE меня не очень радует(
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Re: Обращение к API vk.com и обработка полученных данных

Привет всем.

Я сейчас нашел другой вариант работы с API VK - без "XML DOM wrapper (COM)", думаю двухэтапную и выход новой версии чуть задержится... особенно с праздниками.
Хочу уйти от дополнительной библиотеки и получать данные в JSON. Массив получения данных будет такой же, код будет чуть меньше.

Первоначальная авторизация уже есть - но на капчу при заходе все никак не выйти, чтобы я смог ее отловить.

PS: двухэтапную пробовал пройти через "WinHttp" - там с запросами все хорошо и сделать все можно.
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Re: Обращение к API vk.com и обработка полученных данных

Примечание разработки:
Версия AutoIt: 3.3.14.2

Версия разработки:
  • 1.3.0.1 (1.3-a)
    Изменение метода получения данных: используем JSON
  • 1.3.0.2 (1.3-a2)
    Реализована двухэтапная аутентификация (подтверждение входа через SMS)
  • 1.3.1.3 (1.3-b3)
    Исправления ошибок в функции _VK_GetMethod - некоторые методы возвращали некорректный JSON для _JSON_Decode

Подробно:
  • Данная версия ознакомительная (тестовая), возможны ошибки в работе ПО.
  • нет необходимости использовать библиотеку "XML DOM wrapper (COM)"
  • Не используются "куки" и другие функции
  • Название функции авторизации заменена на "_VK_API_OAuth2", параметры передаваемые прежние: ($VK_Email, $VK_PassWORD, $_cookie = False, $VK_API_ID = Default, $VK_Scope = 2015231)
  • Переименован глобальный массив получения данных - $VK_GM. Содержимое/структура остались прежними

Скачать:
github.com: Github.com/VK_Desktop_API/alpha

Инструкция в примерах:
Код:
#include <VK_Desktop_API.au3>

$VK_LogIN 		= ""
$VK_PassWORD 	= ""

	_VK_API_OAuth2($VK_LogIN, $VK_PassWORD)

;~ 	users.isAppUser
	_VK_GetMethod("users.isAppUser")
	_ArrayDisplay($VK_GM, "users.isAppUser")

;~ 	users.get "fields=photo_50,city,verified"
	_VK_GetMethod("users.get", "fields=photo_50,city,verified")
	_ArrayDisplay($VK_GM, "users.get")

;~ audio.get "count=20"
	_VK_GetMethod("audio.get", "count=20")
	_ArrayDisplay($VK_GM, "audio.get")

;~ 	groups.getById "group_id=sosimc" & audio.get "owner_id=-"&$groupsID&"&count=3"
	_VK_GetMethod("groups.getById", "group_id=sosimc")
	 $groupsID = $VK_GM[3][_BDF("gid")]
	_VK_GetMethod("audio.get", "owner_id=-"&$groupsID&"&count=3")
	_ArrayDisplay($VK_GM, "groups.getById & audio.get")

Снимок:
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Re: Обращение к API vk.com и обработка полученных данных

Примечание разработки:
Версия AutoIt: 3.3.14.2

Версия разработки:
  • 1.3.1.4 (1.3-b4)
    Исправление ошибок связанных с методом "photos.getUploadServer"
    Добавлена функция _WinHTTP_FileUpload

Пример реализации загрузки изображений в альбом:
Код:
#include <VK_Desktop_API.au3>

$VK_LogIN 		= ""
$VK_PassWORD 	= ""

	_VK_API_OAuth2($VK_LogIN, $VK_PassWORD)

	$VK_album_id = ""			;ID альбома
	$VK_group_id = ""			;ID группы

	$sCaption = "Описание изображения" ;Описание изображения

	$_VK_GetQ = 'album_id='&$VK_album_id
	 If $VK_group_id Then $_VK_GetQ &= '&group_id='&$VK_group_id
	_VK_GetMethod("photos.getUploadServer", $_VK_GetQ)

	$sLocalFile = FileOpenDialog('Open Images Files', @ScriptDir, 'Images (*.jpg;*.jpeg)')
	$sURL = $VK_GM[2][_BDF("upload_url")]

	$WinHTTPFileUpload = _WinHTTP_FileUpload($sLocalFile, $sURL, 'file')
	If StringInStr($WinHTTPFileUpload, 'photos_list') Then
		$sServer = StringRegExpReplace($WinHTTPFileUpload, '(?s).*?server":(.*?),.*', '$1')
		$sPhotos_list = StringRegExpReplace($WinHTTPFileUpload, '(?s).*?photos_list":"\[\{(.*?)\}\].*', '$1')
		$sPhotos_list = StringRegExpReplace($sPhotos_list, '\\"', '"')
		$sPhotos_list = '[{'&$sPhotos_list&'}]'
		$sHash = StringRegExpReplace($WinHTTPFileUpload, '(?s).*?hash":"(.*?)".*', '$1')
		_VK_GetMethod("photos.save", $_VK_GetQ&"&server="&$sServer&"&photos_list="&$sPhotos_list&"&hash="&$sHash&"&caption="&$sCaption)
	EndIf

Пример реализации загрузки музыки из группы "Ленинград" (http://vk.com/sosimc):
Код:
#include <VK_Desktop_API.au3>

$VK_LogIN 		= ""
$VK_PassWORD 	= ""

	_VK_API_OAuth2($VK_LogIN, $VK_PassWORD)

;~ 	groups.getById "group_id=sosimc" & audio.get "owner_id=-"&$groupsID&"&count=3"
	_VK_GetMethod("groups.getById", "group_id=sosimc")
	 $groupsID = $VK_GM[2][_BDF("gid")]
	_VK_GetMethod("audio.get", "owner_id=-"&$groupsID&"&count=20")

	$VK_GM = _InetGetURL($VK_GM, _BDF("url"))

Func _InetGetURL($ARR, $URL, $InetGetDir = Default)
	If $InetGetDir == Default Then $InetGetDir = @ScriptDir&'\audio'
	If Not FileExists($InetGetDir) Then DirCreate($InetGetDir)

	For $i = 2 To UBound($ARR)-1
		If StringInStr($ARR[$i][$URL], '?extra=') Then
			$ARR[$i][$URL] = StringRegExpReplace($ARR[$i][$URL], '\\', '$1')
			$ARR[$i][$URL] = StringRegExpReplace($ARR[$i][$URL], '(.*?)\?extra.*', '$1')
		EndIf
		$FileN = _FilterSTR($ARR[$i][_BDF("artist")]&" - "&$ARR[$i][_BDF("title")])
		$FileE = StringRegExpReplace($ARR[$i][$URL], '.*?\.(.*?)', "$1")
		$FilePath = $InetGetDir&"\"&$FileN &"."& $FileE
		If FileExists($FilePath) Then
			TrayTip("DownMusic - ("&$i&"/"&UBound($ARR)-1&")", "FileExists: " &$FileN &"."& $FileE, 1, 2)
		Else
			TrayTip("DownMusic - ("&$i&"/"&UBound($ARR)-1&")", "FileInetGet: "&$FileN &"."& $FileE, 5, 1)
			InetGet($ARR[$i][$URL], $FilePath, 1)
		EndIf
	Next
	Return $ARR
EndFunc

Func _FilterSTR($STR_F)
	$STR_F = StringRegExpReplace($STR_F, "([\[\(]?http://\S+\.\S{2,})", "")
	$STR_F = StringRegExpReplace($STR_F, "[^а-яА-ЯёЁa-zA-Z\d\s-'\(\)&]", "")

	$STR_F = StringRegExpReplace($STR_F, "[\\/:;*?<>|.,]", "")
	$STR_F = StringRegExpReplace($STR_F, "amp", "")
	$STR_F = StringRegExpReplace($STR_F, "and", "&")

	$STR_F = StringStripWS ($STR_F, 7)
	Return $STR_F
EndFunc
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
Примечание разработки:

Версия AutoIt: 3.3.14.2
Версия: 1.4.1.1 (beta)/(1.4-b1)
  • Полное или частичное переименование функций + частичное обновление функций библиотеки.
  • Привязка к версии API ВКонтакте (5.53)
  • С вводом режима 'offline' на уровне "Права доступа для токена пользователя" отсутствует необходимость вести разработку в сторону получения и обработки 'Cookie' после авторизации пользователя. К сожалению, данный метод еще не реализован.
  • Получение 2D массива на стадии декодирования JSON ответа. В некоторых случаях функция __JSONDecode работает не корректно... Временно стоят 'легкие заглушки'.

ОСНОВНЫЕ ФУНКЦИИ:
Код:
;~ ===============================================================================
;~    _vAPI_OAuth2 - первоначальная авторизации пользователя
;~    _vAPI_GETMethod - выполнение запросов к API ВКонтакте
;~    _vAPI_TOKENParse - получение access_token 
;~    _vAPI_SCOPE - разрешение прав доступа
;~
;~    _ARRS - возвращение позиции столбца в 2D массиве по первичному элементу
;~    _WinHTTP_FileUpload - функция используется для загрузки изображений
;~
;~    _vGUI_CAPTCHA - вывод GUI с требованием ввода кода с картинки (Captcha). 
;~    _vGUI_AUTHCODE - вывод GUI ввода данных для двухэтапной аутентификации
;~
;~    __JSONDecode - декодирование JSON ответа API и реализации 2D массива
;~ ===============================================================================


ИНСТРУКЦИЯ:
1. Подключить UDF VK_desktop_API.au3
2. Вызвать функцию первоначальной авторизации _vAPI_OAuth2 с 2 обязательными параметрами
  • 'VKAPI_login' - адрес эл. почты или телефон
  • 'VKAPI_pass' - пароль
  • 'VKAPI_ID' - ID standalone-клиента (по-умолчанию = 2987875)
  • 'VKAPI_SCOPE' - запрашиваемые права доступа приложения (по-умолчанию: см. версию скрипта)
3. Вызвать функцию _vAPI_GETMethod указав название метода
  • 'VKAPI_METHOD' - название метода API ВКонтакте
  • 'VKAPI_PARAM' - дополнительные параметры метода API ВКонтакте
4. Результатом функции _vAPI_GETMethod будет глобальный массив $aFun. При необходимости есть возможность сохранять результат _vAPI_GETMethod в свою переменную

ПРИМЕР (1.4-b1):
Код:
#include <VK_Desktop_API.au3>
;~ -------------------------------------------------------------------------------
;~ Name: Example VK_Desktop_API
;~ Author: Valan4ig
;~ NickName: ---Zak---
;~ Version: 1.4.1.1 (1.4-b1)
;~ Author URI: http://vk.com/id859000
;~ -------------------------------------------------------------------------------

   $VKAPI_login = 'YouEmailOrPhone'
   $VKAPI_pass 	= 'YouPassword'
   
;~ Первоначальная авторизация пользователя с указанием ID standalone-клиента по-умолчанию (2987875), а так же прав доступа (136232095)
_vAPI_OAuth2($VKAPI_login, $VKAPI_pass)

;~ Получает настройки текущего пользователя в данном приложении.
_vAPI_GETMethod("account.getAppPermissions")
   _ArrayDisplay($aFun, '$aFun')


Код:
#include <VK_Desktop_API.au3>
;~ -------------------------------------------------------------------------------
;~ Name: Example VK_Desktop_API
;~ Author: Valan4ig
;~ NickName: ---Zak---
;~ Version: 1.4.1.1 (1.4-b1)
;~ Author URI: http://vk.com/id859000
;~ -------------------------------------------------------------------------------

   $VKAPI_login = 'YouEmailOrPhone'
   $VKAPI_pass 	= 'YouPassword'
   
;~ Первоначальная авторизация пользователя с указанием ID standalone-клиента по-умолчанию (2987875), а так же прав доступа к друзьям, фотографиям, аудиозаписям
Local $aLOCAL = ['friends', 'photos', 'audio']
_vAPI_OAuth2($VKAPI_login, $VKAPI_pass, Default, $aLOCAL)

;~ Возвращает список аудиозаписей пользователя. Количество аудиозаписей = 20
_vAPI_GETMethod("audio.get", "count=20")
      _ArrayDisplay($aFun, '$aFun')


Код:
#include <VK_Desktop_API.au3>
;~ -------------------------------------------------------------------------------
;~ Name: Example VK_Desktop_API
;~ Author: Valan4ig
;~ NickName: ---Zak---
;~ Version: 1.4.1.1 (1.4-b1)
;~ Author URI: http://vk.com/id859000
;~ -------------------------------------------------------------------------------

   $VKAPI_login = 'YouEmailOrPhone'
   $VKAPI_pass 	= 'YouPassword'
   
;~ Первоначальная авторизация пользователя с указанием ID standalone-клиента по-умолчанию (2987875), а так же прав доступа к API в любое время с бессрочным ключом
_vAPI_OAuth2($VKAPI_login, $VKAPI_pass, Default, 'offline')

;~ Возвращает информацию о сообществе идентификатор или короткое имя сообщества равному sosimc (официальная группа ВКонтакте группировке 'Ленинград")
_vAPI_GETMethod("groups.getById", "group_id=sosimc")
   _ArrayDisplay($aFun, '$aFun')
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
---Zak---
Уже не работает, можно обновить?
 
Автор
---Zak---

---Zak---

Скриптер
Сообщения
455
Репутация
120
CreatoR
Добрый день.

Извиняюсь, что так долго здесь не появлялся.
А что именно не работает ? Какой метод VK запускаете ?

PS: скачал с GitHub и запустил пример... все сработало.
 

Cornet

Знающий
Сообщения
41
Репутация
6
При авторизации не могу получить доступ к messages, не знаете в чем может быть причина?
И главное раньше видимо был доступ, но не нужен был, а сейчас и старое приложение не работает пока не уберешь разрешения на messages ((


Добавлено:
Сообщение автоматически объединено:

Хм, вот стоит написать вопрос и сам ответ находишь https://vk.com/apiclub?w=wall-1_390510
Как и было анонсировано, секция Messages отключена для вызова с ключами доступа пользователя. Сейчас вызов https://vk.com/dev/messages с пользовательским токеном приложений, не прошедших модерацию, вернет ошибку 15: «access denied to call this method».
А попытка авторизоваться с правом доступа messages — ошибку «This application has no right to use messages»

Если Вы планируете получить права на работу с сообщениями пользователя в своем приложении, напишите, пожалуйста, нам, указав тему «Ограничение Messages API» и приложив следующие данные:
— идентификатор приложения;
— ссылку на скачивание приложения, если есть;
— скринкаст работы приложения;
— описание функциональности.

И вот вздумалось же мне писать прогу через час после отключения (((
 
Верх