[PYTHON] Benachrichtigen Sie Slack regelmäßig über verpasste Backlog-Probleme

Auslösen

Ich sehe immer Slack. Ich sehe nicht viel E-Mail oder Rückstand. Und vergessen Sie die im Backlog zugewiesenen Probleme. .. Okay, kontaktieren Sie uns jeden Morgen für Backlog-Probleme, die nicht Slack-fähig sind. Ich frage mich, ob ich die Liste der relevanten Probleme mit der Backlog-API aus Google Apps Script abrufen und an Slack senden kann.

Abrufen von Probleminformationen mit der Backlog-API

Die Liste der Probleme im Backlog finden Sie unter [Liste der offiziellen Probleme abrufen](https://developer.nulab.com/ja/docs/backlog/api/2/get-issue-list/#%E8%AA%B2% E9% A1% 8C% E4% B8% 80% E8% A6% A7% E3% 81% AE% E5% 8F% 96% E5% BE% 97) Da es auf der Seite ist, versuchen Sie es mit GAS als Referenz zu erhalten Ich werde.

Backlog-API-Schlüssel

Hoppla, vorher bekommen wir den Backlog-API-Schlüssel. Klicken Sie in dem Menü, in dem Sie auf Ihr Symbol in der oberen rechten Ecke der Backlog-Seite geklickt haben, auf ** Personalisierung ** und rufen Sie es von ** API ** im linken Menü ab. Nachdem Sie den API-Schlüssel erhalten haben, drücken Sie sofort die API von GAS, um die Liste der Probleme abzurufen.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';  //Von Ihnen verwendete Backlog-Domain
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';  //API-Schlüssel von Backlog erhalten
  const endpoint = '/api/v2/issues';  //URL unter Erhalten der offiziellen Problemliste

  const url = baseUrl + endpoint + '?apiKey=' + apiKey;  //Machen Sie es zur URL, um nachzufragen
  const response = UrlFetchApp.fetch(url);  //HTTP-Anfrage mit Abrufmethode senden
  const json = JSON.parse(response.getContentText());  //Textdaten extrahieren

  Logger.log(json);  //Ausgabe zum Protokollieren
}

Es wurde in verschiedenen Protokollen ausgegeben. In diesem Fall ist die Anzahl der Protokolle für jedes Problem zu groß, um angezeigt zu werden. Daher wird nur die Problem-ID für jedes Problem angezeigt.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';  //Von Ihnen verwendete Backlog-Domain
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';  //API-Schlüssel von Backlog erhalten
  const endpoint = '/api/v2/issues';  //URL unter Erhalten der offiziellen Problemliste

  const url = baseUrl + endpoint + '?apiKey=' + apiKey;  //Machen Sie es zur URL, um nachzufragen
  const response = UrlFetchApp.fetch(url);  //HTTP-Anfrage mit Abrufmethode senden
  const json = JSON.parse(response.getContentText());  //Textdaten extrahieren
  
  for (let i in json) {  //Drehen Sie die Schleife so oft wie die Anzahl der Aufgaben
    Logger.log(json[i]['issueKey']);  //Ausgabeproblem-ID zum Protokollieren
  }
}

Es gibt keine zusätzlichen Protokolle und es ist einfacher zu sehen, aber da es für das gesamte Backlog erfasst wird, gibt es eine Mischung aus zusätzlichen Problemen. Filtern Sie daher unter den folgenden Bedingungen und erfassen Sie nur die erforderlichen Probleme.

Suchen Sie die Benutzer-ID der verantwortlichen Person

Es scheint, dass die Benutzer-ID der verantwortlichen Person erforderlich ist, um die verantwortliche Person einzugrenzen, aber es scheint, dass die Ausgabe der Benutzer-ID der verantwortlichen Person mit GAS nicht funktioniert ... Da es keine Hilfe dafür gibt, lesen Sie So ermitteln Sie die Benutzer-ID (numerischer Wert) mithilfe der API im Backlog und klicken Sie in Python auf die Backlog-API, um die Benutzer-ID abzurufen. Machen. Bei dieser Methode geben Sie ein Problem an und erhalten die Benutzer-ID der Person, die für dieses Problem verantwortlich ist. Sie erhalten also die Problem-ID, um das Problem anzugeben. Das heißt, es ist einfach, es ist am Ende der URL (xxxx-xx), wenn Sie das Problem öffnen. Insbesondere wird der Teil am Ende der Ausgabe-URL fett gedruckt. (Xx hinten ist eine Zahl) xxxxx.backlog.jp/view/xxxx-xx Sobald Sie die Problem-ID kennen, rufen Sie die Benutzer-ID der verantwortlichen Person in Python ab.

import requests

baseUrl = 'https://xxxxx.backlog.jp';  #Von Ihnen verwendete Backlog-Domain
apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';  #API-Schlüssel von Backlog erhalten
ticket_id = 'xxxx-xx'  #Problem-ID

url = base_url + ticket_id  #Machen Sie es zur URL, um nachzufragen
json = requests.get(url, {'apiKey': apiKey}).json() #Textdaten extrahieren

