Mantisの最新コメントを、見逃さずにSlackへ！(RSS, Selenium, AWS活用記)

## はじめに

この記事は、私が過去に社内の不便さを改善しようと進めた個人プロジェクトを、記録としてまとめたものです。作成時点から時間は経っていますが、一つの課題を発見し、技術的に解決していった過程を共有することで、私と同じような挑戦をする方々の参考になれば幸いです。

私たちのチームは日本支社で、韓国本社が運営するMantisを利用しています。UIやイシュー内容はすべて韓国語のため、日本のQAチームは新しいイシューやコメントが登録されても、リアルタイムで内容を把握するのが困難でした。この問題を解決するため、私は自動化システムの構築に挑戦しました。

実は、このプロジェクトを始めた当時、私はクラウドサーバーやWeb自動化に関する経験が全くありませんでした。しかし、この非効率な状況を何とかしたいという強い思いから、ChatGPTのようなAIツールを学習パートナーとして活用し、挑戦を始めました。単純に答えを求めるのではなく、「なぜこのコードが必要なのか」「もっと良い方法はないか」と対話を重ねることで、技術の原理を理解しようと努めました。

## 1. 最初の挑戦：RSSを利用したリアルタイムのタイトル通知

最初に試みたのは、Zapierのような外部自動化ツールでした。しかし、Mantisサーバーのセキュリティポリシーにより外部からのアクセスが遮断され、失敗に終わりました。この経験から外部からデータを引っぱる(Pull)のではなく、内部からデータを押し出す(Push)方式が必要だと判断し、Oracle Cloudの無料VMにサーバー環境を自前で構築することにしました。

-   **ソリューション**: 1分ごとにMantisのRSSフィードを確認するPythonスクリプトを作成。
-   **技術スタック**: `feedparser`でRSSをパースし、`deep-translator`でイシューのタイトルを日本語に翻訳してSlackに送信。`screen`ユーティリティを使い、24時間無停止での運用を実現しました。

## 2. 明確になった限界：それで、内容は？

システムは期待通りに動作しましたが、致命的な短所がありました。RSSフィードはイシューのタイトルと更新日時しか提供せず、肝心な詳細内容やコメントは通知できなかったのです。

> 通知は来るけど、内容を確認するには結局リンクをクリックしないといけない…

チームメンバーのフィードバック通り、このシステムは半分だけの解決策でした。当時、RSSの情報だけではこの限界を越えられないと考え、プロジェクトは一旦ここで区切りをつけました。

## 3. 技術的ブレークスルー：別プロジェクトで見つけた鍵、Selenium

しばらくして、QAチームから全く別の依頼を受けました。「Mantisのイシューを日本語で検索したい」というものです。

この課題を解決するためにGoogle Sheetsを活用した検索システムを構築する過程で、私は初めてSeleniumという強力な自動化ツールに出会いました。Seleniumを使えば、コードでWebブラウザを直接操作し、ログインからデータ抽出まで自動化できることを知りました。

> **➡️ 詳細はこちら:** [MantisデータをGoogle Sheetsで日本語リアルタイム検索 (GAS & Selenium活用記)](https://qiita.com/HNGSNGGN/items/4877dcac2e28d8297ca6)

このプロジェクトを成功させた瞬間、私は確信しました。
> Seleniumでログインセッションを確立できるなら、以前諦めたコメント内容の取得も可能になる！

過去の課題を解決する鍵を、ついに手に入れたのです。

## 4. 第二の挑戦：RSSとSeleniumの完璧な連携

私は既存のRSS通知システムを、全く新しいアーキテクチャで再設計しました。RSSが「変化の合図」を送り、Seleniumが「詳細な内容」を取得する方式です。

1.  **RSSで変更を検知**: 1分ごとにRSSフィードをチェックし、`pubDate`が更新された最新のイシューを特定します。
2.  **Seleniumで詳細情報を抽出**: 変更が検知されると、SeleniumでMantisにログインして取得したセッションクッキーを`requests`ライブラリに引き継ぎます。このセッションを利用して、イシューの詳細ページからHTMLを丸ごと取得します。
    ```python
    # ログインとセッションの再利用
    def get_session():
        # ... (Seleniumによるログインとクッキー抽出処理) ...
        s = requests.Session()
        for c in drv.get_cookies():
            s.cookies.set(c["name"], c["value"], domain=c["domain"])
        driver.quit()
        return s
    ```
3.  **インテリジェントなフィルタリング**: `BeautifulSoup`でHTMLをパースし、「最終更新日時」と「最後のコメント日時」を比較。その差が2分以内である場合のみ、「コメントがたった今投稿された」と判断し、通知を送信します。
4.  **Slackへ通知**: AWS Translate APIでコメント内容と作成者を日本語に翻訳し、整形されたフォーマットでSlackに送信します。

## 5. 運用安定性の強化：AWS Translateの導入

機能は完成しましたが、翻訳に利用していた`deep-translator`は非公式APIに依存するため、安定性に懸念がありました。そこで、信頼性とセキュリティが保証されたAWSのAmazon Translate APIに切り替えることにしました。

-   **実装**: Python用のAWS SDKである`boto3`を利用して翻訳機能を置き換えました。この過程でIAMロールの権限設定や、環境変数による安全なアクセスキー管理方法についても学習し、「動くコード」から「運用可能なシステム」へと品質を高める経験ができました。
    ```python
    # AWS翻訳関数
    translate = boto3.client("translate", region_name="ap-northeast-1")
    def aws_translate(text, target_lang="ja"):
        # ... (boto3による翻訳リクエスト) ...
        return result["TranslatedText"]
    ```

## おわりに

一つの課題解決のために学んだ技術が、過去に諦めた別の課題を解決する鍵となる、技術の好循環を実体験できたプロジェクトでした。最初は「動くこと」に集中していましたが、次第に「安定的で信頼できること」を考えるようになり、自ら課題を発見し、新しい技術を学び、実用的なシステムとして完成させる一連のプロセスを経験できたことが、何よりの成長でした。

---

### **GitHub Code**

> **[mantis_comment_monitor.py](https://github.com/HNGSNGGN/mantis-automation-suite/blob/main/mantis_comment_monitor.py)**
>
> *(全ての機密情報は`.env`ファイルで分離し、安全に管理しています。)*