Максим Данилин, 16.08.2021

Как сделать счётчик подписчиков Instagram

Введение

Привет!

В этой инструкции мы расскажем, как сделать крутой счётчик подписчиков вашего аккаунта в соцсети Instagram!

Мы решили сделать счётчик подписчиков именно для Instagram, а не Youtube или TikTok, потому что аккаунт в Instagram есть у подавляющего большинства пользователей смартфонов. Для некоторых людей соцсеть Instagram — это не только место, где можно поделиться своими фотографиями с друзьями и близкими людьми, но и неотъемлемая часть жизни. Люди открывают бизнес в Instagram, ведут блоги или просто создают популярные аккаунты. Для всех них количество подписчиков аккаунта очень важно, и они стараются следить за этим показателем. Так и появилась у нас идея выводить количество подписчиков на какое-нибудь внешнее устройство или дисплей, чтобы не заходить каждый раз в приложение.

Наш счётчик подписчиков отличается от других подобных устройств тем, что он большой, настенный, со звуковыми эффектами и уникальным красочным корпусом, напечатанным на 3D-принтере и оформленном в стиле логотипа сети Instagram.

Мы будем выводить на счётчик количество подписчиков русскоязычного аккаунта компании Амперка — amperkaru. Разумеется, вы сможете выводить количество подписчиков любого интересующего вас аккаунта.

Исходный код проекта, аудиофайлы и CAD-файлы мы выложили в репозитории instagram_subscriber_counter на GitHub.

Как получить количество подписчиков

Получить количество подписчиков канала Instagram и автоматизировать этот процесс — задача интересная. Для создания счётчика нам постоянно нужна актуальная информация о количестве подписчиков канала. Если вдруг кто-то отписывается или подписывается на канал, мы хотим узнавать об этом сразу, а не спустя сутки.

Прежде всего у нашего счётчика подписчиков должен быть доступ к интернету. На ум приходят микроконтроллеры типа ESP32 или ESP8266, но они нам тут не помогут.

Ранее у интернет-сервиса Instagram был свой открытый и бесплатный API — Instagram API. Используя его, пользователи и разработчики приложений могли спокойно получить количество подписчиков аккаунта, распарсив подготовленный сервером ответ в формате JSON на простой HTTP GET-запрос. Отправить GET-запрос можно было даже с контроллеров типа ESP32 или ESP8266.

Однако с 29 июня 2020 года официальная поддержка этого API закончилась. Сам Instagram API разделился на два: Instagram Basic Display API и Instagram Graph API. Первый, Basic Display API — бесплатный, но имеет крайне ограниченную функциональность. Получить через него количество подписчиков аккаунта невозможно. Эти данные можно получить только используя платный Instagram Graph API. Кроме этого, для получения статистики вы должны быть гордым обладателем бизнес-аккаунта в Instagram и аккаунта разработчика Facebook, ведь с 2012 года платформа Instagram принадлежит Facebook. Помимо того факта, что сервис является платным, процесс генерации ключей и использования Instagram Graph API крайне сложен для обычного пользователя. Вы можете сами убедиться в этом, взглянув на официальную документацию.

Как же получить количество подписчиков аккаунта, не вникая во все эти сервисы и не тратя деньги? Это можно сделать, используя Веб-скрейпинг (Page Scraping). Количество подписчиков аккаунта — это не какая-то тайная и засекреченная информация. Эти данные можно увидеть, просто зайдя на страничку нужного вам аккаунта в браузере или открыв профиль аккаунта в приложении Instagram. Разумеется, сам аккаунт, в котором вы хотите узнать число подписчиков, должен быть открытым, а не приватным. Но и здесь есть свои тонкости.

Во-первых, вы сами должны войти в систему Instagram, иначе вы не сможете получить ответ на запрос страницы интересующего вас пользователя. Без аутентификации сервер ответит кодом 301 и сделает редирект на страницу логина. Во-вторых, для получения актуального количества подписчиков нам нужно постоянно отправлять запросы на сервер для обновления информации на странице аккаунта. Если запросы будут поступать слишком часто и отправляться с подозрительных устройств без браузера, сервер просто забанит нас или сделает редирект на капчу. Поэтому реализовать Page Scraping, используя микроконтроллеры семейства ESP, очень тяжело.

Выход — использовать качественного инстаграм-бота, который будет сам логиниться в Instagram или использовать полноценный автоматизированный веб-браузер. И такие боты есть, например: InstaPy или Instabot.

