본문 바로가기
IT/Nodejs

티스토리 OPEN API 로 글 작성하는 Nodejs 소스 공유

by DOSGamer 2023. 8. 31.
반응형

티스토리의 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&amp;height=60&amp;face=0_0_54_60,https://scrap.kakaocdn.net/dn/KxSG8/hySC2wA6w3/f36Ero6XtptrErhpMfbKf0/img.png?width=54&amp;height=60&amp;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&amp;height=60&amp;face=0_0_54_60,https://scrap.kakaocdn.net/dn/KxSG8/hySC2wA6w3/f36Ero6XtptrErhpMfbKf0/img.png?width=54&amp;height=60&amp;face=0_0_54_60');">&nbsp;</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&amp;hl=ko" data-og-image="https://scrap.kakaocdn.net/dn/ce32Ni/hyTpdk0Xuu/JPISdxCGJzJnZKKqLHpHLK/img.png?width=512&amp;height=512&amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/eXN5z/hyTpa9H1Jl/jkhHgLCCcrjFNtKXs0L3VK/img.png?width=600&amp;height=300&amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/oBrRx/hyTqwJ2TEF/b2TYlR16qoSLcVrRZFkI1k/img.png?width=526&amp;height=255&amp;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&amp;height=512&amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/eXN5z/hyTpa9H1Jl/jkhHgLCCcrjFNtKXs0L3VK/img.png?width=600&amp;height=300&amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/oBrRx/hyTqwJ2TEF/b2TYlR16qoSLcVrRZFkI1k/img.png?width=526&amp;height=255&amp;face=0_0_526_255');">&nbsp;</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>&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</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">&nbsp;</p>\n` +
    `<h3 data-ke-size="size23"><b>Web Play (설치 없이 게임 하기)</b></h3>\n` +
    `<p data-ke-size="size16">&nbsp;</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();
반응형