在 iPhone 谷歌阅读器应用程序中将项目标记为已读/未读

发布于 2024-10-12 09:12:37 字数 2651 浏览 2 评论 0原文

我正在使用 google reader API 中的数据并使用 GData 用于登录。

我希望能够将表格单元格内的帖子标记为已读/未读,但我发现事实上这一切主要都没有记录,很难找到解决方案,有什么想法/链接吗?

这是标记已读按钮的代码:

//Get the token

NSString *tokenString = [NSString stringWithFormat:@"https://www.google.com/reader/api/0/token"];

NSURL *tokenURL = [NSURL URLWithString:tokenString];
NSMutableURLRequest *tokenRequest = [NSMutableURLRequest requestWithURL:tokenURL];

NSString *tokenStringResult;
NSArray *listItems;

NSError *tokenError = nil;
NSURLResponse *tokenResponse = nil;
NSData *tokenData = [NSURLConnection sendSynchronousRequest:tokenRequest
                                          returningResponse:&tokenResponse
                                                      error:&tokenError];
if (tokenData) 
{
    tokenStringResult = [[NSString alloc] initWithData:tokenData encoding:NSUTF8StringEncoding];

    listItems = [tokenStringResult componentsSeparatedByString:@"/"];
} 
else 
{
    NSLog(@"tokenError = %@", tokenError);
}

// Mark it as read

NSString *readerURLString = [NSString stringWithFormat:@"http://www.google.com/reader/api/0/edit-tag?a=user/-/state/com.google/read&async=true&s=feed/%@&i=%@&T=%@", siteLink, postID, [listItems lastObject]];

NSURL *readerURL = [NSURL URLWithString:readerURLString];

NSMutableURLRequest *readerRequest = [NSMutableURLRequest requestWithURL:readerURL];

[mAuth authorizeRequest:readerRequest];

NSError *error = nil;
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:readerRequest
                                     returningResponse:&response
                                                 error:&error];
if (data) 
{
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
    assert( [httpResponse isKindOfClass:[NSHTTPURLResponse class]] );

    NSLog(@"response.allHeaderFields = %@", [httpResponse allHeaderFields]);

    NSLog(@"response.statusCode = %i", [httpResponse statusCode]);

} 

来自此的日志是:

response.statusCode = {
"Cache-Control" = "private, max-age=0";
"Content-Length" = 1334;
"Content-Type" = "text/html; charset=UTF-8";
Date = "Fri, 21 Jan 2011 03:49:07 GMT";
Expires = "Fri, 21 Jan 2011 03:49:07 GMT";
Server = GSE;
"X-Content-Type-Options" = nosniff;
"X-Frame-Options" = SAMEORIGIN;
"X-Reader-Google-Version" = "527-000";
"X-Reader-User" = 01940378872835844713;
"X-Xss-Protection" = "1; mode=block";
}
response.statusCode = 400

I am developing an app using data from google reader's API and using GData for login.

I want to be able to mark a post inside a table cell as read / unread, but am finding the fact that this is all mainly undocumented hard to work out a solution, any ideas / links?

Here is the code for the mark read button:

//Get the token

NSString *tokenString = [NSString stringWithFormat:@"https://www.google.com/reader/api/0/token"];

NSURL *tokenURL = [NSURL URLWithString:tokenString];
NSMutableURLRequest *tokenRequest = [NSMutableURLRequest requestWithURL:tokenURL];

NSString *tokenStringResult;
NSArray *listItems;

NSError *tokenError = nil;
NSURLResponse *tokenResponse = nil;
NSData *tokenData = [NSURLConnection sendSynchronousRequest:tokenRequest
                                          returningResponse:&tokenResponse
                                                      error:&tokenError];
if (tokenData) 
{
    tokenStringResult = [[NSString alloc] initWithData:tokenData encoding:NSUTF8StringEncoding];

    listItems = [tokenStringResult componentsSeparatedByString:@"/"];
} 
else 
{
    NSLog(@"tokenError = %@", tokenError);
}

