[티스토리] Python 으로 sitemap.xml 만들기
티스토리 블로그는 RSS 는 제공하지만 사이트맵은 제공하지 않습니다.
그래서 sitemap 만들어주는 사이트에서 만들고 편집해서 등록하였었는데 엄청 귀찮습니다.
파이썬으로 티스토리 블로그의 사이트맵을 생성해주는 프로그래밍을 해서 공개합니다.
▶ Python Create Sitemap 소스코드
# coding=utf-8
import json
import math
import requests
import urlparse
import xml.etree.ElementTree as xml
from datetime import datetime
from pytz import timezone
headers = { ### 헤더 필요시 requests.post(URL, headers=headers)
'Referer':'https://www.tistory.com/auth/login',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
URL_0 = 'https://www.tistory.com/auth/login' ### 티스토리 로그인 URL
URL_1 = 'https://www.tistory.com/oauth/authorize' ### 인증 요청 및 Authentication code 발급 URL
URL_2 = 'https://www.tistory.com/apis/blog/info' ### 블로그 정보 URL
URL_3 = 'https://www.tistory.com/apis/post/list' ### 블로그 리스트 URL
URL_4 = 'https://www.tistory.com/apis/post/read' ### 블로그 상세보기 URL
loginParams = { ### 로그인 Parameters ( 블로그주소, 이메일계정, 비밀번호 )
'redirectUrl':'http://ivps.tistory.com',
'loginId':'이메일계정',
'password':'비밀번호'
}
tokenParams = { ### 토큰값을 받아오기 위한 Parameters ( App ID, CallBack, 'token' )
'client_id':'Open API App ID',
'redirect_uri':'Open API CallBack',
'response_type':'token'
}
def params_2(access_token): ### 블로그 정보 Parameters
return {'access_token':access_token, 'output':'json'}
def params_3(access_token, blogName, page, count): ### 블로그 리스트 Parameters
return {'access_token':access_token, 'output':'xml', 'targetUrl':blogName, 'page':page, 'count':count}
def params_4(access_token, blogName, post_id): ### 블로그 상세보기 Parameters
return {'access_token':access_token, 'output':'xml', 'targetUrl':blogName, 'postId':post_id}
blogName = 'ivps' ### 블로그명
page = 0 ### 1 페이지 부터 시작
count = 30 ### 최대값 30
post_id = 0 ### 아래에서 데이터를 추출
access_token = '' ### 아래에서 데이터를 추출
rs = requests.session()
try:
r0 = rs.post(URL_0, data=loginParams)
try:
r1 = rs.get(URL_1, params=tokenParams)
access_token = str( urlparse.parse_qs( r1.url.split('#')[1] )['access_token'][0] )
print('### access_token : ' + access_token)
try:
r2 = rs.get(URL_2, params=params_2(access_token))
print('### Open API, Blog Info Url : ' + str(r2.url))
#print(r2.text)
item = json.loads(r2.text)
item_size = len(item['tistory']['item']['blogs'])
### SITEMAP XML Create
sitemap = xml.Element('urlset')
sitemap.set('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9')
for i in range(item_size): ### 0 ~ 5, 없거나 최대 5개의 블로그
blog_name = item['tistory']['item']['blogs'][i]['name']
if(blog_name == blogName): # 일치하는 블로그만
print('### Find blog : ' + str(blog_name))
### ==> 블로그 주소 부분
x1_1st = xml.SubElement(sitemap, 'url')
x2_lo = xml.SubElement(x1_1st, 'loc').text = item['tistory']['item']['blogs'][i]['url']
x2_ch = xml.SubElement(x1_1st, 'changefreq').text = 'always'
x2_pr = xml.SubElement(x1_1st, 'priority').text = '1.0'
### <==
totalCnt = item['tistory']['item']['blogs'][i]['statistics']['post']
print('### post : ' + totalCnt) ### 포스팅 갯수
pages = int ( math.ceil ( float(totalCnt) / float(count) ) )
for j in range(pages): ### 총 페이지 만큼 반복
page = j+1
print('### Page : ' + str(page) + ' of ' + str(pages) + ' ###')
try:
r3 = rs.get(URL_3, params=params_3(access_token, blogName, page, count))
print('### Open API, Blog List Url : ' + str(r3.url))
xmlList = xml.fromstring(r3.text.encode(r3.encoding))
#xml.dump(xmlList)
for parent in xmlList.getiterator('post'): ### 목록에서 postId 추출
post_id = int( parent.find('id').text )
visibility = int( parent.find('visibility').text )
if(visibility in (2,3)): ### 2:??, 3:발행 게시글
x2_ur = xml.SubElement(sitemap, 'url')
x3_lo = xml.SubElement(x2_ur, 'loc').text = parent.find('postUrl').text
x3_ch = xml.SubElement(x2_ur, 'changefreq').text = 'daily'
x1_pr = xml.SubElement(x2_ur, 'priority').text = '0.9'
else: ### 0:비공개, 1:보호
print('### Pass PostId(' + str(post_id) + ') visibility : ' + str(visibility))
except:
print('@@@ Error : ' + str(r3.url))
else:
print('### Pass blog : ' + str(blog_name))
except:
print('@@@ Error : ' + str(r2.url))
except:
print('@@@ Error : ' + str(r1.url))
except:
print('@@@ Error : ' + str(r0.url))
#xml.dump(sitemap)
xml.ElementTree(sitemap).write('/var/www/html/sitemap.xml', encoding='utf-8', xml_declaration=True) # 적당한 위치에 저장
RSS 만들어주는 코드에서 응용해서 만들었습니다.
색깔이 들어간 부분만 수정하시면 됩니다.
티스토리에서 제공하는 Open API 를 이용한 코드입니다.
오픈API 등록은 https://ivps.tistory.com/645 여기를 참고하세요~
'티스토리' 카테고리의 다른 글
[티스토리] 2차 도메인 연결 해제 후 검색유입 감소 (2) | 2019.08.19 |
---|---|
[티스토리] Python Open API 이용 블로그 및 이미지 백업하기 (0) | 2018.12.26 |
[티스토리] Python Open API 활용 블로그 RSS 생성 소스 (1) | 2018.12.19 |
[티스토리] 오픈 API 로 블로그 목록 백업하기 (0) | 2018.12.14 |
티스토리 보안서버 SSL 적용 (1) | 2018.08.24 |