ios - una - twitter developer login




Obtener lista de amigos de Twitter? (2)

Debido a que esta lista de amigos / listas requiere autenticación para poder acceder a la lista de amigos.

Estoy obteniendo una respuesta de Bad Authentication data en la lista de amigos / listas de twitter. Estoy obteniendo ID de usuario, nombre de pantalla, authToken y authTokenSecret al iniciar sesión.

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

Salida:

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

¿Cuáles son los parámetros necesarios para enviar en la API friends/list.json ? En este documento se dan todos los parámetros son opcionales. https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-list


En Swift 4.2, Xcode 10.1 y iOS 12.1

Finalmente tengo la solución para esto. Aquí primero necesitamos Autorización, luego necesitamos implementar la lista de amigos api.

El código Swift puro no está disponible. Pero lo implementé en puro veloz.

Si desea obtener datos de amigos / listas de Twitter, debe utilizar dos API .

1) oauth2 / token API

2) API de lista / amigos

En oauth2 / token api puede obtener token de acceso, porque necesita token de acceso para la lista de amigos. Y necesitas identificación de usuario, nombre de pantalla .

Pero aquí debes recordar un punto importante.

1) Primero use la api de oauth2 / token para el token de acceso.

2) Después de obtener el token de acceso, use la API de inicio de sesión de twitter para el ID de usuario y el nombre de pantalla.

3) Ahora usa friends / list api.

Aquí, primero, si utiliza el inicio de sesión de Twitter y luego una api de touth2 / token para el token de acceso , puede obtener un error de datos de autenticación incorrecta. Así que por favor siga los 3 pasos anteriores en orden.

1) Obtenga el código de token de acceso (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()
}

Salida:

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

2) Entrar con el código de 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))");
        }
    }

}

Salida:

Aquí obtendrá userName, userId, authtoken, authTokenSecret, nombre de pantalla y correo electrónico, etc.

3) Ahora consigue la lista de amigos de la lista de amigos / lista . Aquí puede obtener amigos / lista, usuarios / búsqueda, seguidores / ids, seguidores / listar datos de api, etc.

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

        }
    }

}

Este código no está disponible en ningún lugar. Intenté mucho con este código y dediqué mucho tiempo a esto. Gracias.





twitter-oauth