print(json['assignee']['id'])  #Geben Sie die Benutzer-ID der Person aus, die für das Erfassungsergebnis verantwortlich ist

Eingrenzen nach Verantwortlichen

Nachdem wir die Benutzer-ID der verantwortlichen Person kennen, werden wir sie nach der für GAS verantwortlichen Person eingrenzen. Fügen Sie dem Parameter der abzufragenden URL wie unten gezeigt "& assigneeId [] = Benutzer-ID der verantwortlichen Person" hinzu.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';
  const endpoint = '/api/v2/issues';

  const url = baseUrl + endpoint + '?apiKey=' + apiKey + '&assigneeId[]=' + xxxxxxx;  //Machen Sie es zur URL, um nachzufragen
  
//(Unten weggelassen. Wie oben.)
}

Eingrenzen nach Problemtyp

Als nächstes eingrenzen Sie nach Typ (Aufgabe, Fehler, Anfrage ..). Der Typ wird durch issueTypeId eingegrenzt. Das Überprüfen der issueTypeId ist ebenfalls einfach. Klicken Sie auf der Registerkarte ** Typ ** von ** Projekteinstellungen ** im linken Menü von Backlog auf den Typ, den Sie überprüfen möchten. Es wird ** issueType.id ** in der URL der Bearbeitungsseite des Typs sein, der durch Klicken angezeigt wird. Nachdem wir die issueTypeId kennen, werden wir sie durch GAS eingrenzen. Dadurch wird den Parametern der Abfrage-URL "issueTypeId [] = issueType.id" hinzugefügt.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';
  const endpoint = '/api/v2/issues';

  const url = baseUrl + endpoint + '?apiKey=' + apiKey + '&assigneeId[]=' + xxxxxxx + '&issueTypeId[]=' + xxxxxxx;  //Machen Sie es zur URL, um nachzufragen
  
//(Unten weggelassen. Wie oben.)
}

Eingrenzen nach Ausgabestatus

Eingrenzen Sie schließlich nach Ausgabestatus (nicht unterstützt, in Bearbeitung, verarbeitet, abgeschlossen). Der Status wird durch "statusId" eingegrenzt. Die statusId kann mit der API überprüft werden, aber ich denke, es ist unten behoben.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';
  const endpoint = '/api/v2/issues';

  const url = baseUrl + endpoint + '?apiKey=' + apiKey + '&assigneeId[]=' + xxxxxxx + '&issueTypeId[]=' + xxxxxxx + '&statusId[]=' + 1;  //Machen Sie es zur URL, um nachzufragen
  
//(Unten weggelassen. Wie oben.)
}

An Slack senden

Nachdem Sie die benötigten Informationen in der Backlog-API haben, können Sie sie an Slack senden.

Slack Incoming Webhooks-Einstellungen

Stellen Sie zunächst die Webhooks ein, die zum Senden von Slack erforderlich sind. Früher habe ich Incoming Webhooks mit der benutzerdefinierten Integration von Slack erstellt, aber jetzt scheint es so, als würde ich eine Slack-App erstellen und Incoming Webhooks als Funktion festlegen, also werde ich es so machen. (Referenz: Slack Custom Integration ist veraltet und [Slacks eingehender Webhook war neu, daher habe ich ihn zusammengefasst](https: // qiita. com / kshibata101 / items / 0e13c420080a993c5d16)) Speziell

  1. Gehen Sie zu https://api.slack.com/apps
  2. Klicken Sie auf die Schaltfläche ** Neue App erstellen **
  3. Geben Sie die Informationen der Slack-App ein, die Sie erstellen möchten, und klicken Sie auf die Schaltfläche ** App erstellen **
  1. Klicken Sie im Menü links auf ** Eingehende Webhooks **
  2. Aktivieren Sie Eingehende Webhooks aktivieren
  3. Klicken Sie auf die Schaltfläche ** Neuen Webhook zum Arbeitsbereich hinzufügen **
  4. Wählen Sie den Kanal oder DM aus, an den Sie Slack senden möchten, und klicken Sie auf die Schaltfläche ** Zulassen **
  5. Die folgende Meldung wird auf dem entsprechenden Slack-Kanal oder DM angezeigt

hat diesem Kanal eine Integration hinzugefügt: * App-Namen festlegen *

Kopieren Sie nach dem Einrichten eingehender Webhooks die URL des Webhooks. Stellen Sie diese URL in GAS ein, um sie zu einem Slack-Ziel zu machen. Der Anzeigename und das Bild der Slack-App, wenn Slack von eingehenden Webhooks benachrichtigt wird, können unter ** Anzeigeinformationen ** von ** Grundinformationen ** im linken Menü festgelegt werden. Um die Slack-App zu löschen, gehen Sie zu ** Grundlegende Informationen **, ** App löschen **.

GAS-Code

Fügen Sie die erhaltene Webhook-URL in ** postUrl ** ein und schreiben Sie wie folgt.

function sendSlack() {
  const postUrl = 'Erhaltene Webhook-URL';
  
  const json = {
    'text': 'Nachricht, die Sie an Slack senden möchten'
  };
  const payload = JSON.stringify(json);
  
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': payload
  };
  
  UrlFetchApp.fetch(postUrl, options);
}

Da es ein Versprechen ist, werde ich die Erklärung weglassen.

Ändern Sie die Einstellungen aus der Tabelle

Ich verwende das Tabellenkalkulations-GAS, also habe ich versucht, die Tabellenkalkulation selbst zu verwenden. Ich habe es möglich gemacht, wie folgt in der Tabelle festzulegen. スクリーンショット 2020-04-26 22.00.14.png Ich werde mich auf diejenigen beschränken, die in der Tabelle markiert sind.

//Holen Sie sich Einstellungen aus der Tabelle
function getConfig() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange(1, 1, 5, 2);
  const values = range.getValues();
  
  //Statuseinstellungen abrufen
  let statusId = '';
  for (let i in [...Array(4).keys()]) {
    let row = Number(i) + 1;
    if (true == values[row][0]) {
      statusId += '&statusId[]=' + row;
    }
  }
  return statusId;
}

