Thanks to visit codestin.com
Credit goes to github.com

Skip to content

gurumnyang/dcinside.js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

@gurumnyang/dcinside.js

NPM Version Downloads

๋””์‹œ์ธ์‚ฌ์ด๋“œ ๊ฐค๋Ÿฌ๋ฆฌ ํฌ๋กค๋ง์„ ์œ„ํ•œ Node.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์„ค์น˜ ๋ฐฉ๋ฒ•

# NPM
npm install @gurumnyang/dcinside.js

# Yarn
yarn add @gurumnyang/dcinside.js

๊ธฐ๋Šฅ

  • ๊ฐค๋Ÿฌ๋ฆฌ ๊ฒŒ์‹œํŒ ์กฐํšŒ, ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ ์กฐํšŒ
  • ๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€ ์กฐํšŒ
  • ๊ฒŒ์‹œ๊ธ€ ๋‚ด์˜ ์ด๋ฏธ์ง€ URL ์ถ”์ถœ
  • ํ†ตํ•ฉ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ˆ˜์ง‘
  • ๋กœ๊ทธ์ธ ๋ฐ ์ธ์ฆ ์ฟ ํ‚ค ์ˆ˜์ง‘
  • ๊ฒŒ์‹œ๊ธ€ ๊ฒŒ์‹œ, ์‚ญ์ œ
  • ๋Œ“๊ธ€ ๊ฒŒ์‹œ, ์‚ญ์ œ
  • ์‹ค์‹œ๊ฐ„ ๋ฒ ์ŠคํŠธ ์ถ”์ฒœ(์‹ค๋ฒ ์ถ”)

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๋น ๋ฅธ ์‹œ์ž‘

const dc = require('@gurumnyang/dcinside.js');

(async () => {
  // 1) ํŽ˜์ด์ง€๋ณ„ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก (๋ชจ๋ฐ”์ผ ํŒŒ์„œ ๊ธฐ๋ณธ)
  const list = await dc.getPostList({ page: 1, galleryId: 'chatgpt', boardType: 'all' });

  // 2) ๋‹จ์ผ ๊ฒŒ์‹œ๊ธ€ ๋ณธ๋ฌธ/๋Œ“๊ธ€
  const post = await dc.getPost({ galleryId: 'chatgpt', postNo: list[0].id, extractImages: true });

  // 3) ํ†ตํ•ฉ๊ฒ€์ƒ‰
  const search = await dc.search('์ฑ—์ง€ํ”ผํ‹ฐ');

  console.log(list.length, post?.title, search.posts.length);
})();

๋ ˆ๊ฑฐ์‹œ(PC) ๋ชฉ๋ก ํŒŒ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const listPc = await dcCrawler.getPostListLegacy({ page: 1, galleryId: 'programming', boardType: 'all' });

ํƒ€์ž… ์ƒ์„ธ

// SearchGalleryItem ์˜ˆ์‹œ
{
  name: '์ฑ—์ง€ํ”ผํ‹ฐ(ChatGPT)โ“œ',
  id: 'chatgpt',
  type: 'mgallery',       // ๋‚ด๋ถ€ ํ˜ธํ™˜์šฉ: 'board'|'mgallery'|'mini'|'person'
  galleryType: 'mgallery',// ๊ตฌ๋ถ„์šฉ: 'main'|'mgallery'|'mini'|'person'
  link: 'https://gall.dcinside.com/mgallery/board/lists/?id=chatgpt',
  rank: 153,
  new_post: 12,
  total_post: 345
}

// SearchPost ์˜ˆ์‹œ
{
  title: '์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๊ธ€',
  content: '์š”์•ฝ ๋‚ด์šฉ',
  galleryName: '์ฑ—์ง€ํ”ผํ‹ฐ(ChatGPT)โ“œ',
  galleryId: 'chatgpt',
  galleryType: 'mgallery', // 'main'|'mgallery'|'mini'|'person'
  date: '2025.08.11 10:00:00',
  link: 'https://gall.dcinside.com/mgallery/board/view/?id=chatgpt&no=1111'
}

๋ชจ๋ฐ”์ผ ๋กœ๊ทธ์ธ & ๊ธ€์“ฐ๊ธฐ ์˜ˆ์‹œ

๋ชจ๋ฐ”์ผ ๋กœ๊ทธ์ธ ์„ธ์…˜์„ ํ™•๋ณดํ•˜๋ฉด ์ฟ ํ‚ค๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•ด ๊ธ€์“ฐ๊ธฐ/์‚ญ์ œ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(PC ๋ฏธ์ง€์›)

