2016-12-12 19 views
15

TL; DR: Thông qua API Slack, làm thế nào tôi có thể phân biệt giữa một tin nhắn trong một kênh so với thông báo trực tiếp?Làm cách nào để một bot Slack phát hiện một tin nhắn trực tiếp so với một tin nhắn trong một kênh?

Tôi có một bot Slack đang hoạt động bằng API RTM, hãy gọi nó là Edi. Và nó hoạt động tuyệt vời miễn là tất cả các lệnh bắt đầu bằng "@edi"; ví dụ. "Trợ giúp @edi". Nó hiện đang phản hồi với bất kỳ kênh nào, đó là thành viên của và các tin nhắn trực tiếp. Tuy nhiên, tôi muốn cập nhật bot để khi đó là một tin nhắn trực tiếp, sẽ không cần phải bắt đầu một lệnh với "@edi"; ví dụ. "@edi trợ giúp" trong một kênh, nhưng "trợ giúp" trong một thông điệp trực tiếp. Tôi không thấy bất cứ điều gì cụ thể để phân biệt giữa hai, nhưng tôi đã thử sử dụng điểm cuối channel.info và đếm số lượng người trong "thành viên"; tuy nhiên, phương pháp này chỉ hoạt động trên kênh công khai. Đối với các kênh riêng tư và tin nhắn trực tiếp, điểm cuối trả về lỗi "channel_not_found".

Xin cảm ơn trước.

Trả lời

24

Tôi đã nói chuyện với James ở Slack và anh ấy đã cho tôi một cách đơn giản để xác định xem thư có phải là DM hay không; nếu một ID kênh bắt đầu với một:

  • C, đó là một kênh nào
  • D, đó là một DM với người sử dụng
  • G, nó là một trong hai kênh riêng hoặc DM nhiều người

Tuy nhiên, các giá trị này không được đặt trong đá và có thể thay đổi tại một số điểm hoặc được thêm vào.

Vì vậy, nếu cú ​​pháp đó biến mất, một cách khác để phát hiện DM sử dụng cả hai kênh.info và groups.info. Nếu cả hai đều trả về “false” cho trường “ok”, thì bạn biết đó là DM.

Lưu ý:

  • channels.info là dành cho các kênh truyền hình công cộng chỉ
  • groups.info là dành cho các kênh truyền hình tư nhân và nhiều người TVLK thông tin chỉ

Bonus: Khi bạn phát hiện một rằng thư là DM, sử dụng ID người dùng hoặc ID kênh và tìm kiếm trong kết quả của im.list; nếu bạn tìm thấy nó, thì bạn sẽ biết đó là DM cho bot.

  • “id” từ im.list là kênh ID
  • “người sử dụng” từ im.danh sách là ID người dùng từ người DM'ing với bot
  • Bạn không vượt qua trong ID người dùng của bot, bởi vì nó được chiết xuất từ ​​token
+0

Làm việc trên cùng một vấn đề này và tìm thấy kênh riêng bắt đầu bằng chữ 'W'. –

0

Chức năng thông tin cũng có sẵn cho các kênh riêng với phương pháp API Slack groups.info. Điều này cũng hoạt động đối với các kênh tin nhắn trực tiếp với nhiều người tham gia vì đây là một kênh riêng tư đặc biệt.

Bạn có thể sử dụng groups.list để nhận ID của tất cả các kênh riêng tư bao gồm. các kênh tin nhắn trực tiếp với nhiều người tham gia.

Lưu ý rằng groups.list sẽ chỉ trả về kênh riêng tư mà người dùng hoặc bot mà mã thông báo truy cập thuộc về đã được mời tham gia.

+0

Tôi đã thử nhóm. thông tin trên DM và nó trả về lỗi "channel_not_found". Nhưng thông tin của bạn đã giúp tôi tìm ra giải pháp. Nếu cả hai group.info và channels.info trả về với một lỗi, thì đó là DM. Tôi đã làm một bài kiểm tra sơ bộ và có vẻ như nó hoạt động. Cảm ơn bạn. – Roger

2

FYI tính đến tháng Bảy năm 2017, cho "tin nhắn. im "sự kiện (thông qua Đăng ký sự kiện của ứng dụng), tải trọng sự kiện dường như trả lại các trường bổ sung để phát hiện xem thư có đến từ bot của riêng bạn hay không (được dán vào đây từ nhật ký của tôi):

INFO[0012] got Slack message: (bot.SlackMessage) { 
    SlackEvent: (bot.SlackEvent) { 
     Type: (string) (len=7) "message", 
     EventTs: (string) (len=17) "1501076832.063834", 
     User: (string) "" 
    }, 
    SubType: (string) (len=11) "bot_message", 
    Channel: (string) (len=9) "D6CJWD132", 
    Text: (string) (len=20) "this is my bot reply", 
    Username: (string) (len=15) "Myapp Local", 
    BotID: (string) (len=9) "B6DAZKTGG", 
    Ts: (string) (len=17) "1501076832.063834" 
} 
Các vấn đề liên quan