Мы решили использовать популярного бота InstaPy, написанного на Python. Для этого нам нужна операционная система — а значит, вместо микроконтроллеров для воплощения проекта мы возьмём одноплатный компьютер Raspberry Pi.

Шаг 1. Что понадобится

Электронные компоненты

Разберёмся, какие электронные компоненты нам понадобятся.

Это важно! Не все описанные ниже электронные компоненты необходимы вам для создания своего счётчика подписчиков. Например, вы можете не добавлять звуковые эффекты в ваш счётчик или использовать блок питания на 5 В вместо 12 В. Ваш счётчик подписчиков может быть простым, а может быть супер-навороченным — всё зависит только от вас! С Raspberry Pi на счётчике можно запустить множество других полезных программ. Далее мы расскажем об электронных компонентах, которые мы использовали конкретно в этом проекте.

Raspberry Pi

Мозгом нашего счётчика подписчиков будет одноплатный компьютер Raspberry Pi 4 Model B с 2 ГБ RAM.

step_1_raspberry

C помощью платы Raspberry Pi можно выйти в сеть интернет, запустить Instagram-бота на Python, реализовать звуковые эффекты, а также использовать контакты GPIO для вывода данных.

Вы можете использовать любой одноплатник Raspberry Pi с произвольным объёмом оперативной памяти. Например, Raspberry Pi Zero, Pi 3 Model B или Pi 3 Model A.

В качестве операционной системы для одноплатника мы возьмём официальную Raspberry Pi OS (Debian 10 Buster). Сами ничего устанавливать и прошивать не будем, а просто возьмём карту microSD с предустановленной Raspberry Pi OS.

Семисегментные индикаторы

Для отображения числа подписчиков мы будем использовать семисегментные индикаторы SegM8.

step_1_segm8s

Модули SegM8 большие, яркие, управляются через единый интерфейс SPI, и легко объединяются в большое табло.

SegM8 имеют два режима яркости: штатный и экономный. При экономичном режиме один семисегментный индикатор питается напряжением 3,3–5 В и потребляет 50 мА. В штатном режиме модуль питается напряжением от 5 до 12 В и потребляет до 300 мА. Мы запитаем наши индикаторы напряжением 12 В.

Мы возьмём четыре таких модуля, то есть наш счётчик будет четырёхразрядный. У Instagram-аккаунта amperkaru, за которым мы будем следить, пока что четырёхзначное число подписчиков, и до пятизначного ему ещё далеко.

Выбирайте количество модулей SegM8, исходя из количества разрядов максимального предполагаемого числа подписчиков. В этом проекте мы подготовили для вас документацию для четырёхразрядного и пятиразрядного счётчика.

Узнать больше о работе с модулями SegM8 можно в инструкции на Wiki Амперки.

Блок питания

Чтобы наш счётчик подписчиков работал непрерывно, ему нужно стационарное питание. Для этого мы возьмём встраиваемый блок питания Mean Well RS-25-12 на 12 В и 25 Вт.

step_1_ac_dc

Мы сможем разместить компактный блок питания прямо в корпусе счётчика.

Выходная мощность источника питания — 25 Вт. При максимальной нагрузке плата Raspberry Pi 4 Model B потребляет 15 Вт (5 В × 3 А). Максимальный ток потребления для четырёх индикаторов SegM8 — 1,2 А (4×300 мА), а потребляемая ими мощность при работе от 12 В равна 14,4 Вт (12 В × 1,2 А). Суммарная мощность равна 29,4 Вт. Однако все эти значения — предельные. В действительности потребление семисегментных индикаторов меньше. Плата Raspberry Pi также будет потреблять гораздо меньше, ведь мы не будем вести на ней сложных вычислений. Поэтому блока питания на 25 Вт нам хватит, хоть и впритык.

Для блока питания нам понадобится сетевой кабель 220 В.

step_1_ac_cable

Подойдёт практически любой кабель питания. Шнур можно отрезать от ненужного или неработающего домашнего электроприбора.

Troyka HAT

На плату Raspberry Pi мы установим плату расширения Troyka HAT.

step_1_troyka_hat

Мы используем Troyka HAT прежде всего из-за понижающего преобразователя напряжения DC-DC, который приводит 12 В с нашего блока питания к 5 В для платы Raspberry Pi. Помимо преобразования напряжения с Troyka HAT мы сможем удобнее подключаться к контактам GPIO на Raspberry.

Электроника для звуковых эффектов

Прежде всего для звуковых эффектов нам нужны динамики. Мы используем два динамика HSP3040A с импедансом 8 Ом.

