컴퓨터
루비에서 티스토리로의 글 포스팅
실마리
2008. 2. 20. 17:02
현재 사용중인 블로그의 자료를 티스토리로 옮겨보려고 고민중입니다. 처음에는 XML 파일을 작성해 볼까 생각했지만 서핑해 보니까 metaWeblogAPI를 사용해서 제목, 글 등을 함수 인자로 주어 티스토리에 블로그를 옮겼다는 포스팅을 찾을 수 있었습니다.
구현은 간단합니다.
require 'xmlrpc/client'
server = XMLRPC::Client.new2('http://사용자아이디.tistory.com/api')
post = { "title"=>제목문자열, "categories"=>[카테고리 배열], "description"=>블로그내용,
"mt_keywords"=>쉼표로 구분한 태그 문자열 }
result = server.call('metaWeblog.newPost', 블로그id, 아이디, 패스워드, post, true)
마지막 2행을 적절히 수정해가면서 반복적으로 호출하면 블로그가 옮겨지는 것이죠. 생성 날짜에 대한 처리가 빠져있습니다만 일단 호출하면 제대로 포스팅이 됩니다.
그런데 문제는 같이 포함된 파일들입니다. 이론적으로는 블로그 내용을 스캔해서 img 태그가 블로그 내부의 파일을 링크하면 이 이미지를 티스토리에 옮겨주면 됩니다. 이때 사용할 수 있는 호출 함수가 metaWeblog.newMediaObject 함수입니다.
호출은 다음과 같은 방법으로 할 수 있습니다.
require base64
bincontent = open(파일이름) { |f| f.read }
enccontent = Base64.encode64.gsub(/\n/, '')
attach = { "name"=>파일이름, "type"=>MIME 타입('image/jpeg'), "bits"=>enccontent }
result = server.call('metaWeblog.newMediaObject', 블로그id, 아이디, 패스워드, attach)
위와 같이 호출하면 서버에서 만들어진 파일에 대한 링크가 반환됩니다. 원래 블로그의 링크를 이것으로 바꾸어주면 되겠죠.
현재까지 알아낸 바로는 티스토리에서는 base64인코딩의 디코딩을 시행하지 않고 그대로 저장하는것 같습니다. 따라서 이미지로 인식되지 않고 블로그에서 이를 볼수가 없습니다. 티스토리측에 버그 리포트를 했는데 어떻게 처리될지 모르겠네요.
* UPDATE
티스토리및 태터툴즈와 이야기를 해 본 결과 제가 한 방식이 맞기는 맞습니다만, 애초 스펙에 문제가 좀 있는 것 같습니다. 하여튼 다음과 같은 방식으로 ruby에서 media를 포스팅하면 되겠습니다.
require base64
bincontent = open(파일이름) { |f| f.read }
attach = { "name"=>파일이름, "type"=>MIME 타입('image/jpeg'), "bits"=>XMLRPC::Base64.new(bincontent) }
result = server.call('metaWeblog.newMediaObject', 블로그id, 아이디, 패스워드, attach)
구현은 간단합니다.
require 'xmlrpc/client'
server = XMLRPC::Client.new2('http://사용자아이디.tistory.com/api')
post = { "title"=>제목문자열, "categories"=>[카테고리 배열], "description"=>블로그내용,
"mt_keywords"=>쉼표로 구분한 태그 문자열 }
result = server.call('metaWeblog.newPost', 블로그id, 아이디, 패스워드, post, true)
마지막 2행을 적절히 수정해가면서 반복적으로 호출하면 블로그가 옮겨지는 것이죠. 생성 날짜에 대한 처리가 빠져있습니다만 일단 호출하면 제대로 포스팅이 됩니다.
그런데 문제는 같이 포함된 파일들입니다. 이론적으로는 블로그 내용을 스캔해서 img 태그가 블로그 내부의 파일을 링크하면 이 이미지를 티스토리에 옮겨주면 됩니다. 이때 사용할 수 있는 호출 함수가 metaWeblog.newMediaObject 함수입니다.
호출은 다음과 같은 방법으로 할 수 있습니다.
require base64
bincontent = open(파일이름) { |f| f.read }
enccontent = Base64.encode64.gsub(/\n/, '')
attach = { "name"=>파일이름, "type"=>MIME 타입('image/jpeg'), "bits"=>enccontent }
result = server.call('metaWeblog.newMediaObject', 블로그id, 아이디, 패스워드, attach)
위와 같이 호출하면 서버에서 만들어진 파일에 대한 링크가 반환됩니다. 원래 블로그의 링크를 이것으로 바꾸어주면 되겠죠.
현재까지 알아낸 바로는 티스토리에서는 base64인코딩의 디코딩을 시행하지 않고 그대로 저장하는것 같습니다. 따라서 이미지로 인식되지 않고 블로그에서 이를 볼수가 없습니다. 티스토리측에 버그 리포트를 했는데 어떻게 처리될지 모르겠네요.
* UPDATE
티스토리및 태터툴즈와 이야기를 해 본 결과 제가 한 방식이 맞기는 맞습니다만, 애초 스펙에 문제가 좀 있는 것 같습니다. 하여튼 다음과 같은 방식으로 ruby에서 media를 포스팅하면 되겠습니다.
require base64
bincontent = open(파일이름) { |f| f.read }
attach = { "name"=>파일이름, "type"=>MIME 타입('image/jpeg'), "bits"=>XMLRPC::Base64.new(bincontent) }
result = server.call('metaWeblog.newMediaObject', 블로그id, 아이디, 패스워드, attach)