ios - versuche - twitter iphone etwas ist schiefgelaufen




Twitter-Freundesliste abrufen? (2)

Ich erhalte eine ungültige Bad Authentication data in der Twitter-Freunde / Liste-API. Beim Anmelden erhalte ich die Benutzer-ID, den Bildschirmnamen, das AuthToken und das 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()
}

Ausgabe:

{
"errors": [
    {
        "code": 215,
        "message": "Bad Authentication data."
    }
]
}

Welche Parameter sind erforderlich, um die friends/list.json API zu senden friends/list.json In diesem Dokument sind alle angegebenen Parameter optional. https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-list


In Swift 4.2, Xcode 10.1 und iOS 12.1

Endlich habe ich die Lösung dafür. Hier benötigen wir zuerst die Autorisierung und dann die Freundeslisten-API.

Ein reiner Swift-Code ist nicht verfügbar. Aber ich habe es schnell umgesetzt.

Wenn Sie Freunde / Listendaten von Twitter erhalten möchten, müssen Sie zwei APIs verwenden .

1) oauth2 / token API

2) Freunde / Liste API

In oauth2 / token api können Sie Zugriffstoken erhalten, da Sie Zugriffstoken für die Freundesliste benötigen. Und Sie benötigen eine Benutzer-ID und einen Bildschirmnamen .

Aber hier müssen Sie sich an einen wichtigen Punkt erinnern .

1) Verwenden Sie zuerst oauth2 / token api als Zugriffstoken.

2) Nachdem Sie das Zugriffstoken erhalten haben, verwenden Sie die Twitter-Anmelde- API für Benutzer-ID und Bildschirmnamen.

3) Jetzt benutze friends / list api.

Wenn Sie hier zuerst den Twitter-Login und dann oauth2 / token api für den Zugriffstoken verwenden , kann es zu einem Fehler mit ungültigen Authentifizierungsdaten kommen . Also folgen Sie bitte den obigen 3 Schritten in der Reihenfolge.

1) Holen Sie sich den Zugangscode (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()
}

Ausgabe :

{"token_type":"bearer","access_token":"AAAAAAAAAAAAAAAAAAA............xqT3t8T"}

2) Mit Twitter Code einloggen

@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))");
        }
    }

}

Ausgabe:

Hier erhalten Sie Benutzername, Benutzer-ID, Authtoken, AuthTokenSecret, Bildschirmname und E-Mail usw.

3) Holen Sie sich jetzt die Freundesliste von friends / list api . Hier können Sie Freunde / Liste, Benutzer / Suche, Follower / IDs, Follower / List-API-Daten usw. abrufen.

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()

        }
    }

}

Dieser Code ist nirgendwo verfügbar. Ich habe viel für diesen Code ausprobiert und viel Zeit dafür aufgewendet. Vielen Dank.


Weil diese Friends / List- API eine Authentifizierung erfordert, um die Friends-Liste abzurufen.





twitter-oauth