SlackとJira連携で業務効率化!Pythonで作る問い合わせ対応ボット開発ハンズオン
「この申請はどうすればいいですか?」「VPNの接続方法を教えてください」といった社内の定型的な問い合わせ対応に、多くの時間を費やしていませんか?本記事では、こうした課題を解決するための一助として、PythonとSlack、Jiraを連携させた問い合わせ対応ボット(エージェント)の開発手順を、初心者にも分かりやすくハンズオン形式で解説します。
完成するボットは、Slack上の質問に自動で回答し、解決できない場合は自動でJiraにサポートチケットを発行します。この記事を読みながら手を動かせば、プログラミング初心者や業務改善に関心のあるビジネスパーソンでも、実践的な業務効率化ツールを作成できます。
本記事で作成するボットの仕組み
今回開発するSlackエージェントは、以下の流れで動作します。
- Slackでの質問受付: ユーザーが特定のSlackチャンネルでボットにメンションを付けて質問します。
- ナレッジ検索と自動回答: ボットは、あらかじめ用意されたナレッジデータ(よくある質問と回答のペア)を検索します。質問内容に一致するキーワードがあれば、自動で回答を返信します。
- Jiraチケットの自動起票: ナレッジデータに適切な回答が見つからない場合、ボットはユーザーの質問内容を基にJira Cloudへ自動的にサポートチケットを作成します。
- ユーザーへの通知: チケット作成後、ボットは作成されたチケット番号をSlack上でユーザーに通知し、担当者による対応にスムーズに引き継ぎます。
この仕組みにより、簡単な問い合わせは即時解決し、専門的な対応が必要な問題は自動でエスカレーションされ、問い合わせ対応業務の大幅な効率化が期待できます。
前提準備と必要なツール
ハンズオンを始める前に、以下のツールと環境を準備してください。ほとんどは無料で利用開始できます。
ツール・環境 | 説明 |
---|---|
Slackワークスペース | ボットをテストするためのSlack環境。普段の業務用とは別に、無料で開発用ワークスペースを作成できます。アプリ作成権限が必要です。 |
Jira Cloud環境 | AtlassianのJira Cloudサイトとプロジェクト。無料プランで利用可能です。API呼び出しに使うAPIトークンを発行しておきます。 |
Python 3 環境 | Python 3.7以上がインストールされたPC(Windows/Mac/Linux)。 |
開発ツール | VS Codeなどのコードエディタと、コマンドを実行するターミナル。 |
ngrok | ローカルPCで動かすプログラムを一時的にインターネットに公開するツール。これにより、Slackからの通知を開発中のPCで受け取れます。 [4, 6, 7] |
専門用語の補足
- API (Application Programming Interface): ソフトウェアやサービスが、外部のプログラムと情報をやり取りするための「窓口」です。今回はSlackやJiraのAPIを使い、Pythonプログラムからデータを送受信します。
- SDK (Software Development Kit): 特定の機能(今回はSlackボット)を開発しやすくするための、ライブラリやツールがまとまった開発キットです。
- ngrokとは?: 通常、自分のPC上で開発中のプログラムは外部のインターネットからアクセスできません。ngrokは、PCとインターネットの間に安全な「トンネル」を作り、一時的に外部(今回はSlack)からのアクセスを可能にする便利なツールです。 [4, 6]
Step 1: Slackアプリの作成と設定
まず、Slackにボットとして動作する「アプリ」を登録し、必要な権限を設定します。
1. Slackアプリの新規作成
Slack APIのアプリ作成ページにアクセスし、「Create New App」をクリックします。 [2] 「From scratch」を選び、アプリ名(例: Jira-Help-Bot)と、インストールする開発用ワークスペースを選択して作成します。
2. 権限(スコープ)の設定
次に、ボットがSlack内でどのような操作を許可されるかを設定します。これを「スコープ」と呼びます。
- 左メニューの「OAuth & Permissions」を開きます。
- 「Bot Token Scopes」セクションまでスクロールし、「Add an OAuth Scope」ボタンをクリックして以下の2つの権限を追加します。
app_mentions:read
: ボットへのメンション(@ボット名)が付けられた投稿を読み取る権限。chat:write
: ボットがチャンネルにメッセージを投稿する権限。
- ページ上部の「Install App to Workspace」をクリックし、表示される画面で承認します。
- インストールが完了すると、「Bot User OAuth Token」が表示されます。このトークン(
xoxb-
で始まる文字列)は後で使うので、コピーして安全な場所にメモしておきましょう。
3. Signing Secretの取得とイベント購読
Slackからの通知が本物であることを確認するための「鍵」を取得し、どのような出来事(イベント)をボットに通知するかを設定します。
- 左メニューの「Basic Information」に戻り、「App Credentials」セクションにある「Signing Secret」をコピーしてメモします。
- 左メニューの「Event Subscriptions」を開き、「Enable Events」をオンにします。
- 「Request URL」の入力欄が表示されますが、ここは後でngrokを起動してから設定します。一旦空欄のままでOKです。
- 「Subscribe to bot events」を展開し、「Add Bot User Event」から
app_mention
イベントを選択して追加します。これにより、誰かがボットにメンションしたときに通知が飛ぶようになります。 - 「Save Changes」をクリックして保存します。
4. ボットをチャンネルに招待
最後に、テストを行うSlackチャンネル(例: #help-bot-test
)を作成し、そのチャンネルに今作ったボットを招待します。チャンネル内で/invite @ボット名
と入力すれば招待できます。
Step 2: Python開発環境のセットアップ
次に、ボットを動かすためのPythonプログラムを作成する準備をします。
1. プロジェクトフォルダとライブラリのインストール
PC上にプロジェクト用のフォルダ(例: slack-jira-bot
)を作成します。ターミナルでそのフォルダに移動し、必要なPythonライブラリをインストールします。
pip install slack_bolt slack_sdk requests python-dotenv
- slack_bolt: Slack公式のSDKで、イベントの受信や返信を簡単に実装できます。 [2]
- requests: Jira APIにリクエストを送るために使います。
- python-dotenv: APIトークンなどの機密情報を安全に管理するために使います。
2. 環境変数ファイル(.env)の作成
プロジェクトフォルダ直下に.env
というファイルを作成し、先ほどメモしたSlackと、これから準備するJiraの情報を記述します。コードに直接書き込まず、このように別ファイルで管理するのがセキュリティ上推奨されます。
SLACK_BOT_TOKEN="xoxb-xxxxxxxxxxxx-xxxxxxxx"
SLACK_SIGNING_SECRET="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
JIRA_USERNAME="your-email@example.com"
JIRA_API_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxx"
JIRA_SITE="https://your-domain.atlassian.net"
JIRA_PROJECT_KEY="HELP"
- JIRA_USERNAME: Jiraにログインする際のメールアドレス。
- JIRA_API_TOKEN: Atlassianアカウントの「プロファイル」→「APIトークン管理」から新規作成してコピーします。パスワードの代わりになるものです。
- JIRA_SITE: ご自身のJiraサイトのURLです。
- JIRA_PROJECT_KEY: チケットを作成したいJiraプロジェクトのキー(例: プロジェクト名が「Help Desk」ならキーは「HELP」など)。
3. Pythonコードの作成
プロジェクトフォルダにapp.py
というファイルを作成し、以下のコードを貼り付けます。
import os
import re
import requests
from dotenv import load_dotenv
from slack_bolt import App
# .envファイルから環境変数を読み込み
load_dotenv()
# SlackとJiraの認証情報を取得
SLACK_BOT_TOKEN = os.environ.get("SLACK_BOT_TOKEN")
SLACK_SIGNING_SECRET = os.environ.get("SLACK_SIGNING_SECRET")
JIRA_USERNAME = os.environ.get("JIRA_USERNAME")
JIRA_API_TOKEN = os.environ.get("JIRA_API_TOKEN")
JIRA_SITE = os.environ.get("JIRA_SITE")
JIRA_PROJECT_KEY = os.environ.get("JIRA_PROJECT_KEY")
# Slack Boltアプリを初期化
app = App(token=SLACK_BOT_TOKEN, signing_secret=SLACK_SIGNING_SECRET)
# 社内ナレッジの簡易データベース(辞書形式)
knowledge_base = {
"VPN": "【VPN接続ガイド】こちらの社内ドキュメントをご参照ください: [URL]",
"勤怠": "【勤怠管理FAQ】勤怠システムの使い方はこちらです: [URL]",
"経費精算": "経費精算の締め日は毎月25日です。申請はこちらから: [URL]"
}
# ボットへのメンションを処理する関数
@app.event("app_mention")
def handle_app_mention(event, say):
text = event.get("text", "")
# メンション部分(@Uxxxx>)を取り除く
query = re.sub(r"<@[^>]+>", "", text).strip()
if not query:
say("ご用件をお聞かせください。")
return
# ナレッジベースを検索
answer = None
for keyword, response_text in knowledge_base.items():
if keyword in query:
answer = response_text
break
if answer:
# 回答が見つかった場合
say(f"お問い合わせありがとうございます!\n\n{answer}")
else:
# 回答が見つからない場合、Jiraチケットを作成
say(f"お問い合わせありがとうございます。ナレッジに回答が見つかりませんでした。\n担当者が確認しますので、Jiraにチケットを起票しますね。")
issue_key = create_jira_ticket(summary=query, description=f"Slackからの問い合わせ\n\nユーザー: @{event['user']}>\n質問内容: {query}")
if issue_key:
issue_url = f"{JIRA_SITE}/browse/{issue_key}"
say(f"チケットを作成しました! 👉 {issue_url}|{issue_key}>\n担当者からの連絡をお待ちください。")
else:
say("申し訳ありません、チケットの作成に失敗しました。システム管理者にご連絡ください。")
# Jiraチケットを作成する関数
def create_jira_ticket(summary: str, description: str = "") -> str:
api_url = f"{JIRA_SITE}/rest/api/3/issue"
auth = (JIRA_USERNAME, JIRA_API_TOKEN)
headers = {"Content-Type": "application/json"}
payload = {
"fields": {
"project": {"key": JIRA_PROJECT_KEY},
"summary": summary,
"description": {
"type": "doc",
"version": 1,
"content": [{"type": "paragraph", "content": [{"type": "text", "text": description}]}]
},
"issuetype": {"name": "Task"}
}
}
try:
response = requests.post(api_url, auth=auth, headers=headers, json=payload)
response.raise_for_status() # エラーがあれば例外を発生させる
return response.json().get("key")
except requests.exceptions.RequestException as e:
print(f"Jira APIエラー: {e}")
return None
# アプリを起動
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
Step 3: ボットの起動と動作確認
いよいよボットを動かしてみましょう!ターミナルを2つ使って作業します。
1. Pythonアプリの起動
1つ目のターミナルで、作成したPythonアプリを起動します。
python app.py
「⚡️ Bolt app is running!」と表示されたら、ローカルサーバーがポート3000番で起動成功です。 [5]
2. ngrokの起動とSlackへのURL設定
2つ目のターミナルで、ngrokを起動してローカルサーバーをインターネットに公開します。
ngrok http 3000
ngrokが起動すると、「Forwarding」の行にhttps://xxxxxxxx.ngrok.io
のようなURLが表示されます。 [6, 9] このURLをコピーしてください。
次に、Slack APIのアプリ設定ページに戻り、「Event Subscriptions」メニューを開きます。「Request URL」に、コピーしたngrokのURLの末尾に/slack/events
を付け加えたものを入力します(例: https://xxxxxxxx.ngrok.io/slack/events
)。入力後、しばらくすると「Verified」という緑のチェックマークが表示されるはずです。最後に「Save Changes」で保存します。
3. Slackでのテスト
準備は万端です!Slackのテスト用チャンネルでボットに話しかけてみましょう。
- ナレッジがある質問:
「@ボット名 VPNの接続方法
」のように投稿します。ボットがキーワード「VPN」を検知し、数秒後にナレッジベースに登録した回答を返してくれれば成功です。 - ナレッジがない質問:
次に「@ボット名 新しいPCのセットアップをお願いしたい
」など、ナレッジにない質問をします。ボットが回答を見つけられないため、Jiraにチケットを自動作成し、そのチケット番号とリンクを返信してくれれば成功です。
実際にJiraのプロジェクト画面を開き、新しいチケットが作成されていることを確認しましょう。 [16] 概要に質問内容が、詳細に問い合わせ内容が記録されていれば完璧です。
補足:より実践的な改善ポイント
今回のハンズオンは基礎編ですが、ここからさらに機能を拡張することで、より実用的なボットに進化させられます。
- 自然言語理解の強化: 今は単純なキーワードマッチですが、AI(LLM)などを組み込んで、より柔軟に質問の意図を理解できるように改良できます。
- インタラクティブなやり取り: Slackのボタンやメニュー機能を使い、「この内容でチケットを作成しますか?」とユーザーに確認を求めるステップを追加すると、より親切な設計になります。
- チケット内容の動的な変更: 質問内容に応じて、Jiraの担当者や優先度を自動で設定するロジックを追加することも可能です。
- Socket Modeの利用: 今回はngrokを使いましたが、Slackが提供する「Socket Mode」を利用すると、ngrokなしでローカル開発が可能です。 [3, 11] これはファイアウォールの内側からでも安全に接続できるため、企業環境での開発に適しています。
最後に
本記事では、Pythonを使ってSlackでの問い合わせに自動応答し、必要に応じてJiraチケットを起票するエージェントの作成方法を解説しました。このような自動化ツールは、定型業務を削減し、チーム全体の生産性を向上させる強力な武器となります。 [21, 25]
今回作成したコードをベースに、ぜひご自身の業務に合わせたカスタマイズに挑戦してみてください。この記事が、あなたの業務効率化の第一歩となれば幸いです。