Python/2.7 for fun.

티스토리 서비스 종료 대비용 사진 가져오기.

qkqhxla1 2016. 12. 26. 13:38

티스토리 서비스가 종료한다는 소문이 돌고 있다. 기사를 찾아보니 다음측에서는 서비스를 계속한다고

밝힌것 같은데 백업 기능도 종료되고, 혹시 모르니까 미리미리 서비스 종료한다는 말이 나왔을때

다른 블로그로 이동할수 있게끔 대비해놓자. 


글같은경우 복붙으로 쉽게 살릴수 있지만 사진같은 경우는 복붙으로 붙여놓으면 다른 블로그에서 인식을 못한다. 다시 업로드해야되는데... 업로드를 위해서는 원본 사진이 필요하다. 대부분의 사람들이 원본 사진은 따로 저장을 안해두기에, 사진을 다시 썼던 글에서 하나하나 다운받아야 한다. 나처럼 글을 많이 쓰고 사진을 많이 넣은 사람들을 위해 모든 글의 사진을 다운받는 스크립트를 하나 만들었다.


1. 티스토리 글 읽기 구조를 주소/숫자 처럼 바꾼다. 나같은경우 첫글은 http://qkqhxla1.tistory.com/2 이다. 그다음 글은 http://qkqhxla1.tistory.com/3.. 이런식으로 뒤의 숫자만 바뀌게끔 설정을 변경한다. 관리자 모드에서 변경 가능하다.

2. 아래 스크립트를 실행하고 인자를 넣어준다.

참고로 세션 값 40글자같은 경우에는 editthiscookie같은 쿠키를 가져오는 툴을 설치하고, 로그인 후 editthiscookie를 실행시켜서 TSSESSION쿠키값을 가져온다.


참고로 에러처리는 귀찮아서 안해놨다. 중간에 입력 포맷이 틀리면 프로그램이 그냥 꺼진다.


실행파일.

사진.zip

실행파일이 의심스러운 사람들은 아래 소스코드로 실행시키길.

# -*- encoding: cp949 -*-
import urllib2
import re
import os, sys
import time
reload(sys)
sys.setdefaultencoding('cp949')

url = raw_input(u'티스토리 주소 입력 ex)http://qkqhxla1.tistory.com : ')
cookie = 'TSSESSION='+raw_input(u'세션 값 입력(영소문자+숫자로 40글자) : ')
photo_dir = u'사진모음'
start_page = int(raw_input(u'시작 페이지 : '))
end_page = int(raw_input(u'마지막 페이지 : '))

if not url.startswith('http://'): url = 'http://'+url
if url[-1]!='/': url += '/' 
def download_photo(url, filename):
    file_path = "%s%s" % (photo_dir+'\\', filename)
    downloaded_image = file(file_path, "wb")
      
    req = urllib2.Request(url)
    req.add_header('cookie',cookie)
    image_on_web = urllib2.urlopen(req)
    while True:
        buf = image_on_web.read()
        if len(buf) == 0:
            break
        downloaded_image.write(buf)
      
    downloaded_image.close()
    image_on_web.close()
    return file_path

if photo_dir not in os.listdir('.'):
    os.makedirs(photo_dir)

print u"\n사진은 현재 스크립트와 같은 폴더의 \n'사진모음'폴더 안에 들어갑니다.\n"
for i in xrange(start_page, end_page+1):
    print u'{}{}페이지의 사진을 가져오는 중...'.format(url,i)
    req = urllib2.Request(url+str(i))
    req.add_header('cookie',cookie)
    try:
        page = urllib2.urlopen(req).read().decode('utf-8')
        photo = [p for p in re.findall('<img src="(.*?)" style=',page) if p.find('.gif')==-1]
        if len(photo) > 0:
            os.makedirs(photo_dir+'\\'+str(i))
            cnt = 0
            for p in photo:
                download_photo(p, str(i)+'\\'+str(cnt)+'.png')
                cnt += 1
    except: pass
print u'사진을 전부 받아왔습니다. 자동으로 프로그램을 종료합니다.'
time.sleep(3)