Discord-бот THN

Репозиторій GitHub проєкту

профіль

Під час навчання в коледжі, і навіть зараз, я та майже всі мої друзі використовуємо Discord як одну з наших основних платформ для соціального обміну повідомленнями. Тоді, і навіть зараз, я хочу бути в курсі новин із кібербезпеки. Тому я подумав, що для розважального проєкту я та мій друг зробимо Discord-бота, який буде перепощувати новини про кібербезпеку з The Hacker News у Discord-сервер. Я представив ідею своєму другу, і йому вона дуже сподобалася, тож ми почали її реалізовувати.

The Hacker News (THN) — це сайт новин про кібербезпеку. Зараз THN це НЕ Hacker News. Було деяке обговорення щодо того, що назва “The Hacker News” дуже схожа на “Hacker News” — дуже популярний і легендарний сайт соціальних новин, який зосереджений на технічному підприємництві. Але, як людина, яка постійно користується The Hacker News, я вважаю, що The Hacker News — хороший джерело новин про кібербезпеку.

Працюючи над цим проєктом, я зіткнувся з викликом — потрібно було знайти спосіб витягувати новини з THN. Єдиними доступними варіантами були або використання Twitter API, або веб-скрейпінг THN. Я деякий час намагався налаштувати Twitter API, але здався, бо Twitter ускладнив налаштування і використання свого API. Тому я звернувся до веб-скрейпінгу THN. Оскільки кодова база мала бути написана на Python, я використав requests та beautifulsoup4 для веб-скрейпінгу.

Коли скрейпер запрацював, наступною задачею був Discord-бот. Створити та розгорнути Discord-бота дуже просто. Тому ми швидко запустили бота менш ніж за день. Також ми налаштували сам Discord-сервер у цей проміжок часу.

Однією з функцій, яку ми додали, була функція “фільтри”. Ця функція сортувала статті THN за тим, чи належали вони до “apple-news”, “google-news”, “linux-news” та/або “microsoft-news”. Вона сортувала ці типи новин у відповідні канали. Також був канал “all”, який містив усі статті, але ми вважали цю функцію корисною, оскільки вона певною мірою впорядковувала типи новин і не була надто складною у реалізації.

Беручи до уваги все вищесказане, загальна ідея роботи Discord-бота була така:

  1. Щогодини він скрейпив THN і витягував ключову інформацію про статтю. Ця інформація включала: заголовок, деталі, дату та URL статті.
  2. Бот потім перевіряв свою історію повідомлень на сервері, щоб з’ясувати, які зі статей, які він скрейпив, є новими. Це забезпечує, що бот не перепощує статті, які він уже опублікував.
  3. Він фільтрував нові статті за певними темами, як описано вище.
  4. Зібравши та відфільтрувавши всі статті, бот публікував URL кожної статті у свій Discord-сервер, а також у відповідні канали.
  5. Після всього цього бот чекав ще годину, щоб повторити ті самі кроки знову.

У підсумку, discord-бот був написаний повністю на Python і використовував наступні сторонні пакети: beautifulsoup4, requests, discord.py і python-dotenv. Також Discord-бот хостився на моєму Raspberry Pi 3 B+, який працював на 32-бітній Raspberry Pi OS Lite. Ми запускали бота ось так:

# run the bot in the background
python3 bot.py &

Після того, як ми налаштували бота та сервер, ми поділилися нашим проєктом з усіма нашими друзями та однокласниками. За тиждень до сервера приєдналося приблизно 25 людей.

Але через кілька місяців ми помітили, що люди насправді не використовують сервер, і більшість з них або покинули сервер, або вимкнули звук у всіх каналах сервера. Основною причиною цього було те, що більшості користувачів хотілося більш персональних і налаштовуваних опцій фільтрації, а також більшість з них не дуже цікавилися кібербезпекою.

Через це ми вирішили закрити Discord-сервер. Цей проєкт тривав з лютого 2022 року по травень 2022 року, офіційно закрившись 25 травня 2022 року. У цей день ми зупинили бота, видалили Discord-сервер, видалили обліковий запис Discord-бота, створений для цього проєкту, і зробили код повністю відкритим у цьому репозиторії GitHub.

У підсумку. Це був цікавий проєкт, і ми багато чому навчилися. Також, на той час ми цього не знали, але цей проєкт став початковою версією для нашого наймасштабнішого проєкту… Notify-Cyber!