- SiteLink #1 : http://nbloger.com/view_post/vw.asp?bidx=205

필요하신분들이 많으실듯해서 올려드립니다.

사실 크게 어려운 부분은 아닙니다.

아래글은 트랙백의 기본개념보다는 windows + asp 환경에서의 기술적 구현을 위해 간단하게 작성된 소스입니다.
따라서 트랙백의 기본개념을 이해하신후 소스를 보시는것이 도움이 되실것입니다.
또한 보다 확장적인 서비스를 위해서는 아래 소스외에 더 많은 부분을 추가하셔야 합니다.



1. 트랙백 핑 받기

[CODE] <% '변수 처리 bidx = Request("bidx") strTitle = Request("title") strExcerpt = Request("excerpt") strURL = Request("url") '콘텐츠 타입 Response.ContentType = "text/xml" '변수 확인 If strURL="" or strTitle = "" or bidx = "" Then Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>" Response.Write "<response>" Response.Write "<error>1</error>" Response.Write "<message>Not Enough Arguments.</message>" Response.Write "</response>" Response.End End If '내 블로그에 글이 있는지 확인 If 해당글의수 = 0 Then Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>" Response.Write "<response>" Response.Write "<error>1</error>" Response.Write "<message>Not Exist Post.</message>" Response.Write "</response>" Response.End End If set rs = Server.CreateObject("ADODB.Recordset") with rs .Open trackback_table,접근문자열,adOpenStatic,adLockPessimistic,adCmdTable .addnew .fields ("글번호 필드명") = opt_insert_text (bidx) .fields ("주소 필드명") = opt_insert_text (strURL) .fields ("제목 필드명") = opt_insert_text (strTitle) .fields ("내용 필드명") = opt_insert_text (strExcerpt) .fields ("날짜") = now .update .close end with set rs = nothing '정상적으로 완료되었으면 성공했다는 대답을 보내자. Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>" Response.Write "<response>" Response.Write "<error>0</error>" Response.Write "<message>TrackBack Success.</message>" Response.Write "</response>" %> [/CODE]



첫번째로 트랙백은 규정적으로 4개의 변수값을 전송합니다.
글제목(title),글주소(url),글내용(exerpt),블로그명(blog_name) 입니다.
여기서 필수요소는 url 입니다.
위 소스에서는 블로그명을 포함시키지 않았습니다.
그리고 글번호는 해당 글의 존재유무를 확인하기 위해 트랙백 주소에서 GET 형태로 받아옵니다.

두번째로 인코딩되는 xml 중 부분이 가장 중요합니다.
즉, error 값으로 트랙백 핑을 보낸쪽에다 대답을 하는 것입니다.
0이면 성공이?1이면 실패입니다.
그리고 부분은 말그대로 추가설명입니다.
그리고 트랙백 핑은 POST 형태로 값을 받습니다.
받아오는 변수들을 Request.Form 형태로 정의해주는것이 더 좋을듯 하네요.

세번째로 위 소스에서는 간단한 xml 이라 굳이 xmlhttp 같은 xml 관련 서버 컴포넌트를 사용하지 않았습니다.



2. 트랙백 핑 보내기


[CODE] <% b_tb = "핑을 보낼 블로그 게시물의 트랙백 주소" if b_tb <> "" then '만약 트랙백 주소가 입력되었다면 .. ' 여기서 부터 트랙백 처리 ' 핑을 보낼 준비하자 x_Posturl = Server.URLEncode(나의 글의 고유주소) x_BlogName = Server.URLEncode(나의 블로그명) x_Title = Server.URLEncode(나의 글의 제목) x_Excerpt = Server.URLEncode(나의 글의 내용) Str_tb="title="&amp;amp;amp;amp;amp;amp;x_Title&amp;amp;amp;amp;amp;amp;" &amp;amp;amp;amp;amp;amp;url="&amp;amp;amp;amp;amp;amp;x_Posturl &amp;amp;amp;amp;amp;amp;"&amp;amp;amp;amp;amp;amp;excerpt=" &amp;amp;amp;amp;amp;amp;x_Excerpt&amp;amp;amp;amp;amp;amp;" &amp;amp;amp;amp;amp;amp;blog_name="&amp;amp;amp;amp;amp;amp ;x_BlogName ' 트랙백 핑을 보내자 set xml = server.CreateObject("msxml2.xmlhttp") xml.open "POST", "" &amp;amp;amp;amp;amp;amp; b_tb &amp;amp;amp;amp;amp;amp; "", false ' 몇가지 헤더처리 xml.setRequestHeader "Accept-Language","ko" xml.setRequestHeader "Accept-Encoding","gzip, deflate" xml.setRequestHeader "Content-Type","application/x-www-form-urlencoded" xml.setRequestHeader "Connection","Keep-Alive" xml.setRequestHeader "Cache-Control","no-cache" xml.send (Str_tb) ' 트랙백 핑 성공여부 If InStr(1, xml.responseText, "<error>0</error>") Then ' 성공일경우 처리 Else ' 실패일경우 처리 End If Set xml = Nothing end if %> [/CODE]



