[PYTHON] Informer régulièrement Slack des problèmes de backlog manqués

Déclencheur

Je vois toujours Slack. Je ne vois pas beaucoup d'e-mails ou d'arriérés. Et oubliez les problèmes attribués dans Backlog. .. Très bien, entrons en contact avec les problèmes de backlog qui ne sont pas compatibles avec Slack tous les matins. Je me demande si je peux extraire la liste des problèmes pertinents de Google Apps Script avec l'API de Backlog et la transmettre à Slack.

Obtenir des informations sur les problèmes avec l'API Backlog

Pour obtenir la liste des problèmes dans Backlog, procédez comme suit: [Obtenir la liste des problèmes officiels](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) Comme il est répertorié sur la page, essayez de l'obtenir avec GAS pour référence. Je vais.

Clé d'API Backlog

Oups, avant cela, nous aurons la clé d'API Backlog. Cliquez sur ** Personnalisation ** dans le menu où vous avez cliqué sur votre icône dans le coin supérieur droit de la page Backlog, et récupérez-la depuis ** API ** dans le menu de gauche. Après avoir obtenu la clé API, appuyez immédiatement sur l'API de GAS pour obtenir la liste des problèmes.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';  //Domaine de backlog que vous utilisez
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';  //Clé API obtenue à partir du Backlog
  const endpoint = '/api/v2/issues';  //URL répertoriée dans Obtention de la liste officielle des problèmes

  const url = baseUrl + endpoint + '?apiKey=' + apiKey;  //Faites-en l'URL pour demander
  const response = UrlFetchApp.fetch(url);  //Envoyer une requête HTTP avec la méthode fetch
  const json = JSON.parse(response.getContentText());  //Extraire des données textuelles

  Logger.log(json);  //Sortie vers journal
}

Il a été produit dans divers journaux. Si tel est le cas, la quantité de journaux pour chaque problème est trop grande à voir, nous n'afficherons donc temporairement que l'ID de problème pour chaque problème.

function myFunction() {
  const baseUrl = 'https://xxxxx.backlog.jp';  //Domaine de backlog que vous utilisez
  const apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';  //Clé API obtenue à partir du Backlog
  const endpoint = '/api/v2/issues';  //URL répertoriée dans Obtention de la liste officielle des problèmes

  const url = baseUrl + endpoint + '?apiKey=' + apiKey;  //Faites-en l'URL pour demander
  const response = UrlFetchApp.fetch(url);  //Envoyer une requête HTTP avec la méthode fetch
  const json = JSON.parse(response.getContentText());  //Extraire des données textuelles
  
  for (let i in json) {  //Tournez la boucle autant de fois que le nombre de tâches
    Logger.log(json[i]['issueKey']);  //ID du problème de sortie dans le journal
  }
}

Il n'y a pas de journaux supplémentaires et il est plus facile à voir, mais comme il est acquis pour l'ensemble du Backlog, les problèmes supplémentaires sont mitigés. Par conséquent, filtrez dans les conditions suivantes et n'acquérez que les problèmes requis.

Trouvez l'ID utilisateur du responsable