// Mark it as read

NSString *readerURLString = [NSString stringWithFormat:@"http://www.google.com/reader/api/0/edit-tag?a=user/-/state/com.google/read&async=true&s=feed/%@&i=%@&T=%@", siteLink, postID, [listItems lastObject]];

NSURL *readerURL = [NSURL URLWithString:readerURLString];

NSMutableURLRequest *readerRequest = [NSMutableURLRequest requestWithURL:readerURL];

[mAuth authorizeRequest:readerRequest];

NSError *error = nil;
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:readerRequest
                                     returningResponse:&response
                                                 error:&error];
if (data) 
{
    NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
    assert( [httpResponse isKindOfClass:[NSHTTPURLResponse class]] );

    NSLog(@"response.allHeaderFields = %@", [httpResponse allHeaderFields]);

    NSLog(@"response.statusCode = %i", [httpResponse statusCode]);

} 

the log from this is:

response.statusCode = {
"Cache-Control" = "private, max-age=0";
"Content-Length" = 1334;
"Content-Type" = "text/html; charset=UTF-8";
Date = "Fri, 21 Jan 2011 03:49:07 GMT";
Expires = "Fri, 21 Jan 2011 03:49:07 GMT";
Server = GSE;
"X-Content-Type-Options" = nosniff;
"X-Frame-Options" = SAMEORIGIN;
"X-Reader-Google-Version" = "527-000";
"X-Reader-User" = 01940378872835844713;
"X-Xss-Protection" = "1; mode=block";
}
response.statusCode = 400

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

空气里的味道 2024-10-19 09:12:37

因此,通过大量的试验和错误,我已经让它发挥作用了。

编辑 - 添加了授权码

NSString *GOOGLE_CLIENT_AUTH_URL    = @"https://www.google.com/accounts/ClientLogin?client=SomeName";
NSString *gSourceString             = @"SomeName";

NSMutableURLRequest *httpReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:GOOGLE_CLIENT_AUTH_URL]];
[httpReq setTimeoutInterval:30.0];
[httpReq setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[httpReq setHTTPMethod:@"POST"];

[httpReq addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

NSString *requestBody = [[NSString alloc]  initWithFormat:@"Email=%@&Passwd=%@&service=reader&accountType=HOSTED_OR_GOOGLE&source=%@", userString, passwordString, [NSString stringWithFormat:@"%@%d", gSourceString]];

[httpReq setHTTPBody:[requestBody dataUsingEncoding:NSASCIIStringEncoding]];

[requestBody release];

NSHTTPURLResponse *response = nil;

NSData *data    = nil;
NSString *responseStr       = nil;
NSArray *responseLines      = nil;

int responseStatus = 0;

data = [NSURLConnection sendSynchronousRequest:httpReq returningResponse:&response error:&error];

[httpReq release];

if ([data length] > 0) 
{
    responseStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    responseStatus = [response statusCode];

    if (responseStatus == 200 ) 
    {
        authOK = TRUE;
        NSLog(@"Successfully authenticated with Google.");
        NSArray *authLines = nil;
        authLines  = [responseStr componentsSeparatedByString:@"\n"];

        int j;
        for (j =0; j < [authLines count]; j++ ) 
        {
            if ([[authLines objectAtIndex:j] rangeOfString:@"Auth="].length != 0) {

                NSMutableString *teststring = [NSMutableString stringWithString:[authLines objectAtIndex:j]];

                [teststring replaceCharactersInRange:NSMakeRange(0,4) withString:@"auth"];

                authString = teststring;
            }
        }
    }
    }


 NSString *auth = [[NSString alloc] initWithString: [NSString stringWithFormat:@"GoogleLogin %@", authString]];

NSDictionary *createHeader = [[NSDictionary dictionaryWithObjectsAndKeys:@"www.google.com", @"Host", @"EditApp", @"User-Agent", @"gzip, deflate", @"Accept-Encoding", auth, @"Authorization", nil]retain];

[auth release];

NSURL *url =[NSURL URLWithString:@"http://www.google.com/reader/api/0/token?client=EditApp"];
NSData *recieveData;
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc]initWithURL:url];
[urlRequest setHTTPMethod:@"GET"];
[urlRequest setAllHTTPHeaderFields:createHeader];
NSURLResponse *response;
NSError *error;
recieveData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