일반적으로 글의 저장 또는 편집시 사용하실수 있습니다.
그리고 Str_tb 변수 정의 하면서 POST 로 넘기는 변수명은 변경하시면 안됩니다.
또한 위 소스에서는 xmlhttp 컴포넌트를 이용하여 POST 형태로 핑을 전송합니다.
트랙백 핑의 성공여부는 받아온 xml 을 디코딩 하셔도 되지만 그냥 부분만 체크하기 위해 instr 로 처리하였습니다.
추가적으로 부분도 체크하여 성공 또는 실패시의 메시지를 받아오실수도 있습니다.
간혹 핑 전송시 한글이 깨어진다는 질문이 있는데, 이 경우 UrlEncoding 을 시키지 않으셨을때가 가장많습니다.
그외에는 위와 같은 방법으로 무난하게 성공하실것 입니다.
- SiteLink #1 : http://nbloger.com/view_post/vw.asp?bidx=232

꼭 블로그가 아니더라도 XML RSS 는 이제 어느정도 대세가 되어가고 있는 듯합니다. 이제는 언론사나 커뮤니티 등에서도 RSS 가 나옵니다.. 그리고 #Reader나 Xpyder,FreeDemon 등의 RSS 구독기 또한 점차 넓게 사용되고 있습니다. 여기서는 이러한 XML RSS 를 구현하는 방법을 ASP 기반에서 XML 컴포넌트를 이용하여 구현하고자 합니다.



사실 RSS 를 구현할때 사실 단순히 텍스트 파일로 뿌려주고 ContentType 만 xml 로 선언해줘도 가능합니다. 그러나 조금은 다르게 해보고 싶다는 저의 호기심도 있고, 확장성과 향후 유지보수에 조금이라도 더 손쉽게 하기위해서 윈도우즈 2000 에 기본제공되어 있는 XML 관련 컴포넌트를 이용하여 구현해보았습니다. 물론 아래 소스는 지금 제 블로그 RSS 의 원형이 되고 있습니다.



한가지 주의 하실점은 XML 선언전에 어떠한 개행(
) 이나 문자가 들어가서는 안됩니다. PHP 에서의 쿠키과 마찬가지 입니다.

[CODE] <?xml version="1.0" encoding="EUC-KR" ?> <% Response.ContentType = "text/xml" Set xmlPars = Server.CreateObject("Msxml2.DOMDocument") ' 여기서 부터 rss 정보를 담는다. Set rss = xmlPars.CreateElement("rss") rss.setAttribute "version", "2.0" rss.setAttribute "xmlns:dc", "http://purl.org/dc/elements/1.1/" rss.setAttribute "xmlns:sy", "http://purl.org/rss/1.0/modules/syndication/" rss.setAttribute "xmlns:admin", "http://webns.net/mvcb/" rss.setAttribute "xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlPars.AppendChild(rss) '<channel> 시작 Set Channel = xmlPars.CreateElement("channel") rss.AppendChild(Channel) '<title>정보 Set title = xmlPars.CreateElement("title") Channel.AppendChild(title) Channel.childnodes(0).text = "블로그 제목" '<link>정보 Set channel_link = xmlPars.CreateElement("link") Channel.AppendChild(channel_link) Channel.childnodes(1).text = "블로그 주소" '<description>정보 Set description = xmlPars.CreateElement("description") Channel.AppendChild(description) Channel.childnodes(2).text = "블로그 설명" '<dc:language>정보 Set language = xmlPars.CreateElement("dc:language") Channel.AppendChild(language) Channel.childnodes(3).text = "ko" '<image>정보 Set image = xmlPars.CreateElement("image") Channel.AppendChild(image) '이미지 정보에 들어갈 것들 set i_title = xmlPars.CreateElement("title") set i_url = xmlPars.CreateElement("url") set i_width = xmlPars.CreateElement("width") set i_height = xmlPars.CreateElement("height") image.AppendChild(i_title) image.AppendChild(i_url) image.AppendChild(i_width) image.AppendChild(i_height) image.childnodes(0).text = "이미지 제목" image.childnodes(1).text = "이미지 경로" image.childnodes(2).text = "이미지 가로 사이즈" image.childnodes(3).text = "이미지 세로 사이즈" ' 여기서 부터는 포스트에 대해서 출력 ' 우선 데이터를 읽어오자 SQL = "해당되는 포스트에 대한 쿼리문" set rs = Server.CreateObject("ADODB.Recordset") rs.Open SQL,접근문자열,adOpenForwardOnly,adLockPessimistic,adCmdText ' 여기서 부터 루프를 돌리자. Do until rs.EOF '<item> 이라는 노드를 추가 Set item = xmlPars.CreateElement("item") Channel.AppendChild(item) ' 여기서부터 해당 포스트의 세부 정보를 출력 set title = xmlPars.CreateElement("title") ' set link = xmlPars.CreateElement("link") set description = xmlPars.CreateElement("description") set dcdate = xmlPars.CreateElement("dc:date") set dcsubject = xmlPars.CreateElement("dc:subject") item.AppendChild(title) item.AppendChild(link) item.AppendChild(description) item.AppendChild(dcdate) item.AppendChild(dcsubject) item.childnodes(0).text = rs("제목필드") item.childnodes(1).text = rs("포스트 고유 url 필드") item.childnodes(2).text = rs("내용 필드") item.childnodes(3).text = rs("날짜") item.childnodes(4).text = rs("포스트의 분류") rs.movenext loop ' 마지막으로 최종적으로 뿌려주자. Response.Write xmlPars.xml '마무리 ^^; rs.close set rs = nothing Set xmlPars = nothing %> [/CODE]
아는데로 참고만 하세요.
모르면 걍 스킵하시구요.. ㅋㅋㅋ
프로그래밍 하면서 INI파일 이용하는데 편리하긴 하더군요.
초보들만 보시면 될듯..
영어 잘 읽어보면 언제 누가 맹글었다고 다있네요. ㅎㅎㅎ

