* Linux(Ubuntu)で,指定したアカウントのタイムライン200件ツイートを取得(CoreTweet)するC#のプログラム

:CATEGORIES: C#

 元はWindows10のVisual Studioで,.NET Coreとかのコンソールとして作成したものでした。そちらはnamespaceがConsoleAppTwitterとなっていました。これがC#で作成した初めてのプログラムですが,Windows10では先にGUIでウィンドウ処理を行っていました。

using System;
using System.Collections.Generic;
using System.IO;

namespace ttt
{
    class Program
    {
        static void Main(string[] args)
        {
            string tweetText = TweetsGet();
            Console.WriteLine(tweetText);
        }

        static string TweetsGet()
        {
            //var screenName = cmb1.SelectedValue.ToString();
            var screenName = "motoken_tw";
            var str = "";

            var tokens = CoreTweet.Tokens.Create(
                ("ConsumerKey", 
		"ConsumerSecret",
		"AccessToken",
		"AccessSecret");

            // var session = CoreTweet.OAuth.Authorize(("ConsumerKey", "ConsumerSecret", "AccessToken", "AccessSecret");
            // var url = session.AuthorizeUri; // -> user open in browser
            // //get pin
            // tokens = CoreTweet.OAuth.GetTokens(session, "PIN code");


            var parm = new Dictionary<string, object>();
            parm["count"] = 200;
            parm["screen_name"] = screenName;
            parm["tweet_mode"] = "extended";

            var tweets = tokens.Statuses.UserTimeline(parm);

            int i = 1;

            foreach (var tweet in tweets)
            {
                if (tweet.RetweetedStatus == null)
                {
                    var tw_url = "";
                    tw_url = "https://twitter.com/" + tweet.User.ScreenName + "/status/" + tweet.Id;
                    str = str + string.Format("\n---------{0:D3}---------\n", i);
                    str = str + "TW " + tweet.User.Name + "(@" + tweet.User.ScreenName + ") 日時: " + tweet.CreatedAt.DateTime.AddHours(9) + " URL: " + tw_url + "\r\n" + System.Text.RegularExpressions.Regex.Replace(
    tweet.FullText, "^", "> ", System.Text.RegularExpressions.RegexOptions.Multiline) + "\r\n";

                }
                else
                {
                    var tw_url = "https://twitter.com/" + tweet.User.ScreenName + "/status/" + tweet.Id;
                    var rt_url = "https://twitter.com/" + tweet.RetweetedStatus.User.ScreenName + "/status/" + tweet.RetweetedStatus.Id;
                    str = str + string.Format("\n---------{0:D3}---------\n", i);
                    str = str + "RT " + tweet.User.Name + "(@" + tweet.User.ScreenName + ") |" + tweet.RetweetedStatus.User.Name + "(@" + tweet.RetweetedStatus.User.ScreenName + ") 日時:" + tweet.CreatedAt.DateTime.AddHours(9) + "/" + tweet.RetweetedStatus.CreatedAt.DateTime.AddHours(9) + " URL: " + tw_url + " " + rt_url + "\r\n" + System.Text.RegularExpressions.Regex.Replace(
    tweet.FullText, "^", "> ", System.Text.RegularExpressions.RegexOptions.Multiline) + "\r\n";

                }

                i = i + 1;
            }

            return str;

        }

    }

}

 tweet.CreatedAt.DateTime.AddHours(9) という部分でツイートの時刻を日本時間に変更しています。

 よくみると改行コードが\r\nでWindowsのままになっていましたが,Linuxの環境でも問題はなさそうでした。

 他に簡潔な方法があるのかもしれないですが,System.Text.RegularExpressions.Regex.Replace(tweet.FullText, "^", "> ", System.Text.RegularExpressions.RegexOptions.Multiline) は,行頭に引用符を付けるだけの処理です。

 Rubyだと#{tweet_text.gsub(/^/,'> ')} だけで終わる処理です。


using System.Text.RegularExpressions;
……省略……
bool result = Regex.IsMatch("{検査対象文字列}", "{正規表現パターン}");

[source:]正規表現を使って文字列がパターンに一致するか調べるには?[C#VB]:.NET TIPS - @IT https://www.atmarkit.co.jp/ait/articles/1701/25/news025.html

 やはり,ここでusingの出番があったようです。「using System.Text.RegularExpressions;」と宣言を行い,Regex.IsMatch("{検査対象文字列}", "{正規表現パターン}");と使う方法があるようです。

 次の方法の方がよさそうです。


using System.Text.RegularExpressions;
……省略……
var rx = new Regex("{正規表現パターン}", RegexOptions.Compiled);
bool result = rx.IsMatch("{検査対象文字列}" );

[source:]正規表現を使って文字列がパターンに一致するか調べるには?[C#VB]:.NET TIPS - @IT https://www.atmarkit.co.jp/ait/articles/1701/25/news025.html

 VBでは,C#のusingの部分が,Importsとなるようですが,Visual Basicでは見たことがなく,使った覚えがありません。