JIRA ServiceDeskのチケットをSlack通知してみる

## 経緯
オンプレ版JIRAのServiceDeskを利用しているのですが、割り当てられたチケットに意外と気付かないという課題がありました。
そのため割り当てられたチケットを担当者にメンション付きでSlack通知してみようと思い作成してみました。
クラウド版だとアプリがある（？）ようなのですがオンプレだとなさそうだったので自作しました。
※Pythonでコーディングしましたが初心者なので書き方は拙いです。ご了承ください。

## 仕様・環境
- 言語はPythonを利用
- OSはCentOS6系を利用
- ServiceDeskのバージョンは3.11
- cron設定を想定

## 注意点
- コード中のホスト名やユーザー名、パスワードなどは各環境に適宜置き換える

## ソースコード
```python:main.py
import requests
import urllib.parse
import json
import requests
import os
from requests.auth import HTTPBasicAuth

'''
 * オンプレJIRAサーバーのサービスデスクに上がったチケットを
 * 割り振られた担当者に対してSlack通知する
'''
def main:
  # 検索したいプロジェクト名とステータス
  project = 'project_name'
  status = 'status'

  # URLエンコード
  encode_project = urllib.parse.quote(project)
  encode_status = urllib.parse.quote(status)

  # チケット情報取得API
  # hostnameは各環境に合わせて変更
  api = "https://hostname/rest/api/2/search?maxResults=100&jql=project=%s+and+status=%s" % (encode_project, encode_status)

  # Basic認証（usernameとpasswordはJIRAアカウントを利用）
  req = requests.get(api, auth=HTTPBasicAuth('username', 'password'))
  json_contents = req.json()

  message = "以下JIRAチケットの新規申請があります。確認してください。\n\n"
  message_personal = {}
  assignee_list = []

  if json_contents['issues']:
      for fields in json_contents['issues']:
          web_link = ''
          # カスタムフィールドは適宜変更
          # リダイレクトするためにURLを取得
          if fields['fields']['customfield_xxxx'] is not None:
              web_link = fields['fields']['customfield_xxxx']['_links']['web']

          # チケット担当者の取得
          if fields['fields']['assignee']['name'] is not None:
              assignee_name = fields['fields']['assignee']['name']
          else:
              assignee_name = '担当者未割り当て'
          # チケットの題名
          summary = fields['fields']['summary']

          assignee_list.append(assignee_name)

          # リンクがある場合はSlackのメッセージででsummary表示しリダイレクト用リンクを埋め込む
          # 担当者毎のメッセージを作り込む
          if web_link == '':
              if assignee_name in message_personal:
                  message_personal[assignee_name] += summary + "\n"
              else:
                  message_personal[assignee_name] = '@' + assignee_name + "\n" + summary + "\n"
          else:
              if assignee_name in message_personal:
                  message_personal[assignee_name] += '<' + web_link + '|' + summary + ">\n"
              else:
                  message_personal[assignee_name] = '@' + assignee_name + "\n" + '<' + web_link + '|' + summary + ">\n"


          contents = ''
          assignee_list_uniq = list(set(assignee_list))
          for user in assignee_list_uniq:
              contents += message_personal[user] + "\n"

      send_slack_message('channel_name', 'title', message + contents, ':icon:')


'''
 * Slackでメッセージを送信する
 * @param channel_name:送信先チャンネル名（個人名設定可）
 * @param title:送信時のタイトル
 * @param message:送信内容
 * @param icon:アイコン
'''
def send_slack_message(channel_name, title, message, icon):
    # 作成したwebhookのURLを設定
    SLACK_WEBHOOK_URL = 'webhook_url'

    jsonData = {
        'channel':channel_name,
        'username':user_name,
        'text':message,
        'icon_emoji':icon,
        'link_names':'true'
    }

    content = json.dumps(jsonData)

    requests.post(SLACK_WEBHOOK_URL, data=content)
```
こちらをサーバーに配置してクーロン設定するかサーバーレス等で登録していただければ利用可能です。

## 課題
割り当たったらSlack通知としたかったのですが現状は決まった時間に通知となっています。
Basic認証ではなくトークンを利用したかったですが上手くいかず未解決です。

## 参考資料
https://docs.atlassian.com/jira-servicedesk/REST/3.11.0/