์บก์ฐจ์— ๊ฑธ๋ฆด ๊ฒฝ์šฐ success:false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค

const dc = require('@gurumnyang/dcinside.js');

(async () => {
  const login = await dc.mobileLogin({ code: process.env.DC_ID, password: process.env.DC_PW });
  if (!login.success) {
    throw new Error(`๋กœ๊ทธ์ธ ์‹คํŒจ: ${login.reason}`);
  }

  const write = await dc.createMobilePost({
    galleryId: 'dragonlake',
    subject: 'ํ…Œ์ŠคํŠธ ์ œ๋ชฉ',
    content: 'ํ…Œ์ŠคํŠธ ๋ณธ๋ฌธ์ž…๋‹ˆ๋‹ค.',
    jar: login.jar, // ๋กœ๊ทธ์ธ ์‹œ ์–ป์€ ์ฟ ํ‚ค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
  });

  if (!write.success) {
    console.log(write.message || '๊ธ€์“ฐ๊ธฐ ์‹คํŒจ');
    return;
  }

  console.log('๋“ฑ๋ก๋œ ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ:', write.postId, '์ด๋™ URL:', write.redirectUrl);

  const remove = await dc.deleteMobilePost({
    galleryId: 'dragonlake',
    postId: write.postId,
    jar: login.jar,
  });

  console.log('์‚ญ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€:', remove.success, '๋ฉ”์‹œ์ง€:', remove.message);
})();

๋Œ“๊ธ€์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด await dc.deleteComment({ galleryId: 'dragonlake', postId: ๊ธ€๋ฒˆํ˜ธ, commentId: ๋Œ“๊ธ€๋ฒˆํ˜ธ, jar: login.jar }); ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด await dc.createComment({ galleryId: 'dragonlake', postId: ๊ธ€๋ฒˆํ˜ธ, content: '๋Œ“๊ธ€ ๋‚ด์šฉ', jar: login.jar }); ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ŠคํŠธ๋Š” nickname, password, captchaCode๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜์„ธ์š”.

์‹ค์‹œ๊ฐ„ ๋ฒ ์ŠคํŠธ ์ถ”์ฒœ(์‹ค๋ฒ ์ถ”)

์‹ค์‹œ๊ฐ„ ๋ฒ ์ŠคํŠธ ์ถ”์ฒœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

const dc = require('@gurumnyang/dcinside.js');

(async () => {
  // (์„ ํƒ) ๋กœ๊ทธ์ธ ์„ธ์…˜์ด ์žˆ๋‹ค๋ฉด jar์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // const login = await dc.mobileLogin({ code: process.env.DC_ID, password: process.env.DC_PW });
  // const jar = login.success ? login.jar : undefined;

  // (์„ ํƒ) ํ”„๋ก์‹œ ์‚ฌ์šฉ ์˜ˆ์‹œ (Axios ProxyConfig ํ˜•์‹)
  const proxy = process.env.HTTP_PROXY
    ? (() => {
        const u = new URL(process.env.HTTP_PROXY);
        return {
          protocol: u.protocol.replace(':', ''),
          host: u.hostname,
          port: u.port ? Number(u.port) : undefined,
          auth: u.username ? { username: u.username, password: u.password } : undefined,
        };
      })()
    : undefined;

  const result = await dc.recommendBest({
    galleryId: 'chatgpt',
    postId: 68960,
    // jar,
    userAgent: process.env.DC_UA,
    proxy,
  });

  console.log('์„ฑ๊ณต ์—ฌ๋ถ€:', result.success);
  console.log('๋ฉ”์‹œ์ง€:', result.message);
  console.log('HTTP Status:', result.responseStatus);
})();

ํ„ฐ๋ฏธ๋„ ๋ธŒ๋ผ์šฐ์ €(TUI)

๊ฐ„๋‹จํ•œ ํ„ฐ๋ฏธ๋„ UI๋กœ ๊ฒŒ์‹œํŒ ์—ด๋žŒ, ๊ธ€ ์กฐํšŒ, ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm run tui

๋ฉ”๋‰ด์—์„œ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ์—ด๋žŒ(ํŽ˜์ด์ง€ ์ด๋™), ํ†ตํ•ฉ๊ฒ€์ƒ‰(์ •ํ™•๋„/์ตœ์‹ ), ๊ธ€ ๋ฐ”๋กœ ์กฐํšŒ(๊ฐคID/๋ฒˆํ˜ธ)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

