ios - son - Obtener lista de amigos de Twitter?
twitter api example (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.