Reddit 봇 Reddit 응답 봇 만들기

Python에서 reddit 봇을 작성하는 방법에 대한 많은 문서가 있지만 Node에 대한 기본 문서조차 찾는 데 많은 어려움이 있었습니다. 심지어 reddits 공식 위키에 나열된 라이브러리 중 일부는 죽었거나 5년이 되었습니다(읽기: don' 새로운 reddit을 매우 잘 지원합니다). 그래서 간단하고 일반적인 사용 사례에 대해 작성하고 싶었습니다. 귀하를 태그한 사용자에게 답장하는 것입니다.

Reddit 애플리케이션 만들기



먼저 https://www.reddit.com/prefs/apps으로 가서 "앱 만들기"를 누르세요. reddit이 개인 사용자 계정을 사용하지 않도록 이렇게 해야 합니다. 또한 봇을 위한 새 reddit 계정에 가입해야 합니다(특히 소환할 수 있는 경우). 이 애플리케이션에서 기본 계정과 봇 계정을 개발자로 추가했는지 확인하세요.

앱을 만들 때 다음과 유사하게 필드를 채워야 합니다.


about uri 또는 redirect uri 필드는 사용하지 않을 것이기 때문에 걱정할 필요가 없으므로 원하는 대로 입력할 수 있습니다.

들어가면 다음과 같은 화면이 나타납니다.



잠시 후에 이 정보가 필요하므로 이 점을 기록해 두십시오.

노드 프로젝트 시작



이와 같은 경우 사용하기가 매우 쉽다는 것을 알았습니다 snoostorm ( snoowrap 주변의 래퍼). 이 라이브러리를 사용하면 주석이 들어올 때 매우 간단하게 얻을 수 있습니다.

먼저 snoowrap 개체를 만든 다음 이를 사용하여 CommentStream 개체를 만들어야 합니다. 이를 위해서는 reddit 봇 사용자 이름, 암호, 애플리케이션 암호 및 애플리케이션 ID가 필요합니다. 고유한 사용자 에이전트를 지정해야 하므로 my-node-js-bot 와 같이 이름을 지정해야 합니다. 따라서 다음과 같이 구성하십시오(내 것은 위의 그림을 기반으로 구성됨).

const Snoowrap = require('snoowrap');
const { CommentStream } = require('snoostorm');

const client = new Snoowrap({
    userAgent: 'my-node-js-bot',
    clientId: 'qR6rJnQ7sEJZDw',
    clientSecret: 'OCoo9pYnlC2K6fxQQxbcIPQ5MA4',
    username: 'myusernamebutactuallybot',
    password: 'mypasswordbutactuallybot'
});


이 클라이언트 개체를 사용하면 마침내 새로운 의견을 듣기 시작할 수 있습니다! /r/testingground4bots로 이동하여 스레드에 들어가거나 자신만의 스레드를 만드십시오. 그런 다음 몇 가지 코드를 추가하여 댓글 보기를 시작합니다.

// pollTime is 10000 because reddit is very strict on posting too frequently
// at first, you'll only be able to post once every 10 minutes, so make sure you get it right!
const comments = new CommentStream(client, { 
    subreddit: 'testingground4bots', 
    limit: 10, 
    pollTime: 10000 
});

comments.on('item', (item) => {
    console.log(item);
});


봇을 시작하면 터미널에 수많은 댓글이 표시됩니다. 그 이유가 궁금할 수 있습니다. 아직 새로운 것이 들어오는 것을 본 적이 없습니다! 음, client는 봇을 시작할 때 항상 첫 번째 X 항목(이 경우 10)을 제공한 다음 거기에서 추적합니다.

꽤 쉽게 고칠 수 있습니다.

// reddits api doesn't use millis
const BOT_START = Date.now() / 1000;

const comments = new CommentStream(client, { 
    subreddit: 'testingground4bots', 
    limit: 10, 
    pollTime: 10000 
});

comments.on('item', (item) => {
    if(item.created_utc < BOT_START) return;

    console.log(item);
});


좋습니다. 이제 들어오는 최신 댓글만 볼 수 있습니다. 이 하위 레딧에 게시물을 올릴 수 있을 만큼 충분한 레딧 계정을 구축하셨기를 바랍니다. 그렇게 하면 게시 후 상당히 빠르게 터미널이 채워지는 것을 볼 수 있습니다.

상호 작용하기



지금까지 봇이 있고 댓글을 읽습니다. 좋은 시작입니다! 하지만 청중과 상호 작용하기를 원하십니까? 그럼 좋은 세상 안녕은 어때? 확인 해봐:

const BOT_START = Date.now() / 1000;

const comments = new CommentStream(client, { 
    subreddit: 'testingground4bots', 
    limit: 10, 
    pollTime: 10000 
});

comments.on('item', (item) => {
    if(item.created_utc < BOT_START) return;

    item.reply('hello world!');
});


여기에서 댓글이 들어올 때마다 봇이 "hello world!"라고 답장을 보냅니다. 잠깐만요... 좀 자주 얘기할 수도 있잖아요, 그렇죠? 조금 짜증날 수도 있습니다. Reddit은 귀하의 봇이 언급될 때 구체적으로 회신할 것을 권장하므로 매우 쉬운 방법이 있습니다.

const BOT_START = Date.now() / 1000;

const canSummon = (msg) => {
    return msg && msg.toLowerCase().includes('/u/myusernamebutactuallybot');
};

const comments = new CommentStream(client, { 
    subreddit: 'testingground4bots', 
    limit: 10, 
    pollTime: 10000 
});

comments.on('item', (item) => {
    if(item.created_utc < BOT_START) return;
    if(!canSummon(item.body)) return;

    item.reply('hello world!');
});


거기! 따라서 이것이 하는 일은 봇이 찾은 댓글이 실제로 봇 자체를 참조하는지 확인하는 것입니다. 이canSummon 기능은 기본 검사를 수행하여 봇이 많은 사람들의 댓글을 잘못 스팸하지 않도록 합니다. 지금 /u/myusernamebutactuallybot라는 댓글을 작성하면(오히려 자신의 봇 이름을 확인해야 함) 잠시 후 "hello world!"라는 답장이 표시됩니다. 답변으로.

그게 당신이해야 할 전부입니다! 🎉

좋은 웹페이지 즐겨찾기