2013年8月21日水曜日

自作Twitterクライアント作成の記録⑨ リツイートとふぁぼ(お気に入り)機能の実装

久しぶりの更新です、ようやくリツイートとふぁぼの実装ができました。
@ツイート(返信)はもうちょっとまっててね。(もしかしたら今回の応用かも?)



さて、おそらく皆さん普段使われている?この二つの機能、ようやく実装です。

そこでソースだけだとあれなので(わかりにくい?)、今回はリツイートを例にどのような処理をしているのか、自分なりにまとめてみました。(間違ってる部分もあるかも)

さて、おそらくツイッターをやってる方ならこんな風に

↑今頃だけど一応名前を消しておく

リツイートをされたり、したりしてますよね?(無論私はするほうが多いです)←関係ない
でも、どうやって目的のツイートをリツイートしたりしているんでしょう。
それは、ツイートごとに振られているあるIDを使用して、判断しています。その名も「StatusID」
これは、string型であり、このような値が入ってます。

デバックモードで見た値

ちょっと見難いかも?て、そんなことはどうでもよくて、この値をリツートするための関数(であってるかな?)に代入してあげるとリツートができるという仕組みです。

とまあつまり、つぶやきの整理番号的なものを取得してそれをつぶやき本文と同時に送ってあげればいいのです。(これでわかるのか?)
さて、そろそろソースを見てみますか、まずはForm1(メインフォーム)から変更点を

//更新ボタン
        private void button2_Click(object sender, EventArgs e)
        {
            int y = -132;
            twittertoolStripStatusLabel1.Text = "取得中・・・";
            //TLの取得
            if ("TimeLine" == ChangeTextMode)
            {               
                try
                {   
                    //TLの取得準備
                    var tweets =
                        from tweet in twitterCtx.Status
                        where tweet.Type == StatusType.Home &&
                        tweet.Count == TCount   //一度の更新で取得するツイート数
                        select tweet;
                    //TLの取得
                    foreach (var tweet in tweets)
                    {
                        Form2 f = new Form2();
                        f.TopLevel = false;
                        panel1.Controls.Add(f);
                        f.Show();
                        y += 132;
                        f.Location = new Point(1, y);
                        f.BringToFront();
                        f.TextFont = Properties.Settings.Default.Font;
                        f.twText = (tweet.User.Name + "\r\n" + tweet.Text);
                        f.TweetID = tweet.StatusID;
                    }
                    twittertoolStripStatusLabel1.Text = "取得完了!";
                }
                catch (Exception ex) //例外設定
                {
                    MessageBox.Show(ex.Message, "じみったー", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    twittertoolStripStatusLabel1.Text = "取得エラー";
                }
            }
//以下略

さて、もうお気づきの方もいらっしゃると思いますが、「f.TweetID = tweet.StatusID;」という行が増えただけです。これでForm2(ツイート表示用のフォーム)へIDを送ってるだけです。

なのでお次はForm2です、そんなに行数は無いので丸ごといっちゃいましょう

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;
using LinqToTwitter;

namespace じみったー
{
    public partial class Form2 : Form
    {
        string tweetID;
        TwitterContext TwitterCtx;
        PinAuthorizer Auth;
        public string accessToken = "";
        public string accessSecret = "";
        public string consumerKey = "見ないで";
        public string consumerSecret = "見せないよ";

        public Form2()
        {
            InitializeComponent();
            richTextBox1.DetectUrls = Properties.Settings.Default.DetectUrls;
            LoadInit();
            if (accessToken != "") //アクセストークンが指定されてるか
            {
                Auth = new PinAuthorizer();
                Auth.Credentials = new InMemoryCredentials
                {
                    ConsumerKey = this.consumerKey,
                    ConsumerSecret = this.consumerSecret
                };
                Auth.OAuthTwitter.OAuthToken = this.accessToken;
                Auth.OAuthTwitter.OAuthTokenSecret = this.accessSecret;
                TwitterCtx = new TwitterContext(Auth);
            }
        }

        //テキストボックス関連の設定準備
        public RichTextBox RTBox
        {
            get { return richTextBox1; }
            set { richTextBox1 = value; }
        }

        //ツイートの受け取り
        public string twText
        {
            set { richTextBox1.Text = value; }
            get { return richTextBox1.Text; }
        }
        //リツイート等にに必要なツイートIDの受け取り
        public string TweetID
        {
            set { tweetID = value; }
            get { return tweetID; }
        }
        //フォント設定の受け取り
        public Font TextFont
        {
            set { richTextBox1.Font = value; }
            get { return richTextBox1.Font; }
        }
        //ハイパーリンククリック時の挙動
        private void richTextBox1_LinkClicked(object sender, LinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start(e.LinkText);
        }
        //リツートボタンクリック時の挙動
        private void button2_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show("リツートしてよろしいですか?","確認",MessageBoxButtons.YesNo,MessageBoxIcon.Information);
            if (result == DialogResult.Yes)
            {
                var retweet = TwitterCtx.Retweet(tweetID);
            }
        }
        //お気に入りボタンクリック時の挙動
        private void button3_Click(object sender, EventArgs e)
        {
            var status = TwitterCtx.CreateFavorite(tweetID);
        }
        // 設定値を読み込み
        private void LoadInit()
        {
            this.accessToken = Properties.Settings.Default.accessToken;
            this.accessSecret = Properties.Settings.Default.accessSecret;
        }
    }
}

はい、まず、IDを受け取るためのプロパティを新たに作ってます。
あとは、それを変数に格納しておき、必要なときに引数として使うそれだけですと思ってたんです。
OAuth認証の存在を完全に忘れてました。
なのでFrom1でしてる処理をForm2でもやる始末、これは気が向いたら直しておきます、はい。

一応これでリツイートとふぁぼはできるようになりましたが・・・
実はこれ・・・・

まだリツイート、ふぁぼの取り消し&リツイートしてるのか、してないのか知る手段は一切ありません!

中途半端乙
これは、時間があったら挑戦しておきます、はい。(あと@ツイートも)


おまけ
タイトルの⑨ネタ、いったい何人わかるんだろう・・・

0 件のコメント:

コメントを投稿