AndrewShmig / Vkontakte-iOS-SDK-LV

[iOS] Powerful & flexible Vkontakte iOS SDK Latest Version
79 stars 23 forks source link

Ввод капчи #11

Closed nikburnt closed 11 years ago

nikburnt commented 11 years ago

Было бы замечательно добавить возможность ввода капчи по требованию vk. Пока что это единственное препятствие для перевода некоторых наших проектов на Ваше API. Спасибо за Вашу работу)

AndrewShmig commented 11 years ago

@daspisch, я подумал над этим предложением и в некотором смысле нахожусь в недоумении до сих пор, что именно Вы хотите получить, если ВК запросит ввод капчи?

Дополнительная информация по капче находится по этой ссылке: https://vk.com/dev/captcha_error

Давайте объясню, как сейчас происходит работа запросов и ответов. Будем рассматривать на примере слишком частого получения пользовательской информации, что в итоге приведет к запросу капчи.

Предположим есть такой код:

for(int i=0; i<=100000; i++){
   [[VKUser currentUser] infoWithCustomOptions:@{ 
      @"uids": @100,
      @"fields": @"nickname,online,last_seen"
   }];
}

Получим 100к запросов. На какой-то из них ответом сервера будет сообщение об ошибке примерно такого содержания:

{"error":{"error_code":14,"error_msg":"Captcha needed","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"captcha.force"},{"key":"uids","value":"66748"},{"key":"access_token","value":"b9b5151856dcc745d785a6b604295d30888a827a37763198888d8b7f5271a4d8a049fefbaeed791b2882"}],"captcha_sid":"239633676097","captcha_img":"http:\/\/api.vk.com\/captcha.php?sid=239633676097&s=1"}} 

В любом случае при получении ответа в методе делегата VKRequest:response: вы должны будете проверить на наличие каких-то ошибок и соответствующим образом их обработать - обновить токен доступа, если пользователь удалил приложение у себя, либо запросить какие-то дополнительные права доступа, если для выполнения этого действия есть такая необходимость.

Так как при осуществлении запросов вы передаете список параметров (словарь), то при наличии капчи вы просто дописываете необходимые параметры, которые надо отправить после ввода капчи:

// пользователь ввел капчу
[[VKUser currentUser] infoWithCustomOptions:@{
    @"uids": @100,
    @"fields": @"nickname,online,last_seen",
    @"captcha_sid": @"239633676097",
    @"captcha_key": @"МзАл8"
}];

и всё.

Почему я не буду вводить отдельно обработки ситуации с запросом капчи - отображения UIAlertView или другим способом:

  1. запросы могут осуществляться в бэкграунде и при наличии ошибки в ответе, просто игнорировать их
  2. программист вправе выбрать сам наиболее удобный/красивый/подходящий способ отображения и ввода пользователем капчи, что будет вписываться в общий вид приложения, нежели фиксированый UIAlertView с текстовым полем + кнопкой.
  3. если я добавлю подобную обработку капчи отдельно это снизит гибкость системы, что меня не устраивает.

Если бы решение проблемы с капчей было бы действительно сложно реализовать с помощью текущих средств SDK, я бы внимательнее присмотрелся к тому, чтобы реализовать этот самый "фиксированный вариант". Но на данный момент проблем и сложностей с реализацией текущими средствами SDK нет.

AndrewShmig commented 11 years ago

Теперь нет необходимости самому обрабатывать тип ошибки и отлавливать капчу. Дополнил VKRequestDelegate двумя полезными методами:

/** Вызывается в случае, если в ответе есть ошибка

@param request запрос к которому относится вызов метода делегата
@param error ответ сервера с описанием ошибки
*/
- (void)   VKRequest:(VKRequest *)request
responseErrorOccured:(id)error;

/** Вызывается в случае, если требуется ввести капчу

Дополнительная информация по обработке капчи: https://github.com/AndrewShmig/Vkontakte-iOS-SDK-v2.0/issues/11

@param request запрос к которому относится вызов метода делегата
@param captchaSid идентификатор captcha
@param captchaImage ссылка на изображение, которое нужно показать пользователю, чтобы он ввел текст с этого изображения
*/
- (void)VKRequest:(VKRequest *)request
       captchaSid:(NSString *)captchaSid
     captchaImage:(NSString *)captchaImage;
makoni commented 10 years ago

Пример обработки капчи в своём UIViewController, может кому пригодится, если лень писать самому: https://github.com/makoni/vk-sdk-captcha-vc

vk-sdk-captcha-uiviewcontroller