Discord.js๋กœ Bot๐Ÿ‘พ ๋งŒ๋“ค๊ธฐ

์„œ๋ก 

discord.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ฒŒ ์ƒ๊ฐํ•œ ๊ณ„๊ธฐ๋Š” ์นœ๊ตฌ์™€ ๊ฒŒ์ž„ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋‹ค๊ฐ€ ์ด๋Ÿฐ ๋ด‡์ด ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์นœ๊ตฌ๊ฐ€ ์–ธ๊ธ‰์„ ํ•˜์˜€๋‹ค. (๊ทธ ๋‹น์‹œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ์ƒ๊ฐํ–ˆ๋˜ ๋ด‡์ด ์˜คํ”ˆ๋œ ๊ฒƒ์€ ์—†์—ˆ๋‹ค.) ๊ทธ๋ž˜์„œ ํ•œ ๋ฒˆ ํ•ด๋ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๊ณ , ํ•œ ๋‹ฌ ์ •๋„ ๋Šฆ์žฅ์„ ๋ถ€๋ฆฌ๋‹ค๊ฐ€ ์‹œ์ž‘์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ํ•˜๊ณ ๋ณด๋‹ˆ discord.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์›Œ๋‚™ ํŽธํ•˜๊ฒŒ ๋˜์–ด์žˆ์–ด์„œ ์†์‰ฝ๊ฒŒ ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๊ณ , ์‹ค์ œ ๊ฒŒ์ž„ ๊ธธ๋“œ ๋””์Šค์ฝ”๋“œ์— ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์—ฐ์Šต์šฉ์œผ๋กœ ๋งŒ๋“  ๋ด‡์ด๋ผ ๊ตฌ์กฐ์— ๋งŽ์€ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์•˜๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ๋“ค๊ณ ๋ณด๋‹ˆ ์š•์‹ฌํžˆ ์ƒ๊ฒจ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๊ตฌ์กฐ๋„ ์กฐ๊ธˆ์”ฉ ๋‹ค๋“ฌ์œผ๋ฉด ์ข‹์€ ๋ด‡์ด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค.

discord.js ๊ฐœ๋ฐœ์— ์ฐธ๊ณ ํ•œ ๋ฌธ์„œ๋Š” ๋‹จ์—ฐ์ฝ” discord.js ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

๋ณธ๋ก 

๐Ÿ”ด discord.js ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ

์‚ฌ์ „ ์ค€๋น„

์šฐ์„  ๋‚ด๊ฐ€ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉํ•œ ์ŠคํŽ™์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

IDE : Visual Studio Code
Libaraies : discord.js, axios, cheerio, nodemon

  • Javascript๋Š” ES5 ๋ฌธ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋””์Šค์ฝ”๋“œ ๋ด‡์„ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋””์Šค์ฝ”๋“œ ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค.
๋””์Šค์ฝ”๋“œ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ์ ‘์†ํ•ด์„œ ์•ฑ์„ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•˜๊ณ  ์˜จ๋‹ค.

๊ฐœ๋ฐœ์šฉ ๋ด‡ ์ƒ์„ฑํ•˜๊ธฐ

์šฐ์„  ๋””์Šค์ฝ”๋“œ ํšŒ์›๊ฐ€์ž…๋„ ํ–ˆ๊ณ  ์•ฑ๋„ ๋‹ค์šด๋กœ๋“œ๋ฅผ ํ–ˆ๋‹ค๋ฉด ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธํ•  ๋ด‡์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

๋ด‡ ์ƒ์„ฑ ํ™ˆํŽ˜์ด์ง€๋Š” ๋””์Šค์ฝ”๋“œ ๊ฐœ๋ฐœ์ž ํฌํ„ธ์—์„œ ์ง„ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. ํ™ˆํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋งž์ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” ์ง€๊ธˆ 2๊ฐ€์ง€์˜ ๋ด‡์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ์ค‘์ธ๋ฐ ๊นŒ๊ฟ์€ ์‹ค์ œ๋กœ ๊ธธ๋“œ ๋””์ฝ” ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ค‘์ธ ๋ด‡์ด๊ณ  ๊นŒ๊ฟ ์•„๋“ค์€ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฏธ๋ฆฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ด‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๋ด‡์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. New Application ํด๋ฆญ ํ›„ ์•ฑ ์ƒ์„ฑ


