获取推特好友列表?
Get twitter friends list?
我在 Twitter friends/list API 中收到 Bad Authentication data
回复。我在登录时获得用户 ID、屏幕名称、authToken 和 authTokenSecret。
func loadFollowers(userid:String) {
//let twapi = "https://api.twitter.com/1.1/followers/list.json?cursor=-1&user_id=\(session)&count=5000"
let twapi = "https://api.twitter.com/1.1/friends/list.json?cursor=-1&user_id=\(userid)&count=10"
let url2 = URL(string: twapi)!
print(url2)
URLSession.shared.dataTask(with: url2, completionHandler: { (data, response, error) in
//UIApplication.shared.isNetworkActivityIndicatorVisible = false
do {
let userData = try JSONSerialization.jsonObject(with: data!, options:[])
print(userData)
} catch {
NSLog("Account Information could not be loaded \(error)")
}
}).resume()
}
输出:
{
"errors": [
{
"code": 215,
"message": "Bad Authentication data."
}
]
}
friends/list.json
API 中需要发送哪些参数?
在本文档中,他们给出的所有参数都是可选的。
https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-list
因为这个 friends/list api 需要身份验证才能获取好友列表。
在Swift4.2、Xcode10.1和iOS12.1
终于找到了解决方案。这里首先我们需要授权然后需要实现好友列表api.
纯 Swift 代码不可用。但我在纯 swift.
中实现
如果你想从推特上获取friends/list数据你需要使用两个API的 .
1) oauth2/token API
2) friends/list API
在oauth2/token api你可以得到access token,因为你的好友列表需要access token。并且您需要用户ID,屏幕名称。
但是在这里你必须记住一个重点。
1) 首先使用oauth2/token api作为访问令牌。
2) 获取访问令牌后,使用 twitter 登录 api 获取 用户 ID 和屏幕名称。
3) 现在使用 friends/list api.
如果您首先使用 twitter 登录,然后使用 oauth2/token api 作为访问令牌,您可能会得到 错误的身份验证数据错误。所以请您按照以上3个步骤依次进行。
1) 获取访问令牌代码(oauth2/token api):
func getAccessToken() {
//RFC encoding of ConsumerKey and ConsumerSecretKey
let encodedConsumerKeyString:String = "sx5r...S9QRw".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
let encodedConsumerSecretKeyString:String = "KpaSpSt.....tZVGhY".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
print(encodedConsumerKeyString)
print(encodedConsumerSecretKeyString)
//Combine both encodedConsumerKeyString & encodedConsumerSecretKeyString with " : "
let combinedString = encodedConsumerKeyString+":"+encodedConsumerSecretKeyString
print(combinedString)
//Base64 encoding
let data = combinedString.data(using: .utf8)
let encodingString = "Basic "+(data?.base64EncodedString())!
print(encodingString)
//Create URL request
var request = URLRequest(url: URL(string: "https://api.twitter.com/oauth2/token")!)
request.httpMethod = "POST"
request.setValue(encodingString, forHTTPHeaderField: "Authorization")
request.setValue("application/x-www-form-urlencoded;charset=UTF-8", forHTTPHeaderField: "Content-Type")
let bodyData = "grant_type=client_credentials".data(using: .utf8)!
request.setValue("\(bodyData.count)", forHTTPHeaderField: "Content-Length")
request.httpBody = bodyData
let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(String(describing: error))")
return
}
let responseString = String(data: data, encoding: .utf8)
let dictionary = data
print("dictionary = \(dictionary)")
print("responseString = \(String(describing: responseString!))")
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}
do {
let response = try JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String, Any>
print("Access Token response : \(response)")
print(response["access_token"]!)
self.accessToken = response["access_token"] as! String
self.getStatusesUserTimeline(accessToken:self.accessToken)
} catch let error as NSError {
print(error)
}
}
task.resume()
}
输出:
{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAA............xqT3t8T"}
2) 使用推特代码登录
@IBAction func onClickTwitterSignin(_ sender: UIButton) {
//Login and get session
TWTRTwitter.sharedInstance().logIn { (session, error) in
if (session != nil) {
//Read data
let name = session?.userName ?? ""
print(name)
print(session?.userID ?? "")
print(session?.authToken ?? "")
print(session?.authTokenSecret ?? "")
// self.loadFollowers(userid: session?.userID ?? "")
//Get user email id
let client = TWTRAPIClient.withCurrentUser()
client.requestEmail { email, error in
if (email != nil) {
let recivedEmailID = email ?? ""
print(recivedEmailID)
} else {
print("error--: \(String(describing: error?.localizedDescription))");
}
}
//Get user profile image url's and screen name
let twitterClient = TWTRAPIClient(userID: session?.userID)
twitterClient.loadUser(withID: session?.userID ?? "") { (user, error) in
print(user?.profileImageURL ?? "")
print(user?.profileImageLargeURL ?? "")
print(user?.screenName ?? "")
}
let storyboard = self.storyboard?.instantiateViewController(withIdentifier: "SVC") as! SecondViewController
self.navigationController?.pushViewController(storyboard, animated: true)
} else {
print("error: \(String(describing: error?.localizedDescription))");
}
}
}
输出:
在这里你会得到userName, userId, authtoken, authTokenSecret, screen name and email等
3) 现在从 friends/list api 获取好友列表。在这里可以得到friends/list,users/lookup,followers/ids,followers/listapi的数据等...
func getStatusesUserTimeline(accessToken:String) {
let userId = "109....456"
let twitterClient = TWTRAPIClient(userID: userId)
twitterClient.loadUser(withID: userId) { (user, error) in
if user != nil {
//Get users timeline tweets
var request = URLRequest(url: URL(string: "https://api.twitter.com/1.1/friends/list.json?screen_name=KS....80&count=10")!) //users/lookup, followers/ids, followers/list
request.httpMethod = "GET"
request.setValue("Bearer "+accessToken, forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(String(describing: error))")
return
}
// let responseString = String(data: data, encoding: .utf8)
// let dictionary = data
// print("dictionary = \(dictionary)")
// print("responseString = \(String(describing: responseString!))")
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}
do {
let response = try JSONSerialization.jsonObject(with: data, options: [])
print(response)
} catch let error as NSError {
print(error)
}
}
task.resume()
}
}
}
此代码在任何地方均不可用。我为这段代码尝试了很多,为此我花了很多时间。谢谢。
我在 Twitter friends/list API 中收到 Bad Authentication data
回复。我在登录时获得用户 ID、屏幕名称、authToken 和 authTokenSecret。
func loadFollowers(userid:String) {
//let twapi = "https://api.twitter.com/1.1/followers/list.json?cursor=-1&user_id=\(session)&count=5000"
let twapi = "https://api.twitter.com/1.1/friends/list.json?cursor=-1&user_id=\(userid)&count=10"
let url2 = URL(string: twapi)!
print(url2)
URLSession.shared.dataTask(with: url2, completionHandler: { (data, response, error) in
//UIApplication.shared.isNetworkActivityIndicatorVisible = false
do {
let userData = try JSONSerialization.jsonObject(with: data!, options:[])
print(userData)
} catch {
NSLog("Account Information could not be loaded \(error)")
}
}).resume()
}
输出:
{
"errors": [
{
"code": 215,
"message": "Bad Authentication data."
}
]
}
friends/list.json
API 中需要发送哪些参数?
在本文档中,他们给出的所有参数都是可选的。
https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-list
因为这个 friends/list api 需要身份验证才能获取好友列表。
在Swift4.2、Xcode10.1和iOS12.1
终于找到了解决方案。这里首先我们需要授权然后需要实现好友列表api.
纯 Swift 代码不可用。但我在纯 swift.
中实现如果你想从推特上获取friends/list数据你需要使用两个API的 .
1) oauth2/token API
2) friends/list API
在oauth2/token api你可以得到access token,因为你的好友列表需要access token。并且您需要用户ID,屏幕名称。
但是在这里你必须记住一个重点。
1) 首先使用oauth2/token api作为访问令牌。
2) 获取访问令牌后,使用 twitter 登录 api 获取 用户 ID 和屏幕名称。
3) 现在使用 friends/list api.
如果您首先使用 twitter 登录,然后使用 oauth2/token api 作为访问令牌,您可能会得到 错误的身份验证数据错误。所以请您按照以上3个步骤依次进行。
1) 获取访问令牌代码(oauth2/token api):
func getAccessToken() {
//RFC encoding of ConsumerKey and ConsumerSecretKey
let encodedConsumerKeyString:String = "sx5r...S9QRw".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
let encodedConsumerSecretKeyString:String = "KpaSpSt.....tZVGhY".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!
print(encodedConsumerKeyString)
print(encodedConsumerSecretKeyString)
//Combine both encodedConsumerKeyString & encodedConsumerSecretKeyString with " : "
let combinedString = encodedConsumerKeyString+":"+encodedConsumerSecretKeyString
print(combinedString)
//Base64 encoding
let data = combinedString.data(using: .utf8)
let encodingString = "Basic "+(data?.base64EncodedString())!
print(encodingString)
//Create URL request
var request = URLRequest(url: URL(string: "https://api.twitter.com/oauth2/token")!)
request.httpMethod = "POST"
request.setValue(encodingString, forHTTPHeaderField: "Authorization")
request.setValue("application/x-www-form-urlencoded;charset=UTF-8", forHTTPHeaderField: "Content-Type")
let bodyData = "grant_type=client_credentials".data(using: .utf8)!
request.setValue("\(bodyData.count)", forHTTPHeaderField: "Content-Length")
request.httpBody = bodyData
let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(String(describing: error))")
return
}
let responseString = String(data: data, encoding: .utf8)
let dictionary = data
print("dictionary = \(dictionary)")
print("responseString = \(String(describing: responseString!))")
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}
do {
let response = try JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String, Any>
print("Access Token response : \(response)")
print(response["access_token"]!)
self.accessToken = response["access_token"] as! String
self.getStatusesUserTimeline(accessToken:self.accessToken)
} catch let error as NSError {
print(error)
}
}
task.resume()
}
输出:
{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAA............xqT3t8T"}
2) 使用推特代码登录
@IBAction func onClickTwitterSignin(_ sender: UIButton) {
//Login and get session
TWTRTwitter.sharedInstance().logIn { (session, error) in
if (session != nil) {
//Read data
let name = session?.userName ?? ""
print(name)
print(session?.userID ?? "")
print(session?.authToken ?? "")
print(session?.authTokenSecret ?? "")
// self.loadFollowers(userid: session?.userID ?? "")
//Get user email id
let client = TWTRAPIClient.withCurrentUser()
client.requestEmail { email, error in
if (email != nil) {
let recivedEmailID = email ?? ""
print(recivedEmailID)
} else {
print("error--: \(String(describing: error?.localizedDescription))");
}
}
//Get user profile image url's and screen name
let twitterClient = TWTRAPIClient(userID: session?.userID)
twitterClient.loadUser(withID: session?.userID ?? "") { (user, error) in
print(user?.profileImageURL ?? "")
print(user?.profileImageLargeURL ?? "")
print(user?.screenName ?? "")
}
let storyboard = self.storyboard?.instantiateViewController(withIdentifier: "SVC") as! SecondViewController
self.navigationController?.pushViewController(storyboard, animated: true)
} else {
print("error: \(String(describing: error?.localizedDescription))");
}
}
}
输出:
在这里你会得到userName, userId, authtoken, authTokenSecret, screen name and email等
3) 现在从 friends/list api 获取好友列表。在这里可以得到friends/list,users/lookup,followers/ids,followers/listapi的数据等...
func getStatusesUserTimeline(accessToken:String) {
let userId = "109....456"
let twitterClient = TWTRAPIClient(userID: userId)
twitterClient.loadUser(withID: userId) { (user, error) in
if user != nil {
//Get users timeline tweets
var request = URLRequest(url: URL(string: "https://api.twitter.com/1.1/friends/list.json?screen_name=KS....80&count=10")!) //users/lookup, followers/ids, followers/list
request.httpMethod = "GET"
request.setValue("Bearer "+accessToken, forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(String(describing: error))")
return
}
// let responseString = String(data: data, encoding: .utf8)
// let dictionary = data
// print("dictionary = \(dictionary)")
// print("responseString = \(String(describing: responseString!))")
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}
do {
let response = try JSONSerialization.jsonObject(with: data, options: [])
print(response)
} catch let error as NSError {
print(error)
}
}
task.resume()
}
}
}
此代码在任何地方均不可用。我为这段代码尝试了很多,为此我花了很多时间。谢谢。