Il semble que l'ID utilisateur de la personne responsable soit nécessaire pour restreindre la personne responsable, mais il semble que cela ne fonctionne pas pour sortir l'ID utilisateur de la personne responsable de GAS ... Comme il n'y a aucune aide pour cela, reportez-vous à Comment trouver l'ID utilisateur (valeur numérique) à l'aide de l'API dans Backlog et appuyez sur l'API Backlog de Python pour obtenir l'ID utilisateur Faire. Dans cette méthode, vous spécifiez un problème et obtenez l'ID utilisateur de la personne en charge de ce problème, de sorte que vous obtenez l'ID du problème pour spécifier le problème. Cela dit, c'est facile, c'est à la fin de l'URL (xxxx-xx) lorsque vous ouvrez le numéro. Plus précisément, ce sera la partie en gras à la fin de l'URL du problème. (Xx à l'arrière est un nombre) xxxxx.backlog.jp/view/xxxx-xx Une fois que vous connaissez l'ID du problème, obtenez l'ID utilisateur de la personne en charge dans Python.

import requests

baseUrl = 'https://xxxxx.backlog.jp';  #Domaine de backlog que vous utilisez
apiKey = 'xxxxxxxxxxxxxxxxxxxxxxx';  #Clé API obtenue à partir du Backlog
ticket_id = 'xxxx-xx'  #ID du problème

url = base_url + ticket_id  #Faites-en l'URL pour demander
json = requests.get(url, {'apiKey': apiKey}).json() #Extraire des données textuelles

print(json['assignee']['id'])  #Sortie de l'ID utilisateur de la personne en charge du résultat d'acquisition

Affiner par personne responsable

Maintenant que nous connaissons l'ID utilisateur de la personne responsable, nous allons affiner par personne responsable de GAS. Ajoutez & assigneeId [] = ID utilisateur de la personne responsable au paramètre de l'URL de la demande comme indiqué ci-dessous.

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

  const url = baseUrl + endpoint + '?apiKey=' + apiKey + '&assigneeId[]=' + xxxxxxx;  //Faites-en l'URL pour demander
  
//(Omis ci-dessous. Idem que ci-dessus.)
}

Affiner par type de problème

Ensuite, affinez par type (tâche, bug, requête ..). Le type est réduit par ʻissueTypeId. La vérification de issueTypeId est également facile, cliquez sur le type que vous souhaitez vérifier dans l'onglet ** Type ** de ** Paramètres du projet ** dans le menu de gauche de Backlog. Ce sera ** issueType.id ** dans l'URL de la page d'édition du type affiché en cliquant. Maintenant que nous connaissons le issueTypeId, nous allons le réduire par GAS. Cela ajoute ʻissueTypeId [] = issueType.id aux paramètres de l'URL de la requête.

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;  //Faites-en l'URL pour demander
  
//(Omis ci-dessous. Idem que ci-dessus.)
}

Affiner par statut de problème

Enfin, affinez le statut du problème (non pris en charge, en cours, traité, terminé). Le statut est réduit par statusId. Le statusId peut être vérifié à l'aide de l'API, mais je pense qu'il est corrigé ci-dessous.

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;  //Faites-en l'URL pour demander
  
//(Omis ci-dessous. Idem que ci-dessus.)
}

Envoyer à Slack

Maintenant que nous avons les informations dont nous avons besoin dans l'API Backlog, nous pouvons les envoyer à Slack.

Paramètres des webhooks entrants Slack

Tout d'abord, définissez les Webhooks requis pour l'envoi de Slack. J'avais l'habitude de créer des Webhooks entrants avec l'intégration personnalisée de Slack, mais maintenant il semble que je vais créer une application Slack et définir les Webhooks entrants en tant que fonction, donc je vais le faire de cette façon. (Référence: L'intégration personnalisée Slack est obsolète et [Le webhook entrant de slack était nouveau, donc je l'ai résumé](https: // qiita. com / kshibata101 / items / 0e13c420080a993c5d16)) En particulier

  1. Accédez à https://api.slack.com/apps
  2. Cliquez sur le bouton ** Créer une nouvelle application **
  3. Entrez les informations de l'application Slack que vous souhaitez créer et cliquez sur le bouton ** Créer une application **
  1. Cliquez sur ** Webhooks entrants ** dans le menu de gauche
  2. Activez Activer les webhooks entrants
  3. Cliquez sur le bouton ** Ajouter un nouveau Webhook à l'espace de travail **
  4. Sélectionnez la chaîne ou le DM auquel vous souhaitez envoyer Slack et cliquez sur le bouton ** Autoriser **
  5. Le message suivant s'affiche sur le canal Slack ou DM correspondant

a ajouté une intégration à ce canal: * Définir le nom de l'application *

Après avoir configuré les Webhooks entrants, copiez l'URL du Webhook. Définissez cette URL dans GAS pour en faire une destination Slack. Le nom d'affichage et l'image de l'application Slack lorsque Slack est notifié par les Webhooks entrants peuvent être définis dans ** Afficher les informations ** de ** Informations de base ** dans le menu de gauche. Pour supprimer l'application Slack, accédez à ** Informations de base **, ** Supprimer l'application **.

Code GAS

Collez l'URL du Webhook obtenue dans ** postUrl ** et écrivez comme suit.

function sendSlack() {
  const postUrl = 'URL Webhook obtenue';
  
  const json = {
    'text': 'Message que vous souhaitez envoyer à Slack'
  };
  const payload = JSON.stringify(json);
  
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': payload
  };
  
  UrlFetchApp.fetch(postUrl, options);
}

