Рубрики
Без рубрики

Я играл, учился и построил бот McKenna Reddit на Python #raspberrypi

Я построил цитату Маккенны, развернул ее на Raspberry Pi и в процессе узнал об ООП в Python, обработке ошибок и запуске безголовых Raspberry Pi!

Автор оригинала: Alex White.

Обо мне

Я полный стек веб-разработчик, педагог и предприниматель.

Проблема, которую я хотел решить

Меня заинтриговали боты в социальных сетях и потенциальная сила распространения позитивных сообщений, а не чисто негативных! В частности, в течение многих лет Теренс Маккенна был одним из моих любимых авторов, и я заметил, что в Интернете он переживает некоторое посмертное возрождение. Желая помочь большему количеству людей открыть его, я решил кое-что построить.

Что такое цитатный бот Маккенны?

Мистер Маккенна-ничто, если его не цитировать. Например:

– Природа любит смелость. Вы берете на себя обязательство, и природа ответит на это обязательство устранением невозможных препятствий. Мечтайте о несбыточном, и мир не будет вас перемалывать, он поднимет вас. В этом весь фокус. Это то, что все эти учителя и философы, которые действительно считали, которые действительно касались алхимического золота, это то, что они понимали. Это шаманский танец в водопаде. Вот как делается магия. Бросившись в бездну и обнаружив, что это перина.”

Я хотел поделиться его цитатами со всем миром, по одному бот-посту за раз.

Я решил, что создам бота, который будет следить за упоминаниями автора.

Каждые n часов или минут он просматривал массив “субреддитов” и проверял каждый новый пост и каждый новый комментарий к этому посту. Если в посте или комментарии было ключевое слово “Маккенна”, он отвечал цитатой.

Цитаты будут храниться в CSV-файле, который я построил сам, рыская по Интернету в поисках замечательных цитат Маккенны. Это был плодотворный поиск. Я придумал почти 100, результаты которых вы можете увидеть здесь, если вам интересно: https://gist.github.com/awhit012/937f10006869dda6479c

Другой CSV-файл будет содержать список идентификаторов каждого сообщения или комментария, на которые бот ответил, чтобы предотвратить двойные ответы.

Технический стек

Я использовал Python и PRAW (Python Reddit API Wrapper). Первоначально он работал на моем ноутбуке, но позже был развернут на безголовом Raspberry Pi.

Процесс

Три года назад я был больше рубистом, чем питонистом, и изначально намеревался написать это на Рубине. Вскоре я обнаружил, что почти все ресурсы для разработки ботов Reddit предназначены для Python, во многом благодаря этой прекрасной библиотеке Python, PRAW. Всего лишь чуть больше года в моей карьере программиста идея переключения языков в проекте была захватывающей! Я подошел к Питону.

Было очень весело строить и видеть, как мои ответы появляются в субреддите/r/test!

Несмотря на то, что это был относительно простой сценарий, я знал, что хочу написать свой код в ООП, причем настолько чистый и модульный, насколько это возможно, как для практики, так и в том случае, если я хотел добавить больше или адаптировать этот код для другого проекта, что я и сделал. Я создал шаблон ответного бота, который можно было легко превратить в любой тип ответного бота, который вы пожелаете, и я создал еще один скрипт, который я назвал Reddit Scrub, антидокси-инструмент для параноиков, который вручную удалял бы каждый пост и комментарий, когда-либо опубликованный чьим-либо аккаунтом.

Проблемы, с которыми я столкнулся

Самой большой проблемой для этого проекта было то, как запустить его непрерывно! Он должен был работать только 2 раза в день (на самом деле никакой срочности нет), но запуск его с терминала на моем ноутбуке в основном означал, что я должен был уделять ему гораздо больше внимания, чем хотел. В конце концов, это должно было быть волшебным, автоматизированным, распространяющим позитивность делом, а не новой утомительной задачей, добавленной к моему дню.

У меня был Raspberry Pi, который я получил в подарок, и мне нужен был проект. Я пролистал с ним книжечку и был довольно хорошо знаком. Но делать с ним то, что я хотел, было бы чем-то новым.

Я хотел запустить Пи без головы и заставить его делать свое дело без вмешательства. Это заняло некоторое время, чтобы настроиться, но мне понравилось учиться ssh, и я почувствовал себя хакером!

Но мне нужна была правильная обработка ошибок. Не было ничего особенного в том, чтобы перезапустить его на моем ноутбуке, но я просто сделал это намного сложнее для меня, чтобы перезапустить программу, если она действительно выйдет из строя.

 def run(self):
          try:
              self.get_subs()
          except praw.errors.RateLimitExceeded as error:
              print('\tSleeping for %d seconds' % error.sleep_time)
              time.sleep(error.sleep_time)
          except requests.exceptions.ConnectionError as error:
              self.wait(error)
          except KeyboardInterrupt:
              raise
          except:
              self.wait('')

          self.save_cache()
          self.wait("All Subreddits checked.")

Ключевые уроки

Когда я взялся за этот проект, я понятия не имел, что он научит меня так многому, я просто думал, что это будет весело. И это действительно было так!

Я научился писать чистый ООП на Python и укрепил свой ООП в целом. Я научился правильно обрабатывать ошибки. И я научился запускать скрипты на безголовом Raspberry Pi!

Советы и рекомендации

Еще одна вещь, которой это научило меня, – насколько ценными могут быть побочные проекты за пределами обычной области знаний. Будучи ведущим мировым преподавателем в Генеральной Ассамблее, я всегда поощрял своих студентов пробовать создавать вещи, выходящие за рамки веб-разработки, и пробовать вещи, которые просто звучат весело. Это фантастический способ учиться.

Заключительные мысли и следующие шаги

За четыре года программирования этот крошечный, простой проект был одним из самых веселых, которые я когда-либо строил сам. Я всегда стараюсь помнить, что, если я чувствую себя выжженным, лучше всего попробовать построить забавный маленький проект на необычной территории.

Вы можете проверить код для всех этих вещей, которые я упомянул на своем Github.

spirit_of_mckenna оба: https://gist.github.com/awhit012/089a54b09a53ee389827 bot_mother, шаблон reddit reply bot: https://gist.github.com/awhit012/13ccc026089c2c48d50c reddit_scrub: https://gist.github.com/awhit012/82120ea9c1457fa589f6

Хорошего вам дня, и пусть ваши ошибки будут немногочисленны и легки для понимания!