65.9K
CodeProject 正在变化。 阅读更多。
Home

Twitter 客户端 - 使用 Twitterizer 库通过 Twitter OAuth 登录到 C# 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (13投票s)

2013年4月28日

CPOL

3分钟阅读

viewsIcon

56703

downloadIcon

3167

使用 Twitterizer 进行 C# Twitter 集成。

介绍 

本文介绍了 WPF 应用程序与 twitter 的集成,以及一个使用 Twitterizer 库的包含所有基本功能(推文、私信等)的简单 twitter 客户端。

其目的是提供一种使用 twitter 登录应用程序并执行对开发者可能有用的基本操作的简便方法。

背景 

codeproject 上已经有一篇关于 twitter 和 facebook 集成的优秀文章,名为“使用 oAuth 的 C# 应用程序与 facebook 和 twitter 集成”。

请按照上述文章中的说明创建您自己的 secretKey 和 token。

但本文的目的是提供使用 Twitterizer 的 twitter 最常用功能。我一直在寻找 twitterizer 的帮助,遇到了很多问题,所以我决定为其他使用 C# 的 twitterizer 的人写一篇文章。

本文使用 WPF 中的 xml 和浏览器。所以在继续之前,请确保您了解这些。有很多关于 xml 和浏览器控件的文章,例如XML 入门 所以我不会讨论这些。

工作原理

 

当应用程序运行时,它会检查用户是否已登录。如果没有,则显示一个浏览器窗口,以便从 twitter 验证。用户登录到 twitter,twitter 生成一个 pin,用户将其粘贴到提供的文本框中。现在启动主窗口,可以在其中执行所有操作。

登录/注销

当用户登录到 twitter 时,twitter 会将一个键值对发送到应用程序,称为令牌。然后将这些令牌保存到 xml 中。每当用户想要更新状态、发送私信或检查关注者等时,必须将这些令牌与请求一起发送给 twitter。

当用户第一次登录时,此令牌会保存到 xml,下次用户启动应用程序时,应用程序首先检查令牌是否已保存在 xml 文件中。如果令牌已经保存,则表示用户已经登录,否则显示浏览器。

当用户想要注销时,只需单击主窗口中的注销按钮来删除该 xml 文件。下次,系统会再次提示用户登录。

使用代码

代码包含三个 WPF 窗口和两个类。

浏览器窗口和类:
public partial class Browser : Window
{
    public Browser()
    {
        InitializeComponent();
    }
    XMLStuff myXML;

