0

TwitPic に写真をアップロードする機能を備えた iPhone アプリに取り組んでいます。基本認証で動作しています。

OAuthで動作させようとしています。認証エラーが発生しています。私は TwitPic のドキュメントを注意深く調べました。

UI Web ビューを表示してアプリを承認すると、PIN 値が返されます。アプリに PIN 値を入力し、トークンを要求します。

ステータスの更新を Twitter にアップロードできますが、写真はアップロードできません。

私のコードは、ここからのいくつかのサンプルコードに基づいています:

OAuth を使用した iPhone アプリの例

これが私のコードです:

NSString *url = @"http://api.twitpic.com/2/upload.json";
NSString *oauth_header = [oAuth oAuthHeaderForMethod:@"POST" andUrl:url andParams:nil];

NSLog(@"OAuth header : %@\n\n", oauth_header);

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
[request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"];
request.requestMethod = @"POST";

[request addRequestHeader:@"X-Auth-Service-Provider" value:@"https://api.twitter.com/1/account/verify_credentials.json"];   

[request addRequestHeader:@"X-Verify-Credentials-Authorization" value:oauth_header];    

NSData *imageRepresentation = UIImageJPEGRepresentation(imageToUpload, 0.8);        
[request setData:imageRepresentation forKey:@"media"];
[request setPostValue:@"Some Message"  forKey:@"message"];  
[request setPostValue:TWITPIC_API_KEY  forKey:@"key"];  

[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestFailed:)];

[request start];    

OAuth ヘッダーは次のとおりです。

OAuth realm="http://api.twitter.com/", oauth_timestamp="1275492425", oauth_nonce="b686f20a18ba6763ac52b689b2ac0c421a9e4013", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="zNbW3Xi3MuS7i9cpz6fw", oauth_version="1.0", oauth_token="147275699-jmrjpwk3B6mO2FX2BCc9Ci9CRBbBKYW1bOni2MYs", oauth_signature="d17HImz6VgygZgbcp845CD2qNnI%3D"
4

4 に答える 4

3

HA!見つけた!https://api.twitter.com/1/account/verify_credentials.jsonでヘッダーを作成し、http://api.twitpic.com/2/upload.jsonに投稿する必要があります。(そしてGETを使用してください)

    NSString *fakeurl = @"https://api.twitter.com/1/account/verify_credentials.json";
NSString *oauth_header = [oAuth oAuthHeaderForMethod:@"GET" andUrl:fakeurl andParams:nil];

NSLog(@"OAuth header : %@\n\n", oauth_header);

NSString *url = @"http://api.twitpic.com/2/upload.json";
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
request.delegate = self;
[request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"];
request.requestMethod = @"GET";

[request addRequestHeader:@"X-Verify-Credentials-Authorization" value:oauth_header];    
[request addRequestHeader:@"X-Auth-Service-Provider" value:@"https://api.twitter.com/1/account/verify_credentials.json"];   


NSData *imageRepresentation = UIImageJPEGRepresentation([UIImage imageNamed:@"IMG_0717.jpg"], 0.2);    
if (imageRepresentation) {
    NSLog(@"Pic not nil");
}
[request setData:imageRepresentation forKey:@"media"];
[request setPostValue:@"twitpic, i hate you. die painfully."  forKey:@"message"];  
[request setPostValue:twitPicKey  forKey:@"key"];  

[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestFailed:)];

[request start];
于 2010-06-15T08:05:09.227 に答える
3

GSTwitPicEngineを使用します: https://github.com/Gurpartap/GSTwitPicEngine

GSTwitPicEngine の使用:

クラスまたは必要に応じてエンジンを初期化します。

self.twitpicEngine = (GSTwitPicEngine *)[GSTwitPicEngine twitpicEngineWithDelegate:self];

認証トークンを見つけて、twitpicEngine に次のように指定します。

[twitpicEngine setAccessToken:token];

次に、画像をアップロードしてテキスト メッセージを添付します (Twitter には投稿しません)。

[twitpicEngine uploadPicture:[UIImage imageNamed:@"mypic.png"]  withMessage:@"Hello world!"]; // This message is supplied back in success delegate call in request's userInfo.

画像のみをアップロードするには:

[twitpicEngine uploadPicture:uploadImageView.image];

リクエストが終了すると、デリゲート メソッドの 1 つが適切なデータと情報とともに呼び出されます。


GSTwitPicEngineDelegate プロトコルは、次の 2 つのデリゲート メソッドを指定します。

- (void)twitpicDidFinishUpload:(NSDictionary *)response {
  NSLog(@"TwitPic finished uploading: %@", response);

  // [response objectForKey:@"parsedResponse"] gives an NSDictionary of the response one of the parsing libraries was available.
  // Otherwise, use [[response objectForKey:@"request"] objectForKey:@"responseString"] to parse yourself.

  if ([[[response objectForKey:@"request"] userInfo] objectForKey:@"message"] > 0 && [[response objectForKey:@"parsedResponse"] count] > 0) {
    // Uncomment to update status upon successful upload, using MGTwitterEngine's instance.
    // [twitterEngine sendUpdate:[NSString stringWithFormat:@"%@ %@", [[[response objectForKey:@"request"] userInfo] objectForKey:@"message"], [[response objectForKey:@"parsedResponse"] objectForKey:@"url"]]];
  }
}

- (void)twitpicDidFailUpload:(NSDictionary *)error {
  NSLog(@"TwitPic failed to upload: %@", error);

  if ([[error objectForKey:@"request"] responseStatusCode] == 401) {
    // UIAlertViewQuick(@"Authentication failed", [error objectForKey:@"errorDescription"], @"OK");
  }
}

準備完了?

于 2011-05-06T12:15:36.217 に答える
0

ヘッダーを生成するOAuthメソッドはGETである必要があります。POSTではありません。

また、URLはhttps://api.twitter.com/1/account/verify_credentials.jsonである必要があります

于 2010-06-10T14:17:16.403 に答える
0

ありがとう、これは私もそれを機能させるのに役立ちました:) http://github.com/jaanus/PlainOAuthを機能するサンプルコードで更新しました。

于 2010-07-04T08:28:27.727 に答える