User-Agent ๊ด€๋ จ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜

const { getRandomUserAgent } = require('@gurumnyang/dcinside.js');

console.log(getRandomUserAgent()); // ๋ฌด์ž‘์œ„ User-Agent ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜

์‘๋‹ต ๋ฐ์ดํ„ฐ ํ˜•์‹

๊ฒŒ์‹œ๊ธ€ ๊ฐ์ฒด

{
  postNo: "1234567",
  title: "๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ",
  author: "์ž‘์„ฑ์ž ๋‹‰๋„ค์ž„",
  date: "2025.01.01 12:34:56", 
  content: "๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ...",
  viewCount: "123",
  recommendCount: "10",
  dislikeCount: "2",
  comments: {
    totalCount: 5,
    comments: [
      {
        parent: "0", 
        id: "comment_id",
        author: {
          userId: "user_id",
          nickname: "๋Œ“๊ธ€ ์ž‘์„ฑ์ž",
          ip: "1.2.3.*" // IP ํ‘œ์‹œ๊ฐ€ ๋œ ๊ฒฝ์šฐ์—๋งŒ
        },
        regDate: "01.01 12:34:56",
        memo: "๋Œ“๊ธ€ ๋‚ด์šฉ"
      }
      // ...
    ]
  },
  // ์ด๋ฏธ์ง€ URL ์ถ”์ถœ ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํฌํ•จ๋จ
  images: [
    "https://example.com/image1.jpg",
    "https://example.com/image2.jpg"
  ]
}

๊ฒŒ์‹œ๊ธ€ ์ •๋ณด ๊ฐ์ฒด (PostInfo)

{
  id: "1234567",               // ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ
  type: "picture",              // ๊ฒŒ์‹œ๊ธ€ ์œ ํ˜• ('notice', 'picture', 'text', 'recommended', 'unknown')
  subject: "์ผ๋ฐ˜",              // ๋ง๋จธ๋ฆฌ
  title: "๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค",    // ๊ฒŒ์‹œ๊ธ€ ์ œ๋ชฉ
  link: "https://gall.dcinside.com/mgallery/board/view/?id=programming&no=1234567", // ๊ฒŒ์‹œ๊ธ€ ๋งํฌ
  author: {
    nickname: "์ž‘์„ฑ์ž๋‹‰๋„ค์ž„",    // ์ž‘์„ฑ์ž ๋‹‰๋„ค์ž„
    userId: "writer_id",        // ์ž‘์„ฑ์ž ID (์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ)
    ip: "1.2.3.*"              // ์ž‘์„ฑ์ž IP (ํ‘œ์‹œ๋œ ๊ฒฝ์šฐ๋งŒ)
  },
  date: "2025.04.21 12:34:56",  // ์ž‘์„ฑ ๋‚ ์งœ
  count: 123,                   // ์กฐํšŒ์ˆ˜
  recommend: 10,                // ์ถ”์ฒœ์ˆ˜
  replyCount: 5                 // ๋Œ“๊ธ€ ์ˆ˜
}

ํ†ตํ•ฉ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ์ฒด (SearchResult)

{
  query: '์ง€ํ”ผํ‹ฐ',
  galleries: [
    {
      name: '์ฑ—์ง€ํ”ผํ‹ฐ(ChatGPT)โ“œ',
      id: 'chatgpt',
      type: 'mgallery',
      link: 'https://gall.dcinside.com/mgallery/board/lists/?id=chatgpt',
      rank: 153,
      new_post: 615,
      total_post: 52041
    }
  ],
  posts: [
    {
      title: '์ง€ํ”ผํ‹ฐ ์ˆ˜์ค€์ด ์–ด๋งˆ์–ด๋งˆํ•˜๊ธด ํ•จ 3(feat.๊ฐค๋Ÿผ)',
      content: '๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฌผ ๋‚˜์˜ค๊ธธ ๊ธฐ๋Œ€ํ•˜๋ฉด์„œ ๊ฐค๋Ÿผ ๊ทธ๋ฆผ ๋นŒ๋ ค์„œ ๊ฐ™์€ ์š”์ฒญ ํ•ด๋ดค์Œ ????? ์™œ ๋‚˜๋งŒ??? - dc official App',
      galleryName: '์ฑ—์ง€ํ”ผํ‹ฐ(ChatGPT) ๊ฐค๋Ÿฌ๋ฆฌ',
      galleryId: 'chatgpt',
      date: '2025.08.12 21:57',
      link: 'https://gall.dcinside.com/mgallery/board/view/?id=chatgpt&no=52384'
    }
  ]
}