์œ„์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ New Application ์„ ํด๋ฆญํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์ด์–ผ๋กœ๊ทธ ์ฐฝ์ด ๋œจ๋Š”๋ฐ ์ž์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์„ ์ ๋Š”๋‹ค. (๋ด‡ ์ด๋ฆ„์€ ๋”ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.) ๊ทธ๋ฆฌ๊ณ  Create ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค€๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์œผ๋กœ ์ด๋™์ด ๋˜๋Š”๋ฐ ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •๋ณด๋ฅผ ์ ๋Š” ๋ถ€๋ถ„์ธ๋ฐ ๋‚˜๋Š” ๋‹ค๋ฅธ๊ฑด ์ž˜ ๋ชฐ๋ผ์„œ ๋”ฑํžˆ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค...๐Ÿ˜…

2. Bot ๋ฉ”๋‰ด๋ฅผ ์ด์šฉํ•ด์„œ ๋ด‡ ์ƒ์„ฑํ•˜๊ธฐ.


์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ์—๊ฒŒ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”์— ์žˆ๋Š” Bot ์ด๋ผ๋Š” ๋ฉ”๋‰ด์ด๋‹ค. ํ•ด๋‹น ๋ฉ”๋‰ด๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ ํ™”๋ฉด์ด ๋œฌ๋‹ค.

์—ฌ๊ธฐ์„œ๋„ ๋‹ค๋ฅธ ์„ค์ •๊ฐ’์€ ์ž˜ ๋ชฐ๋ผ์„œ ๋ด‡ ์ด๋ฆ„๋งŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์ค‘์— ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ๋ด‡์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ† ํฐ๊ฐ’์„ ์ž…๋ ฅํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฆ„ ์•„๋ž˜ ๋ณด๋ผ์ƒ‰ Copy ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ํ† ํฐ์„ ์–ป์œผ๋ฉด ๋œ๋‹ค.

3. ์ƒ์„ฑํ•œ ๋ด‡์„ ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์— ์ดˆ๋Œ€ํ•˜๊ธฐ

์ด๋ ‡๊ฒŒ ๋ด‡ ์ƒ์„ฑ๊นŒ์ง€ ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿผ ํ•ด๋‹น ๋ด‡์„ ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•  ๋””์Šค์ฝ”๋“œ ์ฑ„๋„์— ์ดˆ๋Œ€ํ•ด์„œ ์›ํ•˜๋Š” ๋ด‡์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ดˆ๋Œ€ํ•ด๋ณด๋„๋ก ํ•˜์ž.

์œ„์˜ ์‚ฌ์ง„์„ ์ฐธ๊ณ ํ•ด์„œ ์™ผ์ชฝ ๋„ค๋น„๋ฐ”์—์„œ OAuth2 ์„ ๋ˆŒ๋Ÿฌ์„œ ํ™”๋ฉด์„ ์ด๋™ํ•˜๊ณ  ๋ฐ‘์œผ๋กœ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด ๋ด‡์˜ Scope ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ๋ด‡์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ด‡์„ ์ฒดํฌํ•œ๋‹ค. (๋‹ค๋ฅธ Scope ๋ฅผ ์›ํ•˜๋ฉด ์ค‘๋ณต์œผ๋กœ ์ฒดํฌํ•˜๋ฉด ๋œ๋‹ค. ์ „ ์ž˜ ๋ชฐ๋ผ์„œ...๋ด‡๋งŒ...๐Ÿ˜)

๊ทธ๋Ÿฌ๋ฉด ํ•˜๋‹จ์— URL ์ด ์ƒ์„ฑ๋˜๋Š”๋ฐ ์˜ค๋ฅธ์ชฝ์— ๋ณด๋ผ์ƒ‰ Copy ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋งํฌ๊ฐ€ ๋ณต์‚ฌ๊ฐ€ ๋˜๊ณ  ํ•ด๋‹น ๋งํฌ๋ฅผ Browser ์— ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ๋ด‡ ์ถ”๊ฐ€ ํ™”๋ฉด์ด ๋œจ๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ ์ž์‹ ์ด ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•˜๋ฉด ๋˜๋Š”๋ฐ ์ƒˆ๋กœ ๊ฐ€์ž…ํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋””์Šค์ฝ”๋“œ ์•ฑ์œผ๋กœ ๋“ค์–ด๊ฐ€์„œ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ์ฐธ๊ณ ํ•ด์„œ ์ƒ์„ฑํ•˜๊ณ  ๋Œ์•„์˜ค๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜ ์„ ํƒํ•˜๋ฉด ํ•˜๋‹จ์˜ ๋ณด๋ผ์ƒ‰ Authorize ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๊ฐ€ ๋˜๊ณ  ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์„œ๋ฒ„๋กœ ๋ด‡์ด ์ถ”๊ฐ€๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค.

๋‚˜๋Š” ์ด๋ฏธ ๊นŒ๊ฟ ์•„๋“ค๐Ÿ‘พ ์„ ์ดˆ๋Œ€ํ•ด๋‘” ์ƒํƒœ๊ณ , ๋ฒจ๋กœ๊ทธ ๋ด‡๐Ÿ‘พ ์ด ํ•˜๋‹จ์— ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ถ”๊ฐ€๋œ ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ์™”์œผ๋ฉด ์ผ๋‹จ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์€ ๋๋‚œ ์ƒํƒœ๋‹ค! ๋”ฐ๋ผ์„œ ์ด์ œ๋Š” ๋Œ€๋ง์˜ ์—๋””ํ„ฐ๋ฅผ ์ผœ์„œ ์ฝ”๋”ฉ์„ ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์šฐ์„ ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์†Œ๊ฐœ๋ฅผ ํ•˜๊ณ  ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ํŒ์ด ์žˆ๋‹ค๋ฉด ํŒ์„ ์†Œ๊ฐœํ•ด๋ณด๋„๋ก ํ•  ์˜ˆ์ •์ด๋‹ค.

๐ŸŸ  discord.js๋ฅผ ์ด์šฉํ•ด์„œ ๋ด‡๊ณผ ์†Œํ†ตํ•˜๊ธฐ

์šฐ์„  discord.js ๋ฅผ ์ด์šฉํ•˜๋Š” ๋งŒํผ javascript (Node.js)๋ฅผ ์ด์šฉํ•  ์˜ˆ์ •์ด๊ณ , ๋ฌธ๋ฒ•์€ ES5 ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋จผ์ € npm init ์„ ์ด์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

1. npm init ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด Node.js ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

ํ•„์ž๋Š” ์šด์˜์ฒด์ œ๋ฅผ ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉ์ค‘์ด๊ธฐ์— cmd๋ฅผ ์ผœ์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. (6์›” WWDC์—์„œ ๋งฅ๋ถ 14์ธ์น˜ ๊ณต๊ฐœ์ข€ ํ•ด์ฃผ์„ธ์š”...ใ… ใ… )

์—ฌ๊ธฐ์„œ ํ•œ๊ฐ€์ง€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์•„๋Š” ๊ฟ€ํŒ์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ ํด๋” ๊ฒฝ๋กœ ๋ถ€๋ถ„์— cmd ๋ฅผ ์น˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ์— ์ ‘์†๋œ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.



์—ฌ๊ธฐ์„œ npm init ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ–ˆ๋‹ค.

Microsoft Windows [Version 10.0.19042.985]
(c) Microsoft Corporation. All rights reserved.

C:\Users\junsugi\Desktop\react-workspace>cd velogbot
C:\Users\junsugi\Desktop\react-workspace\velogbot>npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (velogbot) velogbot  # ํ”„๋กœ์ ํŠธ๋ช… (์†Œ๋ฌธ์ž๋กœ๋งŒ ์ž‘์„ฑ)
version: (1.0.0) 0.0.1                    # ์•ฑ ๋ฒ„์ „ (์ „ ํ•ญ์ƒ 0.0.1 ๋ถ€ํ„ฐ ์‹œ์ž‘)
description: ๋ฒจ๋กœ๊ทธ ๋ด‡                     # ์•ฑ ์„ค๋ช… (์ž์œ ๋กญ๊ฒŒ ์ ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.)
entry point: (discord.js) index.js        # ์•ฑ์„ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ์ฝํž ํŒŒ์ผ (Java๋กœ ์น˜๋ฉด main ํ•จ์ˆ˜๋ฅผ ์ง€์ •)
test command:                            
git repository:
keywords:
author: junsugi                           # ์ €์ž๋ช…
license: (ISC)
About to write to C:\Users\junsugi\Desktop\react-workspace\velogbot\package.json:

{
  "name": "velogbot",
  "version": "0.0.1",
  "description": "๋ฒจ๋กœ๊ทธ ๋ด‡",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "junsugi",
  "license": "ISC"
}


Is this OK? (yes) yes

์œ„์˜ ์„ค์ •๊ฐ’๋“ค์€ ์ „๋ถ€ ์ƒ์„ฑ๋œ package.json ์—์„œ ์–ธ์ œ๋“ ์ง€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

2. npm install์„ ์ด์šฉํ•ด ๊ธฐ๋ณธ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ํ•˜๊ธฐ

๋”ฐ๋ผ์„œ package.json ์ด ์กด์žฌํ•˜๋Š” ํด๋”์—์„œ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์ฐฝ์— npm install ์„ ์ž…๋ ฅํ•œ๋‹ค.

C:\Users\junsugi\Desktop\react-workspace\velogbot>npm install
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN [email protected] No repository field.

up to date in 0.964s
found 0 vulnerabilities

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๊ฐ€ ๋˜๊ณ  node_modules ๋ผ๋Š” ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํด๋”์—๋Š” ์šฐ๋ฆฌ๊ฐ€ node.js ๋ฅผ ์ด์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋Œ€๋ง์˜ discord.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
๋‹ค์šด๋กœ๋“œ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. npm install discord.js --save

C:\Users\junsugi\Desktop\react-workspace\velogbot>npm install discord.js --save
npm WARN [email protected] No repository field.

+ [email protected]
added 15 packages from 17 contributors and audited 15 packages in 1.658s
found 0 vulnerabilities

3. discord.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ

์ด์ œ๋Š” ์—๋””ํ„ฐ๋ฅผ ์ผœ์„œ discord.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋Š” discord.js ๊ฐœ๋ฐœ์ž ํฌํ„ธ์— ์žˆ๋Š”๋ฐ ์ž˜ ๋‚˜์™€์žˆ๋‹ค. (์„œ๋ก ์— ๋งํฌ๋œ ํŽ˜์ด์ง€์™€ ๋™์ผ)

ํ™ˆํŽ˜์ด์ง€์— ์ ‘์†ํ•ด์„œ ์™ผ์ชฝ์— ๋„ค๋น„๋ฐ”์— ๋‹ค์Œ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด๊ฐ€์„œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Creating Your Bot > Getting your bot up & running > Logging in to Discord

  • ํด๋ฆญ์‹œ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๋ฐ”๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์•„๋„ ๋‚ด๊ฐ€ ๋ณต์‚ฌํ•ด์™”๋‹ค! ํ˜น์‹œ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ณด๊ณ  ์‹ถ์œผ๋ฉด ๋“ค์–ด๊ฐ€๋ณด๋„๋ก ํ•˜์ž!

const Discord = require('discord.js');	// discord.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ถœ
const client = new Discord.Client();	// Client ๊ฐ์ฒด ์ƒ์„ฑ

// discord ๋ด‡์ด ์‹คํ–‰๋  ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ ๋Š” ๋ถ€๋ถ„
client.once('ready', () => {
	console.log('Ready!');
});

// ๋ด‡๊ณผ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ถ€๋ถ„
client.login('your-token-goes-here');

๋”ฐ๋ผ์„œ ์•„๊นŒ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์™€์„œ client.login() ๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. (๊นŒ๋จน์—ˆ์œผ๋ฉด ๋‹ค์‹œ ํ™•์ธํ•˜๊ธฐ!)

๋„ฃ์–ด์ฃผ๊ณ  package.json ํŒŒ์ผ๋กœ ๋“ค์–ด๊ฐ€์„œ scripts ์„น์…˜์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

  "scripts": {
    "start": "node index.js"
    "test": "echo \"Error: no test specified\" && exit 1"
  },

scripts ๋ถ€๋ถ„์— ์ ํžŒ ๋ช…๋ น์–ด๋Š” ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ npm run ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๊ธˆ ์ ์€ start ๋ผ๋Š” ๋ช…๋ น์–ด๋Š” index.js ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๋ช…๋ น์–ด์ด๋‹ค.

4. ๋ด‡ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋ฉ”์‹œ์ง€ ํ™•์ธํ•˜๊ธฐ!

์šฐ์„  ์‹คํ–‰์‹œํ‚ค๊ธฐ ์ „์— ์œ„์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

// ๋””์Šค์ฝ”๋“œ ์„œ๋ฒ„์— ์ž‘์„ฑ๋˜๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ
client.on('message', message => {
	console.log(message.content);
});

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค๋ฉด package.json ์ด ์กด์žฌํ•˜๋Š” ํด๋”์—์„œ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ผœ๊ณ  npm run start ๋ฅผ ์ ์–ด์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Ready! ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๋ด‡๊ณผ ์—ฐ๊ฒฐ์ด ๋œ ๊ฒƒ์ด๋‹ค. (๋ช‡ ์ดˆ ์ •๋„ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

C:\Users\junsugi\Desktop\react-workspace\velogbot>npm run start

> [email protected] start C:\Users\junsugi\Desktop\react-workspace\velogbot
> node index.js

Ready! # ํ•ด๋‹น ๋กœ๊ทธ๊ฐ€ ๋–ด๋‹ค๋ฉด ์„ฑ๊ณต!

๊ทธ๋ฆฌ๊ณ  ๋””์Šค์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋ฒจ๋กœ๊ทธ๋ด‡(์ž์‹ ์˜ ๋ด‡)์ด ์˜จ๋ผ์ธ์ด ๋œ ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ฑ„๋„์— ์ฑ„ํŒ…์„ ์ž…๋ ฅํ•ด๋ณด๋„๋ก ํ•˜์ž (์™ผ์ชฝ ๋„ค๋น„๋ฐ”์— ์ฑ„ํŒ… ์ฑ„๋„์ด ์—†๋‹ค๋ฉด + ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ์ฑ„ํŒ… ์ฑ„๋„ ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋„๋ก ํ•˜์ž!)

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด์ฃผ์—ˆ๊ณ  ์ฝ˜์†”์ฐฝ์„ ๋ณด๋ฉด ํ•ด๋‹น ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•ด์„œ discord.js ๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๋Š” ๋ชจ๋‘ ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋˜์—ˆ๊ณ  ๊ฐ„๋‹จํ•œ ํŠœํ† ๋ฆฌ์–ผ๊นŒ์ง€ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค.

๊ฒฐ๋ก 

๋ญ”๊ฐ€ ๋˜๊ฒŒ ๊ฑฐ์ฐฝํ•˜๊ณ  ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ javascript ๋งŒ ์•Œ๊ณ  ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค๋ฉด ์‹ค์ œ๋กœ ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ๋ถ„๋“ค๋„ ์žฌ๋ฐŒ๊ฒŒ ์ž…๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์•ผ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋งค๋ฒˆ ์ฝ”๋”ฉ์˜ ์ž…๋ฌธ์ด ์›น ๋งŒ๋“ค๊ธฐ๋Š” ๋„ˆ๋ฌด ์ง€๋ฃจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ์˜ฌ๋ฆฌ๊ฒŒ ๋œ ๊ณ„๊ธฐ๋„ ์žˆ๊ณ , ๋งŒ๋“ค๊ณ  ๋ณด๋‹ˆ๊นŒ ๋ฟŒ๋“ฏํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ๋„ ๋น ๋ฅด๊ฒŒ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์žฌ๋ฐŒ์—ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—๋Š” ์ด์ œ cheerio ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ์›น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

๊ทธ๋Ÿผ ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€!

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