step_1_speakers

Два динамика — для стереозвука. Корпуса данных динамиков имеют удобные монтажные отверстия, и их будет легко установить на счётчик. Максимальная мощность одного динамика — 2 Вт.

Динамики мы подключим к усилителю звука класса D в формате одноюнитового Troyka-модуля.

step_1_amplifier

Простой, но эффективный двухканальный усилитель звука класса D даст нам стереозвук с выходной мощностью 1,5 Вт на канал. Общая мощность звука на нашем счётчике — 3 Вт. Его громкость будет сопоставима с громкостью динамиков ноутбука.

Напряжение питания усилителя — 5 В, а ток потребления до 1 А в пиках. Питание 5 В можно взять с колодок Troyka HAT, но мы решили разделить питание звука с питанием Raspberry и использовать отдельный понижающий преобразователь DC-DC в формате одноюнитового Troyka-модуля.

step_1_dc_dc

Для удобного крепления двух Troyka-модулей к корпусу счётчика мы используем плату-переходник Troyka Pad 1×2.

step_1_troyka_pad

Генерировать звук мы будем без дополнительных звуковых карт, а через 3,5-миллиметровый разъём на плате Raspberry Pi. То есть мы будем использовать не цифро-аналоговый преобразователь, а аппаратный ШИМ-сигнал. Качество звука нам не критично — главное, чтобы счётчик был достаточно громкий и его можно было услышать из любой точки помещения.

Чтобы не паять разъём мини-джек 3,5 мм вручную, воспользуемся TRS-штекером с клеммником.

step_1_mini_jack

Провода

Как и всегда, нам нужно немного проводов разного сечения.

step_1_wires

Для подвода питания к Troyka HAT пригодится силовой 2,1-миллиметровый штекер питания. Можно взять штекер с клеммниками, штекер без клеммников или отрезать штекер от кабеля питания от Кроны.

Для подключения динамиков к усилителю вместо обычных проводов лучше использовать акустические провода.

Метизы

Также нам понадобится немного крепежа. В проекте мы используем обычные гайки и винты с цилиндрической головкой и внутренним шестигранником. Крепёж оцинкованный или нержавеющий — не важно.

  • 16× Винт М3×10 DIN 912
  • 22× Винт M4×40 DIN 912
  • 16× Винт М5×16 DIN 912
  • 14× Гайка М3 DIN 934
  • 22× Гайка М4 DIN 934

Крепёж стандартный, и его можно найти в хозяйственном или автомобильном магазине.

Шаг 2. Схема подключения

С электронными компонентами мы определились, теперь разберёмся, как это всё подключить.

step_2_wiring_scheme

Подключаем сетевой кабель 220 В к блоку питания. Линию 12 В с блока питания ведем на:

  • cемисегментные индикаторы SegM8;
  • на Troyka-преобразователь DC-DC для понижения напряжения до 5 В;
  • на Troyka HAT через 2,1-миллиметровый штекер.

Два динамика подключаем акустическими проводами к винтовым клеммам Troyka-усилителя звука. Один динамик на левый канал к колодкам L+ и L-, второй динамик — на правый канал к колодкам R+ и R-. Усилитель звука запитываем от 5 В с Troyka-преобразователя DC-DC. К усилителю звука подключаем разъём TRS через трёхпроводной шлейф «мама-мама».

Модули SegM8 подключаем пятью проводами к указанным контактам Troyka HAT:

  • Линию VCC модуля SegM8 к шине 5 В.
  • Линию GND модуля SegM8 к шине GND.
  • Линию CLK интерфейса SPI модуля SegM8 к шине SCK.
  • Линию DI интерфейса SPI модуля SegM8 к шине MOSI.
  • Линию CS интерфейса SPI модуля SegM8 к пину Wiring Pi 10.

Шаг 3. Дизайн счётчика

Сперва мы придумали, как будет выглядеть наш счётчик подписчиков, и смоделировали все его детали в SolidWorks. При желании вы можете изменить модель счётчика под себя — все исходники хранятся в репозитории instagram_sub_counter.

Идея следующая: мы напечатаем корпус счётчика на FDM 3D-принтере, а затем оформим его, покрасив в цвета логотипа Instagram.

Чтобы корпус влез в область печати 3D-принтера, а также для экономии пластика и минимизации поддержек мы разбили корпус на шесть частей:

  • Передняя левая (3D-деталь BODY_LEFT_TOP)
  • Передняя центральная (3D-деталь BODY_CENTER_4_TOP)
  • Передняя правая (3D-деталь BODY_RIGHT_TOP)
  • Задняя левая (3D-деталь BODY_LEFT_BOTTOM)
  • Задняя центральная (3D-деталь BODY_CENTER_4_BOTTOM)
  • Задняя правая (3D-деталь BODY_RIGHT_BOTTOM)

Между собой части корпуса соединяются винтами и гайками. Причём все эти соединения — скрытые, а гайки — закладные. Крепёж деталей корпуса сделан так, чтобы при взгляде на счётчик не было видно винтов и отверстий.

На лицевой стороне счётчика в правой части мы разместили семисегментные индикаторы, а в левой — составной логотип Instagram.

Логотип Instagram состоит из трёх белых напечатанных деталей:

  • Объектив (3D-деталь INSERT_0)
  • Вспышка (3D-деталь INSERT_1)
  • Рамка (3D-деталь INSERT_2)

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

Весь счётчик получился размером 550×167 мм.

step_3_counter_design_1

На задней стороне счётчика мы разместим всю нашу электронику. Мы подготовили в корпусе крепёжные отверстия для блока питания, платы Raspberry Pi, динамиков и Troyka Pad.

В верхней части корпуса сзади мы добавили две проушины для настенного монтажа счётчика.

step_3_counter_design_2

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

Шаг 4. 3D-печать

Напечатаем все детали.

У нас в распоряжении два принтера: Creality Ender-3 V2 и Prusa i3 MK3S.

Вы можете использовать практически любой FDM-принтер с минимальной областью печати 200×200 мм. Мы специально спроектировали детали корпуса счётчика так, чтобы они уместились на любом распространённом домашнем 3D-принтере.

Мы печатаем детали из PLA-пластика, поскольку его легче покрасить.

Для деталей логотипа Instagram нам понадобится примерно 63 грамма белого пластика. Мы использовали белый PLA-пластик eSUN.

Печатаем три детали с толщиной слоя в 0,15 мм, заполнением 60%, юбкой и стандартными поддержками.

step_4_print_1

Для корпусных деталей счётчика суммарно понадобится примерно 881 грамм пластика любого цвета. Мы печатали корпусные детали из катушек PLA-пластика FDplast разных цветов, которые были под рукой.

step_4_print_2

Корпусные детали печатаем с толщиной слоя в 0,3 мм, заполнением 10%, юбкой и стандартными поддержками.

step_4_print_3

Вот такие у нас получились детали:

Все напечатанные детали нужно обработать. Удалить все поддержки, подложки, очистить пазы под закладные гайки, удалить образовавшиеся при печати нити. Затем нужно как следует зачистить мелкозернистой наждачкой все поверхности. Также желательно вывести в размер все отверстия для крепежа. При большой усадке пластика крепёжные отверстия можно рассверлить 3-, 4- и 5-миллиметровым сверлом.

Можно примерить между собой все шесть деталей. Задние с задними, лицевые с лицевыми.

step_4_print_12

Желательно, чтобы детали корпуса получились более-менее одинаковые и между ними не было резких переходов.

Шаг 5. Покраска

Начнём покраску деталей.

Мы хотим, чтобы наш счётчик имел уникальный дизайн с оформлением в цветах логотипа Instagram. Порывшись в интернете, мы узнали, из каких RGB-цветов состоит логотип Instagram. Всего пять компонентов.

step_5_paint_1

Можно покрасить PLA-пластик густой акриловой краской для моделизма, той самой, которой красят миниатюры. Однако найти модельную краску таких цветов практически невозможно. Ещё лучше покрасить пластик автомобильной акриловой краской для пластика в баллонах с подбором цвета. Но нам нужны опредлённые редкие цвета, а цена за колеровку таких баллонов очень высока.

Мы решили взять обычную акриловую краску для стен. Нужные цвета мы заколеровали в строительном магазине.

step_5_paint_2

Но и даже там никто не сможет сделать вам краску именно нужного RGB-цвета, а лишь приближённого к нему. Мы подобрали ближайшие аналоги для наших RGB-цветов по каталогу NCS (Natural Color System):

  • #515BD4 — NCS S 2060-R70B
  • #8134AF — NCS S 2050-R50B
  • #DD2A7B — NCS S 1070-R20B
  • #FEDA77 — NCS S 0540-Y10R
  • #F58529 — NCS S 1070-Y40R

Мы взяли по 250 мл краски каждого цвета.

step_5_paint_3

Просто так нанести краску на PLA-пластик не получится — она сразу слезет. Нужна грунтовка. Для грунтовки мы использовали автомобильную грунт-эмаль по пластику KUDA серого цвета. Найти такую эмаль очень легко в больших магазинах автозапчастей. Одного баллона на наш счётчик более чем достаточно.

step_5_paint_4

Грунтуем все корпусные детали. Грунтовать можно только с лицевой стороны — там, где будет краска. Чем больше слоёв грунта вы нанесёте — тем лучше ляжет краска и тем лучше вы скроете на детали слои 3D-печати. После грунтовки оставляем сохнуть детали на пару часов.

step_5_paint_5

Следующий вопрос — чем красить детали? Можно покрасить кисточками или аэрографом. Корпус счётчика довольно большой, и для экономии времени мы решили покрасить детали автомобильным пневматическим краскопультом.

step_5_paint_6

Если краска слишком густая — разбавьте её обычной водой, но не переборщите, разбавляйте по чуть-чуть. Слишком разбавленная краска не ляжет на загрунтованную поверхность, а просто стечёт с неё или засохнет большими некрасивыми каплями.

step_5_paint_7

Сперва мы покрасили все шесть деталей корпуса в один сплошной цвет #DD2A7B — оттенок фона логотипа Instagram. Первый раз мы слишком сильно разбавили краску водой, так что её пришлось смыть. Второй раз более густая краска легла как нужно, и мы оставили детали сохнуть на сутки.

step_5_paint_8

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

После покраски мы покрыли все детали прозрачным акриловым лаком, который добавляет блеска и яркости нашим цветам, а также защищает покрытие от царапин и влаги. Мы использовали глянцевый лак Bosny Spray Paint.

step_5_paint_13

Даём лаку просохнуть ещё часа два, и лакокрасочное покрытие деталей готово!

Весь процесс покраски мы записали на видео:

Шаг 6. Сборка корпуса

Можем приступать к сборке!

Сборка левой части корпуса

В переднюю левую напечатанную часть корпуса (BODY_LEFT_TOP) вставляем белые напечатанные детали логотипа Instagram (INSERT_0, INSERT_1, INSERT_2).

step_6_assemble_1

Перевернём переднюю левую часть корпуса (BODY_LEFT_TOP) и установим в неё пять закладных гаек M4.

step_6_assemble_2

Соединяем переднюю левую часть корпуса (BODY_LEFT_TOP) с задней левой частью корпуса (BODY_LEFT_BOTTOM). Две половинки корпуса закрепляем пятью винтами M4×40.

step_6_assemble_3

Сборка центральной части корпуса

В переднюю центральную часть корпуса (BODY_СENTER_4_TOP) по бокам устанавливаем четыре закладные гайки М4.

step_6_assemble_4

Соединяем переднюю центральную часть корпуса (BODY_СENTER_4_TOP) с задней центральной частью корпуса (BODY_СENTER_4_BOTTOM). Две половинки корпуса закрепляем четырьмя винтами M4×40.

step_6_assemble_5

В пятиразрядной версии счетчика процесс сборки центральных корпусных деталей (BODY_СENTER_5_TOP и BODY_СENTER_5_BOTTOM) аналогичный.

Сборка правой части корпуса

В переднюю правую часть корпуса (BODY_RIGHT_TOP) устанавливаем пять закладных гаек М4.

step_6_assemble_6

Соединяем переднюю правую часть корпуса (BODY_RIGHT_TOP) с задней правой частью корпуса (BODY_RIGHT_BOTTOM). Две половинки корпуса закрепляем пятью винтами M4×40.

step_6_assemble_7

Финальная сборка корпуса

Теперь соединим все три собранные части корпуса — левую, центральную и правую. Корпуса соединяются восемью винтами и гайками М4. Данный крепёж скрыт в корпусе, так что для затягивания гаек понадобится шестигранный ключ на 3 мм, гаечный ключ на 7 мм и, возможно, ловкость рук.

step_6_assemble_8

Вот так выглядит корпус нашего счётчика в собранном виде:

step_6_assemble_9

Весь процесс сборки корпуса мы записали на видео:

Шаг 7. Установка электроники

Установим электронику в корпус нашего счётчика. Сперва поставим блок питания Mean Well.

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

Блок питания крепится на задней стенке левой части корпуса двумя винтами М3×10.

step_7_assemble_1

Установим звук в корпус.

В центральную часть корпуса поставим два динамика HSP3040A. Каждый динамик крепится четырьмя винтами М3×10 и гайками М3. Лицевая сторона динамика должна находиться на задней части корпуса счётчика.

step_7_assemble_2

Также на центральной части корпуса закрепим двойной Troyka Pad двумя винтами М3×10 и гайками М3 через два центральных отверстия.

В Troyka Pad вставляем Troyka-усилитель звука и DC-DC преобразователь. Troyka-модули удобнее разместить на Troyka Pad клеммниками наружу.

step_7_assemble_3

Установим в корпус плату Raspberry Pi 4. Она крепится в корпусе четырьмя винтами М3×10 и гайками М3. На плату Raspberry устанавливаем Troyka HAT.

step_7_assemble_4

Установим модули SegM8.

Перед установкой всех индикаторов в корпус счётчика их нужно соединить между собой в единую цепочку.

step_7_assemble_5

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

step_7_assemble_6

Вставляем собранные индикаторы в корпус счётчика с лицевой стороны. С задней стороны корпуса закрепляем индикаторы шестнадцатью винтами М5×16 — по четыре на каждый индикатор.

step_7_assemble_7

Для красоты все провода на задней стенке счётчика можно скрепить кабельными стяжками.

Электроника установлена, подключена, и наш счётчик обретает свой законченный вид.

Весь процесс сборки и установки электроники мы записали на видео:

Шаг 8. Программа

Железо нашего счётчика собрано, теперь приступим к софту.

Исходный код для этого проекта мы разместили в GitHub-репозитории instagram_subscriber_counter.

Здесь мы не будем описывать основы работы с платой Raspberry Pi. Базовую информацию вы можете узнать из Wiki-статьи про начало работы с Raspberry Pi.

Мы подключили плату Raspberry Pi к нашей сети Wi-Fi и выделили ей IP-адрec, чтобы не искать её в сети. Наш счётчик подписчиков — настенный, поэтому к нему не будут подключаться ни дисплей, ни клавиатура, ни мышь. Так что рулить Raspberry мы будем с настольного компьютера по SSH.

Для получения количества подписчиков мы используем Instagram-бота InstaPy. А значит, программу мы будем писать на Python.

Устанавливаем InstaPy. Инструкцию по установке вы найдёте в официальной документации. Установка бота на Raspberry отличается от установки на настольный компьютер. Кроме этого для установки бота нужно множество сторонних пакетов и библиотек, в частности для автоматированной работы Web-браузера. В документации на InstaPy есть подробная инструкция по установке именно на Raspberry Pi. Просто следуйте этой инструкции, и всё получится.

Для управления семисегментыми индикаторами SegM8 имеется Python-библиотека SegM8Pi. Установим её на Raspberry, используя pip:

python3 -m pip install segm8

Модули SegM8 управляются через интерфейс SPI, и нам нужно сделать его доступным для ввода-вывода в настройках Raspberry командой:

sudo raspi-config

В меню «Interface Options → SPI» устанавливаем значение Yes.

step_8_program_1

Звуковые эффекты проще всего воспроизводить средствами операционной системы Raspberry Pi OS, обычным аудиоплеером. Мы выбрали легковесный консольный аудиоплеер mpg123. Устанавливаем его командой:

sudo apt-get install mpg123

У платы Raspberry нет звуковой карты. Аудио генерируется аппаратным ШИМ-сигналом, а для вывода звука по умолчанию доступно два устройства — 3,5-миллиметровый разъём для наушников и HDMI-порт. В операционной системе список всех доступных для вывода звука устройств можно посмотреть командой:

aplay -l

step_8_program_2

Мы будем использовать карту card 1 и устройство bcm2835 Headphones. По умолчанию звук выводится через HDMI-порт, а нам нужен 3,5-миллиметровый разъём. В настройках raspi-config в меню «System Options → Audio» устанавливаем значение 1 Headphones.

step_8_program_3

Установим уровень громкости на разъёме для наушников в максимальное значение 100.

alsamixer

step_8_program_4

Подберём забавные звуковые эффекты нашему счётчику.

В качестве звуковых эффектов будем использовать короткие MP3-семплы. Мы взяли звуковые эффекты из онлайн-библиотеки Sound Pack. В ней более 20 тысяч различных звуковых семплов, так что вы наверняка сможете подобрать что-нибудь по душе.

Пусть наш счётчик издает два звука. Звук оваций толпы, если у отслеживаемого канала появились новые подписчики и звук недовольства толпы, если от канала отписались.

Скачиваем аудио файлы и размещаем их где-нибудь в файловой системе Raspberry.

Это важно! Как мы уже говорили ранее, боту InstaPy нужно быть залогиненным в Instagram, то есть он работает от лица какого-либо аккаунта. Использование ботов — не самая одобряемая деятельность в Instagram, аккаунт за это могут забанить. Поэтому не стоит использовать бота на своём основном профиле. Лучше создайте новый пустой аккаунт для активностей бота.

Вот так выглядит наш Python-файл get_followers.py:

#!/usr/bin/env python3

import instapy
from instapy.util import smart_run
from instapy.util import get_relationship_counts
from instapy.util import reload_webpage

import sys
import os
import time
import segm8

INSTAGRAM_USERNAME = 'your_account_name'
INSTAGRAM_PASSWORD = 'your_account_password'
INSTAGRAM_TRACKED_USER_NAME = 'amperkaru'
REQUEST_INTERVAL_SECONDS = 360

segm8_module = segm8.SegM8(0, 4)

subscribers_count = 0
previous_subscribers_count = 0

session = instapy.InstaPy(username=INSTAGRAM_USERNAME,password=INSTAGRAM_PASSWORD, headless_browser=True)

with smart_run(session):
	while True:
		reload_webpage(session.browser)
		subscribers_count, following_count = get_relationship_counts(session.browser,INSTAGRAM_TRACKED_USER_NAME, session.logger)
		print('Subscribers count: ', subscribers_count)
		sys.stdout.flush()

		segm8_module.display_int(subscribers_count, 0, 4, segm8.Align.RIGHT)

		if subscribers_count != previous_subscribers_count:
			if subscribers_count > previous_subscribers_count:
				os.system('mpg123 /home/pi/instagram_subscriber_counter/sound_files/Sound_05810.mp3')
			else:
				os.system('mpg123 /home/pi/instagram_subscriber_counter/sound_files/Sound_05829.mp3')

		previous_subscribers_count = subscribers_count

		time.sleep(REQUEST_INTERVAL_SECONDS)

Как работает программа? Сперва мы объявляем глобальные переменные:

  • INSTAGRAM_USERNAME — имя аккаунта Instagram для бота.
  • INSTAGRAM_PASSWORD — пароль от этого аккаунта.
  • INSTAGRAM_TRACKED_USER_NAME — имя аккаунта Instagram, число подписчиков которого мы хотим узнать.
  • REQUEST_INTERVAL_SECONDS — интервал между GET-запросами на обновление страницы браузера в секундах. Это время, через которое мы сможем получать акутальные данные из Instagram. Мы установили интервал в 5 минут. Не стоит делать интервал слишком коротким — сервер Instagram расценит это как спам и откажет нам в обслуживании. Ещё лучше сделать этот интервал произвольно генерируемым в пределах от пары до десяти и более минут. Так можно снизить вероятность того, что поведение нашего аккаунта примут за бота.

Создаём объект класса SegM8 для работы с семисегментными индикаторами. Первым параметром указываем номер CS пина интерфейса SPI, к которому подключены наши индикаторы. Номер 0 соответствует пину c именем CE0, или иначе 10 пину WiringPi. Номер 1 соответствует пину c именем CE1, или иначе 11 пину WiringPi. Мы подключили линию CS семисегментых индикаторов к десятому пину WiringPi, так что указываем параметр 0. Второй параметр — количество используемых семисегментных индикаторов, объединённых в цепочку. У нас четыре индикатора, поэтому значение второго параметра устанавливаем в 4.

segm8_module = segm8.SegM8(0, 4)

При запуске программы создастся новая сессия браузера без графической оболочки (headless_browser=True), и будет запущена сессия бота от имени указанного вами аккаунта INSTAGRAM_USERNAME.

session = instapy.InstaPy(username=INSTAGRAM_USERNAME,password=INSTAGRAM_PASSWORD, headless_browser=True)

Далее, в бесконечном цикле мы с заданным интервалом REQUEST_INTERVAL_SECONDS:

time.sleep(REQUEST_INTERVAL_SECONDS)

Обновляем текущую страницу в браузере:

reload_webpage(session.browser)

Переходим на страницу нужного нам аккаунта INSTAGRAM_TRACKED_USER_NAME и берём с неё количество подписчиков аккаунта и количество подписей:

subscribers_count, following_count = get_relationship_counts(session.browser, INSTAGRAM_TRACKED_USER_NAME, session.logger)

Полученное количество подписчиков выводим на семисегментные индикаторы с выравниванием по правому краю:

segm8_module.display_int(subscribers_count, 0, 4, segm8.Align.RIGHT)