์—๋Ÿฌ ์ฒ˜๋ฆฌ์™€ ์žฌ์‹œ๋„

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์š”์ฒญ ์‹คํŒจ ์‹œ ์ž๋™์œผ๋กœ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜: 3ํšŒ
  • ์žฌ์‹œ๋„ ๊ฐ„ ์ง€์—ฐ ์‹œ๊ฐ„: 1000ms (์ง€์ˆ˜ ๋ฐฑ์˜คํ”„ ์ ์šฉ)
// ์„ค์ • ์˜ต์…˜
const options = {
  retryAttempts: 5,    // ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ ๋ณ€๊ฒฝ 
  retryDelay: 2000     // ์žฌ์‹œ๋„ ๊ฐ„ ์ง€์—ฐ ์‹œ๊ฐ„ ๋ณ€๊ฒฝ
  // ๋‹ค๋ฅธ ์˜ต์…˜...
};

๊ฐœ๋ณ„ ํ˜ธ์ถœ ๋‹จ์œ„๋กœ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ retryCount๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

await dc.getPost({ galleryId: 'chatgpt', postNo: 12345, retryCount: 5 });
await dc.getPosts({ galleryId: 'chatgpt', postNumbers: [111, 222], retryCount: 5 });

API ๋ ˆํผ๋Ÿฐ์Šค

ํ•ต์‹ฌ ํ•จ์ˆ˜

getPostList(options)

๊ฐค๋Ÿฌ๋ฆฌ ํŽ˜์ด์ง€์—์„œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์€ ๋ชจ๋ฐ”์ผ ํŒŒ์„œ์ž…๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (GetPostListOptions)
    • page (number): ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
    • galleryId (string): ๊ฐค๋Ÿฌ๋ฆฌ ID
    • boardType (boardType, ์„ ํƒ): ๊ฒŒ์‹œํŒ ์œ ํ˜• ('all', 'recommend', 'notice' ์ค‘ ํ•˜๋‚˜, ๊ธฐ๋ณธ๊ฐ’: 'all')
    • delayMs (number, ์„ ํƒ): ์š”์ฒญ ๊ฐ„ ์ง€์—ฐ ์‹œ๊ฐ„(ms)

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<PostInfo[]>: ๊ฒŒ์‹œ๊ธ€ ์ •๋ณด ๊ฐ์ฒด์˜ ๋ฐฐ์—ด

getPostListLegacy(options)

PC(๋ ˆ๊ฑฐ์‹œ) ํŒŒ์„œ๋กœ ๊ฐค๋Ÿฌ๋ฆฌ ํŽ˜์ด์ง€์—์„œ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” getPostList์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.


getPost(options)

๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์€ ๋ชจ๋ฐ”์ผ ํŒŒ์„œ์ž…๋‹ˆ๋‹ค

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (GetPostOptions)
    • galleryId (string): ๊ฐค๋Ÿฌ๋ฆฌ ID
    • postNo (string | number): ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ
    • extractImages (boolean, ์„ ํƒ): ์ด๋ฏธ์ง€ URL ์ถ”์ถœ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)
    • includeImageSource (boolean, ์„ ํƒ): ๋ณธ๋ฌธ์— ์ด๋ฏธ์ง€ URL ํฌํ•จ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)
    • retryCount (number, ์„ ํƒ): ์ด ํ˜ธ์ถœ์—์„œ ์‚ฌ์šฉํ•  ์žฌ์‹œ๋„ ํšŸ์ˆ˜ (์ „์—ญ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฎ์–ด์”€)

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<Post | null>: ๊ฒŒ์‹œ๊ธ€ ๊ฐ์ฒด ๋˜๋Š” ์‹คํŒจ ์‹œ null

getPostLegacy(options)

PC(๋ ˆ๊ฑฐ์‹œ) ํŒŒ์„œ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” getPost์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.


getPosts(options)

