Saturday, April 29, 2006
Perl/펄] 세상에서 가장 간단한 RSS리더기를 만들어 보자
Perl 과 RSS에 대한 게시물입니다. 2024-03-21에 약간 업데이트했습니다.
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
위의 코드를 rss.pl 등의 적당한 이름으로 하드에 저장하면 된다.
이것은 포스트 제목들만 출력하는 간단한 RSS리더기다. Atom은 되지 않고 RSS만 가능하다. RSS 1.0은 물론 2.0도 지원된다.
별도의 모듈을 다운받아야 이 펄 코드를 실행시킬 수 있다. 그렇지만 어렵지는 않다.
CPAN에서 XML::RSS 로 검색하면 모듈이 하나 나오는데 거기서, XML-RSS-1.10.tar.gz 라는 이름의 파일(버전에 따라 다름)을 다운로드 받아서, WinRAR 등으로, 안을 들여다보면,
XML-RSS-1.10\lib\XML
이런 폴더가 압축되어 있고, XML 폴더 밑에 RSS.pm 이라는 앙증맞은 파일이 하나 들어 있다. 이것이 그 모듈이다. 텍스트 파일로 되어 있다.
이 RSS.pm 만 풀어서 라이브러리 폴더에 넣어주면 된다.(펄 라이브러리를 지정하는 방법은 여기를 참고.) 이 모듈에는 .xs 파일이 없기 때문에, 즉 순수한 펄 코드로만 이루어진 모듈이기에 C컴파일러로 컴파일할 필요가 없다.
필자의 경우
D:\WINDOWS_\Programs\perl_\site\lib
이 폴더에, XML 이라는 폴더를 하나 만들고, 그 XML 폴더 밑에 RSS.pm 파일을 넣어 주었다.
결국 RSS.pm 모듈의 전체적인 주소는 이렇게 되었다:
D:\WINDOWS_\Programs\perl_\site\lib\XML\RSS.pm
findpm RSS.pm
으로, 모듈이 잘 설치되었는지 확인해 보면, 이상한 에러가 나는데, 실제 스크립트 자체는 잘 작동했다.
위의 펄 소스의 뼈대는 일본 블로거( http://hail2u.net/rss/ # 폐쇄됨)의 블로그에서 가져온 코드를 약간 한국화시키고 기능을 추가한 것이다. 그리고 위의 소스 중에서 RSS 헤더 정보를 출력하는 부분은 XML::RSS 모듈 속에 동봉된 예제인 rss_info.pl 에서 따온 것이다. 그런데 헤더 정보 출력이 그리 정확하지 않았다.
아래는, 펄마니아의 피드인
http://www.perlmania.or.kr/rss/perlmania.xml
를 옵션으로 주고 실행했을 때의 결과이다.
rss.pl http://www.perlmania.or.kr/rss/perlmania.xml
이렇게 실행시키면 된다. (펄마니아 게시판에 스팸들이 많이 오는데 그것까지 다 나오고 있다.)
펄마니아의 피드는 현재, euc-kr 인데도 UTF-8 로 오인하는 버그가 RSS.pm 모듈에는 있었다.
피드 주소를 옵션으로 지정해 주지 않고 그냥 실행시키면 기본값으로, 필자의 피드인
http://feeds.feedburner.com/mwultong
이 나오도록 했다. (이 점이 불만스러운 분은, 자신의 피드 주소로 소스 코드를 수정하면 된다.ㅎㅎ)
이번에는 정확하게 출력되었다.
유니코드 피드이지만, 명령 프롬프트 화면에서 유니코드를 출력하면 한글이 깨졌기에, 완성형 ANSI로 출력했다. 출력을 유니코드(UTF-8)로 하기 위해서는,
이것을
#use encoding "utf8"; # 유니코드로 출력. 화면에선 글자 깨짐.
use encoding "utf8", STDOUT => "cp949"; # 화면에서 글자 잘 보임
이렇게 주석(#) 기호를 옮겨서
use encoding "utf8"; # 유니코드로 출력. 화면에선 글자 깨짐.
#use encoding "utf8", STDOUT => "cp949"; # 화면에서 글자 잘 보임
수정한 후, 다음과 같이 재지향을 사용해서, 결과를 파일로 저장하면 된다:
rss.pl > out.txt
이렇게 하면 명령 프롬프트에 나온 글자들이 파일로 저장된다. 다만 도스 텍스트가 아닌 유닉스 텍스트이기에 메모장에서는 이상하게 보이는데, 울트라에디트 같은 고급 에디터에서 불러서 읽으면 된다. ("[Perl/펄] 한글 자소 분리: '똠방각하'를 'ㄸㅗㅁㅂㅏㅇㄱㅏㄱㅎㅏ'로 자동 변환" 포스트에 보면, 유닉스 텍스트를 도스 텍스트로 출력하는 sub LF2LFCR 라는 함수가 있는데, 이것을 쓰면 도스 텍스트로 출력할 수 있을 것이다.)
이 포스트에서 소개한 펄 코드 자체는 너무 단순해서 별로 쓸모가 없지만, 이것을 기반으로 잘 응용하면 훌륭한 RSS툴을 만들 수도 있을 것이다.
아톰 피드를 지원하기 위해서는 CPAN에서 atom 으로 검색하여 모듈을 얻어서 사용하면 된다. (펄(Perl)은 어지간한 코드는 다 CPAN에서 구할 수 있기에 자신이 직접 만들 필요는 없다.) 그런데 아톰 피드는 외국에서도 별로 인기가 없는 듯했다.
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
#!/usr/bin/perl
use strict; use warnings;
# 간단한 RSS 리더기 v0.1
#use encoding "utf8"; # 유니코드로 출력. 화면에선 글자 깨짐.
use encoding "utf8", STDOUT => "cp949"; # 화면에서 글자 잘 보임
use LWP::Simple;
use XML::RSS; # CPAN 에 가서 다운로드받아야 함
my $my_url = 'http://feeds.feedburner.com/mwultong'; # 기본 피드 주소
$my_url = $ARGV[0] if (defined $ARGV[0]); # 다른 피드 주소를 옵션으로 주면 그 다른 주소를 사용
my $content = get($my_url);
my $rss = new XML::RSS;
eval { $rss->parse($content); };
# 피드 헤더 정보 출력
print "URL: ".$my_url."\n";
print "XML encoding: ".$rss->encoding."\n";
print "RSS Version: ".$rss->version."\n";
print "Title: ".$rss->channel('title')."\n";
print "Language: ".$rss->channel('language')."\n";
print "Rating: ".$rss->channel('rating')."\n";
print "Copyright: ".$rss->channel('copyright')."\n";
print "Publish Date: ".$rss->channel('pubDate')."\n";
print "Last Build Date: ".$rss->channel('lastBuildDate')."\n";
print "CDF URL: ".$rss->channel('docs')."\n";
print "Items: ".scalar(@{$rss->items})."\n\n";
for my $item (@{$rss->{'items'}}) { # 포스트들의 제목 출력
print "$item->{title}\n";
}
__END__
여기서부터는 이런저런 메모를 적을 수 있다.
use strict; use warnings;
# 간단한 RSS 리더기 v0.1
#use encoding "utf8"; # 유니코드로 출력. 화면에선 글자 깨짐.
use encoding "utf8", STDOUT => "cp949"; # 화면에서 글자 잘 보임
use LWP::Simple;
use XML::RSS; # CPAN 에 가서 다운로드받아야 함
my $my_url = 'http://feeds.feedburner.com/mwultong'; # 기본 피드 주소
$my_url = $ARGV[0] if (defined $ARGV[0]); # 다른 피드 주소를 옵션으로 주면 그 다른 주소를 사용
my $content = get($my_url);
my $rss = new XML::RSS;
eval { $rss->parse($content); };
# 피드 헤더 정보 출력
print "URL: ".$my_url."\n";
print "XML encoding: ".$rss->encoding."\n";
print "RSS Version: ".$rss->version."\n";
print "Title: ".$rss->channel('title')."\n";
print "Language: ".$rss->channel('language')."\n";
print "Rating: ".$rss->channel('rating')."\n";
print "Copyright: ".$rss->channel('copyright')."\n";
print "Publish Date: ".$rss->channel('pubDate')."\n";
print "Last Build Date: ".$rss->channel('lastBuildDate')."\n";
print "CDF URL: ".$rss->channel('docs')."\n";
print "Items: ".scalar(@{$rss->items})."\n\n";
for my $item (@{$rss->{'items'}}) { # 포스트들의 제목 출력
print "$item->{title}\n";
}
__END__
여기서부터는 이런저런 메모를 적을 수 있다.
위의 코드를 rss.pl 등의 적당한 이름으로 하드에 저장하면 된다.
이것은 포스트 제목들만 출력하는 간단한 RSS리더기다. Atom은 되지 않고 RSS만 가능하다. RSS 1.0은 물론 2.0도 지원된다.
별도의 모듈을 다운받아야 이 펄 코드를 실행시킬 수 있다. 그렇지만 어렵지는 않다.
CPAN에서 XML::RSS 로 검색하면 모듈이 하나 나오는데 거기서, XML-RSS-1.10.tar.gz 라는 이름의 파일(버전에 따라 다름)을 다운로드 받아서, WinRAR 등으로, 안을 들여다보면,
XML-RSS-1.10\lib\XML
이런 폴더가 압축되어 있고, XML 폴더 밑에 RSS.pm 이라는 앙증맞은 파일이 하나 들어 있다. 이것이 그 모듈이다. 텍스트 파일로 되어 있다.
이 RSS.pm 만 풀어서 라이브러리 폴더에 넣어주면 된다.(펄 라이브러리를 지정하는 방법은 여기를 참고.) 이 모듈에는 .xs 파일이 없기 때문에, 즉 순수한 펄 코드로만 이루어진 모듈이기에 C컴파일러로 컴파일할 필요가 없다.
필자의 경우
D:\WINDOWS_\Programs\perl_\site\lib
이 폴더에, XML 이라는 폴더를 하나 만들고, 그 XML 폴더 밑에 RSS.pm 파일을 넣어 주었다.
결국 RSS.pm 모듈의 전체적인 주소는 이렇게 되었다:
D:\WINDOWS_\Programs\perl_\site\lib\XML\RSS.pm
findpm RSS.pm
으로, 모듈이 잘 설치되었는지 확인해 보면, 이상한 에러가 나는데, 실제 스크립트 자체는 잘 작동했다.
위의 펄 소스의 뼈대는 일본 블로거( http://hail2u.net/rss/ # 폐쇄됨)의 블로그에서 가져온 코드를 약간 한국화시키고 기능을 추가한 것이다. 그리고 위의 소스 중에서 RSS 헤더 정보를 출력하는 부분은 XML::RSS 모듈 속에 동봉된 예제인 rss_info.pl 에서 따온 것이다. 그런데 헤더 정보 출력이 그리 정확하지 않았다.
아래는, 펄마니아의 피드인
http://www.perlmania.or.kr/rss/perlmania.xml
를 옵션으로 주고 실행했을 때의 결과이다.
rss.pl http://www.perlmania.or.kr/rss/perlmania.xml
이렇게 실행시키면 된다. (펄마니아 게시판에 스팸들이 많이 오는데 그것까지 다 나오고 있다.)
D:\Z>rss.pl http://www.perlmania.or.kr/rss/perlmania.xml
URL: http://www.perlmania.or.kr/rss/perlmania.xml
XML encoding: UTF-8
RSS Version: 1.0
Title: PerlMania
Language: 0
Rating: 0
Copyright: 0
Publish Date: 0
Last Build Date: 0
CDF URL: 0
Items: 10
외국어공부
defunct가 됩니다..
PDF 파일 보여주기
○박사이트이랍니다
○박사이트이랍니다
싱*싱*한* ○.걸. ○.슴 ○.출 동/영/상♣
Re: 2박3일 동원훈련다녀왔습니다.
Re: Re: Re: 디비에서던져주는메세지를받고싶어요
Re: Re: 디비에서던져주는메세지를받고싶어요
Re: 문자열 검색 도와주세요.
D:\Z>
URL: http://www.perlmania.or.kr/rss/perlmania.xml
XML encoding: UTF-8
RSS Version: 1.0
Title: PerlMania
Language: 0
Rating: 0
Copyright: 0
Publish Date: 0
Last Build Date: 0
CDF URL: 0
Items: 10
외국어공부
defunct가 됩니다..
PDF 파일 보여주기
○박사이트이랍니다
○박사이트이랍니다
싱*싱*한* ○.걸. ○.슴 ○.출 동/영/상♣
Re: 2박3일 동원훈련다녀왔습니다.
Re: Re: Re: 디비에서던져주는메세지를받고싶어요
Re: Re: 디비에서던져주는메세지를받고싶어요
Re: 문자열 검색 도와주세요.
D:\Z>
펄마니아의 피드는 현재, euc-kr 인데도 UTF-8 로 오인하는 버그가 RSS.pm 모듈에는 있었다.
피드 주소를 옵션으로 지정해 주지 않고 그냥 실행시키면 기본값으로, 필자의 피드인
http://feeds.feedburner.com/mwultong
이 나오도록 했다. (이 점이 불만스러운 분은, 자신의 피드 주소로 소스 코드를 수정하면 된다.ㅎㅎ)
D:\Z>rss.pl
URL: http://feeds.feedburner.com/mwultong
XML encoding: UTF-8
RSS Version: 2.0
Title: mwultong Blog ― 소설 / IT
Language: en-US
Rating: 0
Copyright: 0
Publish Date: 0
Last Build Date: Fri, 28 Apr 2006 21:53:52 -0500
CDF URL: 0
Items: 15
블로그 피드(Feed) 상단에, 그림 로고(Logo) 넣기
[QnA] 왜 TIF/TIFF 화일은 업로드할 수 없나요. 스캐너로 뽑은 사진인데-_-;
[HTML/CSS] 사이트 피드 자동검출/자동인식(Autodiscovery) 태그 수정하기
[공지] RSS 2.0 으로 블로그 피드를 바꾸었습니다
[독서] '댄 브라운' 소설 '다 빈치 코드' (베텔스만 코리아)
[스팸 방지/프라이버시 보호] 이메일(EMail)의 이미지를 차단하자
[독서] 김훈 소설 '언니의 폐경' 프리뷰 / 제5회 황순원 문학상 수상작품집
구글의 인기 검색어 알아보기 ㅎㅎ: Keyword Tool
블로그의 사이트 피드를 피드버너(FeedBurner)에 등록
[QnA] 3dsmax.chm 이란? 3dsmax.chm 파일은 어디서 다운로드받나요?
[QnA] 한자 폰트(글꼴) 있는 곳 / 좋은 한자 폰트는?
[HTML/CSS] 포스트 제목 툴팁(tooltip)의 쌍따옴표/홑따옴표 문제 해결
[독서] 마광수 소설 '권태' 프리뷰 (문학사상사)
[독서] 한강(韓江) 소설 '몽고반점' (이상문학상 대상 수상작) 프리뷰 (문학사상사)
[HTML/CSS] 메타 태그(META TAG)의 'REVISIT-AFTER' 속성은 이제 쓸모 없는 듯
D:\Z>
URL: http://feeds.feedburner.com/mwultong
XML encoding: UTF-8
RSS Version: 2.0
Title: mwultong Blog ― 소설 / IT
Language: en-US
Rating: 0
Copyright: 0
Publish Date: 0
Last Build Date: Fri, 28 Apr 2006 21:53:52 -0500
CDF URL: 0
Items: 15
블로그 피드(Feed) 상단에, 그림 로고(Logo) 넣기
[QnA] 왜 TIF/TIFF 화일은 업로드할 수 없나요. 스캐너로 뽑은 사진인데-_-;
[HTML/CSS] 사이트 피드 자동검출/자동인식(Autodiscovery) 태그 수정하기
[공지] RSS 2.0 으로 블로그 피드를 바꾸었습니다
[독서] '댄 브라운' 소설 '다 빈치 코드' (베텔스만 코리아)
[스팸 방지/프라이버시 보호] 이메일(EMail)의 이미지를 차단하자
[독서] 김훈 소설 '언니의 폐경' 프리뷰 / 제5회 황순원 문학상 수상작품집
구글의 인기 검색어 알아보기 ㅎㅎ: Keyword Tool
블로그의 사이트 피드를 피드버너(FeedBurner)에 등록
[QnA] 3dsmax.chm 이란? 3dsmax.chm 파일은 어디서 다운로드받나요?
[QnA] 한자 폰트(글꼴) 있는 곳 / 좋은 한자 폰트는?
[HTML/CSS] 포스트 제목 툴팁(tooltip)의 쌍따옴표/홑따옴표 문제 해결
[독서] 마광수 소설 '권태' 프리뷰 (문학사상사)
[독서] 한강(韓江) 소설 '몽고반점' (이상문학상 대상 수상작) 프리뷰 (문학사상사)
[HTML/CSS] 메타 태그(META TAG)의 'REVISIT-AFTER' 속성은 이제 쓸모 없는 듯
D:\Z>
이번에는 정확하게 출력되었다.
유니코드 피드이지만, 명령 프롬프트 화면에서 유니코드를 출력하면 한글이 깨졌기에, 완성형 ANSI로 출력했다. 출력을 유니코드(UTF-8)로 하기 위해서는,
이것을
#use encoding "utf8"; # 유니코드로 출력. 화면에선 글자 깨짐.
use encoding "utf8", STDOUT => "cp949"; # 화면에서 글자 잘 보임
이렇게 주석(#) 기호를 옮겨서
use encoding "utf8"; # 유니코드로 출력. 화면에선 글자 깨짐.
#use encoding "utf8", STDOUT => "cp949"; # 화면에서 글자 잘 보임
수정한 후, 다음과 같이 재지향을 사용해서, 결과를 파일로 저장하면 된다:
rss.pl > out.txt
이렇게 하면 명령 프롬프트에 나온 글자들이 파일로 저장된다. 다만 도스 텍스트가 아닌 유닉스 텍스트이기에 메모장에서는 이상하게 보이는데, 울트라에디트 같은 고급 에디터에서 불러서 읽으면 된다. ("[Perl/펄] 한글 자소 분리: '똠방각하'를 'ㄸㅗㅁㅂㅏㅇㄱㅏㄱㅎㅏ'로 자동 변환" 포스트에 보면, 유닉스 텍스트를 도스 텍스트로 출력하는 sub LF2LFCR 라는 함수가 있는데, 이것을 쓰면 도스 텍스트로 출력할 수 있을 것이다.)
결론
이 포스트에서 소개한 펄 코드 자체는 너무 단순해서 별로 쓸모가 없지만, 이것을 기반으로 잘 응용하면 훌륭한 RSS툴을 만들 수도 있을 것이다.
아톰 피드를 지원하기 위해서는 CPAN에서 atom 으로 검색하여 모듈을 얻어서 사용하면 된다. (펄(Perl)은 어지간한 코드는 다 CPAN에서 구할 수 있기에 자신이 직접 만들 필요는 없다.) 그런데 아톰 피드는 외국에서도 별로 인기가 없는 듯했다.
tag: rss
RSS 피드 | Atom Feed
tag: perl
Perl | 펄
<< Home