Commit c3d499c4 authored by DANIEL DIAZ SANCHEZ's avatar DANIEL DIAZ SANCHEZ
Browse files

Update README.md

parent 499075f9
......@@ -391,69 +391,34 @@ public class User {
### Anade una consulta al API de Twetter
Vamos a probar con la función del API [get user timeline](https://dev.twitter.com/rest/reference/get/statuses/user_timeline) que permite obtener los tweets más recientes de un usuario.
Vamos a probar con la función del API [get user timeline](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-user_timeline) que permite obtener los tweets más recientes de un usuario.
Inspecciona la página del API. Revisa los parámetros de la llamada a esa función del API Rest, verás que puedes usar `user_id` que es el ID de twetter (poco conocido, un número) o bien el `screen_name' que es el nombre de la cuenta de twitter que se muestra por internet, por ejemplo `@realmadrid`.
Inspecciona la página del API. Revisa los parámetros de la llamada a esa función del API Rest, verás que puedes usar `user_id` que es el ID de twetter (poco conocido, un número) o bien el `screen_name' que es el nombre de la cuenta de twitter que se muestra por internet, por ejemplo @realmadrid.
Además se pueden especificar el número de Tweets a obtener.
Para obtener 2 tweets de la cuenta @realmadrid usa el siguiente código:
Para obtener 2 tweets de la cuenta `@realmadrid` usa el siguiente código:
```java
package cdistRest;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import org.apache.commons.codec.binary.Base64;
import com.google.gson.Gson;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import com.mashape.unirest.request.GetRequest;
import com.mashape.unirest.request.body.RequestBodyEntity;
public class TwitterCrawler {
import kong.unirest.GetRequest;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;
import kong.unirest.UnirestException;
private static final String oauth_consumer_key = "XXXXXXXXx";
private static final String oauth_consumer_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
public class BearerToken
{
private String access_token;
private String token_type;
}
public static String deserializeJson(String input_json)
{
Gson gson = new Gson();
BearerToken new_bearerToken = gson.fromJson(input_json, BearerToken.class);
return new_bearerToken.access_token;
}
public class TwitterCrawler {
private static final String bearer_token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
public static void main(String args[]) throws IOException {
try {
/* get bearer token according to https://dev.twitter.com/oauth/application-only */
String URLEncoderConsumerKey = URLEncoder.encode(oauth_consumer_key, "UTF-8");
String URLEncoderConsumerSecret = URLEncoder.encode(oauth_consumer_secret, "UTF-8");
String AuthorizationHeader = URLEncoderConsumerKey+":"+URLEncoderConsumerSecret;
String AuthorizationHeaderB64 = Base64.encodeBase64String(AuthorizationHeader.getBytes("UTF8"));
System.out.println(AuthorizationHeaderB64);
RequestBodyEntity postReq = Unirest.post("https://api.twitter.com/oauth2/token")
.header("User-Agent","TwitterApp")
.header("host", "api.twitter.com")
.header("Authorization", "Basic " + AuthorizationHeaderB64)
.header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")
.body("grant_type=client_credentials");
HttpResponse<String> res = postReq.asString();
String bearer_token = TwitterCrawler.deserializeJson(res.getBody());
System.out.println("Bearer Token : " + bearer_token);
/* we now have a brearer token so can make requests to Twitter */
/* https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=realmadrid&count=2 */
HttpResponse<String> json_str_Response = null;
......@@ -469,20 +434,18 @@ public class TwitterCrawler {
List<Tweet> tweet_list = Tweet.deserializeJsonArray(json_str_Response.getBody());
Unirest.shutdown();
Unirest.shutDown();
} catch (UnirestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
```
Observa, depurando paso a paso y usando break points (en ocasiones entrar dentro de una función con eclipse no funciona - dado que no encuentra el código - lo mejor es usar breakpoints en los métodos en los que queremos parar) lo siguiente:
* Creación de la cabecera de autenticación a partir del objeto BearerToken
......@@ -496,13 +459,13 @@ La función del API descrita en https://dev.twitter.com/rest/reference/get/statu
Pese a la limitación dura de 3200, en cada petición se pueden pedir como máximo 200 (parámetro `count` de la llamada al API)
El problema es que los API REST no tienen estado, entonces, **¿cómo bajar los 3200?**
El problema es que los API REST no tienen estado, entonces, **¿cómo bajar los 3200 tweets?**
Para ello, es necesario usar **cursores**, elementos que le informen a Twitter a partir de qué Tweet deseas obtener los siguientes 200.
Para ello utilizamos el parámetro `max_id` de la petición, usando la información contenida aquí https://dev.twitter.com/rest/public/timelines
Usemos una cuenta popular, cualquiera con más de 3200 Tweets. Para ello usa cualquiera de las más populares del mundo (yo voy a usar @realmadrid).
Usemos una cuenta popular, cualquiera con más de 3200 Tweets. Para ello usa cualquiera de las más populares del mundo (yo voy a usar `@realmadrid`).
De todos los tweets recibidos, hay que buscar cuál de ellos tiene menor id y usarlo como parámetro (restándole 1) para la siguiente petición.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment