Cómo usar el API de Twitter para desarrollar una aplicación en C# C Sharp .Net que nos permita interactuar con nuestra cuenta de Twitter. Para ello desarrollamos la aplicación gratuita con código fuente AjpdSoft Gestión Seguidores Twitter. Con el API de Twitter podremos leer los tweets, tweets retwitteados, menciones, Timeline, seguir a usuarios, dejar de seguir, visitar pefil, enviar tweet, mostrar los últimos 20 seguidores, amigos, mensajes directos, etc. También podremos realizar tareas automáticas como: enviar mensaje directo a quien nos sigue, añadir mención a quien nos sigue, seguir a quien nos sigue (todo ello de forma automática). También podremos, de forma automática, dejar de seguir a aquellos amigos (que seguimos) que no nos siguen.
- Alta de aplicación en Twitter Developers.
- API para acceso a Twitter con Visual Studio .Net C# C Sharp.
- Acceso a Twitter con aplicación C# .Net y API Twitter Spring.NET Social Extension.
- AjpdSoft Gestión Seguidores Twitter en funcionamiento.
- Código fuente source code C# AjpdSoft Gestión Seguidores Twitter.
- Artículos relacionados.
- Créditos.
Alta de aplicación en Twitter Developers
Para que nuestra aplicación desarrollada en C# .Net (Visual Stuio .Net) pueda conectar utilizar el API de Twitter deberemos registrarla en Twitter. Deberemos disponer de un usuario de Twitter, si aún no lo tenemos nos daremos de alta en su web oficial. Una vez que tengamos el usuario accederemos a la sección Developers de Twitter en la URL:
https://dev.twitter.com/apps
Nos mostrará la lista de aplicaciones de Twitter que tengamos dadas de alta, para añadir una nueva pulsaremos en «Create new application»:
Introduciremos los datos de la aplicación, como el nombre, descripción, sitio web, etc., en nuestro caso desarrollaremos AjpdSoft Gestión Seguidores Twitter:
Una vez introducidos los datos, leídos los términos de licencia y aceptados (marcando «Yes, I agree») introduciremos los datos del capcha y pulsaremos en «Create your Twitter application»:
Nos mostrará la nueva aplicación creada en Twitter, en la pestaña «Details» podremos consultar las asignaciones de Consumer key y un Consumer secret y otros datos que necesitaremos para desarrollar la aplicación en C# o en otros lenguajes: Request token URL, Authorize URL, Access token URL, etc.:
En la pestaña «Settings» podremos modiciar el nombre, la descripción, el sitio web, podremos añadir un icono para la aplicación y lo más importante, deberemos establecer el tipo de permiso que requerirá la aplicación en «Application Type», con las posibilidades de «Read only», «Read and Write», «Read, Write and Access direct messages». Dependiendo de las tareas que queramos que realice nuestra aplicación indicaremos el tipo de acceso, normalmente con «Read only» suele ser suficiente. Estos permisos se mostrarán al usuario cuando utilice nuestra aplicación por lo que debemos escoger la opción estrictamente necesaria, a ser posible «Read only»:
En la pestaña «OAuth tool» podremos consultar el Consumer Key, Consumer Secret, Access token y Access token secret de nuestra aplicación. También el método de petición de información: GET, POST, DELETE, PUT, HEAD. Normalmente se suele usar GET:
Con estos sencillos pasos ya tendremos nuestra aplicación dada de alta en Twitter con los datos de acceso necesarios para su posterior desarrollo en C# C Sharp como explicaremos a continuación.
API para acceso a Twitter con Visual Studio .Net C# C Sharp
Una vez dada de alta la aplicación en Twitter, lo siguiente que necesitaremos será el API de Twitter, que son un conjunto de librerías DLL con los métodos necesarios para realizar diversas operaciones en una cuenta de Twitter desde C# C Sharp. Existen varios proyectos que han desarrollado las librerías DLL necesarias para acceder a Twitter desde una aplicación Visual Studio .Net C# C Sharp, algunos de ellos:
- LINQ2Twitter by @joemayo.
- Spring.NET Social extension for Twitter by SpringSource.
- TweetSharp by @danielcrenna.
- Tweetinvi maintained by Linvi.
- Crafted,Twitter by @martbrow.
Usaremos Spring.NET Social Extension for Twitter, por lo tanto realizaremos la descarga de estos ficheros desde:
https://github.com/spring-projects/spring-net-social-twitter/tree/master/lib/net/4.0
O bien usando Maven o Gradle (como se recomienda en la web oficial de Spring.NET Social Extension).
Acceso a Twitter con aplicación C# .Net y API Twitter Spring.NET Social Extension
Descomprimiremos el fichero Spring.Social.Twitter-2.0.0-M1.zip descargado, usaremos los ficheros ubicados en:
…/Spring.Social.Twitter-2.0.0-M1/bin/net/4.0/Debug
Usaremos:
- Spring.Rest.dll
- Spring.Social.Core.dll
- Spring.Social.Twitter.dll
Abriremos Microsoft Visual Studio .Net, pulsaremos en «Archivo» – «Nuevo proyecto»:
Seleccionaremos en la parte izquierda «Otros lenguajes» – «Visual C#», en la parte derecha seleccionaremos «.NET Framework 4» y «Aplicación de Windows Forms». Introduciremos el nombre para el proyecto
A continuación agregaremos las referencias al API de Twitter en Visual Studio .Net, para ello pulsaremos en «Proyecto» – «Agregar referencia»:
En la pestaña «Examniar» seleccionaremos los ficheros DLL del API de Twitter: Spring.Rest.dll, Spring.Social.Core.dll, Spring.Social.Twitter.dll:
De esta forma se agregarán las referencias al API de Twitter en nuestro proyecto C# C Sharp:
- Spring.Rest
- Spring.Social.Core
- Spring.Social.Twitter
Agregaremos ahora una nueva clase a nuestro proyecto donde implementaremos todas las tareas que queramos realizar con el API de Twitter, para ello pulsaremos con el botón derecho del ratón sobre el proyecto en el Explorador de soluciones, seleccionaremos «Agregar» – «Clase»:
Introduciremos el nombre para la clase, por ejemplo «TareasTwitter.cs«, pulsaremos «Aceptar»:
Añadiremos en esta clase los import correspondientes para usar el API de Twitter:
using Spring.IO;
using Spring.Social.OAuth1;
using Spring.Social.Twitter.Api;
using Spring.Social.Twitter.Api.Impl;
using Spring.Social.Twitter.Connect;
En esta clase añadiremos como constantes privadas las claves Consumer Key y Consumer Secret obtenidas en este paso:
El código fuente completo de esta clase puede consultarse aquí.
De la misma forma añadiremos también otra clase para encriptar y desencriptar texto, que nos servirá para guardar la contraseña de acceso a la base de datos, la llamaremos «Encriptar.cs«:
El código fuente completo de esta clase puede consultarse aquí.
Añadiremos la clase para guardar la configuración de la aplicación, la llamaremos «GuardarConfiguracion.cs«:
El código fuente completo de esta clase puede consultarse aquí.
Añadiremos la clase para guardar la configuración de la aplicación, la llamaremos «BDSQLite.cs«:
El código fuente completo de esta clase puede consultarse aquí.
El formulario principal de la aplicación «formTwitter.cs» contendrá los siguientes componentes (aquí el código fuente completo):
El código fuente completo del formulario principal puede consultarse aquí.
AjpdSoft Gestión Seguidores Twitter en funcionamiento
La aplicación AjpdSoft Gestión Seguidores Twitter muestra los tweets, tweets retwitteados, menciones, timeline, permite seguir, dejar de seguir, visitar pefiles, enviar tweet, muestra los últimos 20 seguidores, amigos, mensajes directos, etc. Además, lo más interesante de esta aplicación gratuita es que permite realizar tareas automáticas como: enviar mensaje directo a quien nos sigue, añadir mención a quien nos sigue, seguir a quien nos sigue (todo ello de forma automática). También permite, de forma automática, dejar de seguir a aquellos amigos (que seguimos) que no nos siguen.
A continuación mostramos un videotutorial sobre el funcionamiento de AjpdSoft Gestión Seguidores Twitter:
AjpdSoft Gestión de Seguidores Twitter
Ejecutaremos la aplicación AjpdSoft Gestión Seguidores Twitter, en primer lugar en «Usuario» introduciremos el nombre de usuario de Twitter, pulsaremos en «Conectar con Twitter»:
La aplicación abrirá el navegador por defecto, accederemos a nuestra cuenta de Twitter en el navegador y autorizaremos el acceso de AjpdSoft Gestión Seguidores Twitter, Twitter generará un PIN:
Deberemos introducir dicho PIN en la aplicación AjpdSoft Gestión Seguidores Twitter:
Una vez conectados, desde la pestaña «Mensajes directos» podremos obtener los 20 últimos mensajes directos, desde donde podremos responder a un mensaje directo o eliminarlo:
En la pestaña «Seguidores» podremos consultar los últimos 20 seguidores de nuestra cuenta de Twitter, podremos dejar de seguir a un amigo, seguir a un usuario o visitar su perfil:
En la pestaña «Siguiendo» podremos consultar los últimos 20 amigos a los que hemos seguido, podremos dejar de seguir a un amgio, seguir a un usuario o visitar su pefil (id, nick, nombre, seguidores, siguiendo, fecha antigüedad, descripción, url del perfil, ubicación, idioma):
Desde la pestaña «Tweet» podremos enviar un Tweet, en la pestaña «Tweets TimeLine» podremos ver los últimos 20 mensajes de la línea de tiempo:
En la pestaña «Mis tweets» podremos consultar los últimos 20 tweets enviados con el ID de tweet, el id de usuario, el nick de usuario, la fecha, el texto del tweet y el número de retweets:
En la pestaña «Menciones» podremos consultar las últimas 20 menciones que nos hayan hecho (id, id usuario, fecha, tweet, número retweets):
En la pestaña «Tweet favoritos» podremos consultar los últimos 20 tweets marcados como favoritos:
En la pestaña «Mis tweets retwitteados» podremos consultar los últimos 20 tweets retwitteados:
En la pestaña «Tareas automáticas» podremos establecer y activar tres acciones automáticas que permite AjpdSoft Gestión Seguidores Twitter:
- Enviar mensaje directo a nuevos seguidores.
- Añadir mención a nuevo seguidor.
- Seguir a nuevo seguidor.
Podremos elegir qué acción realizará AjpdSoft Gestión Seguidores Twitter de forma automática en el intervalo de segundos especificado. La aplicación comprobará en el intervalo indicado si hay nuevos seguidores, de haberlos y de forma automática, realizará las acciones indicadas (mensaje directo, mención, seguir):
Para que la opción anterior de tareas automáticas funcione deberemos configurar la base de datos SQLite local, para ello pulsaremos en la pestaña «Configuración»:
- Fichero BD SQLite: indicaremos una carpeta y nombre de fichero donde se creará la base de datos local SQLite que usará la aplicación internamente, en esta base de datos guardará los nuevos usuarios a los que le haya enviado mensaje directo para no enviar mensajes directos varias veces al mismo usuario.
- Una vez especificada la ubicación y fichero de la base de datos pulsaremos en «Crear BD y tablas para Twitter» para crear la base de datos. Si la base de datos ya existe con datos NO deberemos volver a crearla, será suficiente con seleccionarla en «Fichero BD SQLite».
Una vez creada la base de datos y especificadas acciones automáticas, para activarlas, en la pestaña «Tareas automáticas» pulsaremos en «Actovar tareas automáticas»:
Minimizando la aplicación quedará en el área de notificación:
La aplicación AjpdSoft Gestión Seguidores Twitter también permite dejar de seguir a quien no nos sigue de forma automática. Para ello pulsaremos en la pestaña «Dejar de seguir a quien no te sigue», pulsaremos en el botón «Obtener amigos que no te siguen», la aplicación obtendrá los amigos a los que seguimos, los seguidores y mostrará en la parte derecha los amigos que no nos siguen, pulsando en «Dejar de seguir a todos los que no te siguen» de forma automática dejará de seguir a los que no nos siguen:
Nota: esta versión de la aplicación tiene la limitación de sólo permitir esta tarea automática si no tenemos más de 5000 amigos.
IMPORTANTE: no debemos abusar de las técnicas indicadas en este tutorial puesto que Twitter podría penalizar nuestra cuenta, no debe abusarse, sobre todo, de las menciones.
A continuación mostramos un videotutorial sobre el funcionamiento de AjpdSoft Gestión Seguidores Twitter:
AjpdSoft Gestión de Seguidores Twitter
Código fuente source code C# C Sharp AjpdSoft Gestión Seguidores Twitter
A continuación mostramos listado del código fuente (source code) de la aplicación AjpdSoft Gestión Seguidores Twitter:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545 <em>using System;using System.Collections.Generic;using System.Linq;using System.Text;using Spring.Social.OAuth1;using Spring.Social.Twitter.Api;using Spring.Social.Twitter.Api.Impl;using Spring.Social.Twitter.Connect;namespace AjpdSoftGestiónSeguidoresTwitter{//datos perfil usuario Twitterpublic struct PerfilUsuario{public string nombre;public string nick;public long id;public string descripcion;public int seguidores;public int siguiendo;public DateTime? fechaAlta;public string ubicacion;public string idioma;public string urlPerfil;public bool notificaciones;public bool traductor;public bool verificado;public bool protegido;public bool loSigo;}//datos mensaje directo Twitterpublic struct MensajeDirecto{public long id;public long idUsuario;public string nick;public string usuario;public string mensaje;public DateTime? fecha;}//datos seguidor Twitterpublic struct Seguidor{public PerfilUsuario perfilUsuario;public string meSigue;}//Datos amigo Twitterpublic struct Amigo{public PerfilUsuario perfilUsuario;public string meSigue;}//Tweet Twitter (TimeLine, Retweet, menciones)public struct DatosTweet{public long id;public long idUsuario;public string usuario;public DateTime? fecha;public string tweet;public long NumeroRetweet;}class TareasTwitter{//ConsumerKey y ConsumerSecret de nuestra aplicación dada de alta en Twitterprivate const string TwitterConsumerKey = "4azv2Q xxx";private const string TwitterConsumerSecret = "DsFUOA xxx";ITwitter twitter;//Conectar con API de Twitter mediante PIN para obtener token de acceso//devuelve true si la conexión se ha realizado correctamentepublic bool obtenerTokenTwitter(ref string resultado){try{TwitterServiceProvider twitterServiceProvider =new TwitterServiceProvider(TwitterConsumerKey, TwitterConsumerSecret);// Autenticación en Twitter usando código PINOAuthToken oauthToken =twitterServiceProvider.OAuthOperations.FetchRequestTokenAsync("oob", null).Result;string authenticateUrl =twitterServiceProvider.OAuthOperations.BuildAuthorizeUrl(oauthToken.Value, null);System.Diagnostics.Process.Start(authenticateUrl);string pinCode = "";InputBox.solicitarTexto("Código PIN","Introduzca el código PIN obtenido de Twitter:", ref pinCode);AuthorizedRequestToken requestToken =new AuthorizedRequestToken(oauthToken, pinCode);OAuthToken oauthAccessToken =twitterServiceProvider.OAuthOperations.ExchangeForAccessTokenAsync(requestToken, null).Result;twitter = twitterServiceProvider.GetApi(oauthAccessToken.Value, oauthAccessToken.Secret);resultado = System.DateTime.Now + " " +"Conectado a API de twitter correctamente con PIN";return true;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener token acceso Twitter: " + error.Message;return false;}}//Obtener los datos del perfil del usuario de Twitter//que ha iniciado sesión de autenticación con PINpublic void obtenerDatosPerfilPIN (string usuario,ref PerfilUsuario datosPerfilUsuario, ref string resultado){try{datosPerfilUsuario.nick =twitter.UserOperations.GetUserProfileAsync(usuario).Result.ScreenName;datosPerfilUsuario.nombre =twitter.UserOperations.GetUserProfileAsync(usuario).Result.Name;datosPerfilUsuario.descripcion =twitter.UserOperations.GetUserProfileAsync(usuario).Result.Description;datosPerfilUsuario.siguiendo =twitter.UserOperations.GetUserProfileAsync(usuario).Result.FriendsCount;datosPerfilUsuario.seguidores =twitter.UserOperations.GetUserProfileAsync(usuario).Result.FollowersCount;datosPerfilUsuario.fechaAlta =twitter.UserOperations.GetUserProfileAsync(usuario).Result.CreatedDate;datosPerfilUsuario.ubicacion =twitter.UserOperations.GetUserProfileAsync(usuario).Result.Location;datosPerfilUsuario.id =twitter.UserOperations.GetUserProfileAsync(usuario).Result.ID;datosPerfilUsuario.idioma =twitter.UserOperations.GetUserProfileAsync(usuario).Result.Language;datosPerfilUsuario.urlPerfil =twitter.UserOperations.GetUserProfileAsync(usuario).Result.ProfileUrl;datosPerfilUsuario.verificado =twitter.UserOperations.GetUserProfileAsync(usuario).Result.IsVerified;datosPerfilUsuario.traductor =twitter.UserOperations.GetUserProfileAsync(usuario).Result.IsTranslator;datosPerfilUsuario.protegido =twitter.UserOperations.GetUserProfileAsync(usuario).Result.IsProtected;resultado = System.DateTime.Now + " " +"Datos del perfil [" + usuario + "] obtenidos correctamente";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener datos del perfil [" + usuario +"]: " + error.Message;}}//obtener datos perfil de usuario por IDpublic void obtenerPerfilUsuario (long id,ref PerfilUsuario perfilUsuario, ref string resultado){try{TwitterProfile perfilUsuarioTwitter =twitter.UserOperations.GetUserProfileAsync(id).Result;PerfilUsuario perfil = new PerfilUsuario();perfil.descripcion = perfilUsuarioTwitter.Description;perfil.fechaAlta = perfilUsuarioTwitter.CreatedDate;perfil.id = perfilUsuarioTwitter.ID;perfil.idioma = perfilUsuarioTwitter.Language;perfil.nick = perfilUsuarioTwitter.ScreenName;perfil.nombre = perfilUsuarioTwitter.Name;perfil.verificado = perfilUsuarioTwitter.IsVerified;perfil.traductor = perfilUsuarioTwitter.IsTranslator;perfil.protegido = perfilUsuarioTwitter.IsProtected;perfil.loSigo = perfilUsuarioTwitter.IsFollowing;perfil.seguidores = perfilUsuarioTwitter.FriendsCount;perfil.siguiendo = perfilUsuarioTwitter.FriendsCount;perfil.ubicacion = perfilUsuarioTwitter.Location;perfil.urlPerfil = perfilUsuarioTwitter.ProfileUrl;perfilUsuario = perfil;resultado = "Obtenido perfil usuario " + Convert.ToString(id);}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener datos del perfil [" + Convert.ToString(id) +"]: " + error.Message;}}//Enviar mensaje directo a usuario Twitter//debe ser seguido por el usuario que ha iniciado sesiónpublic void enviarMensajeDirectoTwitter(string mensaje,long idUsuario, ref string resultado){if (mensaje != ""){try{DirectMessage mensajeDirectoTwiiter =twitter.DirectMessageOperations.SendDirectMessageAsync(idUsuario, mensaje).Result;resultado = System.DateTime.Now + " " +"Mensaje directo [" + mensaje + "] enviado a [" +Convert.ToString(idUsuario) + "]";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al enviar mensaje directo: " + error.Message;}}}//Obtener últimos 20 mensajes directos Twitterpublic List obtenerUltimos20MensajesDirectos(ref string resultado){try{List mensajes = new List();IList mensajesTwiiter =twitter.DirectMessageOperations.GetDirectMessagesReceivedAsync().Result;foreach (DirectMessage mensajeTwitter in mensajesTwiiter){MensajeDirecto mensajeDirecto = new MensajeDirecto();mensajeDirecto.id = mensajeTwitter.ID;mensajeDirecto.idUsuario = mensajeTwitter.Sender.ID;mensajeDirecto.nick = mensajeTwitter.Sender.ScreenName;mensajeDirecto.usuario = mensajeTwitter.Sender.Name;mensajeDirecto.mensaje = mensajeTwitter.Text;mensajeDirecto.fecha = mensajeTwitter.CreatedAt;mensajes.Add(mensajeDirecto);resultado = System.DateTime.Now + " " +"Obteniendo mensaje [" + Convert.ToString(mensajeTwitter.ID) + "]" +Environment.NewLine + resultado;}resultado = System.DateTime.Now + " " +"Últimos 20 mensajes directos obtenidos";return mensajes;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener mensajes directos: " + error.Message;return null;}}//Elimina un mensaje directo de Twitter que nos hayan enviadopublic void eliminarMensajeDirecto(long idMensaje, ref string resultado){try{DirectMessage mensaje;mensaje =twitter.DirectMessageOperations.DeleteDirectMessageAsync(idMensaje).Result;resultado = System.DateTime.Now + " " +"Mensaje directo [" + idMensaje + "] eliminado correctamente";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al eliminar mensaje directo [" +Convert.ToString(idMensaje) + "]: " + error.Message;}}//Obtener últimos 20 usuarios que nos han seguido en Twitterpublic List obtenerUltimos20Seguidores (ref string resultado){try{List seguidores = new List();CursoredList seguidoresTwitter =twitter.FriendOperations.GetFollowersAsync().Result;foreach (TwitterProfile seguidorTwitter in seguidoresTwitter){Seguidor seguidor = new Seguidor();seguidor.perfilUsuario.id = seguidorTwitter.ID;seguidor.perfilUsuario.nick = seguidorTwitter.ScreenName;seguidor.perfilUsuario.nombre = seguidorTwitter.Name;if (seguidorTwitter.IsFollowing)seguidor.meSigue = "Sí";elseseguidor.meSigue = "No";seguidor.perfilUsuario.seguidores = seguidorTwitter.FollowersCount;seguidor.perfilUsuario.siguiendo = seguidorTwitter.FriendsCount;seguidor.perfilUsuario.fechaAlta = seguidorTwitter.CreatedDate;seguidor.perfilUsuario.descripcion = seguidorTwitter.Description;seguidor.perfilUsuario.urlPerfil = seguidorTwitter.ProfileUrl;seguidor.perfilUsuario.ubicacion = seguidorTwitter.Location;seguidor.perfilUsuario.idioma = seguidorTwitter.Language;seguidores.Add(seguidor);resultado = "Obteniendo seguidor [" + Convert.ToString(seguidorTwitter.ID) + "]" +Environment.NewLine + resultado;}resultado = System.DateTime.Now + " " +"Últimos 20 seguidores obtenidos" +Environment.NewLine + resultado;return seguidores;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener seguidores: " + error.Message;return null;}}//Obtener últimos 20 usuarios a los que seguimos (amigos) en Twitterpublic List obtenerUltimos20Amigos(ref string resultado){try{List amigos = new List();CursoredList amigosTwitter =twitter.FriendOperations.GetFriendsAsync().Result;foreach (TwitterProfile amigoTwitter in amigosTwitter){Amigo amigo = new Amigo();amigo.perfilUsuario.id = amigoTwitter.ID;amigo.perfilUsuario.nick = amigoTwitter.ScreenName;amigo.perfilUsuario.nombre = amigoTwitter.Name;if (amigoTwitter.IsFollowing)amigo.meSigue = "Sí";elseamigo.meSigue = "No";amigo.perfilUsuario.seguidores = amigoTwitter.FollowersCount;amigo.perfilUsuario.siguiendo = amigoTwitter.FriendsCount;amigo.perfilUsuario.fechaAlta = amigoTwitter.CreatedDate;amigo.perfilUsuario.descripcion = amigoTwitter.Description;amigo.perfilUsuario.urlPerfil = amigoTwitter.ProfileUrl;amigo.perfilUsuario.ubicacion = amigoTwitter.Location;amigo.perfilUsuario.idioma = amigoTwitter.Language;amigos.Add(amigo);resultado = "Obteniendo amigo [" + Convert.ToString(amigoTwitter.ID) + "]" +Environment.NewLine + resultado;}resultado = System.DateTime.Now + " " +"Últimos 20 amigos obtenidos" +Environment.NewLine + resultado;return amigos;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener amigos: " + error.Message;return null;}}//Dejar de seguir a usuario que seguimos (amigo) por nickpublic void dejarDeSeguirAmigo(string usuario, ref string resultado){try{TwitterProfile amigo =twitter.FriendOperations.UnfollowAsync(usuario).Result;resultado = System.DateTime.Now + " " +"Dejado de seguir a [" + usuario + "]";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al dejar de seguir a [" + usuario + "]: " +error.Message;}}//Dejar de seguir a usuario que seguimos (amigo) por IDpublic void dejarDeSeguirAmigo(long usuario, ref string resultado){try{TwitterProfile amigo =twitter.FriendOperations.UnfollowAsync(usuario).Result;resultado = System.DateTime.Now + " " +"Dejado de seguir a [" + usuario + "]";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al dejar de seguir a [" + Convert.ToString(usuario) + "]: " +error.Message;}}public void seguirUsuario(string usuario, ref string resultado){try{TwitterProfile amigo =twitter.FriendOperations.FollowAsync(usuario).Result;resultado = System.DateTime.Now + " " +"Siguiendo a [" + usuario + "]";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al seguir a [" + usuario + "]: " + error.Message;}}//Obtener los 20 últimos tweets de mi línea de tiempo (HomeTimeLine)//últimos de mis tweets, menciones y mis tweets retwitteadospublic List obtener20UltimosTweet(string tipo, ref string resultado){try{List tweets = new List();IList lineaTiempo;lineaTiempo =twitter.TimelineOperations.GetHomeTimelineAsync().Result;if (tipo == "UserTimeLine"){lineaTiempo =twitter.TimelineOperations.GetUserTimelineAsync().Result;}if (tipo == "Menciones"){lineaTiempo =twitter.TimelineOperations.GetMentionsAsync().Result;}if (tipo == "Favoritos"){lineaTiempo =twitter.TimelineOperations.GetFavoritesAsync().Result;}if (tipo == "Retweets"){lineaTiempo =twitter.TimelineOperations.GetRetweetsOfMeAsync().Result;}foreach (Tweet tweetTwitter in lineaTiempo){DatosTweet datoTweet = new DatosTweet();datoTweet.id = tweetTwitter.ID;datoTweet.idUsuario = tweetTwitter.User.ID;datoTweet.usuario = tweetTwitter.User.ScreenName;datoTweet.fecha = tweetTwitter.CreatedAt;datoTweet.tweet = tweetTwitter.Text;datoTweet.NumeroRetweet = tweetTwitter.RetweetCount;tweets.Add(datoTweet);resultado = System.DateTime.Now + " " +"Obteniendo tweet [" + Convert.ToString(tweetTwitter.ID) + "]" +Environment.NewLine + resultado;}resultado = System.DateTime.Now + " " +"Tweets TimeLine obtenidos" + Environment.NewLine + resultado;return tweets;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener tweets de TimeLine: " + error.Message;return null;}}//Enviar tweetpublic void enviarTweet(string texto, ref string resultado){try{Tweet tweet =twitter.TimelineOperations.UpdateStatusAsync(texto).Result;resultado = System.DateTime.Now + " " +"Tweet enviado correctamente [" + texto + "]";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al enviar tweet: " + error.Message;}/*Tweet tweet = twitter.TimelineOperations.UpdateStatusAsync(txtTweet.Text,new AssemblyResource("c:imagen.png", typeof(Program))).Result;*/}//Obtener últimos 5000 usuarios a los que seguimos (amigos) en Twitter//cursor = -1 obtendrá los 5000 amigos del usuario con el que hemos iniciado sesiónpublic List obtenerUltimos5000Amigos(long cursor, ref string resultado){try{CursoredList amigosTwitter =twitter.FriendOperations.GetFriendIdsInCursorAsync(cursor).Result;resultado = System.DateTime.Now + " " +"Últimos 5000 amigos obtenidos" +Environment.NewLine + resultado;return amigosTwitter;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener 5000 últimos amigos: " + error.Message;return null;}}//Obtener últimos 5000 usuarios que nos siguen (seguidores) en Twitter//cursor = -1 obtendrá los 5000 seguidores del usuario con el que hemos iniciado sesiónpublic List obtenerUltimos5000Seguidores(long cursor, ref string resultado){try{CursoredList seguidoresTwitter =twitter.FriendOperations.GetFollowerIdsInCursorAsync(cursor).Result;resultado = System.DateTime.Now + " " +"Últimos 5000 seguidores obtenidos" +Environment.NewLine + resultado;return seguidoresTwitter;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al obtener 5000 últimos seguidores: " + error.Message;return null;}}}}</em>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 <em>using System;using System.Security.Cryptography;using System.Text;using System.IO;namespace AjpdSoftGestiónSeguidoresTwitter{class Encriptar{public string cifrarTextoAES (string textoCifrar, string palabraPaso,string valorRGBSalt, string algoritmoEncriptacionHASH,int iteraciones, string vectorInicial, int tamanoClave){try{byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(vectorInicial);byte[] saltValueBytes = Encoding.ASCII.GetBytes(valorRGBSalt);byte[] plainTextBytes = Encoding.UTF8.GetBytes(textoCifrar);PasswordDeriveBytes password =new PasswordDeriveBytes(palabraPaso, saltValueBytes,algoritmoEncriptacionHASH, iteraciones);byte[] keyBytes = password.GetBytes(tamanoClave / 8);RijndaelManaged symmetricKey = new RijndaelManaged();symmetricKey.Mode = CipherMode.CBC;ICryptoTransform encryptor =symmetricKey.CreateEncryptor(keyBytes, InitialVectorBytes);MemoryStream memoryStream = new MemoryStream();CryptoStream cryptoStream =new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);cryptoStream.FlushFinalBlock();byte[] cipherTextBytes = memoryStream.ToArray();memoryStream.Close();cryptoStream.Close();string textoCifradoFinal = Convert.ToBase64String(cipherTextBytes);return textoCifradoFinal;}catch{return null;}}public string descifrarTextoAES (string textoCifrado, string palabraPaso,string valorRGBSalt, string algoritmoEncriptacionHASH,int iteraciones, string vectorInicial, int tamanoClave){try{byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(vectorInicial);byte[] saltValueBytes = Encoding.ASCII.GetBytes(valorRGBSalt);byte[] cipherTextBytes = Convert.FromBase64String(textoCifrado);PasswordDeriveBytes password =new PasswordDeriveBytes(palabraPaso, saltValueBytes,algoritmoEncriptacionHASH, iteraciones);byte[] keyBytes = password.GetBytes(tamanoClave / 8);RijndaelManaged symmetricKey = new RijndaelManaged();symmetricKey.Mode = CipherMode.CBC;ICryptoTransform decryptor =symmetricKey.CreateDecryptor(keyBytes, InitialVectorBytes);MemoryStream memoryStream = new MemoryStream(cipherTextBytes);CryptoStream cryptoStream =new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);byte[] plainTextBytes = new byte[cipherTextBytes.Length];int decryptedByteCount =cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);memoryStream.Close();cryptoStream.Close();string textoDescifradoFinal =Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);return textoDescifradoFinal;}catch{return null;}}}}</em>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 <em>using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SQLite;using System.Data.SqlClient;using System.Data;namespace AjpdSoftGestiónSeguidoresTwitter{class BDSQLite{public SQLiteConnection conexionSQLite;//crear la BD SQLite y las tablas para guardar datos de Twitterpublic void crearBDSQLite (string fichero, string contrasena, ref string resultado){try{//creamos la BD SQLiteSQLiteConnection.CreateFile(fichero);if (contrasena != ""){//establecemos la contraseñaconexionSQLite.ChangePassword(contrasena);}//si existe el fichero de BD creamos las tablasif (System.IO.File.Exists(fichero)){//conectamos con la BD SQLite para crear las tablasstring resultadoConexion = "";if (conectarBDSQLite(fichero, contrasena, ref resultadoConexion)){//crear las tablas de SQLite para guardar datos de Twitter//tabla seguidoresstring consultaSQL = "create table seguidores (" +"id long not null primary key, fecha datetime)";SQLiteCommand comandoSQL =new SQLiteCommand(consultaSQL, conexionSQLite);comandoSQL.CommandType = CommandType.Text;comandoSQL.ExecuteNonQuery();//tabla amigosconsultaSQL = "create table amigos (" +"id long not null primary key, fecha datetime)";comandoSQL =new SQLiteCommand(consultaSQL, conexionSQLite);comandoSQL.CommandType = CommandType.Text;comandoSQL.ExecuteNonQuery();//tabla mensajes directosconsultaSQL = "create table mensaje (" +"id not null primary key, idusuario long)";comandoSQL =new SQLiteCommand(consultaSQL, conexionSQLite);comandoSQL.CommandType = CommandType.Text;comandoSQL.ExecuteNonQuery();resultado = System.DateTime.Now + " " +"BD SQLite creada correctamente.";}}}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al abrir la BD SQLite: " + error.Message;}}//conectar con la base de datos SQLitepublic bool conectarBDSQLite (string fichero,string contrasena, ref string resultado){//si existe la BD SQLiteif (System.IO.File.Exists(fichero)){string stringConexionSQLite =String.Format("Data Source={0}", fichero);try{conexionSQLite = new SQLiteConnection(stringConexionSQLite);if (contrasena != "")conexionSQLite.SetPassword(contrasena);conexionSQLite.Open();resultado = System.DateTime.Now + " " +"Conectado a la BD SQLite correctamente";return true;}catch (Exception error){resultado = System.DateTime.Now + " " +"Error al abrir BD SQLite: " + error.Message;return false;}}else{resultado = System.DateTime.Now + " " +"Error al abrir BD SQLite: no existe el fichero " +fichero;return false;}}//comprobar si existe seguidor en la bd SQLite (por el ID de Twitter)public bool existeSeguidor(long idSeguidor, ref string resultado){string consultaSQL ="select count(*) from seguidores where id = " +Convert.ToString(idSeguidor);SQLiteCommand comandoSQL =new SQLiteCommand(consultaSQL, conexionSQLite);comandoSQL.CommandType = CommandType.Text;try{long numRegistros = (long)comandoSQL.ExecuteScalar();comandoSQL.Dispose();resultado = System.DateTime.Now + " " +"Ejecutada consulta SQL en SQLite para existe seguidor: " +Convert.ToString(numRegistros);return (numRegistros > 0);}catch (Exception error){resultado = System.DateTime.Now + " " +"Error SQLite existe seguidor: " + error.Message;return false;}}//insertar nuevo seguidor en BD SQLitepublic void insertarSeguidor(long idSeguidor, ref string resultado){string consultaSQL ="insert into seguidores (id, fecha) values (@idSeguidor, @fecha)";try{SQLiteParameter parametroFecha = new SQLiteParameter();parametroFecha.ParameterName = "@fecha";parametroFecha.DbType = DbType.DateTime;parametroFecha.Value = System.DateTime.Now;SQLiteParameter parametroidSeguidor = new SQLiteParameter();parametroidSeguidor.ParameterName = "@idSeguidor";parametroidSeguidor.DbType = DbType.String;parametroidSeguidor.Value = Convert.ToString(idSeguidor);SQLiteCommand comandoSQL =new SQLiteCommand(consultaSQL, conexionSQLite);comandoSQL.CommandType = CommandType.Text;comandoSQL.Parameters.Add(parametroFecha);comandoSQL.Parameters.Add(parametroidSeguidor);comandoSQL.ExecuteNonQuery();resultado = System.DateTime.Now + " " +"Insertado nuevo seguidor en BD SQLite [" +Convert.ToString(idSeguidor) + "]";}catch (Exception error){resultado = System.DateTime.Now + " " +"Error SQLite insertar seguidor: " +error.Message;}}}}</em>
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468 <em>using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace AjpdSoftGestiónSeguidoresTwitter{public partial class formTwitter : Form{TareasTwitter tareasTwitter = new TareasTwitter();BDSQLite bdSQLite = new BDSQLite();Int32 numMensajesDirectosSesion = 0;private void cerrarAplicacion(){Application.Exit();}public formTwitter(){InitializeComponent();}private void btEliminarMensajeDirecto_Click(object sender, EventArgs e){try{long idMensaje;idMensaje = Convert.ToInt64(lsMensajes.Items[lsMensajes.FocusedItem.Index].Text);if (MessageBox.Show("¿Está seguro que desea eliminar el mensaje directo [" +Convert.ToString(idMensaje) + "]?", "Eliminar mensaje directo",MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==System.Windows.Forms.DialogResult.Yes){string resultado = "";tareasTwitter.eliminarMensajeDirecto(idMensaje, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al eliminar mensaje directo: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btResponderMensajeDirecto_Click(object sender, EventArgs e){try{long idUsuario;idUsuario =Convert.ToInt64(lsMensajes.Items[lsMensajes.FocusedItem.Index].SubItems[1].Text);string resultado = "";string mensaje = "";InputBox.solicitarTexto("Mensaje","Introduzca mensaje directo a enviar:", ref mensaje);tareasTwitter.enviarMensajeDirectoTwitter(mensaje, idUsuario, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al responder mensaje directo: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btConectarTwitter_Click(object sender, EventArgs e){string resultado = "";if (tareasTwitter.obtenerTokenTwitter(ref resultado)){btObtenerDatosPerfil.Enabled = true;btPerfilVisitarURL.Enabled = true;tab.Enabled = true;btObtenerDatosPerfil.Text = "Obtener datos del perfil @" +txtUsuarioAccesoTwitter.Text;}else{btObtenerDatosPerfil.Enabled = false;btPerfilVisitarURL.Enabled = false;tab.Enabled = false;}txtLog.Text = resultado;}private void btObtenerSeguidores_Click(object sender, EventArgs e){//preparamos el ListViewlsSeguidores.Clear();lsSeguidores.View = View.Details;lsSeguidores.GridLines = true;lsSeguidores.FullRowSelect = true;lsSeguidores.Columns.Add("ID", 70);lsSeguidores.Columns.Add("Nick", 80);lsSeguidores.Columns.Add("Nombre", 95);lsSeguidores.Columns.Add("Lo sigo", 40);lsSeguidores.Columns.Add("Seguidores", 60);lsSeguidores.Columns.Add("Siguiendo", 60);lsSeguidores.Columns.Add("Fecha alta", 60);lsSeguidores.Columns.Add("Descripción", 100);lsSeguidores.Columns.Add("URL Perfil", 60);lsSeguidores.Columns.Add("Ubicación", 40);lsSeguidores.Columns.Add("Idioma", 40);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[11];ListViewItem elementoListView;string resultado = "";List seguidores = new List();seguidores = tareasTwitter.obtenerUltimos20Seguidores(ref resultado);//Añadimos los elementos (filas) al ListView//con los seguidores twitter obtenidosforeach (Seguidor seguidor in seguidores){elementosFila[0] = Convert.ToString(seguidor.perfilUsuario.id);elementosFila[1] = Convert.ToString(seguidor.perfilUsuario.nick);elementosFila[2] = seguidor.perfilUsuario.nombre;elementosFila[3] = seguidor.meSigue;elementosFila[4] = Convert.ToString(seguidor.perfilUsuario.seguidores);elementosFila[5] = Convert.ToString(seguidor.perfilUsuario.siguiendo);elementosFila[6] = Convert.ToString(seguidor.perfilUsuario.fechaAlta);elementosFila[7] = seguidor.perfilUsuario.descripcion;elementosFila[8] = seguidor.perfilUsuario.urlPerfil;elementosFila[9] = seguidor.perfilUsuario.ubicacion;elementosFila[10] = seguidor.perfilUsuario.idioma;elementoListView = new ListViewItem(elementosFila);lsSeguidores.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btVisitarPerfilSeguidor_Click(object sender, EventArgs e){string urlPerfilTwitter = "";try{urlPerfilTwitter =lsSeguidores.Items[lsSeguidores.FocusedItem.Index].SubItems[8].Text;System.Diagnostics.Process.Start(urlPerfilTwitter);txtLog.Text = System.DateTime.Now + " " +"Visitado perfil [" + urlPerfilTwitter + "]" +Environment.NewLine + txtLog.Text;}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al visitar perfil Twitter [" +urlPerfilTwitter + "]: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btDejardeSeguir_Click(object sender, EventArgs e){try{string seguidorNick;seguidorNick =lsSeguidores.Items[lsSeguidores.FocusedItem.Index].SubItems[1].Text;string resultado = "";tareasTwitter.dejarDeSeguirAmigo(seguidorNick, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al dejar de seguir a seguidor: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btSeguirSeguidor_Click(object sender, EventArgs e){try{string seguidorNick;seguidorNick =lsSeguidores.Items[lsSeguidores.FocusedItem.Index].SubItems[1].Text;string resultado = "";tareasTwitter.seguirUsuario(seguidorNick, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al seguir a seguidor: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btObtenerUltimosAmigos_Click(object sender, EventArgs e){//preparamos el ListViewlsAmigos.Clear();lsAmigos.View = View.Details;lsAmigos.GridLines = true;lsAmigos.FullRowSelect = true;lsAmigos.Columns.Add("ID", 70);lsAmigos.Columns.Add("Nick", 80);lsAmigos.Columns.Add("Nombre", 95);lsAmigos.Columns.Add("Seguidores", 60);lsAmigos.Columns.Add("Siguiendo", 60);lsAmigos.Columns.Add("Fecha alta", 60);lsAmigos.Columns.Add("Descripción", 100);lsAmigos.Columns.Add("URL Perfil", 60);lsAmigos.Columns.Add("Ubicación", 40);lsAmigos.Columns.Add("Idioma", 40);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[10];ListViewItem elementoListView;string resultado = "";List amigos = new List();amigos = tareasTwitter.obtenerUltimos20Amigos(ref resultado);//Añadimos los elementos (filas) al ListView//con los seguidores twitter obtenidosforeach (Amigo amigo in amigos){elementosFila[0] = Convert.ToString(amigo.perfilUsuario.id);elementosFila[1] = Convert.ToString(amigo.perfilUsuario.nick);elementosFila[2] = amigo.perfilUsuario.nombre;elementosFila[3] = Convert.ToString(amigo.perfilUsuario.seguidores);elementosFila[4] = Convert.ToString(amigo.perfilUsuario.siguiendo);elementosFila[5] = Convert.ToString(amigo.perfilUsuario.fechaAlta);elementosFila[6] = amigo.perfilUsuario.descripcion;elementosFila[7] = amigo.perfilUsuario.urlPerfil;elementosFila[8] = amigo.perfilUsuario.ubicacion;elementosFila[9] = amigo.perfilUsuario.idioma;elementoListView = new ListViewItem(elementosFila);lsAmigos.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btDejarSeguirAmigo_Click(object sender, EventArgs e){try{string seguidorNick;seguidorNick =lsAmigos.Items[lsAmigos.FocusedItem.Index].SubItems[1].Text;string resultado = "";tareasTwitter.dejarDeSeguirAmigo(seguidorNick, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al dejar de seguir a amigo: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btSeguirAmigo_Click(object sender, EventArgs e){try{string seguidorNick;seguidorNick =lsAmigos.Items[lsAmigos.FocusedItem.Index].SubItems[1].Text;string resultado = "";tareasTwitter.seguirUsuario(seguidorNick, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al seguir a amigo: " + error.Message +Environment.NewLine + txtLog.Text;}}private void btEnviarTweet_Click(object sender, EventArgs e){string resultado = "";tareasTwitter.enviarTweet(txtTweet.Text, ref resultado);txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btObtenerUltimosMensajesDirectos_Click(object sender, EventArgs e){//establecemos las propiedades del ListViewlsMensajes.Clear();lsMensajes.View = View.Details;lsMensajes.GridLines = true;lsMensajes.FullRowSelect = true;//añadimos las columnas al ListViewlsMensajes.Columns.Add("ID", 90);lsMensajes.Columns.Add("ID Usuario", 70);lsMensajes.Columns.Add("Nick", 70);lsMensajes.Columns.Add("Usuario", 90);lsMensajes.Columns.Add("Mensaje", 600);lsMensajes.Columns.Add("Fecha", 90);string[] elementosFila = new string[6];ListViewItem elementoListView;string resultado = "";List mensajes = new List();mensajes = tareasTwitter.obtenerUltimos20MensajesDirectos(ref resultado);//Añadimos los elementos (filas) al ListView con los mensajes twitter obtenidosforeach (MensajeDirecto mensaje in mensajes){elementosFila[0] = Convert.ToString(mensaje.id);elementosFila[1] = Convert.ToString(mensaje.idUsuario);elementosFila[2] = mensaje.nick;elementosFila[3] = mensaje.usuario;elementosFila[4] = mensaje.mensaje;elementosFila[5] = Convert.ToString(mensaje.fecha);elementoListView = new ListViewItem(elementosFila);lsMensajes.Items.Add(elementoListView);}txtLog.Text = resultado +Environment.NewLine + txtLog.Text;}private void btObtenerUltimosTweetsTimeLine_Click(object sender, EventArgs e){//Establecemos las propiedades del ListViewlsTweets.Clear();lsTweets.View = View.Details;lsTweets.GridLines = true;lsTweets.FullRowSelect = true;//Añadimos las columnas al ListViewlsTweets.Columns.Add("ID", 90);lsTweets.Columns.Add("ID Usuario", 70);lsTweets.Columns.Add("Usuario", 70);lsTweets.Columns.Add("Fecha", 90);lsTweets.Columns.Add("Tweet", 500);lsTweets.Columns.Add("Nº retweets", 90);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[6];ListViewItem elementoListView;string resultado = "";List tweets = new List();tweets = tareasTwitter.obtener20UltimosTweet("HomeTimeLine", ref resultado);foreach (DatosTweet tweet in tweets){//Añadimos una primera fila al ListViewelementosFila[0] = Convert.ToString(tweet.id);elementosFila[1] = Convert.ToString(tweet.idUsuario);elementosFila[2] = tweet.usuario;elementosFila[3] = Convert.ToString(tweet.fecha);elementosFila[4] = tweet.tweet;elementosFila[5] = Convert.ToString(tweet.NumeroRetweet);elementoListView = new ListViewItem(elementosFila);lsTweets.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btObtenerUltimosTweetsMios_Click(object sender, EventArgs e){//Establecemos las propiedades del ListViewlsTweetsMios.Clear();lsTweetsMios.View = View.Details;lsTweetsMios.GridLines = true;lsTweetsMios.FullRowSelect = true;//Añadimos las columnas al ListViewlsTweetsMios.Columns.Add("ID", 90);lsTweetsMios.Columns.Add("ID Usuario", 70);lsTweetsMios.Columns.Add("Usuario", 70);lsTweetsMios.Columns.Add("Fecha", 90);lsTweetsMios.Columns.Add("Tweet", 500);lsTweetsMios.Columns.Add("Nº retweets", 90);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[6];ListViewItem elementoListView;string resultado = "";List tweets = new List();tweets = tareasTwitter.obtener20UltimosTweet("UserTimeLine", ref resultado);foreach (DatosTweet tweet in tweets){//Añadimos una primera fila al ListViewelementosFila[0] = Convert.ToString(tweet.id);elementosFila[1] = Convert.ToString(tweet.idUsuario);elementosFila[2] = tweet.usuario;elementosFila[3] = Convert.ToString(tweet.fecha);elementosFila[4] = tweet.tweet;elementosFila[5] = Convert.ToString(tweet.NumeroRetweet);elementoListView = new ListViewItem(elementosFila);lsTweetsMios.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btObtenerTweetsMenciones_Click(object sender, EventArgs e){//Establecemos las propiedades del ListViewlsTweetMenciones.Clear();lsTweetMenciones.View = View.Details;lsTweetMenciones.GridLines = true;lsTweetMenciones.FullRowSelect = true;//Añadimos las columnas al ListViewlsTweetMenciones.Columns.Add("ID", 90);lsTweetMenciones.Columns.Add("ID Usuario", 70);lsTweetMenciones.Columns.Add("Usuario", 70);lsTweetMenciones.Columns.Add("Fecha", 90);lsTweetMenciones.Columns.Add("Tweet", 500);lsTweetMenciones.Columns.Add("Nº retweets", 90);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[6];ListViewItem elementoListView;string resultado = "";List tweets = new List();tweets = tareasTwitter.obtener20UltimosTweet("Menciones", ref resultado);foreach (DatosTweet tweet in tweets){//Añadimos una primera fila al ListViewelementosFila[0] = Convert.ToString(tweet.id);elementosFila[1] = Convert.ToString(tweet.idUsuario);elementosFila[2] = tweet.usuario;elementosFila[3] = Convert.ToString(tweet.fecha);elementosFila[4] = tweet.tweet;elementosFila[5] = Convert.ToString(tweet.NumeroRetweet);elementoListView = new ListViewItem(elementosFila);lsTweetMenciones.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btObtenerTweetsFavoritos_Click(object sender, EventArgs e){//Establecemos las propiedades del ListViewlsTweetsFavoritos.Clear();lsTweetsFavoritos.View = View.Details;lsTweetsFavoritos.GridLines = true;lsTweetsFavoritos.FullRowSelect = true;//Añadimos las columnas al ListViewlsTweetsFavoritos.Columns.Add("ID", 90);lsTweetsFavoritos.Columns.Add("ID Usuario", 70);lsTweetsFavoritos.Columns.Add("Usuario", 70);lsTweetsFavoritos.Columns.Add("Fecha", 90);lsTweetsFavoritos.Columns.Add("Tweet", 500);lsTweetsFavoritos.Columns.Add("Nº retweets", 90);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[6];ListViewItem elementoListView;string resultado = "";List tweets = new List();tweets = tareasTwitter.obtener20UltimosTweet("Favoritos", ref resultado);foreach (DatosTweet tweet in tweets){//Añadimos una primera fila al ListViewelementosFila[0] = Convert.ToString(tweet.id);elementosFila[1] = Convert.ToString(tweet.idUsuario);elementosFila[2] = tweet.usuario;elementosFila[3] = Convert.ToString(tweet.fecha);elementosFila[4] = tweet.tweet;elementosFila[5] = Convert.ToString(tweet.NumeroRetweet);elementoListView = new ListViewItem(elementosFila);lsTweetsFavoritos.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void btObtenerTweetsMisRetwees_Click(object sender, EventArgs e){//Establecemos las propiedades del ListViewlsTweetsMisRetweets.Clear();lsTweetsMisRetweets.View = View.Details;lsTweetsMisRetweets.GridLines = true;lsTweetsMisRetweets.FullRowSelect = true;//Añadimos las columnas al ListViewlsTweetsMisRetweets.Columns.Add("ID", 90);lsTweetsMisRetweets.Columns.Add("ID Usuario", 70);lsTweetsMisRetweets.Columns.Add("Usuario", 70);lsTweetsMisRetweets.Columns.Add("Fecha", 90);lsTweetsMisRetweets.Columns.Add("Tweet", 500);lsTweetsMisRetweets.Columns.Add("Nº retweets", 90);//Añadimos los elementos (filas) al ListViewstring[] elementosFila = new string[6];ListViewItem elementoListView;string resultado = "";List tweets = new List();tweets = tareasTwitter.obtener20UltimosTweet("Retweets", ref resultado);foreach (DatosTweet tweet in tweets){//Añadimos una primera fila al ListViewelementosFila[0] = Convert.ToString(tweet.id);elementosFila[1] = Convert.ToString(tweet.idUsuario);elementosFila[2] = tweet.usuario;elementosFila[3] = Convert.ToString(tweet.fecha);elementosFila[4] = tweet.tweet;elementosFila[5] = Convert.ToString(tweet.NumeroRetweet);elementoListView = new ListViewItem(elementosFila);lsTweetsMisRetweets.Items.Add(elementoListView);}txtLog.Text = resultado + Environment.NewLine + txtLog.Text;}private void temporizador_Tick(object sender, EventArgs e){string resultado = "";try{//obtenemos últimos 20 seguidoresList seguidores = new List();seguidores = tareasTwitter.obtenerUltimos20Seguidores(ref resultado);txtLog.Text = resultado +Environment.NewLine + txtLog.Text;//recorremos seguidor a seguidor para tareas automáticasforeach (Seguidor seguidor in seguidores){//si el seguidor es nuevo lo añadimos a la BD SQLiteif (!bdSQLite.existeSeguidor(seguidor.perfilUsuario.id, ref resultado)){txtLog.Text = resultado +Environment.NewLine + txtLog.Text;bdSQLite.insertarSeguidor(seguidor.perfilUsuario.id, ref resultado);txtLog.Text = resultado +Environment.NewLine + txtLog.Text;//Es un nuevo seguidor, le enviamos automáticamente un mensaje directoif (txtTareaAutoMensajeDirectoSeguidores.Text != "" &opTareaAutoEnviarMensajeDirectoSeguidores.Checked){tareasTwitter.enviarMensajeDirectoTwitter(txtTareaAutoMensajeDirectoSeguidores.Text,seguidor.perfilUsuario.id, ref resultado);txtLog.Text = resultado +Environment.NewLine + txtLog.Text;numMensajesDirectosSesion = numMensajesDirectosSesion + 1;bePNumMensajesDirectos.Text = "Nº mensajes directos: " +Convert.ToString(numMensajesDirectosSesion);if (iconizarApp.Visible)iconizarApp.Text = Application.ProductName + " @" +txtUsuarioAccesoTwitter.Text + " [" +Convert.ToString(numMensajesDirectosSesion) + "]";}//añadi mención nuevo seguidorif (opTareaAutoMencion.Checked){if (seguidor.perfilUsuario.nick != "" & txtTareaAutoMencion.Text != ""){string textoMencion = "";textoMencion = txtTareaAutoMencion.Text;textoMencion = textoMencion.Replace("##nick##","@" + seguidor.perfilUsuario.nick);tareasTwitter.enviarTweet(textoMencion, ref resultado);txtLog.Text = resultado +Environment.NewLine + txtLog.Text;}}//Es un nuevo seguidor, lo seguimosif (opTareaAutoSeguirSeguidor.Checked){tareasTwitter.seguirUsuario(seguidor.perfilUsuario.nick, ref resultado);txtLog.Text = resultado +Environment.NewLine + txtLog.Text;//numSeguidos = +1;//bePNumMensajesDirectos.Text = "Nº mensajes directos: " +// Convert.ToString(numMensajesDirectosSesion);}}elsetxtLog.Text = System.DateTime.Now + " " +"El seguidor [" + Convert.ToString(seguidor.perfilUsuario.id) +"] ya existe en la BD" +Environment.NewLine + txtLog.Text;}}catch (Exception error){txtLog.Text = System.DateTime.Now + " " +"Error al iniciar temporizador: " + error.Message +Environment.NewLine + txtLog.Text;