Skip to content

Instantly share code, notes, and snippets.

@Gargo
Created June 16, 2011 06:00
Show Gist options
  • Save Gargo/1028758 to your computer and use it in GitHub Desktop.
Save Gargo/1028758 to your computer and use it in GitHub Desktop.
//
// EBVKAPI.m
// anyMusicAnywhere
//
// Created by Eric_Bro on 28.02.11.
// Copyright 2011 DevStudio. All rights reserved.
//
#import "EBVKAPI.h"
NSDictionary* dictionaryWithSessionParametersFromVKAPI(NSString* email,
NSString* password) {
// Посылаем "пустой" запрос - для того чтобы получить куки.
NSURL *url = [NSURL URLWithString:
[NSString stringWithFormat:@"http://vk.com/login.php?email=%@&pass=%@&m=1",email,password]];
NSData *empty_request = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url]
returningResponse:nil
error:nil];
empty_request = nil;
// Получаем исходный код страницы авторизации
NSString *new_url = [NSString stringWithFormat:@"http://vk.com/login.php?app=%@&layout=popup&type=browser&settings=16383",sAPI_ID);
NSData *raw_data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:new_url]]
returningResponse:nil
error:nil];
NSString *pageSource = [[NSString alloc] initWithData:raw_data encoding: NSASCIIStringEncoding];
// Проверка пароля\мыла
if ([pageSource rangeOfString:@"var app_settings_hash = \'\';"].length != 0) {
NSLog(@"Wrong pass or\\and email!");
exit(-1);
}
// Ищем в коде значение переменной "auth_hash"
NSString *auth_hash = getStringBetweenStrings(@"var auth_hash = \'",@"\';",pageSource);
// Получаем параметры сессии
JSONDecoder *decoder = [JSONDecoder decoder];
[pageSource release];
return [decoder parseJSONData:[NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"http://vk.com/login.php?act=a_auth&app=%@&hash=%@&permanent=1",sAPI_ID,auth_hash]]]
returningResponse:nil
error:nil]];
}
NSDictionary * executeAPIMethod(NSString* nameOfMethod,
NSMutableDictionary* parametersOfMethod,
NSString* formatOfAnswer,
NSDictionary *sessionVar) {
NSString *bodyOfRequest =@"";
NSString *sig = @"";
sig = [sig stringByAppendingFormat:@"%@",[sessionVar objectForKey:@"mid"]];
[parametersOfMethod setObject:sAPI_ID
forKey:@"api_id"];
[parametersOfMethod setObject:formatOfAnswer
forKey:@"format"];
[parametersOfMethod setObject:@"3.0"
forKey:@"v"];
[parametersOfMethod setObject:nameOfMethod
forKey:@"method"];
NSArray *arrayOfAllKeys = [[parametersOfMethod allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
for (id obj in arrayOfAllKeys){
bodyOfRequest = [bodyOfRequest stringByAppendingFormat:@"&%@=%@",
(NSString*)obj, [[parametersOfMethod objectForKey:obj] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
sig = [sig stringByAppendingFormat:@"%@=%@",
(NSString*)obj, [parametersOfMethod objectForKey:obj]];
}
sig = [sig stringByAppendingFormat:@"%@",[sessionVar objectForKey:@"secret"]];
sig = MD5(sig);
bodyOfRequest = [bodyOfRequest substringFromIndex:1];
bodyOfRequest = [bodyOfRequest stringByAppendingFormat:@"&sid=%@&sig=%@",[sessionVar valueForKey:@"sid"],sig];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString:
[NSString stringWithFormat:@"http://api.vkontakte.ru/api.php?%@",bodyOfRequest]]];
NSData *VKanswer = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
return [[JSONDecoder decoder] parseJSONData:VKanswer];
}
NSString* getStringBetweenStrings(NSString *first,NSString*second,NSString*main){
NSRange rangeofFirst = [main rangeOfString:first];
NSRange rangeOfSecond = [main rangeOfString:second];
if ((rangeofFirst.length == 0) || (rangeOfSecond.length == 0)) {
return nil;
}
NSString *result = [[main substringFromIndex:rangeofFirst.location+rangeofFirst.length]
substringToIndex:
[[main substringFromIndex:rangeofFirst.location+rangeofFirst.length] rangeOfString:second].location];
return result;
}
NSString* MD5(NSString*input) {
const char* str = [input UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment