とりあえず、自身が保有している 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ページの各要素に対して操作を行い、以下の手順でツイート処理を行う。- ツイートボタンをクリックし、ツイートボックスを前面に表示する
- ツイートデータを入力
- ツイートする
実際にこのプログラムを動作させると次のようになります。
アプリ起動時:
Twitterにログインしている場合には、ホーム画面がWebBrowserに読み込まれる
Twitterにログインしていない場合には、ツイートしたいユーザでログインする
tweetボタンクリック時:
tweetボタンをクリックすると、ツイートする画面にメッセージが自動的に入力される
↓
そのまま自動的にツイートが行われる
上記のコードでプログラム的にツイートを行えることを確認しました。
以下注意点です。
- 上記のコードはC#のWebBrowserでプログラム的にツイートが行えることの実証の為のコンセプトコードであり、そのまま使用するのは大変危険です。(動けばいいやという気持ちで書かれたコードであり、あくまで参考程度にとどめておいてください。)
- 上記のソースコードを参考にする場合には、Twitterの利用規約に反しないよう、十分に留意してください。
- 上記のコードは現在のTwitterのHTMLソースに大きく依存しており、TwitterのHTMLソースが変更された場合には、動かなくなる可能性があります。
参考文献
*1Twitterizerでtwitterにツイートする方法 - 紙切れの山
http://d.hatena.ne.jp/AllaMarcia/20120114/1326513447
*2
【PHP】Twitter APIを使ってツイートをしてみる » はげたまのめもちよう
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) « ツール工房 覚書
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
コメントを投稿
コメント投稿機能について