日々のコンピュータ情報の集積と整理

Dr.ウーパのコンピュータ備忘録

2014年4月6日日曜日

C#のWebBrowserを使ってプログラム的にツイートする方法を考えてみた

Twitterのつぶやきをプログラム的に行いたいと考えていろいろと調べてみましたが、一般的な方法である Twitter の API を使用する方法はいろいろと外部のライブラリを使用しないといけなかったり、いろいろと手順が必要で大変そうでした。(*1)(*2)(*3)

とりあえず、自身が保有している Twitter アカウントに対して、プログラム的にツイートが行えればよいので、何か簡単にできる方法が無いかと考えていたところ、C# で WebBrowser を使用してツイートする方法を思いつきました。


以下、その方法について簡単に説明します。

フォームのデザイン:

WebBrowserコントロールとツイート用のボタンを設置


全ソースコードからコアの部分を抜粋:


        // メソッド:指定した秒数分、DoEvents を実行する
        // sec : DoEvents を実行する秒数
        // 備考:
        //   CPU 使用率を 100% で張り付かせないために、
        //   適当にスリープを織り交ぜつつ DoEvents を実行する
        private void DoEvents(int sec)
        {
            const int sleepTime = 100;                              // スリープする時間 (ミリ秒)
                                                                    // 長すぎず、短すぎない、処理に適した時間を指定する
            for (int i = 0; i < sec * (1000 / sleepTime); i++)
            {
                System.Windows.Forms.Application.DoEvents();
                System.Threading.Thread.Sleep(sleepTime);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                // ツイートボタンをクリックし、ツイートボックスを前面に表示する
                {
                    // 画面右上のツイートするボタン要素を取得し、click する
                    HtmlElement he = this.webBrowser.Document.GetElementById("global-new-tweet-button");
                    he.InvokeMember("click");
                }

                // ブラウザの処理が完了するまで適当な時間待つ:2秒待つ
                //   完全にこのスレッドをスリープさせてしまうと、ブラウザの処理も止まってしまうため、
                //   DoEvents をしつつ、スリープを行い、指定時間待つ
                DoEvents(2);

                
                HtmlElement he_tweetform;           // ツイートするためのテキストボックスやボタンを格納している form

                // ツイートデータを入力
                {
                    // ツイートを入力する要素を取得し、テキストをセット
                    HtmlElement he = this.webBrowser.Document.GetElementById("tweet-box-global");
                    he.InnerText = "テストメッセージ-" + System.DateTime.Now.ToString();
                    he_tweetform = he.Parent.Parent;
                }


                // ブラウザの処理が完了するまで適当な時間待つ:2秒待つ
                //   完全にこのスレッドをスリープさせてしまうと、ブラウザの処理も止まってしまうため、
                //   DoEvents をしつつ、スリープを行い、指定時間待つ
                DoEvents(2);


                // ツイートする
                {
                    // ツイートボタン要素を取得し、クリックする
                    //   ツイートボタンはドキュメント内に2箇所あるので、
                    //   目的のツイートボタンが得られるようにツイートデータ入力に使用した要素が属するformから検索する
                    HtmlElementCollection hec = he_tweetform.GetElementsByTagName("button");
                    foreach(HtmlElement he in hec )
                    {
                        if (he.GetAttribute("className") == "btn primary-btn tweet-action tweet-btn js-tweet-btn")
                        {
                            he.InvokeMember("click");
                            break;
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.ToString());
            }
        }


プログラムの処理としては以下の流れになります。

アプリ起動時:

WebBrowserコントロールでTwitterのWebページを読み込む。


tweetボタンクリック時:

WebBrowserコントロールで読み込んだTwitterのWebページの各要素に対して操作を行い、以下の手順でツイート処理を行う。

  1. ツイートボタンをクリックし、ツイートボックスを前面に表示する
  2. ツイートデータを入力
  3. ツイートする



実際にこのプログラムを動作させると次のようになります。

アプリ起動時:

Twitterにログインしている場合には、ホーム画面がWebBrowserに読み込まれる
Twitterにログインしていない場合には、ツイートしたいユーザでログインする


tweetボタンクリック時:

tweetボタンをクリックすると、ツイートする画面にメッセージが自動的に入力される
そのまま自動的にツイートが行われる


上記のコードでプログラム的にツイートを行えることを確認しました。


以下注意点です。

  • 上記のコードはC#のWebBrowserでプログラム的にツイートが行えることの実証の為のコンセプトコードであり、そのまま使用するのは大変危険です。(動けばいいやという気持ちで書かれたコードであり、あくまで参考程度にとどめておいてください。)
  • 上記のソースコードを参考にする場合には、Twitterの利用規約に反しないよう、十分に留意してください。


  • 上記のコードは現在のTwitterのHTMLソースに大きく依存しており、TwitterのHTMLソースが変更された場合には、動かなくなる可能性があります。



参考文献

*1
Twitterizerでtwitterにツイートする方法 - 紙切れの山
http://d.hatena.ne.jp/AllaMarcia/20120114/1326513447

*2
【PHP】Twitter APIを使ってツイートをしてみる &raquo; はげたまのめもちよう
http://blog.oretama.com/2013/02/11/%E3%80%90php%E3%80%91twitter-api%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%84%E3%82%A4%E3%83%BC%E3%83%88%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/

*3
[C#] OAuth認証を利用しクライアントアプリケーション(デスクトップアプリケーション)から Twitterにつぶやきを投稿する
http://www.ipentec.com/document/document.aspx?page=csharp-use-twitter-api-oauth-winform


WebBrowser クラス (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser(v=vs.110).aspx

HtmlElement メソッド (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement_methods(v=vs.110).aspx

[C#] 簡単 WebBrowser の作成 言語: C#
http://code.msdn.microsoft.com/windowsdesktop/C-WebBrowser-1a4dd8ed

C#のWebBrowserコントロールを使ってみる (1) &laquo;  ツール工房 覚書
http://studio.tgl.jp/blog/?p=1187

[C#]WebBrowserコンポーネントで、id名、タグ名、name属性、class属性それぞれで要素を取得する方法: プログラミングメモ
http://how-to-be-a-hacker.seesaa.net/article/268251370.html

WebBrowserコントロール内のテキストボックスに文字列をセットするには?[2.0、C#、VB] - @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/860controlwb/controlwb.html

DoEventsを行う: .NET Tips: C#, VB.NET
http://dobon.net/vb/dotnet/vb6/doevents.html





関連記事

関連記事を読み込み中...

同じラベルの記事を読み込み中...