닫기
검색

위젯팩토리

위젯 팩토리에서 위젯을 만들어 보세요!
완성된 위젯을 등록하면 심사후 위젯뱅크에 소개 됩니다.
위젯 등록하기 위젯 관리하기

factory star

이전 다음
ELLE 위젯
ELLE 위젯
나의 스타일 업그레이드!
블로그 랭킹 위젯
블로그 랭킹 위젯
내 블로그 랭킹 보기

원격 콘텐츠 사용법

  • 위젯/가젯 API는 다른 웹서버들과 웹페이지들로부터 콘텐츠를 원격으로 가져오고, 사용할 수 있습니다.
    원격 웹 콘텐츠 탐색과 활용을 위해 makeRequest(url, callback, opt_params) 함수를 제공합니다.
    • String url : 콘텐츠가 위치한 원격 URL
    • Function callback : 지정한 URL로부터 가져온 데이터를 호출하기 위한 함수
    • Map opt_params : request를 보낼 때 추가하는 파라미터
    opt_params에는 다음과 같은 내용 포함될 수 있습니다.
    • 콘텐츠 타입 : TEXT, XML, JSON 사용 가능 (gadgets.io.RequestParameters.CONTENT_TYPE)
    • 메쏘드 타입 : POST 또는 GET (gadgets.io.RequestParameters.METHOD)
    • request와 같이 보낼 헤더 정보 (gadgets.io.RequestParameters.HEADERS)
    • 인증방식 : NONE, SIGNED 사용 가능 (gadgets.io.RequestParameters.AUTHORIZATION)
    makeRequest()를 호출하면 다음과 같은 공통 특성을 가집니다.
    • 첫번째 파라미터인 url은 원격 콘텐츠를 가져오기 위해 사용된다.
    • 두번째 파라미터인 callback 함수는 반환된 데이터를 처리하기 위해 사용된다.
    • 비동기적이고, 콜백 함수안에서 일어나야만 하는 전 과정을 포함한다. 콜백은 파라미터로서 다른 함수에 전달될 수 있는 함수입니다. 콜백은 제 3의 개발자들에게 기존에 구동중인 프레임웍에 특정 처리를 hook 할 수 있도록 제공한다.
    • 즉시 반환되어야 하기 때문에 반환값은 별도로 없다. 그리고 연관된 콜백 함수들은 response 가 반환될때마다 호출된다.
    다음 예제는 원격 콘텐츠를 텍스트 형식으로 가져오는 소스입니다. http://www.daum.net 웹페이지로 부터 앞의 300글자만 alert창으로 보여줍니다.
    function getHtml() { var params = {}; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT; params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 10 * 60; var url = "http://www.daum.net"; gadgets.io.makeRequest(url, response, params); }; function response(obj) { //obj.text contains the text of the page that was requested var str = obj.text; var html = str.substr(0,400); alert(html); }; gadgets.util.registerOnLoadHandler(getHtml);
    이 예제는 makeRequest()의 기본적인 사용법을 보여줍니다.
    • makeRequest()가 호출될 때 위젯/가젯 API는 비동기적인 HTTP GET request를 해당 URL로 보내고, 이를 해당 함수로 전달한다.
    • makeRequest()가 반환되고 난 후, 콜백 함수가 호출된다. 이 의미는 콜백 함수안에 의존적인 코드를 넣거나, 콜백 함수에 의해 호출되는 내부 함수를 넣어야 한다는 의미이다.
    • makeRequest() 함수는 다음과 같은 구조로 반환값을 갖는다.
      • data : 파싱된 데이터
      • errors : 오류가 발생하였을 경우, 오류내용
      • text : 반환 된 텍스트
    기본적으로 원격 콘텐츠는 text로 반환됩니다. opt_params 필드의 CONTENT_TYPE의 값을 조정하여 반환 형식을 변경할 수 있습니다.
    • TEXT : gadgets.io.ContentType.TEXT
    • DOM : gadgets.io.ContentType.DOM
    • JSON : gadgets.io.ContentType.JSON
  • 1. TEXT 형태 사용하기
    다음 원격에 있는 XML파일을 아무 변환없이 그대로 TEXT로 표시하는 예제입니다.
    이 예제는 기본적인 파라미터를 사용하여 가져올 콘텐츠 타입을 세팅하는 방법을 보여줍니다. 콜백함수인 response안에서 obj.text를 이용하여 반환된 TEXT를 사용합니다.
    <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs height="200" title="원격 TEXT 사용법" scrolling="true"> </ModulePrefs> <Content type="html"> <![CDATA[ <div id="content_div"></div> <script type="text/javascript"> function getHtml() { var params = {}; // 콘텐츠 종류를 TEXT로 설정 params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.TEXT; params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 10 * 60; var url = "http://ws.daum.net/aboutWebSearch.html"; // 콜백함수는 response gadgets.io.makeRequest(url, response, params); }; function response(obj) { //반환된 TEXT를 str 변수에 저장 var str = obj.text; _gel('content_div').innerHTML = str; }; gadgets.util.registerOnLoadHandler(getHtml); </script> ]]> </Content> </Module>
  • 2. XML 형태 사용하기
    XML문서를 탐색하기 위해서 makeRequest()를 사용할 수 있습니다. XML로부터 원하는 값을 추출해서 HTLM이나 CSS와 결합시켜, 위젯/가젯 안에 HTML 결과로 렌더링이 가능합니다.
    다음 XML 파일은 Daum 검색의 실시간 이슈검색어 정보를 포함하고 있습니다.
    최상위 노드는 DTOP_RT_TO_KEYWORD이고, 이 노드는 여러개의 RECORD 노드를 가지고 있습니다. 각각의 RECORD 노드는 순위, 키워드, 이전순위, 증감, 링크 정보를 가지고 있습니다.
    <?xml version="1.0" encoding="EUC-KR"?> <DTOP_RT_TO_KEYWORD lastmodified="20080916154401"> <RECORD> <RANK><![CDATA[1]]></RANK> <KEYWORD><![CDATA[명계춘 타계]]></KEYWORD> <SCORE>new</SCORE> <UPTYPE>2</UPTYPE> <URL><![CDATA[http://search.daum.net/search?w=tot&rtupcoll=NNS&nil_profile=g%26nil_cafesearch=1%26q=]]></URL> <FULL_URL><![CDATA[http://search.daum.net/search?w=tot&rtupcoll=NNS&nil_profile=cafetop_rtup&q=%B8%ED%B0%E8%C3%E1+%C5%B8%B0%E8]]></FULL_URL> </RECORD> <RECORD> <RANK><![CDATA[2]]></RANK> <KEYWORD><![CDATA[김현중 응급실]]></KEYWORD> <SCORE>22</SCORE> <UPTYPE>1</UPTYPE> <URL><![CDATA[http://search.daum.net/search?w=tot&rtupcoll=NKS,NNS&nil_profile=g%26nil_cafesearch=2%26q=]]></URL> <FULL_URL><![CDATA[http://search.daum.net/search?w=tot&rtupcoll=NKS,NNS&nil_profile=cafetop_rtup&q=%B1%E8%C7%F6%C1%DF+%C0%C0%B1%DE%BD%C7]]></FULL_URL> </RECORD> ... <RECORD> <RANK><![CDATA[10]]></RANK> <KEYWORD><![CDATA[박두병]]></KEYWORD> <SCORE>21</SCORE> <UPTYPE>1</UPTYPE> <URL><![CDATA[http://search.daum.net/search?w=tot&rtupcoll=&nil_profile=g%26nil_cafesearch=10%26q=]]></URL> <FULL_URL><![CDATA[http://search.daum.net/search?w=tot&rtupcoll=&nil_profile=cafetop_rtup&q=%B9%DA%B5%CE%BA%B4]]></FULL_URL> </RECORD> </DTOP_RT_TO_KEYWORD>
    다음은 위의 XML 소스를 사용하여 실시간 이슈검색어를 보여주는 예제입니다.
    <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="Daum 실시간 이슈" scrolling="true" height="260"> </ModulePrefs> <Content type="html"> <![CDATA[ <style type="text/css"> #daumSearchBox { height: 21px; background-image : url('http://imgsrc.search.daum-img.net/search_all/show/tistory/plugin/bg_search2_2.gif'); margin: 5px auto ; padding: 0; } #daumSearchBox input { background: none; margin : 0; padding : 0; border : 0; } #daumSearchBox #daumLogo { width: 34px; height: 21px; float: left; margin-right: 5px; background-image : url('http://imgsrc.search.daum-img.net/search_all/show/tistory/plugin/bg_search1_2.gif'); } #daumSearchBox #show_q { background-color: transparent; border: none; font: 12px Gulim, Sans-serif; color: #555; margin-top: 4px; float: left; } #daumSearchBox #show_btn { background-image : url('http://imgsrc.search.daum-img.net/search_all/show/tistory/plugin/bt_search_2.gif'); width: 37px; height: 21px; float: right; margin:0; cursor:pointer; text-indent:-1000em; } </style> <form id="daumSearchBox" style="width:200px" method="GET" action="http://search.daum.net/search" target="_blank"> <input type="hidden" name="w" value="tot" /> <div id="daumLogo"></div> <input id="show_q" type="text" name="q" value="위젯뱅크" onfocus="this.value=''" style="width:99px"> <input id="show_btn" type="submit" value="검색" /> </form> <hr /> <div>Daum Issue <a href="javascript:;" onclick="displayKeyword();">새로고침</a></div> <div id="content_div"></div> <div id="time_div"></div> <script type="text/javascript"> displayKeyword(); function displayKeyword() { var params = {}; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM; params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 10 * 60; // Daum 이슈검색어 XML 파일 위치 var url = "http://img.search.hanmail.net/jumpkeyword/DTOP/DTOP_RT_TO_KEYWORD.xml"; gadgets.io.makeRequest(url, response, params); } function response(obj) { responseXML = obj.data; var html = "<div>"; // DTOP_RT_TO_KEYWORD의 속성이 하나여서 두가지 다 사용 가능 var lastmodified = responseXML.getElementsByTagName("DTOP_RT_TO_KEYWORD").item(0).getAttribute("lastmodified"); //var lastmodified = responseXML.getElementsByTagName("DTOP_RT_TO_KEYWORD").item(0).attributes.item(0).nodeValue; var keywordList = responseXML.getElementsByTagName("RECORD"); // 각 RECORD에 대한 값들을 저장 for (var i=0; i<10; i++) { var record = keywordList.item(i).childNodes; for (var j=0; j<record.length; j++) { var node = record.item(j); if (node.nodeName == "RANK") { var rank = node.firstChild.nodeValue; } if (node.nodeName == "KEYWORD") { var keyword = node.firstChild.nodeValue; } if (node.nodeName == "FULL_URL") { var fullUrl = node.firstChild.nodeValue; } } html += "<dt style='background:url(http://imgsrc.search.daum-img.net/searchtrend_img/2008/ic_blue"+rank+".gif) no-repeat left 2px;'>"; html += "<a href=\"" + fullUrl + "\" target=\"_blank\" style=\"color:#2D47C8;font-weight:bold;text-decoration:none;padding-left:26px;\">" + keyword + "</a>"; html += "</dt>"; } document.getElementById("content_div").innerHTML = html; document.getElementById("time_div").innerHTML = lastmodified + " 현재"; } </script> ]]> </Content> </Module>
    이 예제는 DOM 데이터를 가지고 상호작용을 할 때 사용하는 기본적인 4가지 함수를 보여줍니다.
    • getElementsByTagName(tagname) : DOM문서중에서, tagname에 매치되는 이름을 가진 노드들의 배열을 반환한다. wildcard 문자(*)를 이용하면, 파일안의 모든 요소 정보를 탐색할 수 있다.

      예) response.getElementsByTagName("*").

    • getElementsById(id) : DOM문서 중에서, ID에 해당하는 하나의 노드를 탐색한다.
    • getAttribute(attribute) : 요소 노드들 중에서, attribute로 전달한 속성을 반환한다.

      예) responseXML.getElementsByTagName("DTOP_RT_TO_KEYWORD").item(0).getAttribute("lastmodified")

    • attributes : 단일 요소 노드들로부터 노드의 속성들의 배열을 반환한다.
    여기서는 DOM 트리를 탐색하는 서로 다른 함수 몇 가지만을 나타냈는데 lastChild, nextSibling, previousSibling, parentNode와 같은 노드를 포함할 수도 있습니다.
  • 3. 피드 사용하기
    FEED를 위젯/가젯으로 사용하기 위해서는 DOM 콘텐츠 다입을 아래처럼 사용할 수 있습니다.
    다음 예제는 makeRequest() 함수를 사용하여 피드를 가져오고, 위젯/가젯 안에 데이터를 표시하는 방법을 보여줍니다.
    <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="Fetch Feed Example" height="200" /> <Content type="html"> <![CDATA[ <style> #content_div { font-size: 80%; margin: 5px; background-color: #FFFFBF;} </style> <div id="content_div"></div> <script type="text/javascript"> var showdate = false; var summary = false; var entries = 10; function makeDOMRequest() { var params = {}; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM; params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 10 * 60; var url = "http://blog.daum.net/xml/rss/widgetbank"; gadgets.io.makeRequest(url, response, params); } function response(obj) { try{ var domdata = obj.data; var title = getFeedTitle(domdata); var html = "<div><b>" + title + "</b></div>"; var itemList = domdata.getElementsByTagName("item"); entries = itemList.length; for (var i = 0; i < entries ; i++) { var nodeList = itemList.item(i).childNodes; for (var j = 0; j < nodeList.length ; j++) { var node = nodeList.item(j); if (node.nodeName == "title") { var name = node.firstChild.nodeValue; } if (node.nodeName == "link") { var link = node.firstChild.nodeValue; } if (node.nodeName == "pubDate") { var date = node.firstChild.nodeValue; } if (node.nodeName == "description") { var desc = node.firstChild.nodeValue; } } html += "<div>" + "<a target='_blank' href='" + link + "'>" + name + "</a>"; if (showdate==true) { html += "<br><i>" + date + "</i>"; } if (summary==true) { html += "<br><i>" + desc + "</i>"; } html += "</div>"; } document.getElementById('content_div').innerHTML = html; } catch(e) { alert("데이터를 가져오지 못했습니다."); } } function getFeedTitle(dat) { var titles = dat.getElementsByTagName("title"); var feed_title = titles.item(0).firstChild.nodeValue; return feed_title; } gadgets.util.registerOnLoadHandler(makeDOMRequest); </script> ]]> </Content> </Module>
  • 4. JSON 사용하기
    JSON으로 인코딩된 콘텐츠를 자바스크립트 객체로 가져오기 위해서 JSON 콘텐츠 타입을 사용할 수 있습니다.
    다음 예제는 위젯/가젯 리스트를 받아와서 링크를 걸어주는 프로그램입니다.
    <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="JSON Examlple" height="200"> <Require feature="opensocial-0.7"/> </ModulePrefs> <Content type="html"> <![CDATA[ <div id="content_div"></div> <script type="text/javascript"> function makeJSONRequest() { var params = {}; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON; params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 10 * 60; // This URL returns a JSON-encoded string that represents a JavaScript object var url = "http://widgetbank.daum.net/widget/list.json"; gadgets.io.makeRequest(url, response, params); }; function response(obj) { var jsondata = obj.data; var html = "<strong>위젯리스트</strong><br /><br />"; // JSON의 dataList를 가져옴 var widgets = jsondata['dataList']; // 내용들을 html에 셋팅 for (var i=0; i<widgets.length; i++) { html += '<a href="http://widgetbank.daum.net/widget/view/' + widgets[i].id + '" target="_blank">' + widgets[i].title + '</a><br />'; } document.getElementById('content_div').innerHTML = html; }; gadgets.util.registerOnLoadHandler(makeJSONRequest); </script> ]]> </Content> </Module>

Google 가젯 API