Komplett

Es sieht so aus, wenn alle kombiniert werden.

const baseUrl = 'https://xxxxx.backlog.jp';
const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';

function myFunction() {
  const statusId = getConfig();
  issues(statusId)
}

//Holen Sie sich eine Liste der Probleme
function issues(statusId) {
  //Holen Sie sich eine Liste der Probleme von Backlog
  const endpoint = '/api/v2/issues';
  const url = baseUrl + endpoint + '?apiKey=' + apiKey + statusId + '&issueTypeId[]=' + xxxxxx + '&assigneeId[]=' + xxxxxx;
  const resp = UrlFetchApp.fetch(url);
  const json = JSON.parse(resp.getContentText());
  
  //Extrahieren Sie die erforderlichen Informationen (Problem-ID, Problem-Betreff, Problem-URL) aus der von Backlog erhaltenen Problemliste
  let message = '';
  for (let i in json) {
    const issueKey = json[i]['issueKey'];  //Problem-ID
    const summary = json[i]['summary'];  //Thema ausstellen
    message += issueKey + ' ' + summary + '\n' + baseUrl + '/view/' + issueKey;
    //Wenn es mehrere Probleme gibt, fügen Sie für jede Schleife einen Zeilenumbruch ein
    if (json[i] != json[json.length - 1]) {
      message += '\n';
    }
  }
  //Übergeben Sie den Inhalt (Nachricht), den Sie mit Slack senden möchten
  sendSlack(message);
}

//An Slack senden
function sendSlack(message) {
  //Testen Sie die Webhook-URL
  const postUrl = 'Erhaltene Webhook-URL';
  const json = {
    'text': message
  };
  const payload = JSON.stringify(json);
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

//Holen Sie sich Einstellungen aus der Tabelle
function getConfig() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange(1, 1, 5, 2);
  const values = range.getValues();
  
  //Statuseinstellungen abrufen
  let statusId = '';
  for (let i in [...Array(4).keys()]) {
    let row = Number(i) + 1;
    if (true == values[row][0]) {
      statusId += '&statusId[]=' + row;
    }
  }
  return statusId;
}

Wenn Sie dies so einstellen, dass es jeden Morgen um 9 Uhr mit einem Auslöser beginnt, wird Slack jeden Morgen die folgende Benachrichtigung erhalten. スクリーンショット 2020-04-26 22.28.58.png

We're hiring! Wir entwickeln einen KI-Chatbot. Wenn Sie interessiert sind, können Sie uns gerne über die Wantedly-Seite kontaktieren!

Referenzartikel

[Liste der Probleme abrufen (offiziell)](https://developer.nulab.com/ja/docs/backlog/api/2/get-issue-list/#%E8%AA%B2%E9%A1%8C% E4% B8% 80% E8% A6% A7% E3% 81% AE% E5% 8F% 96% E5% BE% 97) [Erfassung von Probleminformationen (offiziell)](https://developer.nulab.com/ja/docs/backlog/api/2/get-issue/#%E8%AA%B2%E9%A1%8C%E6% 83% 85% E5% A0% B1% E3% 81% AE% E5% 8F% 96% E5% BE% 97) Slack Custom Integration veraltet Slacks eingehender Webhook war neu, daher habe ich ihn zusammengefasst So ermitteln Sie die Benutzer-ID (numerischer Wert) mithilfe der API im Backlog Hinzufügen von Problemen mit der Backlog-API mithilfe von Python

Recommended Posts

Benachrichtigen Sie Slack regelmäßig über verpasste Backlog-Probleme
Benachrichtigen Sie Slack über GitHub Push
Benachrichtigen Sie Slack darüber, wie Keras lernt
Ich habe versucht, Slack über das Update von Redmine zu informieren
Benachrichtigen Sie Slack über Änderungen des Prozessstatus mithilfe des EventListener des Supervisors
Veröffentlichen Sie regelmäßig Bilder von Papillon auf Python + AWS Lambda + Slack