// Get token 

NSString *pretokenString = [[NSString alloc] initWithData:recieveData encoding:NSASCIIStringEncoding];

tokenString = [pretokenString substringWithRange:NSMakeRange(2, [pretokenString length]-2)];

[pretokenString release];

[urlRequest release];

NSMutableURLRequest *thttpReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com/reader/api/0/edit-tag?"]];

[thttpReq setTimeoutInterval:30.0];

[thttpReq setHTTPMethod:@"POST"];

NSString *authHeader = [NSString stringWithFormat:@"GoogleLogin %@", authString];
[thttpReq addValue:authHeader forHTTPHeaderField:@"Authorization"];

[thttpReq addValue:@"Content-Type" forHTTPHeaderField:@"application/x-www-form-urlencoded"];

// siteLink is the url of the feed
// googlePostID is the id from the XML output: tag:google.com,2005:reader/item/e3345c69e174bdec

NSString *trequestBody = [[NSString alloc] initWithFormat:@"a=user/-/state/com.google/read&ac=edit-tags&s=feed/%@&i=%@&T=%@", siteLink, googlePostID, tokenString];

[thttpReq setHTTPBody:[trequestBody dataUsingEncoding:NSASCIIStringEncoding]];

NSURLConnection *con = [[NSURLConnection alloc]
                            initWithRequest:thttpReq
                            delegate:self
                            startImmediately:NO];
[con scheduleInRunLoop:[NSRunLoop currentRunLoop]
                   forMode:NSRunLoopCommonModes];
[con start];

So through alot of trial and error I've got it working.

EDIT - Added Auth code

NSString *GOOGLE_CLIENT_AUTH_URL    = @"https://www.google.com/accounts/ClientLogin?client=SomeName";
NSString *gSourceString             = @"SomeName";

NSMutableURLRequest *httpReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:GOOGLE_CLIENT_AUTH_URL]];
[httpReq setTimeoutInterval:30.0];
[httpReq setCachePolicy:NSURLRequestReloadIgnoringCacheData];
[httpReq setHTTPMethod:@"POST"];

[httpReq addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

NSString *requestBody = [[NSString alloc]  initWithFormat:@"Email=%@&Passwd=%@&service=reader&accountType=HOSTED_OR_GOOGLE&source=%@", userString, passwordString, [NSString stringWithFormat:@"%@%d", gSourceString]];

[httpReq setHTTPBody:[requestBody dataUsingEncoding:NSASCIIStringEncoding]];

[requestBody release];

NSHTTPURLResponse *response = nil;

NSData *data    = nil;
NSString *responseStr       = nil;
NSArray *responseLines      = nil;

int responseStatus = 0;

data = [NSURLConnection sendSynchronousRequest:httpReq returningResponse:&response error:&error];

[httpReq release];

if ([data length] > 0) 
{
    responseStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    responseStatus = [response statusCode];

    if (responseStatus == 200 ) 
    {
        authOK = TRUE;
        NSLog(@"Successfully authenticated with Google.");
        NSArray *authLines = nil;
        authLines  = [responseStr componentsSeparatedByString:@"\n"];

        int j;
        for (j =0; j < [authLines count]; j++ ) 
        {
            if ([[authLines objectAtIndex:j] rangeOfString:@"Auth="].length != 0) {

                NSMutableString *teststring = [NSMutableString stringWithString:[authLines objectAtIndex:j]];

                [teststring replaceCharactersInRange:NSMakeRange(0,4) withString:@"auth"];

                authString = teststring;
            }
        }
    }
    }


 NSString *auth = [[NSString alloc] initWithString: [NSString stringWithFormat:@"GoogleLogin %@", authString]];

NSDictionary *createHeader = [[NSDictionary dictionaryWithObjectsAndKeys:@"www.google.com", @"Host", @"EditApp", @"User-Agent", @"gzip, deflate", @"Accept-Encoding", auth, @"Authorization", nil]retain];

[auth release];

NSURL *url =[NSURL URLWithString:@"http://www.google.com/reader/api/0/token?client=EditApp"];
NSData *recieveData;
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc]initWithURL:url];
[urlRequest setHTTPMethod:@"GET"];
[urlRequest setAllHTTPHeaderFields:createHeader];
NSURLResponse *response;
NSError *error;
recieveData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

