본문 바로가기

연재/Project Jarvis

[Pexpect] Telegram-cli 제어하기



Telegram-cli 파이썬으로 제어하기


  Telegram-cli를 사용하면 콘솔환경에서 메시지를 받고 보낼 수 있습니다. 이를 제어하려면 daemon으로 돌리고 포트로 접근하는 방법도 있겠지만, 파이썬으로 구동시키는 경우에는 Pexpect를 통해서 좀 더 쉽게 제어가 가능합니다. 우선은 Telegram-cli가 깔린 환경이여야 할 것이고, 아래 코드를 참조해보세요. Pexpect를 다른 Application처럼 구동시키려고 해도 Telegram-cli의 경우에는 잘 되지 않았기에 포스팅합니다. ( '>' 문자열로 인식이 쉽게 안되는 문제가 있는듯.. 외국 커뮤니티에서도 같은 이야기가 나오는듯 합니다.)



실행(리셋)시키기

	
def telegramcli_reset():

    # Connect to Telegram Cli
    print '------------------------------'
    print 'Telegram Cli Setting Start...'

    telegram = pexpect.spawn('/bin/telegram-cli')
    telegram.expect('>')
    print telegram.before
    telegram.sendline('dialog_list')
    telegram.expect('unread')
    print telegram.before
    telegram.sendline('msg BotWorld [Notice] Py Server telegram-cli is now on')
    telegram.expect('>>>')
    print telegram.before
    telegram.expect('>')
    print telegram.before
    print '------------------------------'


    return telegram 
	


  첫 구동을 시키는 부분입니다. Telegram-cli의 경우에 처음에 dialog_list와 같은 명령으로 대화방 목록을 긁어오지 않는 경우 chat_room 이름을 통하여 메시지를 전달할 수 없는 문제가 있습니다. 따라서 위의 코드처럼 동작하도록 만들었습니다. 저의 경우에는 BotWorld라는 단톡방에 리셋이 될 경우 메시지가 올라오도록 위처럼 작성하였습니다.



초기 구동 코드

	
telegram = telegramcli_reset() 
	


  위와 같이 telegram이라는 변수에 저장되게 해둡니다. 나중에 telegram 변수를 통하여 접근하면 됩니다.



이후 제어

def msg_send(msg): yield 'Msg Sending... ' global telegram try: telegram.expect('[.+]') print telegram.before telegram.sendline('msg BotWorld ' + msg) telegram.expect('>>>') print telegram.before telegram.expect('>') print telegram.before except: yield 'Error. Resending... ' telegram = telegramcli_reset() telegram.sendline('msg BotWorld ' + msg) telegram.expect('>>>') print telegram.before telegram.expect('>') print telegram.before yield unicode(msg, "utf-8")


  위는 예시일 뿐입니다. 원하는 이벤트에 위 코드 예시처럼 telegram 변수를 통하여 원하는 메시지를 전달하면 될 것입니다. 저의 경우에는 msg_send 함수가 호출되면 BotWorld 대화방에 메시지가 올라가도록 설정해두었습니다.



  사실 공식Bot Interface API가 올라온 마당에, 위 코드가 완전 의미있는 것 같지는 않지만 사용하실 분들이 있을 수도 있을 것 같아 공유해봅니다.