[CODE] =============================================================================== Attribute VB_Name = "INIFILES" '**************************************************** '* INIFILES.BAS Version 2.0 Date: 02/01/95 * '* VB Tips & Tricks * '* 8430-D Summerdale Road San Diego CA 92126-5415 * '* Compuserve: 74227,1557 * '* America On-LineS: DPMCS * '* InterNet: DPMCS@AOL.COM * '**************************************************** Option Explicit 'Global PlayPath As String #If Win16 Then Declare Function WritePrivateProfileString Lib "KERNEL" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal FileName$) As Integer Declare Function GetPrivateProfileString Lib "KERNEL" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal ReturnString$, ByVal NumBytes As Integer, ByVal FileName$) As Integer #Else Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal FileName$) As Long Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal AppName$, ByVal KeyName$, ByVal keydefault$, ByVal ReturnString$, ByVal NumBytes As Long, ByVal FileName$) As Long #End If Function GetINI(Division As String, KeyName As String, INIPath As String) As String Dim ii As Integer Dim kk As Integer Dim sRet As String If INIPath = "" Then MsgBox "환경 설정 화일이 업습니다." GetINI = "" End If sRet = String(255, Chr(0)) ii = GetPrivateProfileString(Division, KeyName, "", sRet, Len(sRet), INIPath) kk = InStr(sRet, Right(sRet, 1)) GetINI = Left(sRet, kk% - 1) End Function '******************************************************* '* Procedure Name: sReadINI * '*Returns a string from an INI file. To use, call the * '*functions and pass it the AppName, KeyName and INI * '*File Name, [sReg=sReadINI(App1,Key1,INIFile)]. If you * '*need the returned value to be a integer then use the * '*val command. * '******************************************************* Function ReadINI(KeyName As String) As String Dim ii As Integer Dim kk As Integer Dim sRet As String Dim FileName As String Dim AppName As String AppName = "PlayPath" FileName = "C:mt.ini" sRet = String(255, Chr(0)) ii = GetPrivateProfileString(AppName, KeyName, "", sRet, Len(sRet), FileName) kk = InStr(sRet, Right(sRet, 1)) ReadINI = Mid(sRet, 1, kk% - 1) End Function '******************************************************* '* Procedure Name: WriteINI * '*-----------------------------------------------------* '* Created: 2/10/94 By: David McCarter * '* Modified: By: * '*=====================================================* '*Writes a string to an INI file. To use, call the * '*function and pass it the sAppname, sKeyName, the New * '*String and the INI File Name, * '*[R=WriteINI(App1,Key1,sReg,INIFile)]. Returns a 1 if * '*there were no errors and a 0 if there were errors. * '******************************************************* Sub WriteINI(Division As String, KeyName As String, NewString As String, INIPath As String) Dim R As Integer If INIPath = "" Then INIPath = App.Path & "line.ini" End If R = WritePrivateProfileString(Division, KeyName, NewString, INIPath) End Sub [/CODE]

+ Recent posts