// Get token 

NSString *pretokenString = [[NSString alloc] initWithData:recieveData encoding:NSASCIIStringEncoding];

tokenString = [pretokenString substringWithRange:NSMakeRange(2, [pretokenString length]-2)];

[pretokenString release];

[urlRequest release];

NSMutableURLRequest *thttpReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com/reader/api/0/edit-tag?"]];

[thttpReq setTimeoutInterval:30.0];

[thttpReq setHTTPMethod:@"POST"];

NSString *authHeader = [NSString stringWithFormat:@"GoogleLogin %@", authString];
[thttpReq addValue:authHeader forHTTPHeaderField:@"Authorization"];

[thttpReq addValue:@"Content-Type" forHTTPHeaderField:@"application/x-www-form-urlencoded"];

// siteLink is the url of the feed
// googlePostID is the id from the XML output: tag:google.com,2005:reader/item/e3345c69e174bdec

NSString *trequestBody = [[NSString alloc] initWithFormat:@"a=user/-/state/com.google/read&ac=edit-tags&s=feed/%@&i=%@&T=%@", siteLink, googlePostID, tokenString];

[thttpReq setHTTPBody:[trequestBody dataUsingEncoding:NSASCIIStringEncoding]];

NSURLConnection *con = [[NSURLConnection alloc]
                            initWithRequest:thttpReq
                            delegate:self
                            startImmediately:NO];
[con scheduleInRunLoop:[NSRunLoop currentRunLoop]
                   forMode:NSRunLoopCommonModes];
[con start];
溺深海 2024-10-19 09:12:37

如果您熟悉 php,我最近写了一篇关于使用 google readi api 的教程。
http://mobile.tutsplus.com/tutorials/mobile-web-apps/building-a-mobile-web-application-with-the-google-reader-api/

我注意到的一件事是,在这个字符串

http://www.google.com/reader/api/0/edit-tag/a=user/-/state/com.google/read&async=true& ;s=feed/%@&i=%@

如果您不包含“编辑”标记,则网址应如下所示。你需要吗?编辑标签后。

http://www.google.com/reader/api/0/edit-tag?a=user/-/state/com.google/ read&async=true&s=feed/%@&i=%@&T=%@

用户登录后,您可以从此链接获取“编辑”令牌,https://www.google.com/reader/api/0/token

抱歉可以'对 Objective-C 的东西没有帮助。

If you are familiar with php I wrote a tutorial on using the google readi api recently.
http://mobile.tutsplus.com/tutorials/mobile-web-apps/building-a-mobile-web-application-with-the-google-reader-api/

One thing I notice is that in this string

http://www.google.com/reader/api/0/edit-tag/a=user/-/state/com.google/read&async=true&s=feed/%@&i=%@

Your not including the "edit" token the url should look like this. and you need the ? after edit-tag.

http://www.google.com/reader/api/0/edit-tag?a=user/-/state/com.google/read&async=true&s=feed/%@&i=%@&T=%@

You can get the "edit" token from this link once you have the user logged in, https://www.google.com/reader/api/0/token

Sorry can't help with objective-c stuff.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文