チャットワークのメッセージをSeleniumで取得するプログラムをつくります。まずログインしないといけないのですが、Seleniumだとなかなか画像認証がとおりません。そこで以下の方法をとります。

最初は普通にアクセスしてログインする
セッション情報を保持しておいてログイン状態を維持する

これだと次回Seleniumでアクセスしてもログインされた状態でアクセスできます。

あとはHTMLの解析だけです。

通常のメッセージは以下のようになっています。

もしファイルも一緒に送信するとpreタグのなかがこのようになります。

そこで発言者と発言内容、添付ファイルがあるならこれも取得するというのであれば以下のようになります。

class=”_message”を取得。そのなかのclass=”_speakerName”を調べれば発言者がわかります。preを調べれば発言内容もわかります。pre内にa タグが存在し、その href属性に gateway/download_file.php? が含まれ、target属性が”_downloadFrame”であればそれが添付ファイルです。添付ファイルのurlは https://www.chatwork.com/ + gateway/download_file.php?~ です。

発言時刻ですが、同じ日に複数回メッセージを送ると日付が省略されています。

しかしdata-tm=の部分を調べればここから日付も含めて時刻がわかります。この部分には1970年1月1日0字0分0秒からの経過秒が書かれていることがわかります。日本時間と世界標準時とのあいだに9時間のズレがあります。

data-tm属性を取得して、

これで取得できます。

それから同じ人が連続してメッセージを送ったときに発言者は取得できません。このときは前の人と同じとして処理をおこないます。

でははじめましょう。デザイナで以下のようなものを作ります。

そしてNuGetでSelenium.WebDriverとSelenium.Support、そして操作したいブラウザのDriverをインストールします。今回はChromeを操作するのでSelenium.Chrome.WebDriverをインストールします。それからHTMLの解析でAngleSharp、Excelファイルを操作するためにClosedXMLを使います。AngleSharpとClosedXMLもNuGetでインストールしておいてください。

アプリが開始されるとChromeが起動します。事前にChromeでChatWorkにログインしておけば自動的にログインされます。

ボタンが押されたらファイルを保存する場所を選択させ、ChatWorkのHTMLを解析してデータを取得し、Excelファイルとして保存します。

ChatWorkのHTMLを解析してデータを取得するGetMessageList(int max)メソッドを示します。HTMLの解析にAngleSharpを使用しています。

データを取得できたらExcelファイルとして保存します。ClosedXMLを使用しています。

終了するときにChromeDriverをdisposeする必要があります。これをわすれるとChromeDriverはいつまで立っても終了しません。なにげなくタスクマネージャーをみてみると大変なことになっていました。

ChromeDriverをDisposeするときに時間がかかります。そのあいだFormは閉じないのでユーザーとしては「あれっ」と思うことになります。そこでthis.Visible = false;のあとChromeDriverをDisposeする処理をおこなっています。