В прошлом посте я писал про скрипт на bash, который скачивает .torrent файлы с rutracker.org, используя bash. Ради эксперимента решил реализовать такой код на Obj-C.
// RutrackerSimpleDownload
// Created by Alexander Gusev on 12.04.13.
// Copyright (c) 2013 Alexander Gusev. All rights reserved.
// http://goooseman.ru
// Variables //
NSString *username = @"";
NSString *password = @"";
NSInteger fileID = 4296614;
NSString *fileLocation = @"/Users/goooseman/Downloads/"; //should be /path/to/file/ not /path/to/file. ~ doesn't work here
// Login Session (Getting cookies) //
NSURL *loginUrl = [NSURL URLWithString:@"http://login.rutracker.org/forum/login.php"];
NSMutableURLRequest *loginRequest = [NSMutableURLRequest requestWithURL:loginUrl];
NSHTTPURLResponse *loginResponse;
NSError* loginError;
NSString *post = [NSString stringWithFormat:@"login_username=%@&login_password=%@&login=Вход", username, password];
NSLog(@"%@", post);
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
[loginRequest setValue:[NSString stringWithFormat:@"%ld",[postData length]] forHTTPHeaderField:@"Content-Length"];
[loginRequest setTimeoutInterval:15];
[loginRequest setHTTPBody:postData];
[loginRequest setHTTPMethod:@"POST"];
[loginRequest setHTTPShouldHandleCookies:YES];
[NSURLConnection sendSynchronousRequest:loginRequest returningResponse:&loginResponse error:&loginError];
// Download file //
NSURL *torrentUrl = [NSURL URLWithString:[NSString stringWithFormat:@"http://dl.rutracker.org/forum/dl.php?t=%ld", fileID]];
NSLog(@"%@", torrentUrl);
NSHTTPURLResponse *torrentResponse;
NSError *torrentError;
NSMutableURLRequest *torrentRequest = [NSMutableURLRequest requestWithURL:torrentUrl];
NSString *torrentPost = [NSString stringWithFormat:@"t=%ld", fileID];
NSData *torrentPostData = [torrentPost dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
[torrentRequest setValue:[NSString stringWithFormat:@"%ld",[postData length]] forHTTPHeaderField:@"Content-Length"];
[torrentRequest setHTTPShouldHandleCookies:YES];
[torrentRequest setHTTPBody:torrentPostData];
[torrentRequest setHTTPMethod:@"POST"];
[torrentRequest setValue:[NSString stringWithFormat:@"t:%ld", fileID] forHTTPHeaderField:@"header"];
[torrentRequest setValue:[NSString stringWithFormat:@"http://rutracker.org/forum/viewtopic.php?t=%ld", fileID] forHTTPHeaderField:@"Referer"];
NSData *torrentUrlConnection = [NSURLConnection sendSynchronousRequest:torrentRequest returningResponse:&torrentResponse error:&torrentError];
[torrentUrlConnection writeToFile:[NSString stringWithFormat:@"%@[rutracker.org].t%ld.torrent", fileLocation, fileID] atomically:YES];
Знаете, что мне не нравится? Когда логинишься на rutracker.org с другого клиента, авторизация на всех других слетает. Видимо у них одновременно может существовать только одна валидная кука. В хроме приходится заново логинится каждый раз после использования этого кода. Хорошо, что код использует системный cookie jar (который использует Safari), благодаря этому авторизация в Safari не слетает.