์—ฌ๋Ÿฌ ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ๋กœ ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (๊ฐ์ฒด)
    • galleryId (๋ฌธ์ž์—ด): ๊ฐค๋Ÿฌ๋ฆฌ ID
    • postNumbers (๋ฌธ์ž์—ด ๋˜๋Š” ์ˆซ์ž์˜ ๋ฐฐ์—ด): ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ ๋ฐฐ์—ด
    • delayMs (์ˆซ์ž, ์„ ํƒ): ์š”์ฒญ ๊ฐ„ ์ง€์—ฐ ์‹œ๊ฐ„(ms) (๊ธฐ๋ณธ๊ฐ’: 100)
    • extractImages (๋ถˆ๋ฆฌ์–ธ, ์„ ํƒ): ์ด๋ฏธ์ง€ URL ์ถ”์ถœ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)
    • includeImageSource (๋ถˆ๋ฆฌ์–ธ, ์„ ํƒ): ๋ณธ๋ฌธ์— ์ด๋ฏธ์ง€ URL ํฌํ•จ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: false)
    • onProgress (ํ•จ์ˆ˜, ์„ ํƒ): ์ง„ํ–‰ ์ƒํ™ฉ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ (current, total)
    • retryCount (์ˆซ์ž, ์„ ํƒ): ๊ฐ ๊ฒŒ์‹œ๊ธ€ ์š”์ฒญ์—์„œ ์‚ฌ์šฉํ•  ์žฌ์‹œ๋„ ํšŸ์ˆ˜ (์ „์—ญ ๊ธฐ๋ณธ๊ฐ’์„ ๋ฎ์–ด์”€)

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<Post[]>: ์ˆ˜์ง‘๋œ ๊ฒŒ์‹œ๊ธ€ ๊ฐ์ฒด ๋ฐฐ์—ด

getAutocomplete(query)

๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด DCInside ์ž๋™์™„์„ฑ ๊ฒฐ๊ณผ(JSON)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • query (๋ฌธ์ž์—ด): ๊ฒ€์ƒ‰์–ด

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<object>: ์ž๋™์™„์„ฑ ๊ฒฐ๊ณผ ๊ฐ์ฒด

search(query, options)

ํ†ตํ•ฉ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • query (๋ฌธ์ž์—ด): ๊ฒ€์ƒ‰์–ด
  • options (๊ฐ์ฒด, ์„ ํƒ)
    • sort ('latest' | 'accuracy', ์„ ํƒ): ์ •๋ ฌ ๊ธฐ์ค€

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<object>: ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐ์ฒด { query?, gallery?, posts[] }

mobileLogin(options)

๋ชจ๋ฐ”์ผ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์ธ์ฆ ์ฟ ํ‚ค๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (MobileLoginOptions)
    • code (๋ฌธ์ž์—ด): ๋””์‹œ์ธ์‚ฌ์ด๋“œ ์‹๋ณ„ ์ฝ”๋“œ(ID)
    • password (๋ฌธ์ž์—ด): ๋น„๋ฐ€๋ฒˆํ˜ธ
    • keepLoggedIn (๋ถˆ๋ฆฌ์–ธ, ์„ ํƒ): ์ž๋™ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ (๊ธฐ๋ณธ๊ฐ’: true)
    • userAgent (๋ฌธ์ž์—ด, ์„ ํƒ): ์ปค์Šคํ…€ User-Agent
    • jar (CookieJar, ์„ ํƒ): ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•œ ์ฟ ํ‚ค ์ €์žฅ์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์ „๋‹ฌ

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<MobileLoginResult>: ์„ฑ๊ณต ์—ฌ๋ถ€, ์ฟ ํ‚ค ๋ชฉ๋ก, CookieJar, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ •๋ณด ๋“ฑ์„ ํฌํ•จํ•œ ๊ฐ์ฒด

createMobilePost(options)

๋ชจ๋ฐ”์ผ ๊ธ€์“ฐ๊ธฐ ํผ์„ ์‚ฌ์šฉํ•ด ๊ฒŒ์‹œ๊ธ€์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (MobileCreatePostOptions)
    • galleryId (๋ฌธ์ž์—ด): ๊ฐค๋Ÿฌ๋ฆฌ ID (ํ•„์ˆ˜)
    • subject (๋ฌธ์ž์—ด): ๋ง๋จธ๋ฆฌ/์ œ๋ชฉ (ํ•„์ˆ˜)
    • content (๋ฌธ์ž์—ด): ๋ณธ๋ฌธ (ํ•„์ˆ˜)
    • headText (๋ฌธ์ž์—ด | ์ˆซ์ž, ์„ ํƒ): ๋ง๋จธ๋ฆฌ ์ฝ”๋“œ
    • nickname (๋ฌธ์ž์—ด, ์„ ํƒ): ๋น„๋กœ๊ทธ์ธ ๊ธ€์“ฐ๊ธฐ์šฉ ๋‹‰๋„ค์ž„
    • password (๋ฌธ์ž์—ด, ์„ ํƒ): ๋น„๋กœ๊ทธ์ธ ๊ธ€์“ฐ๊ธฐ์šฉ ๋น„๋ฐ€๋ฒˆํ˜ธ
    • useGallNickname (๋ถˆ๋ฆฌ์–ธ, ์„ ํƒ): ๊ฐค๋Ÿฌ๋ฆฌ ๋‹‰๋„ค์ž„ ์‚ฌ์šฉ ์—ฌ๋ถ€
    • jar (CookieJar, ์„ ํƒ): ๋กœ๊ทธ์ธ์œผ๋กœ ํ™•๋ณดํ•œ ์ฟ ํ‚ค๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ
    • userAgent (๋ฌธ์ž์—ด, ์„ ํƒ): ์ปค์Šคํ…€ User-Agent
    • extraFields (๊ฐ์ฒด, ์„ ํƒ): ์ถ”๊ฐ€ ํผ ํ•„๋“œ ๊ฐ•์ œ ์ž…๋ ฅ

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<MobileCreatePostResult>: ์„ฑ๊ณต ์—ฌ๋ถ€, ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ URL, ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ๋‹ด์€ ๊ฐ์ฒด

deleteMobilePost(options)

๋ชจ๋ฐ”์ผ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (MobileDeletePostOptions)
    • galleryId (๋ฌธ์ž์—ด): ๊ฐค๋Ÿฌ๋ฆฌ ID (ํ•„์ˆ˜)
    • postId (๋ฌธ์ž์—ด | ์ˆซ์ž): ์‚ญ์ œํ•  ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ (ํ•„์ˆ˜)
    • jar (CookieJar, ์„ ํƒ): ๋กœ๊ทธ์ธ ์ฟ ํ‚ค๊ฐ€ ๋‹ด๊ธด ์ €์žฅ์†Œ
    • password (๋ฌธ์ž์—ด, ์„ ํƒ): ๋น„๋กœ๊ทธ์ธ ์‚ญ์ œ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ
    • userAgent (๋ฌธ์ž์—ด, ์„ ํƒ): ์ปค์Šคํ…€ User-Agent

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<MobileDeletePostResult>: ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ด์€ ๊ฐ์ฒด

deleteMobileComment(options)

๋ชจ๋ฐ”์ผ ๋Œ“๊ธ€ ์‚ญ์ œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (MobileDeleteCommentOptions)
    • galleryId (๋ฌธ์ž์—ด): ๊ฐค๋Ÿฌ๋ฆฌ ID (ํ•„์ˆ˜)
    • postId (๋ฌธ์ž์—ด | ์ˆซ์ž): ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆฐ ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ (ํ•„์ˆ˜)
    • commentId (๋ฌธ์ž์—ด | ์ˆซ์ž): ์‚ญ์ œํ•  ๋Œ“๊ธ€ ๋ฒˆํ˜ธ (ํ•„์ˆ˜)
    • jar (CookieJar, ์„ ํƒ): ๋กœ๊ทธ์ธ ์ฟ ํ‚ค๊ฐ€ ๋‹ด๊ธด ์ €์žฅ์†Œ
    • password (๋ฌธ์ž์—ด, ์„ ํƒ): ๋น„๋กœ๊ทธ์ธ ๋Œ“๊ธ€ ์‚ญ์ œ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ
    • userAgent (๋ฌธ์ž์—ด, ์„ ํƒ): ์ปค์Šคํ…€ User-Agent

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<MobileDeleteCommentResult>: ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ด์€ ๊ฐ์ฒด

recommendBest(options)

๋ชจ๋ฐ”์ผ ํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•ด CSRF ํ† ํฐ์„ ์–ป์€ ๋’ค ์‹ค์‹œ๊ฐ„ ๋ฒ ์ŠคํŠธ ์ถ”์ฒœ(์‹ค๋ฒ ์ถ”) ์—”๋“œํฌ์ธํŠธ๋กœ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • options (BestRecommendOptions)
    • galleryId (๋ฌธ์ž์—ด): ๊ฐค๋Ÿฌ๋ฆฌ ID (ํ•„์ˆ˜)
    • postId (๋ฌธ์ž์—ด | ์ˆซ์ž): ์ถ”์ฒœํ•  ๊ฒŒ์‹œ๊ธ€ ๋ฒˆํ˜ธ (ํ•„์ˆ˜)
    • jar (CookieJar, ์„ ํƒ): ๋กœ๊ทธ์ธ(์„ธ์…˜) ์ฟ ํ‚ค ์ €์žฅ์†Œ
    • userAgent (๋ฌธ์ž์—ด, ์„ ํƒ): ์ปค์Šคํ…€ User-Agent
    • proxy (ProxyConfig, ์„ ํƒ): Axios ํ”„๋ก์‹œ ์„ค์ • ๊ฐ์ฒด ๋˜๋Š” false

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<BestRecommendResult>
    • success (๋ถˆ๋ฆฌ์–ธ): ์„ฑ๊ณต ์—ฌ๋ถ€
    • message (๋ฌธ์ž์—ด, ์„ ํƒ): ์„œ๋ฒ„๊ฐ€ ์ „๋‹ฌํ•œ ๋ฉ”์‹œ์ง€(์˜ˆ: ์ด๋ฏธ ์ถ”์ฒœํ•จ ๋“ฑ)
    • responseStatus (์ˆซ์ž): HTTP ์ƒํƒœ ์ฝ”๋“œ
    • raw (์ž„์˜, ์„ ํƒ): ์„œ๋ฒ„ ์›๋ณธ ์‘๋‹ต ๊ฐ์ฒด

์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜

delay(ms)

์ง€์ •๋œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ) ๋™์•ˆ ์‹คํ–‰์„ ์ง€์—ฐ์‹œํ‚ต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • ms (์ˆซ์ž): ์ง€์—ฐํ•  ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)

๋ฐ˜ํ™˜๊ฐ’:

  • Promise<void>

getRandomUserAgent()

๋ฌด์ž‘์œ„ User-Agent ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜:

  • ์—†์Œ

๋ฐ˜ํ™˜๊ฐ’:

  • string: ๋ฌด์ž‘์œ„ User-Agent ๋ฌธ์ž์—ด

TypeScript ํƒ€์ž…

  • AutocompleteResponse, AutocompleteGalleryItem, AutocompleteWikiItem
  • getAutocomplete(query: string): Promise<AutocompleteResponse>
  • raw.getAutocomplete(query: string): Promise<AutocompleteResponse>

TODO

  • ๊ฒŒ์‹œํŒ ํŽ˜์ด์ง€ ํฌ๋กค๋ง
  • ๊ฒŒ์‹œ๊ธ€ ๋ณธ๋ฌธ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๋Œ“๊ธ€ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ๋ชจ๋“  ๋Œ“๊ธ€ ํŽ˜์ด์ง€ ์ˆ˜์ง‘
  • ์žฌ์‹œ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ถ”๊ฐ€
  • ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€ URL ์ถ”์ถœ
  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ง€์›
  • ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ
  • ๋ชจ๋ฐ”์ผ ๋กœ๊ทธ์ธ/์ฟ ํ‚ค ์ˆ˜์ง‘
  • ๋ชจ๋ฐ”์ผ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ/์‚ญ์ œ
  • ๋ชจ๋ฐ”์ผ ๋Œ“๊ธ€ ์‚ญ์ œ
  • ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •
  • ๋Œ“๊ธ€ ์ž‘์„ฑ
  • ์ถ”์ฒœ/๋น„์ถ”์ฒœ
  • ์‹ค์‹œ๊ฐ„ ๋ฒ ์ŠคํŠธ ์ถ”์ฒœ(์‹ค๋ฒ ์ถ”)

์ฃผ์˜์‚ฌํ•ญ

  • ๋””์‹œ์ธ์‚ฌ์ด๋“œ์˜ ์ด์šฉ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•ด์ฃผ์„ธ์š”.
  • ๊ณผ๋„ํ•œ ์š”์ฒญ์€ IP ์ฐจ๋‹จ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ ์ ˆํ•œ ๋”œ๋ ˆ์ด(delayMs)๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.
  • ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ์ธ ์—ฐ๊ตฌ, ๋ถ„์„ ๋“ฑ์˜ ๋น„์ƒ์—…์  ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.

๋ผ์ด์„ ์Šค

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published