스물두번째 날: use Hangout;

저자

@keedi - Seoul.pm 리더, Perl덕후, 거침없이 배우는 펄의 공동 역자, keedi.k at gmail.com

시작하며

2013년을 기준으로 대한민국의 스마트폰 사용비율은 약 70%를 이미 넘었다고 합니다. 일반 피처폰 신제품을 구경하기 힘든 것을 감안하면 이 비율은 앞으로 더 증가할 것을 예측할 수 있죠. 더불어 정확하지는 않지만 스마트폰 사용자 중 약 80%는 안드로이드 폰을 사용한다고 하구요. 안드로이드 폰의 가장 큰 장점은 구글의 행아웃(구 GTalk)을 기본으로 사용할 수 있다는 점입니다. 안드로이드 폰에서 행아웃은 SMS 서비스와 거의 유사하게 동작하기 때문에 중요한 정보를 전달하기에는 메일보다 조금 더 유리합니다. 회사에서 발생하는 여러가지 이벤트를 기본적으로는 메일을 통해 전달하고는 있지만 중요도에 따라 이 행아웃을 통해 추가적으로 보내줄 수 있다면 편리하지 않을까요? 예를 들어 서버의 상태를 감시하다가 대부분의 경우는 메일로 보내지만 심각한 수준이라면 행아웃으로 보낸다던가, 데일리 빌드가 실패한 경우 행아웃으로 보낸다던가 말이죠. :-)

준비물

필요한 모듈은 다음과 같습니다.

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Net::XMPP

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Net::XMPP

사용 방법

구글이 사용하는 행아웃의 프로토콜은 다행히 열린 표준을 지향하는 XMPP 프로토콜 기반입니다. XMPP 프로토콜은 예전 Jabber라고 불렸었으며 1999년 Jabber 오픈소스 커뮤니티에서 개발되었습니다. 따라서 행아웃에 참가해 메시지를 받거나 보내려면 XMPP 프로토콜을 따르기만 하면 됩니다. 펄에서는 Net::XMPP 모듈을 이용해 간단히 XMPP 프로토콜을 사용할 수 있습니다.

Net::XMPP 모듈으로 메시지를 보내려면 Net::XMPP::Client 모듈 객체를 생성해야 합니다.

use Net::XMPP;

my $conn = Net::XMPP::Client->new;

my $status = $conn->Connect(
    hostname       => 'talk.google.com',
    port           => 5222,
    componentname  => 'gmail.com',
    connectiontype => 'tcpip',
    tls            => 1,
) or die "Connection failed: $!\n";

그 뒤에는 로그인을 시도해야겠죠? 로그인 역시 간단합니다.

my ( $res, $msg ) = $conn->AuthSend(
    username => $username,
    password => $password,
    resource => $resource,    # client name
);
die sprintf "Auth failed %s $!", $msg // q{}
    unless defined $res and $res eq 'ok';

여기까지 문제가 없다면 메시지를 보내거나 받을 준비는 모두 끝났습니다. 메시지를 보내는 것 역시 김빠지게 간단합니다. ;)

$conn->MessageSend(
    to       => $recipient,
    resource => $resource,
    subject  => 'message via ' . $resource,
    type     => 'chat',
    body     => decode_utf8($message),
);

전체 코드

다양한 스케줄러나 프로그램과 연계할 수 있도록 간단한 스크립트로 작성해보았습니다. 필요하다면 모듈 형태로 작성하는 것도 어렵지는 않겠죠.

#!/usr/bin/env perl

use v5.18;
use utf8;
use strict;
use warnings;

use Encode qw( decode_utf8 );
use Net::XMPP;

my $username  = shift or die "$0: username needed";
my $password  = shift or die "$0: password needed";
my $resource  = shift or die "$0: client handle needed";
my $recipient = shift or die "$0: need recipient address";
my $message   = shift or die "$0: need message to send";

my $conn = Net::XMPP::Client->new;

my $status = $conn->Connect(
    hostname       => 'talk.google.com',
    port           => 5222,
    componentname  => 'gmail.com',
    connectiontype => 'tcpip',
    tls            => 1,
) or die "Connection failed: $!\n";

my ( $res, $msg ) = $conn->AuthSend(
    username => $username,
    password => $password,
    resource => $resource,    # client name
);
die sprintf "Auth failed %s $!", $msg // q{}
    unless defined $res and $res eq 'ok';

$conn->MessageSend(
    to       => $recipient,
    resource => $resource,
    subject  => 'message via ' . $resource,
    type     => 'chat',
    body     => decode_utf8($message),
);

실행 결과

제법 그럴듯하죠?

행아웃 메시지 알림바 그림 1. 행아웃 메시지 알림바 (원본)

메시지도 정상적으로 오는군요. :)

행아웃 메시지 그림 2. 행아웃 메시지 알림바 (원본)

정리하며

사실 올해 5월 구글은 GTalk를 행아웃으로 변경하면서 XMPP 지원을 빼버렸습니다. 덕분에 새로운 신규 가입자의 경우 XMPP로 메시지를 주고 받는 부분이 원활하지 않을 수 있습니다. 다행히 한동안은 기존 사용자들로 인해 XMPP 호환 레이어를 두었는지 아직까지는 기존 계정의 경우 큰 문제없이 XMPP를 이용해서 메시지를 주고받을 수 있습니다. 구글이 XMPP 프로토콜을 빼버린 것은 무척 유감입니다만 XMPP가 행아웃에서 고인이 될 그 순간까지는 유용하게 사용할 수 있길 바랍니다.

Enjoy Your Perl! ;-)

EOT

EOT

blog comments powered by Disqus