質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Hubot

HubotはGitHub社が開発したチャットbotのフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

解決済

slackAPIで取得したユーザーIDをslackに投稿すると不具合

tarou212
tarou212

総合スコア7

Hubot

HubotはGitHub社が開発したチャットbotのフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1回答

0リアクション

0クリップ

314閲覧

投稿2018/03/01 05:47

編集2018/03/02 01:27

backlogの課題が追加&更新された時に、hubotを通じてslackのチャンネルに投稿できるようにしました。
個人通知出来るように、slackAPIのuser.list(https://api.slack.com/methods/users.list/test)を使用し、backlogから取得した通知相手の名前を元にユーザーIDをslackに投稿し個人通知出来るようにしたのですが、backlogを更新すると通知相手がずれて通知されてしまいます。


1回目
山田さんに対してbacklog更新→slackに通知されない
2回目
山田さんに対してbacklog更新→山田さんに対してslackに通知される
3回目
佐藤さんに対してbacklog更新→山田さんに対してslackに通知される
4回目
山田さんに対してbacklog更新→佐藤さんに対してslackに通知される
5回目
鈴木さんに対してbacklog更新→山田さんに対してslackに通知される

下記の部分を消すとズレが無くなるので、slackAPIの部分の記述が原因だと考えています。
1回目のslackに通知されない時に、エラーログを見ると「ReferenceError: memberid is not defined」と書かれていました。

message += "<@" + memberid + ">"; //ここを消すとズレが直る

backlogからユーザー名の取得とユーザー名を元にslackAPIからslackのユーザーIDを取得する箇所です。

if (body.notifications.length > 0) { ref1 = body.notifications; for (i = 0, len = ref1.length; i < len; i++) { a = ref1[i]; username = "" + a.user.name; message += "" + a.user.name; //名前表示 console.log(a.user.name); console.log(a.user.id); request.get({ url: "https://slack.com/api/users.list?token=" + process.env.HUBOT_SLACK_TOKEN }, function(err, response, body) { var member; var j, len1, ref2; ref2 = JSON.parse(body).members; for (j = 0, len1 = ref2.length; j < len1; j++) { member = ref2[j]; if (member.profile.display_name === username) { //slackの表示名とバックログの名前が一致した時に、slackID memberid = member.id;//slackID取得 } } }); message += "<@" + memberid + ">"; //ここを消すとズレが直る } }

全体のコード

var backlogUrl, request; backlogUrl = 'https://backlog.jp/'; request = require('request'); module.exports = (function(_this) { return function(robot) { return robot.router.post("/slackroom/:room", function(req, res) { var a, body, error, i, label, len, message, username, ref, ref1, ref2, room, url,memberid; room = req.params.room; body = req.body; console.log('body type = ' + body.type); console.log('room = ' + room); try { switch (body.type) { case 1: label = '課題の追加'; break; case 2: case 3: label = '課題の更新'; break; default: return; } url = backlogUrl + "view/" + body.project.projectKey + "-" + body.content.key_id; if (((ref = body.content.comment) !== null ? ref.id : void 0) !== null) { url += "#comment-" + body.content.comment.id; } message = "*Backlog " + label + "*\n"; if (body.notifications.length > 0) { ref1 = body.notifications; for (i = 0, len = ref1.length; i < len; i++) { a = ref1[i]; username = "" + a.user.name; message += "" + a.user.name; //名前表示 console.log(a.user.name); console.log(a.user.id); request.get({ url: "https://slack.com/api/users.list?token=" + process.env.HUBOT_SLACK_TOKEN }, function(err, response, body) { var member; var j, len1, ref2; ref2 = JSON.parse(body).members; for (j = 0, len1 = ref2.length; j < len1; j++) { member = ref2[j]; if (member.profile.display_name === username) { //slackの表示名とバックログの名前が一致した時に、slackID memberid = member.id;//slackID取得 } } }); message += "<@" + memberid + ">"; } } message += "\n[" + body.project.projectKey + "-" + body.content.key_id + "] - "; message += body.content.summary + " _by" + body.createdUser.name + "_\n>>> "; if (((ref2 = body.content.comment) !== null ? ref2.content : void 0) !== null) { message += body.content.comment.content + "\n"; } message += "" + url; console.log('message = ' + message); if (message !== null) { robot.messageRoom(room, message); return res.end("OK"); } else { robot.messageRoom(room, "Backlog integration error."); return res.end("Error"); } } catch (_error) { error = _error; console.log(error); return robot.send; } }); }; })(this);

コールバック関数を使用した記述

if (body.notifications.length > 0) { ref1 = body.notifications; for (i = 0, len = ref1.length; i < len; i++) { a = ref1[i]; username = "" + a.user.name; message += "" + a.user.name; //名前表示 console.log(a.user.name); console.log(a.user.id); } function execCallback (callback) { request.get({ url: "https://slack.com/api/users.list?token=" + process.env.HUBOT_SLACK_TOKEN }, function(err, response, body) { var member; var j, len1, ref2; ref2 = JSON.parse(body).members; for (j = 0, len1 = ref2.length; j < len1; j++) { member = ref2[j]; if (member.profile.display_name === username) { //slackの表示名とバックログの名前が一致した時に、slackID memberid = member.id;//slackID取得 } } }); callback(); } var myCallback = function () { message += "<@" + memberid + ">"; }; execCallback(myCallback); }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

CHERRY

2018/03/01 06:25

コードは質問文の編集ページでコードを選択し、編集ページの上に並んでいるボタンの「<code>」ボタンを押すことで、コードブロックにしてください。
karamarimo

2018/03/01 07:34 編集

エラーの通りmemberidの宣言が見当たらないです。あと backlogやhubotは知らないのですが https://slack.com/api/users.list に複数回アクセスする必要があるのでしょうか?
tarou212

2018/03/01 08:05

おっしゃる通り、var memberidと宣言すると一回目のslack通知が出来るようになりました。その変わり通知相手がundefinedと出てしまいました。もしかしたらグローバル変数で処理を行っていたからかもしれないです。「https://slack.com/api/users.list」記述方法がわからずに、ループ内に書いてしまったのですが、複数回アクセスするようにしてしまったのですが1度のアクセスで大丈夫だと思います。
karamarimo

2018/03/01 08:25

「通知相手がundefined」とはコードでどこのことでしょうか?また、やりたいことは body.notifications の各ユーザーについて相当する slack id を取得して message に追加するということでしょうか?コードを見た限り request.get が同期処理であるかのように扱っているのが原因だと思います。
CHERRY

2018/03/01 08:40

slack api の呼び出しをを非同期で実行されていますが、「message += "<@" + memberid + ">";」の部分で、memberid に slack の id は、入っているのでしょうか?
tarou212

2018/03/01 08:41

message += "<@" + memberid + ">";で、通知相手(slackのID)をslackに投稿している部分で、こちらがslack上で「undefined」と表示されました。backlogのユーザー名(a.user.name)とslackの表示名(member.profile.display_name)が一致した人のみ、slackのID(member.id)を取得し、slackのIDをslackに投稿したいです。
tarou212

2018/03/01 08:45

message += "<@" + memberid + ">";で、backlogから1度目の更新&追加した時は、「ReferenceError: memberid is not defined」とエラーログが表示されて入っていないのですが、2回目以降は、slackIDは、入っています。途中で通知相手を変えると質問の例に書いてあるように、一人分ズレて相手に通知されます。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Hubot

HubotはGitHub社が開発したチャットbotのフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。