    private void btnRefresh_Click(object sender, RoutedEventArgs e)
    {
        browserControl.Refresh();
    }
    // checks whether already logged in or not. if logged in then goto main window, else goto twitter
    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        myXML = new XMLStuff();
        statusBarMessage.Text = "Checking for login info..";
        bool loggedIn = AlreadyLoggedIn();
        statusBarMessage.Text = "Not logged in, shifting to login page.";
        if (!loggedIn)
        {
            Login();
            statusBarMessage.Text = "";
        }
        else
        {
            MainWindow mw = new MainWindow();
            mw.Show();
            this.Close();
        }
    }
 
    private void btnSend_Click(object sender, RoutedEventArgs e)
    {
        TwitterStuff.pin = tbPin.Text; //when user enters pin, it is saved to TwitterStuff class
        Properties.Settings.Default.Save();
        TwitterStuff.tokenResponse2 = OAuthUtility.GetAccessToken(TwitterStuff.consumerKey, 
          TwitterStuff.consumerSecret, TwitterStuff.tokenResponse.Token, tbPin.Text);
        myXML.writeToXML(TwitterStuff.tokenResponse2.ScreenName.ToString(), 
          TwitterStuff.tokenResponse2.Token, TwitterStuff.tokenResponse2.TokenSecret);
        TwitterStuff.screenName = TwitterStuff.tokenResponse2.ScreenName.ToString();
        SetLocalTokens();
        //MessageBox.Show("Logged In and local tokens are set");
        statusBarMessage.Text = "Successfuly logged in.";
        MainWindow mw = new MainWindow();
        mw.Show();
        this.Close();
    }

    private void browserControl_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        lblUri.Content = browserControl.Source.AbsoluteUri.ToString();
        progressBar.IsIndeterminate = false;
        progressBar.Visibility = System.Windows.Visibility.Hidden;
        // MessageBox.Show(browserControl.Source.AbsoluteUri.ToString());
    }
    // open twitter site with our consumerKey and consumerSecret to login
    private void Login()
    {
        TwitterStuff.tokenResponse = OAuthUtility.GetRequestToken(TwitterStuff.consumerKey, 
                  TwitterStuff.consumerSecret, TwitterStuff.callbackAddy);
        string target = "http://twitter.com/oauth/authenticate?oauth_token=" + 
                  TwitterStuff.tokenResponse.Token;
        try
        {
            browserControl.Navigate(new Uri(target));
        }
        catch (System.ComponentModel.Win32Exception noBrowser)
        {
            if (noBrowser.ErrorCode == -2147467259)
                MessageBox.Show(noBrowser.Message);
        }
        catch (Exception other)
        {
            MessageBox.Show(other.Message);
        }
    }

 
    /// <summary>
    /// Initialize token
    /// </summary>
    private void SetLocalTokens()
    {
        TwitterStuff.tokens = new OAuthTokens();
        TwitterStuff.tokens.AccessToken = TwitterStuff.tokenResponse2.Token;
        TwitterStuff.tokens.AccessTokenSecret = TwitterStuff.tokenResponse2.TokenSecret;
        TwitterStuff.tokens.ConsumerKey = TwitterStuff.consumerKey;
        TwitterStuff.tokens.ConsumerSecret = TwitterStuff.consumerSecret;
    }
    // if already logged in, then tokens are loaded from xml file using this method.
    private bool SetLocalTokens(string accessToken, string tokenSec)
    {
        try
        {
            TwitterStuff.tokens = new OAuthTokens();
            TwitterStuff.tokens.AccessToken = accessToken;
            TwitterStuff.tokens.AccessTokenSecret = tokenSec;
            TwitterStuff.tokens.ConsumerKey = TwitterStuff.consumerKey;
            TwitterStuff.tokens.ConsumerSecret = TwitterStuff.consumerSecret;
            // MessageBox.Show("Tokens with arguments initialized.");
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
    // this method checks whether xml file exists and reads data,
    // if so, it means that user is logged in. and true is returned 
    private bool AlreadyLoggedIn()
    {
        try
        {
            //MessageBox.Show("Trying to get login info");
            List<string> LoginInfo = myXML.readFromXml();

            TwitterStuff.screenName = LoginInfo[1];
            if (!SetLocalTokens(LoginInfo[2], LoginInfo[3]))
                return false;
            //MessageBox.Show("Already logged in.");
            return true;
        }
        catch (Exception e)
        {
            statusBarMessage.Text = "Not logged in.";
            return false;
        }
    }

    private void browserControl_Navigating(object sender, 
                     System.Windows.Navigation.NavigatingCancelEventArgs e)
    {
        progressBar.IsIndeterminate = true;
        progressBar.Visibility = System.Windows.Visibility.Visible;
    }
}

XMLStuff 类只是使用 writeToXML 方法将令牌字符串写入 xml 文件,并使用 readFromXml 读取令牌。

当用户单击注销按钮时,将调用 xml 注销方法,该方法仅删除 XML 文件。

TwitterStuff

此类执行所有与 twitter 相关的功能。

public static string consumerKey = "your consumer key here";
public static string consumerSecret = "your consumer secret here"

通过遵循上述文章,从 twitter 获取您的 consumerKey 和 consumerSecret。

public static string pin = "xxxxxxx";

当用户登录到 twitter 时,twitter 提供一个 pin,该 pin 存储在此变量中。

public static OAuthTokens tokens;

这些令牌作为参数传递给所有主要的 twitter 函数。例如,发送消息函数

TwitterDirectMessage.Send(tokens, receiverScreenName.Trim(), msg);

更新状态的方法:

public bool tweetIt(string status)
{
    try
    {
        TwitterStatus.Update(tokens, status);
        MessageBox.Show("Status updated successfuly");
        return true;
    }
    catch (TwitterizerException te)
    {
        MessageBox.Show(te.Message);
        return false;
    }
} 

此方法采用一个字符串变量并将其作为推文发布到 twitter。

public List<string> getMessages()
{
    List<string> temp = new List<string>();
    var receivedMessages = TwitterDirectMessage.DirectMessages(tokens);
    foreach (var v in receivedMessages.ResponseObject)
    {
        temp.Add(v.Recipient.ScreenName + " >> " + v.Text);
    }

    return temp;
}  

上述方法获取所有用户的所有已接收消息,然后将其存储到一个字符串列表中。

兴趣点 

如果您想将 twitter 集成到您的应用程序中,那么此项目中的 TwitterStuff 和 Browser 类将为您提供帮助。

重要提示

此项目是在 VS2012 中创建的,可能无法在以前的版本中打开。

Twitterizer 库用于连接到 twitter。 可在 https://github.com/Twitterizer/Twitterizer 获取

这是我的第一篇文章,所以请...!

© . All rights reserved.