我Bad Authentication data在Twitter好友/列表API中得到 响应。登录时获取用户ID,屏幕名称,authToken和authTokenSecret。
Bad Authentication data
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.jsonAPI 所需的参数是什么?在本文档中,给定的所有参数都是可选的。 https://developer.twitter.com/zh-CN/docs/accounts-and-users/follow-search- get-users/api-reference/get-friends- list
friends/list.json
在Swift 4.2,Xcode 10.1和iOS 12.1中
终于我得到了解决方案。首先,我们需要授权,然后需要实现好友列表api。
纯Swift代码不可用。但是我完全是迅速实施的。
如果要从Twitter 获取 朋友/列表 数据,则需要使用 两个API 。
1)oauth2 / token API
2)朋友/列表API
在 oauth2 / token api中,您可以获取访问令牌,因为您需要好友列表的访问令牌。并且您需要 用户标识,屏幕名称 。
但是在这里,您 必须记住 一个要点。
1)首先使用 oauth2 / token api作为访问令牌。
2)获取访问令牌后,使用 twitter登录 api输入 用户ID和屏幕名称。
3)现在使用 好友/列表 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)使用Twitter代码登录
@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,屏幕名称和电子邮件等。
3)现在从friends / list api获取朋友列表 。在这里您可以获取朋友/列表,用户/查找,关注者/ id,关注者/列表api的数据等…
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() } } }
此代码在任何地方都不可用。我为此代码做了很多尝试,为此花了很多时间。谢谢。