IFTTT에서 slack에 게시한 내용을 python의 slackbot 라이브러리가 픽업할 수 없는 현상에 대해서

9079 단어 iftttPython3slackbot

현상



pypi를 통해 파이썬 slackbot 라이브러리를 설치하면 IFTTT에서 slack에 게시 한 내용을 픽업 할 수 없습니다.
pip install slackbot

run.py
# -*- encoding: utf-8 -*-
from slackbot.bot import Bot
from slackbot.bot import listen_to

@listen_to('てすと')
def listen_func(message):
    message.send('ぽん')

def main():
    bot = Bot()
    bot.run()

if __name__ == '__main__':
    main()



# 이유
이 기사 에 있는 것처럼, 통상의 투고와 IFTTT 경유의 투고에서는 포맷이 다르기 때문입니다.
데이터의 취득은 slackbot의 「dispacher.py」라고 하는 소스가 하고 있습니다만,
여기에서 취득한 데이터를 print하는 소스를 넣어 내용을 보면 ...

dispacher.py
    def dispatch_msg(self, msg):
        category = msg[0]
        msg = msg[1]
        print(msg)  # <- 44行目にprintを仕込む
        if not self._dispatch_msg_handler(category, msg):
            if category == u'respond_to':
                if not self._dispatch_msg_handler('default_reply', msg):
                    self._default_reply(msg)
python run.py

# 普通に投稿した場合
{
  'type': 'message', 
  'user': ‘XXXXXXXX’, 
  'text': 'てすと', 
  'client_msg_id': ‘XXXXXXX’, 
  (略)
}

# IFTTT経由で投稿した場合
{
  'username': 'IFTTT', 
  'icons': {'image_36': 'https://a.slack-edge.com/8f51/img/services/ifttt_36.png', 
  'image_48': 'https://a.slack-edge.com/8f51/img/services/ifttt_48.png', 'image_72': 
  'https://a.slack-edge.com/8f51/img/services/ifttt_72.png'}, 
  'attachments': [
    {
     'pretext': 'しゅっしゃ', 
     'fallback': 'しゅっしゃ', 
     'mrkdwn_in': ['text', 'pretext']
    }
   ], 
  (略)
}

전혀 다릅니다.
그래서 일반적으로 게시물의 데이터 형식 만 지원하므로,
IFTTT의 게시물은 dispacher.py에서 데리러 있지 않습니다.

대책



dispacher의 msg를 얻는 부분을 다시 씁니다.
아래는 dispacher.py의 49 행 ~입니다.
(2019/9/15 갱신: 아무래도 메시지의 형식이 미묘하게 바뀐 것 같습니다, 코멘트 감사합니다!)

(편집 전) dispacher.py
    def _dispatch_msg_handler(self, category, msg):
        responded = False
        for func, args in self._plugins.get_plugins(category, msg.get('text', None)):
            if func:
                responded = True
                try:

(편집 후) dispacher.py
    def _dispatch_msg_handler(self, category, msg):
        responded = False
        text = None
        if 'attachments' in msg and len(msg.get('attachments')) > 0:
            text = msg['attachments'][0].get('pretext', None)
        elif 'text' in msg:
            text = msg.get('text', None)

        for func, args in self._plugins.get_plugins(category, text):
            if func:
                responded = True
                try:

차이:
htps : // 기주 b. 코 m / ぃ s05 / s ぁ 쿠보 t / 코 m 파레 /에서 ゔ ぉ p. . . 주전자 10 : ゔぇぉ p

이것을 다시 써서 python run.py 하면 제대로 IFTTT에도 반응하게 됩니다.


수정된 코드



htps : // 기주 b. 코 m / 주전자 10 / s ぁ ck 보트 t / t ree /
(※코드 본체의 수정만으로 특별히 테스트는 추가하지 않습니다...)

참고 기사

좋은 웹페이지 즐겨찾기