SwiftでTwitterのタイムラインなどを取得する

SwiftでTwitterのタイムラインやプロフィール、バナー画像を取得したのでメモ

### 参考
こちらの記事をめちゃくちゃ参考にさせて頂きました
http://himaratsu.hatenablog.com/entry/twitter/api

# やること

- iOSに登録されているアカウントを使用する
- タイムラインの取得
- ユーザの取得
- バナー画像の取得
- ツイートする

# サンプルコード
GISTにあげておきました
iOSに登録されているアカウントを選択して、プロフィール画像とバナー画像を表示させるサンプルです
https://gist.github.com/SatoshiKawabata/c73542cb164d0abfe2a1

# 準備
使用するのはAccounts, Socialのフレームワークです

```swift:
import Accounts
import Social
```

# アカウントの取得

iOSに登録されているアカウントを取得するメソッドです
コールバックにアカウントの配列が返ってきます

```swift:
var accountStore:ACAccountStore = ACAccountStore()
var twAccount: ACAccount?

func getAccounts(callback: [ACAccount] -> Void) {
	
	let accountType:ACAccountType = accountStore.accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter)
	accountStore.requestAccessToAccountsWithType(accountType, options: nil) { (granted: Bool, error: NSError?) -> Void in
		if error != nil {
			print("error! \(error)")
			return
		}
		
		if !granted {
			print("error! Twitterアカウントの利用が許可されていません")
			return
		}
		
		let accounts = self.accountStore.accountsWithAccountType(accountType) as! [ACAccount]
		if accounts.count == 0 {
			print("error! 設定画面からアカウントを設定してください")
			return
		}
		
		print("アカウント取得完了")
		callback(accounts)
	}
}
```

# リクエストメソッド
リクエストを送るメソッドを汎用化します
コールバックにレスポンスデータが入ってきます

```swift:
func sendRequest(url: NSURL, requestMethod: SLRequestMethod, params: AnyObject?, responseHandler: (responseData: NSData!, urlResponse: NSHTTPURLResponse!) -> Void) {
	let request:SLRequest = SLRequest(
		forServiceType: SLServiceTypeTwitter,
		requestMethod: requestMethod,
		URL: url,
		parameters: params as? [NSObject : AnyObject]
	)
	request.account = twAccount
	request.performRequestWithHandler { (responseData: NSData!, urlResponse: NSHTTPURLResponse!, error: NSError!) -> Void in
		if error != nil {
			print("error is \(error)")
		} else {
			responseHandler(responseData: responseData, urlResponse: urlResponse)
		}
	}
}
```

# タイムラインの取得
先ほどのリクエストメソッドを使ってタイムラインの取得リクエストを送ります
コールバックにタイムラインのデータが返ってきます
Twitter APIのページ
https://dev.twitter.com/rest/reference/get/statuses/user_timeline

```swift:
func getTimeline(callbabk: NSMutableArray -> Void) {
	
	let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/statuses/user_timeline.json")!
	
	sendRequest(url, requestMethod: .GET, params: nil) { (responseData, urlResponse) -> Void in
		do {
			let result:NSMutableArray = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as! NSMutableArray
			callbabk(result)
		} catch {
			print("エラーが発生しました")
		}
	}
}
```

# ユーザ情報の取得
ユーザ情報の取得リクエストを送ります
コールバックにユーザ情報が返ってきます
Twitter APIのページ
https://dev.twitter.com/rest/reference/get/users/show

```swift:
// ユーザの情報を取得
func getUser(callback: NSMutableDictionary -> Void) {
	let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/users/show.json")!
	let params = ["screen_name" : (twAccount?.username)!]
	
	sendRequest(url, requestMethod: .GET, params: params) { (responseData, urlResponse) -> Void in
		do {
			let result:NSMutableDictionary = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as! NSMutableDictionary
			callback(result)
		} catch {
			print("エラーが発生しました")
		}
	}
}
```

# バナー画像の取得
バナー画像の情報を取得します
コールバックにバナー画像の各種URLが返ってきます
Twitter APIのページ
https://dev.twitter.com/rest/reference/get/users/profile_banner

```swift:
func getBanner(callback: NSMutableDictionary -> Void) {
	
	let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/users/profile_banner.json")!
	let params = ["screen_name" : (twAccount?.username)!]
	
	sendRequest(url, requestMethod: .GET, params: params) { (responseData, urlResponse) -> Void in
		do {
			let result: NSMutableDictionary = try NSJSONSerialization.JSONObjectWithData(responseData, options: .AllowFragments) as! NSMutableDictionary
			callback(result)
		} catch {
			print("エラーが発生しました")
		}
	}
}
```

# ツイートする
引数にツイートしたい文字列を渡せばツイートします
Twitter APIのページ
https://dev.twitter.com/rest/reference/post/statuses/update

```swift:
// 投稿
func postTweet(msg:String) {
	let url:NSURL = NSURL(string: "https://api.twitter.com/1.1/statuses/update.json")!
	let params = ["status" : msg]
	
	sendRequest(url, requestMethod: .POST, params: params) { (responseData, urlResponse) -> Void in
		// 投稿完了ハンドラ
		print(responseData)
	}
}
```