Chatworkのメッセージログをチャンネル画面から直接頑張って取ってみた #chatwork #xpath

KDDI Chatworkのメッセージログ一括取得を色々な制約下でチャレンジしてみた記録です。
2019.02.26

Chatworkにログインしない状態での検索及び調査用に、Chatworkのメッセージログ取得を試みた記録です。API等は使わなかったため、ローコストや省エネとは縁遠いかもしれません。

Chatworkのログ取得方法

Chatworkにおける公式なログ取得には

  • APIによるメッセージ取得
  • 管理画面からのログエクスポート

の2通りが存在します。今回は以下の理由により、上記のいずれも利用しません。

方法 理由
APIによるメッセージ取得 実行制限にぶつかったのか取れなくなった
管理画面からのエクスポート エクスポート権限がない

非公式での一括取得

公式の手順が取れない代わりとして、goodbye-chatworkによる自動ログイン及びログ一括取得が一番手間もかからなさそうだと考えましたが、KDDI Chatworkのログイン画面更新及び2018年8月にへrecaptchaが実装されたことへライブラリが追従していないこともあり、機能しなくなっていました。

ただ、手動ログイン及びブラウザ上に表示されているメッセージを直接コピー等で保存特定のフォーマットにて取得する事は十分可能なため、なるだけ再利用時に加工がいらなくなるようXPathでの要素取得を試してみました。

XPathによるログ取得

今回はScraperというChromeアドオンを利用します。

手続きは以下の流れになります。

  1. KDDI Chatworkにログインする
  2. 該当のチャンネルを開く
  3. Scraper上でXPathを入力する
  4. 取得できた結果をGoogle Spreadsheetに追加する

なお、Chatwork上でScraperを開くと以下のアラートが出ますが、Scrape動作は機能することを確認済みです。

入力が終わったら右下のScrapeをクリックします。右側に解析結果が出力されるはずです。

解析結果画面右下の「Export to Google Docs...」をクリックして、連携操作等を終えたら完了です。

指定するXPath

各フォームに入力します。Columnsは緑の+ボタンにて増やすことができます。

Selecter

名前
XPath //div[contains(@class , "timelineMessage")]/div[contains(@class, "timelineMessage__body")]

Columns

名前
icon_url div/img/@src
username div[contains(@class, "timelineMessage__content")]/div/p[contains(@class, "timelineMessage__userName")]/.
orgname div[contains(@class, "timelineMessage__content")]/div/p[contains(@class, "timelineMessage__orgName")]/.
message div[contains(@class, "timelineMessage__content")]/pre[contains(@class, "timelineMessage__message")]/.
time div[contains(@class, "timelineMessage__timeStamp")]/.

取得する上での注意点

処理の都合上、各チャンネル上のその時点で表示されているログのみをまとめて取得します。表示されていないログについては取得することが出来ません。必要に応じてスクロールさせてから再度実施してください。

まとめ

既存の取得方法が一通り利用できない状況にあったため、表示されている部分をHTMLファイルとして丸ごと保存も考えました。が、加工することを考えた結果XPathによる要素取得という形にしてみました。

操作の都合で全ログをキレイに取るのが難しいため、ある程度重複前提で取得したあとに整理するか、必要なログをピックアップして取得することをオススメします。