반응형
티스토리의 OPEN API 를 이용해서 글을 작성하려면 4단계를 거쳐야 합니다.
티스토리 글작성 제한은 일일 50개 입니다
그래서 프로그램 파일을 4개 만들고
npm script 에
"tistory1": "node src/80.tistoryGetAuth.cjs",
"tistory2": "node src/81.tistoryGetToken.cjs",
"tistoryInfo": "node src/82.tistoryInfo.cjs",
"tistoryWrite": "node src/83.tistoryWrite.js",
명령문을 4개 등록해놨지요
Step1. Auth 키를 받아오고
Step2. (Auth 키를 이용) Token 을 받아오고
Step3. (Token 을 이용) 블로그 정보을 받거나 카테고리 정보 받아오기
Step4. (Token 을 이용) 글 쓰기
아래 소스로 실행해서 5초당 1개씩 글을 작성했지요
지금은 잠시 막혀있지만 풀리면 다시 아래 소스로 밀어 넣을 껍니다.
아래 소스는
tistoryWrite.js 입니다
Auth Key 나 Token 정보는 dotenv 로 별도의 파일 (.env) 로 뺏습니다. (소스와 정보 분리)
실행하면 글 작성할 Game json 정보와 카테고리 정보를 이용해서 글내용과 카테고리 정보, 태그 정보를 5초 마다 비공개로 작성합니다
// Tistory Open API: 블로그 정보 조회
// GET https://www.tistory.com/apis/blog/info?
// access_token={access-token}
// &output={output-type}
import { createRequire } from "module"
const require = createRequire(import.meta.url)
const { readFileSync, existsSync, mkdirSync, writeFileSync } = require("fs")
// directory path
const SOURCE_FILE = "./json/mame.json"
const ROM_URI = `https://archive.org/download/MAME2003_Reference_Set_MAME0.78_ROMs_CHDs_Samples/roms/`;
const CATEGORIES_FILE = "./categories.json"
const data = readFileSync(SOURCE_FILE, "utf-8")
const categoriesFile = readFileSync(CATEGORIES_FILE, "utf-8")
const categories = JSON.parse(categoriesFile)
const axios = require("axios");
require('dotenv').config();
const ACCESS_TOKEN = process.env.ACCESS_TOKEN;
const dataObject = JSON.parse(data);
console.log(`JSON.length = ${dataObject.length}`);
const SAVE_HTML = `<figure id="og_1688017950683" style="color: #333333; text-align: start;" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="article" data-og-title="DOS Game Player Game Save/Load (도스게임 플레이어 게임 저장 로드 방법)" data-og-description="DOS Game State Save (도스게임 상태 저장) Step 1 : Save Game (게임 저장) * Games without a save function do not save the state (저장기능이 없는 게임은 상태 저장이 되지 않습니다) 예시는 삼국지 영걸전 An example is th" data-og-host="skyksit.tistory.com" data-og-source-url="https://skyksit.tistory.com/notice/764" data-og-url="https://skyksit.tistory.com/notice/764" data-og-image="https://scrap.kakaocdn.net/dn/L036q/hySCOrzhpE/rQyAL8EhkOQI3crGuKMnD0/img.png?width=54&height=60&face=0_0_54_60,https://scrap.kakaocdn.net/dn/KxSG8/hySC2wA6w3/f36Ero6XtptrErhpMfbKf0/img.png?width=54&height=60&face=0_0_54_60"><a style="color: #000000;" href="https://skyksit.tistory.com/notice/764" data-source-url="https://skyksit.tistory.com/notice/764">\n` +
`<div class="og-image" style="background-image: url('https://scrap.kakaocdn.net/dn/L036q/hySCOrzhpE/rQyAL8EhkOQI3crGuKMnD0/img.png?width=54&height=60&face=0_0_54_60,https://scrap.kakaocdn.net/dn/KxSG8/hySC2wA6w3/f36Ero6XtptrErhpMfbKf0/img.png?width=54&height=60&face=0_0_54_60');"> </div>\n` +
`<div class="og-text">\n` +
`<p class="og-title" style="color: #000000;" data-ke-size="size16">DOS Game Player Game Save/Load (도스게임 플레이어 게임 저장 로드 방법)</p>\n` +
`<p class="og-desc" style="color: #909090;" data-ke-size="size16">DOS Game State Save (도스게임 상태 저장) Step 1 : Save Game (게임 저장) * Games without a save function do not save the state (저장기능이 없는 게임은 상태 저장이 되지 않습니다) 예시는 삼국지 영걸전 An example is th</p>\n` +
`<p class="og-host" style="color: #909090;" data-ke-size="size16">skyksit.tistory.com</p>\n` +
`</div></a></figure>`;
const DOSGAME_HTML = `<p style="color: #333333; text-align: start;" data-ke-size="size16"><a href="https://play.google.com/store/apps/details?id=com.skyksit.dsam3">https://play.google.com/store/apps/details?id=com.skyksit.dsam3</a></p>\n` +
`<figure id="og_1690180570369" contenteditable="false" data-ke-type="opengraph" data-ke-align="alignCenter" data-og-type="website" data-og-title="도스게임 플레이어 (DosGame Player) - Google Play 앱" data-og-description="다양한 콘솔의 고전 게임을 모바일로 즐길 수 있는 플레이어 입니다" data-og-host="play.google.com" data-og-source-url="https://play.google.com/store/apps/details?id=com.skyksit.dsam3" data-og-url="https://play.google.com/store/apps/details?id=com.skyksit.dsam3&hl=ko" data-og-image="https://scrap.kakaocdn.net/dn/ce32Ni/hyTpdk0Xuu/JPISdxCGJzJnZKKqLHpHLK/img.png?width=512&height=512&face=0_0_512_512,https://scrap.kakaocdn.net/dn/eXN5z/hyTpa9H1Jl/jkhHgLCCcrjFNtKXs0L3VK/img.png?width=600&height=300&face=0_0_600_300,https://scrap.kakaocdn.net/dn/oBrRx/hyTqwJ2TEF/b2TYlR16qoSLcVrRZFkI1k/img.png?width=526&height=255&face=0_0_526_255"><a href="https://play.google.com/store/apps/details?id=com.skyksit.dsam3" target="_blank" rel="noopener" data-source-url="https://play.google.com/store/apps/details?id=com.skyksit.dsam3">\n` +
`<div class="og-image" style="background-image: url('https://scrap.kakaocdn.net/dn/ce32Ni/hyTpdk0Xuu/JPISdxCGJzJnZKKqLHpHLK/img.png?width=512&height=512&face=0_0_512_512,https://scrap.kakaocdn.net/dn/eXN5z/hyTpa9H1Jl/jkhHgLCCcrjFNtKXs0L3VK/img.png?width=600&height=300&face=0_0_600_300,https://scrap.kakaocdn.net/dn/oBrRx/hyTqwJ2TEF/b2TYlR16qoSLcVrRZFkI1k/img.png?width=526&height=255&face=0_0_526_255');"> </div>\n` +
`<div class="og-text">\n` +
`<p class="og-title" data-ke-size="size16">도스게임 플레이어 (DosGame Player) - Google Play 앱</p>\n` +
`<p class="og-desc" data-ke-size="size16">다양한 콘솔의 고전 게임을 모바일로 즐길 수 있는 플레이어 입니다</p>\n` +
`<p class="og-host" data-ke-size="size16">play.google.com</p>\n` +
`</div></a></figure>`;
//블로그 읽기 API
const getWrite = function(name, fileName, consoleName, category, year, manufacturer, matchingId) {
var title = `${name} / ${consoleName.toUpperCase()}`;
var tag = `${consoleName},${category},${year},${manufacturer.toLowerCase()}`;
var slogan = fileName;
var content = `<div> </div>\n` +
`<p data-ke-size="size16">Console : ${consoleName.toUpperCase()}</p>\n` +
`<p data-ke-size="size16">Category : ${category}</p>\n` +
`<p data-ke-size="size16">Year : ${year}</p>\n` +
`<p data-ke-size="size16">Developer(s) : ${manufacturer}</p>\n` +
`<p data-ke-size="size16"> </p>\n` +
`<h3 style="text-align: start;" data-ke-size="size23"><b>ROM URL</b></h3>\n` +
`<pre id="code_1688017988656" class="javascript" data-ke-language="javascript" data-ke-type="codeblock">\n` +
`<code>${ROM_URI}${fileName}.zip</code>\n` +
`</pre>\n` +
`<p data-ke-size="size16"> </p>\n` +
`<h2 style="text-align: start;" data-ke-size="size26">Save Game</h2>\n` +
`<p style="text-align: start;" data-ke-size="size16"><a href="https://skyksit.tistory.com/notice/764">https://skyksit.tistory.com/notice/764</a></p>\n` +
`${SAVE_HTML}\n` +
`${DOSGAME_HTML}\n` +
`<div style="text-align: start;">\n` +
`<p data-ke-size="size16"> </p>\n` +
`<p data-ke-size="size16">You can enjoy thousands of classic games</p>\n` +
`<p data-ke-size="size16">on your mobile phone in the DOS Game Player app</p>\n` +
`<p data-ke-size="size16">도스게임 플레이어 앱에서 휴대폰으로</p>\n` +
`<p data-ke-size="size16">수 천개의 고전 게임을 즐기실 수 있습니다</p>\n` +
`<p data-ke-size="size16"> </p>\n` +
`<h3 data-ke-size="size23"><b>Web Play (설치 없이 게임 하기)</b></h3>\n` +
`<p data-ke-size="size16"> </p>\n` +
`</div>`;
axios
.post("https://www.tistory.com/apis/post/write", {
access_token: ACCESS_TOKEN,
blogName: 'skyksit',
title: title,
category: matchingId,
content: content,
slogan: slogan,
tag: tag,
output: "json"
})
.then((res) => {
console.log(res.data);
});
}
const delay = ms => new Promise(resolve => setTimeout(resolve, ms * 1000));
const processElements = async () => {
for (const element of dataObject) {
const name = `${element.name}`;
const fileName = `${element.fileName}`;
const consoleName = `${element.console}`;
const category = `${element.category}`;
const year = `${element.year}`;
const manufacturer = `${element.manufacturer}`;
const label = `${element.console.toUpperCase()}/${element.category.charAt(0).toUpperCase()}${element.category.slice(1)}`;
const matchingId = categories.find(category => category.label === label)?.id;
getWrite(name, fileName, consoleName, category, year, manufacturer, matchingId);
await delay(5); // Add a delay between requests
}
};
processElements();
반응형
'IT > Nodejs' 카테고리의 다른 글
티스토리 이 블로그는 내부 정책으로 OPEN API 사용할 수 없습니다 (0) | 2023.08.31 |
---|---|
npm ERR! code SELF_SIGNED_CERT_IN_CHAIN 에러 해결 방법 (0) | 2023.03.15 |
사용자 친화적인 HTTP 설계 방법 (0) | 2022.09.22 |
Node.js 기본 정보 링크 (0) | 2022.09.20 |
node 환경변수 관리하는 방법 (0) | 2022.08.29 |
여러 버전의 node 설치관리(nvm) (0) | 2022.08.29 |
imgur access key 생성 방법 (0) | 2022.08.25 |
APP 리뷰 수집 서비스 (0) | 2022.08.23 |