Мы собираемся написать бот Reddit, который прослушивает конкретные фразы и отвечает на комментарии, которые их содержат. Мы узнаем, как можно взаимодействовать с API Reddit в Python, создавая собственного приятеля -бота.
Bottiquette
Вы, наверное, слышали о Три закона робототехники Но вы слышали о Reddit’s Bottiquette ? Это список правил, которые помогут вам создать вежливого бота, который никому не попадет. Самое важное правило – не выдавать себя за человека с вашим ботом. В то время как это нормально, чтобы бросить вверх и вниз, команда для этого должна исходить непосредственно от человека.
Настраивать
Вам понадобится Доход , Python Reddit API обертка Анкет Установите этот пакет с: PIP Установите PROU
Анкет Он получил обширную документацию, и есть также r/redditdev subreddit, если вам понадобится больше вдохновения или помощи.
Создать Скрипт Reddit App и отметьте идентификатор клиента и секрет клиента.
Убедитесь, что вы не посвящаете их репозиторию! С Python вы можете получить доступ к переменным окружающей среды с Os.environ
, картирующий объект. Ниже приводится приложение Hello World Praw. Поскольку наш бот будет выполнять действия учетной записи, нам также понадобятся имя пользователя и пароль учетной записи. С пассивными ботами это не нужно. Есть также Другие способы аутентификации Анкет
# Setting environment variables on different platforms: Linux/OS X - export ENV_VAR='data' Windows Cmd - ENV_VAR='data' Powershell - $env:ENV_VAR='data'
import os import praw # a reddit instance reddit = praw.Reddit(client_id=os.environ['CLIENTID'], client_secret=os.environ['CLIENTSECRET'], user_agent='Reddit bot tutorial v0.1-1', username=os.environ['CLIENTUSER'], password=os.environ['CLIENTPASS']) # with incorrect authentication information, this will error with: # prawcore.exceptions.OAuthException: invalid_grant error processing request print(reddit.user.me())
Поскольку наша конфиденциальная информация определена в другом месте, мы можем совершить это без утечки каких -либо деталей. Также легче проверить, и позвольте другим разработчикам более легко работать с этим кодом.
Все комментарии
Это весело сделать. Мой вызов вам: попробуйте прочитать каждый комментарий, как он опубликован в Reddit. Это действительно дает вам представление о шкале доступных данных.
# with our reddit instance, get an endless stream of comments for comment in reddit.subreddit('all').stream.comments(): print(comment.body)
Здесь, Комментарии
это функция генератора, которая дает новые комментарии по мере того, как они становятся доступными. Как и в большинстве API, существуют ограничения с API Reddit. К счастью для нас, PRAW управляет этим на заднем плане для нас и контролирует нас.
Мы хотим отфильтровать комментарии для конкретных фраз. В то же время, что и переменные среды, мы также собираемся дать эту функцию. Argparse , часть стандартной библиотеки Python, позволяет легко настроить аргументы командной строки.
import argparse # setup argparse parser = argparse.ArgumentParser(description='Reply to certain Reddit comments') parser.add_argument('--search', dest='search', help='Search for these comma-delimited phrases. E.g., "one phrase, another phrase"') args = parser.parse_args() # split by commas, strip extra white space search = [phrase.strip() for phrase in args.search.split(',')] # python args.py --search "test phrase, two, three" # prints: ['test phrase', 'one', 'two'] print(search)
Отвечая на комментарии
Reddit’s r/test это хорошее поле битвы, чтобы попробовать это. Мы будем использовать Комментарий#Ответ Анкет Поскольку мы будем искать тела комментариев для наших фраз, у нас уже будет ссылка на объект комментария, и мы можем просто использовать его Ответ
метод В противном случае вы можете найти объект комментария с помощью я бы.
# with a comment reference comment.reply('hello! signed, a bot.') # find a comment by id comment = reddit.comment(id='dxolpyc') comment.reply('hi again!')
Вам может понадобиться две учетные записи, чтобы правильно проверить это, так как недавно созданные учетные записи Reddit не могут разместить два комментария мгновенно, то есть, то есть опубликовать целевую фразу, а затем ответ на этот комментарий.
Где мы до сих пор
Давайте проверим, как наш бот формирует. Вы увидите, что я использовал Argparse
для обзора поисковых фраз. Мы делаем настраиваемый бот, а не жесткий кодирование, с которым труднее расширить и работать в будущем.
import os import praw import argparse # setup argparse parser = argparse.ArgumentParser(description='Reply to certain Reddit comments') parser.add_argument('--search', dest='search', help='Search for these comma-delimited phrases. E.g., "one phrase, another phrase"') parser.add_argument('--reply', dest='reply', help='Reply to target comments with this phrase') args = parser.parse_args() # our search phrases, also works with a single word search = [phrase.strip() for phrase in args.search.split(',')] # our reply reply = args.reply # reddit instance reddit = praw.Reddit(client_id=os.environ['CLIENTID'], client_secret=os.environ['CLIENTSECRET'], user_agent='Reddit bot tutorial v0.1-1', username=os.environ['CLIENTUSER'], password=os.environ['CLIENTPASS']) # an endless stream of comments for comment in reddit.subreddit('all').stream.comments(): for phrase in search: if phrase in comment.body: comment.reply(reply) # for debugging print(f'Replied to {comment.id}!') break
Куда пойти отсюда
- Клон Учебный репозиторий И взломай!
- Получите имя плаката и используйте его в своем ответе:
comment.author.name
- Размещайте своего бота на малиновом PI или в облаке с Хероку Анкет
- Подключите своего бота с сервисом бэкэнд, как я сделал с моим Emojistreamer Project, который транслирует каждый эмодзи, размещенный в Reddit.
Более
Я недавно стал наставником в Кодирующий тренер . Если вы разрабатываете бот Reddit или нуждаетесь в помощи Dev в целом, я могу помочь!
Присоединяйтесь к 150+ человек, подписавшись на мой Информационный бюллетень О программировании и личностном росте!
Я пишу в Твиттере о технологии @Healeycodes Анкет
Оригинал: “https://dev.to/healeycodes/need-a-friend-write-a-reddit-bot-with-python-to-follow-you-around–2dkl”