본문 바로가기

Language/Java / JSP

[Java] 페이스북 담벼락 글 가져오기

반응형

열나게 키보드를 두드리며 광속 코딩을 하던중에 날아온 업무메일 한통.
"회사에서 운영중인 페이스북 글을 운영중인 사이트 메인에서 노출되게 해주세요"

나는 페이스북을 잘 하지는 않지만, 뭐 요청사항이 왔으니 일단 페이스북 API를 확인하였다.
엑세스 토큰이 어쩌고 저쩌고, 사용자 계정이 어쩌고 저쩌고 ...


그러던중에 업무메일을 꼼꼼히 확인하니 구체적인 요구 사항은 아래와 같았다.
"페이스북에 올라와 있는 최근 게시글 5개를 제목만 리스트에서 보여주고, 제목 클릭시 해당 페이스북으로 링크 걸어 줄 것"

제목과 링크만 필요할듯 하여, 페이스북 API를 사용하지 않기로 하고 여러 방법을 강구하던 끝에 페이스북에서 RSS를 지원한다는 내용을 확인하고 해당 RSS를 프로그램상에서 파싱하여 노출시키도록 결정하였다.

운영중인 RSS의 주소만 알면 파싱하는건 문제도 아니니 일단 시작해 보자.



페이스북 RSS 주소 알아내기



일단 RSS파싱을 하려면 당연히 RSS 주소를 알아야 한다.

페이스북의 RSS의 주소는 공통적으로 http://www.facebook.com/feeds/page.php?format=rss20&id= 이다.

해당 주소에다가 id 값만 뒤에 붙여주면 되는데, 우리가 생각하는 facebook의 id가 아니다. 해당 id는 숫자로 구성되어 있는데, 이 ID를 알아내기 위해선 아래와 같이 쉽게 알아낼수 있다.

나는 네이버 공식 페이스북을 테스트해 보았다. 






1. http://findmyfacebookid.com/ 접속


2. FaceBook URL 입력



3. ID 확인





ID를 확인하였다면 RSS 주소 뒤에 ID를 포함시킨뒤에 브라우저에서 확인해 보자.

http://www.facebook.com/feeds/page.php?format=rss20&id=135525743143750






성공적으로 잘 나온다. 이제 해당 RSS 주소를 가지고 java에서 파싱해 보자.




RSS 파싱하기




RSS에서 파싱하기위해선 jdom 라이브러리가 필요하다. 또 페이스북 제목의 경우 html로 인코딩 되어 있으니 해당 인코딩을 디코딩 할 수 있는 라이브러리도 필요하다.

아래 라이브러리 2개를 다운받아 클래스패스에 적용시키도록 하자.

commons-lang3-3.1.jar

jdom-2.0.5.jar




해당 RSS의 주소를 호출뒤에 소스를 확인해보면 사용할수 있는 노드명을 알 수 있다.

필요한 노드를 파싱하여 목적에 맞게 사용하면 된다.


import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.lang3.StringEscapeUtils;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.xml.sax.InputSource;


public class FaceBookRssParser {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		// RSS 주소
		String rssUrl = "https://www.facebook.com/feeds/page.php?format=rss20&id=135525743143750";
		
		
		try{
			URL url = null ;
			
			SAXBuilder rssParser = new SAXBuilder();
			rssParser.setIgnoringElementContentWhitespace(true) ;
			
			
			url = new URL(rssUrl) ;
			
			InputSource is = new InputSource(url.openStream()) ;
			
			Document doc = rssParser.build(is) ;
			Element root = doc.getRootElement() ;
			Element channel = root.getChild("channel") ;
			List<Element> item = channel.getChildren("item") ;
			
			
			Date date = new Date();
			SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
			
			for(int i=0; i < item.size(); i++){
				Element el = (Element)item.get(i) ;
				
				String title = el.getChildText("title") ;
				String link = el.getChildText("link") ;
				String pubDate = el.getChildText("pubDate") ;
				String author = el.getChildText("author") ;
			
	
				date = new Date(pubDate);
				
				// 날짜 형식 변경			
				String dateEscape = timeFormat.format(date) ;
	
				// 문자 디코딩
				String titleEscape = StringEscapeUtils.unescapeHtml4(title) ;
				String authorEscape = StringEscapeUtils.unescapeHtml4(author) ;
				
				
				HashMap hm = new HashMap();
				
				hm.put("fbTitle", titleEscape) ;
				hm.put("fbLink", link) ;
				hm.put("fbDate", dateEscape) ;
				hm.put("fbAuthor", authorEscape) ;
				
				
			
				
				
				System.out.println(hm) ;
				
				
			}
			
			
			
			
		}catch(Exception e){
			e.printStackTrace();
		}

	}

}