간만에 간단한 코딩을 한번 해 보기로 한다. 만들어 볼 것은 아주 아주 간단한 트위터 봇(bot)인데, 제목 그대로 내가 내 메신저에서 트위터로 메시지를 날릴 수 있게 해 주는 메신저 봇이다. 트위터(Twitter)는 아주 인기있는 마이크로블로깅 서비스인지라 이미 세상에는 너무나도 많은 봇들이 나와서 돌아 다닌다. 게다가 봇을 자동으로 생성해 주는 서비스도 여럿 있다. 그렇지만 간단한 봇 정도야 1분, 아니 10분 안에 만들어 쓸 수도 있지 않을까?

우선 몇 가지 준비를 하자. 메신저 프로토콜은 오픈 프로토콜인 XMPP를 사용하기로 하자. 부연하자면, XMPP는 예전에Jabber라 불리던 것으로 현재 구글이 GTalk 서비스에 사용하고 있는 XML 스트림 기반의 근사한 메시징 프로토콜이다. 그럼 루비로 간단한 봇 프로그램을 만들어 보자. 코드는 다음과 같다.

require 'rubygems'
require 'eventmachine'
require 'xmpp4r-simple'
require 'twitter'

class TwitterBot
  def initialize(jid, j_pass, tw_email, tw_pass)
    @logger = Logger.new(STDOUT)
    @im = Jabber::Simple.new(jid, j_pass)
    @tw = Twitter::Base.new(tw_email, tw_pass)
  end
 
  def update_messages
    @im.received_messages do |msg|
      jid = msg.from.strip
      @tw.update(msg.body)
      @logger.info "%s update: %s" % [ jid, msg.body ]
      @im.add(jid) if !@im.subscribed_to?(jid)
      @im.deliver(jid, "업데이트 성공.")
    end
  end
end

루비의 XMPP 라이브러리인 xmpp4r-simple과 트위터 API wrapper인 twitter 라이브러리를 사용하였기 때문에, 설명할 여지도 없이 간단한 코드가 되었다. 하는 일이라고는 그냥 메신저로부터 메시지를 받아 그 메시지를 다시 트위터로 보내는 게 전부다.

이제 이 봇을 실행해 보자. 간단한 loop문만 돌려도 되지만, 향후 이 봇의 확장성(?)을 고려해서 루비 이벤트 기반 네트워크 라이브러리인 eventmachine을 사용하기로 하였다. 마지막으로 XMPP 서버가 필요한데, 물론 ejabberd 같은 XMPP 서버를 직접 설치하여도 좋겠지만, 굳이 간단한 봇을 위해 그런 수고까지야. 이미 세상에는 아주 훌륭한 XMPP서버가 나와 있으니 그걸 이용하기로 하자. 바로 구글 Talk다! 봇의 구동 코드는 다음과 같은데, 봇의 생성자에 자신의 구글메일ID, 즉 구글토크ID와 패스워드, 그리고 자신의 트위터 접속 정보를 넘겨주기만 하면 된다.

tb = TwitterBot.new(구글메일 주소, 구글메일 패스워드, 트위터 이메일, 트위터 패스워드)

EM.run do
  EM::PeriodicTimer.new(1) do
    tb.update_messages
  end
end  

이제 이 봇을 실행하고 봇의 ID, 즉 위에서 사용한 구글메일주소를 자신의 메신저 친구 목록에 등록하자. 그리고 나서는 트위터로 무언가 글을 올릴 일이 있을 때마다 그냥 메신저에서 봇에게 메시지만 보내면 그만이다.

이 봇은 트위터를 예제로 하고 있지만, 사실 조금만 변경하면 API가 오픈된 많은 서비스들에 응용할 수 있을 것이다. 자신의 블로그에 블로깅을 하는데 이용할 수도 있고, 미투데이나 스프링노트에 글을 올릴 수도 있을 것이다. 아, 물론 미투데이나 스프링노트는 이미 근사한 봇들이 많이 만들어져 있으니 굳이 그럴 일은 없겠지만.

그리고 또, 음.. 플라타너스트리에도 적용해 볼 수 있지 않을까.
2010/05/02 17:42 2010/05/02 17:42

Trackback Address :: https://youngsam.net/trackback/1151