Eсли подписчиков стало больше, то проигрываем плеером mpg123 MP3-аудиофайл c семплом ликующей толпы. Указываем абсолютный путь до аудиофайлов:

if subscribers_count > previous_subscribers_count:
	os.system('mpg123 /home/pi/instagram_subscriber_counter/sound_files/Sound_05810.mp3')

Если подписчиков стало меньше — значит, кто-то от нас отписался, и воспроизводится звук негодования толпы.

else:
	os.system('mpg123 /home/pi/instagram_subscriber_counter/sound_files/Sound_05829.mp3')

Переходим в директорию с Python-файлом и запускаем программу командой:

python3 get_followers.py

step_8_program_5

При желании вы можете расширить функциональность программы, как вам угодно.

Шаг 9. Автозапуск

Сейчас мы запускаем наш Python-скрипт вручную по SSH. Но желательно, чтобы скрипт выполнялся при запуске Raspberry Pi автоматически, сразу после того, как мы вставили штекер в розетку.

Автоматический запуск Python-скрипта можно осуществить, используя rc.local или .bashrc. Однако мы решили настроить автозапуск Python-скрипта в сервисе с помощью Systemd. Отдельный сервис позволит нам всегда иметь удобный доступ к процессу сбора подписчиков и позволит не запускать скрипт каждый раз при новой сессии юзера при подключении по SSH.

Сперва сделаем так, чтобы наша Raspberry Pi автоматически логинилась под пользователем pi при загрузке системы. В настройках raspi-config в меню «System Options → Boot / Auto Login» устанавливаем значение B2 Console Autologin. Параметр B4 Desktop Autologin нам не нужен, ведь мы не пользуемся монитором или дисплеем.

step_9_autostart_1

Создадим новый unit-файл для нашего сервиса и отредактируем его. Назовём сервис get-followers-script.service.

sudo touch /etc/systemd/system/get-followers-script.service
sudo nano /etc/systemd/system/get-followers-script.service

В unit-файле создадим следующее описание сервиса:

[Unit]
Description=Get followers start script

[Service]
Type=oneshot
RemainAfterExit=yes
User=pi
ExecStart=/usr/bin/python3 /home/pi/instagram_subscriber_counter/code/InstaPy/get_followers.py

[Install]
WantedBy=multi-user.target

step_9_autostart_2

Про параметры unit-файлов для сервисов можно почитать тут.

Даём сервису какое-нибудь описание:

Description=Get followers start script

Сервис будем запускать от пользователя pi:

User=pi

При старте сервиса запустим наш Python-скрипт. Важно указать абсолютный путь до скрипта:

ExecStart=/usr/bin/python3 /home/pi/instagram_subscriber_counter/code/InstaPy/get_followers.py

В секции [Install] описываем, в каком уровне запуска должен стартовать сервис. Параметр multi-user.target соответствует уровню выполнения init 3 — многопользовательский режим с поддержкой сети без графики.

WantedBy=multi-user.target

Перегружаем демон systemd и перегружаем Raspberry:

sudo systemctl daemon-reload
sudo reboot now

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

sudo systemctl status get-followers-script.service

Python-скрипт должен запуститься без проблем.

step_9_autostart_3

Также мы можем при необходимости остановить сервис, запустить или перезапустить командами:

sudo systemctl stop get-followers-script.service
sudo systemctl start get-followers-script.service
sudo systemctl restart get-followers-script.service

Посмотреть лог работы сервиса можно командой journalctl:

journalctl -u get-followers-script.service

Так как наш сервис запускается на уровне 3, возможны проблемы с выводом звука через 3,5-миллиметровый разъём от пользователя root. Если проблемы возникли, то вы можете настроить вывод звука через разъём для наушников не через raspi-config, а вручную.

Узнаём номер звуковой карты разъёма для наушников:

cat /proc/asound/cards

step_9_autostart_4

Карта разъёма для наушников имеет номер 1. Создаём файл настройки /etc/asound.conf для звуковой подситемы Linux ALSA.

sudo nano /etc/asound.conf

В данный файл помещаем следующие параметры с указанием номера карты:

defaults.pcm.card 1
defaults.ctl.card 1

step_9_autostart_5

Перегружаем Raspberry и проверяем звук.

Заключение

Мы показали основной принцип, как получать данные о количестве подписчиков Instagram и организовать отображение на стильном табло с оперативным обновлением.

На этом наш проект счётчика подошёл к концу, но вы запросто можете экспериментировать с ним дальше и добавлять новые фичи. До встречи!