No puedo hacer búsquedas con stream, ayuda por favor

api

#1

Estoy haciendo una busqueda en twiter atraves de la siguierte url https://stream.twitter.com/1.1/statuses/filter.json?track=#pruebairis y siempre me retorna el siguiente error.

{“The remote server returned an error: (401) Unauthorized.”}, igual la autentifican la hago correcta pues publico un tweet con el mismo token y todo sale perfecto. He utilizado tweetenvi, twettsharp y no doy con la búsqueda, siempre se interrumpe, alguna documentación al respecto o ejemplo que funcione. Gracias


#2

// Llaves de acceso de la aplicación Twitter
var oauth_token = “xxxxxxxxxxxx”;
var oauth_token_secret = “xxxxxxxxxxxxxx”;
var oauth_consumer_key = “xxxxxxxxxx”;
var oauth_consumer_secret = “xxxxxxxxxxxx”;

// Caracteristicas de la implementacion OAuth
var oauth_version = “1.0”;
var oauth_signature_method = “HMAC-SHA1”;
var follow = “3904317398”;

        // Detalles del mensaje de la API
        var mensaje = textBox_post.Text;
        //var resource_url = "https://api.twitter.com/1.1/statuses/update.json";
        var resource_url = "https://stream.twitter.com/1.1/statuses/filter.json?track=pruebairis";
        var request_type = "POST";

        // Detalles de creación de la cabecera de autentificación
        // Creamos el oauth_nonce
        var oauth_nonce = CreateNonce();
        // Creamos el oauth_timestamp
        var oauth_timestamp = CreateTimestamp();
        // Creamos el oauth_signature
        string oauth_signature = CreateOAuthSignature(oauth_consumer_key, oauth_nonce, oauth_signature_method,
            oauth_timestamp, oauth_token, oauth_version, mensaje, resource_url, request_type, oauth_consumer_secret, oauth_token_secret);

        // Construimos la cabecera de autentificación combinando todos los valores
        var headerFormat = "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\", oauth_signature=\"{2}\", " +
                           "oauth_signature_method=\"{3}\", oauth_timestamp=\"{4}\", " +
                           "oauth_token=\"{5}\", oauth_version=\"{6}\", follow=\"{7}";

        var authHeader = string.Format(headerFormat,
                                Uri.EscapeDataString(oauth_consumer_key),
                                Uri.EscapeDataString(oauth_nonce),
                                Uri.EscapeDataString(oauth_signature),
                                Uri.EscapeDataString(oauth_signature_method),
                                Uri.EscapeDataString(oauth_timestamp),
                                Uri.EscapeDataString(oauth_token),
                                Uri.EscapeDataString(oauth_version)
                        );

        // Realizamos la petición HTTP con el método POST
        var postdata = "status=" + URLEncode(mensaje);
        ServicePointManager.Expect100Continue = false;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
        request.Headers.Add("Authorization", authHeader);
        request.Method = request_type;
        request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
        using (Stream stream = request.GetRequestStream())
        {
            byte[] content = ASCIIEncoding.ASCII.GetBytes(postdata);
            stream.Write(content, 0, content.Length);
            Console.WriteLine("conten "+content);
        }
        WebResponse response = request.GetResponse();//"AQUI ROMPE EL RROR 401"
        StreamReader sr = new StreamReader(response.GetResponseStream());
        string json = sr.ReadToEnd();
        sr.Close();
        response.Close();

        textBox_post.Text = json;

#3

Creo que el problemo es el POST method. Con POST no puede poner los parametros adentro la url. Quando utilizando POST, escribe los parametros a la request body. Como este:

    if (method == "POST")
    {
        byte[] postBody = new ASCIIEncoding().GetBytes("track=pruebairis");
        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(postBody, 0, postBody.Length);
        }
    }

La url es https://stream.twitter.com/1.1/statuses/filter.json sin parametros.


#4

boxnumber03, muchas gracias por tu aporte, efectivamente continua pero al final me muestra este inconveniente con System.dll una webException, pero el try cath no me valida… :frowning:

este mismo error me sale utilizando la api twettsharp…


#5

Eliminas este code?

using (Stream stream = request.GetRequestStream())
{
    byte[] content = ASCIIEncoding.ASCII.GetBytes(postdata);
    stream.Write(content, 0, content.Length);
    Console.WriteLine("conten "+content);
}

#6

No, no lo elimino, ese lo dejo pues envía todo el encabezado de la petición… Y adiciono el que me comentaste… :smile:
A first chance exception of type ‘System.Net.WebException’ occurred in System.dll este es el error que me muestra al hacer las busquedas a veces funciona, aveces me lo muestra, pero no encuentro documentación sobre ello…


#7

Pero ese code – var postdata = "status=" + URLEncode(mensaje) – no es necesario por el request statuses/filter.

Estas mezclando dos requests diferente – statuses/filter y statuses/update?


#8

Si, tienes razón, solo tome ese código que era para enviar un twett y lo estaba adaptado a búsqueda, situación que no he podido realizar… Utilizo las misma credenciales para publicar el twett como para buscarlo y nada, me sigue mostrando el mismo error.

A first chance exception of type ‘System.Net.WebException’ occurred in System.dll

Additional information: The remote server returned an error: (401) Unauthorized.


#9

Comparar tu tiempo systema el tiempo correcto. El diferencia no puede ser mas que 5 minutos.


#10

Sabes como puedo consultar la hora del servidor de twitter, no encuentro método alguno. Y la hora de mi pc esta automática… Supongo que debe estar bien…


#11

No la hora del servidor de twitter. Necesitas la hora atomica. Como aqui www.time.gov.