Puisqu'il s'agit d'une promesse, j'omettrai l'explication.

Modifier les paramètres de la feuille de calcul

J'utilise la feuille de calcul GAS, j'ai donc essayé d'utiliser la feuille de calcul elle-même. Les paramètres suivants peuvent être définis dans la feuille de calcul. スクリーンショット 2020-04-26 22.00.14.png Je vais affiner par ceux vérifiés sur la feuille de calcul.

//Obtenir les paramètres de la feuille de calcul
function getConfig() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange(1, 1, 5, 2);
  const values = range.getValues();
  
  //Obtenir les paramètres d'état
  let statusId = '';
  for (let i in [...Array(4).keys()]) {
    let row = Number(i) + 1;
    if (true == values[row][0]) {
      statusId += '&statusId[]=' + row;
    }
  }
  return statusId;
}

Achevée

Cela ressemble à ça quand tout est combiné.

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

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

//Obtenez une liste de problèmes
function issues(statusId) {
  //Obtenir une liste des problèmes de 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());
  
  //Extraire les informations nécessaires (ID du problème, sujet du problème, URL du problème) de la liste des problèmes obtenue à partir du Backlog
  let message = '';
  for (let i in json) {
    const issueKey = json[i]['issueKey'];  //ID du problème
    const summary = json[i]['summary'];  //Sujet du problème
    message += issueKey + ' ' + summary + '\n' + baseUrl + '/view/' + issueKey;
    //S'il y a plusieurs problèmes, insérez un saut de ligne pour chaque boucle
    if (json[i] != json[json.length - 1]) {
      message += '\n';
    }
  }
  //Transmettez le contenu (message) que vous souhaitez envoyer avec Slack
  sendSlack(message);
}

//Envoyer à Slack
function sendSlack(message) {
  //Tester l'URL du webhook
  const postUrl = 'URL Webhook obtenue';
  const json = {
    'text': message
  };
  const payload = JSON.stringify(json);
  const options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': payload
  };
  UrlFetchApp.fetch(postUrl, options);
}

//Obtenir les paramètres de la feuille de calcul
function getConfig() {
  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange(1, 1, 5, 2);
  const values = range.getValues();
  
  //Obtenir les paramètres d'état
  let statusId = '';
  for (let i in [...Array(4).keys()]) {
    let row = Number(i) + 1;
    if (true == values[row][0]) {
      statusId += '&statusId[]=' + row;
    }
  }
  return statusId;
}

Si vous définissez cette option pour qu'elle commence à 9 h tous les matins avec un déclencheur, la notification suivante sera envoyée à Slack chaque matin. スクリーンショット 2020-04-26 22.28.58.png

We're hiring! Nous développons un chatbot IA. Si vous êtes intéressé, n'hésitez pas à nous contacter depuis la page Wantedly!

Article de référence

[Obtention d'une liste de problèmes (officielle)](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) [Acquisition des informations sur le problème (officielle)](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) Intégration personnalisée Slack obsolète Le webhook entrant de Slack était nouveau, je l'ai donc résumé Comment trouver l'ID de l'utilisateur (valeur numérique) à l'aide de l'API dans Backlog Ajout de problèmes avec l'API Backlog à l'aide de Python

Recommended Posts

Informer régulièrement Slack des problèmes de backlog manqués
Notifier Slack de l'envoi de GitHub
Informer Slack de la manière dont Keras apprend
J'ai essayé d'informer Slack de la mise à jour de Redmine
Notifier Slack des changements d'état de processus à l'aide d'EventListener de Supervisor
Publiez régulièrement des images de Papillon sur Python + AWS Lambda + Slack