Skoro wszystko już gotowe, to co jeszcze zostało? Dwie rzeczy, które wydawały się niesamowicie proste, ale jednak takie nie były:
- Pobieranie komentarzy z Instagrama
- Ostateczna instalacja na wystawie
Co może być trudnego w pobieraniu komentarzy z jednego z popularniejszych internetowych molochów? Zwykle każdy taki serwis posiada banalnie łatwe w użyciu API które w kilka sekund zwróci nam to, czego chcemy. Najtrudniejszą przeszkodą na drodze do ich użycia jest najczęściej zdobycie klucza, za pomocą którego serwis identyfikuje pobierającego dane. Mimo tego, cały proces od początku do zdobycia danych to zwykle kilka minut.
Instagram takie API posiadał, ale kilka miesięcy temu zostało ono całkowicie wyłączone – zamiast tego zostało ono sprzęgnięte z dziełem które mógł stworzyć tylko kompletny psychopata – systemem Facebook Graph.

Facebook Graph to moloch posiadający dane o chyba wszystkim czym zarządza demoniczne imperium Marka Zuckerberga. O ile same jego użycie w celu zdobycia komentarzy pod postem z Instagrama jest dość jasno wyjaśnione, to zdobycie artefaktów do tego potrzebnych jest skomplikowaną grą przygodową której niestety nie ukończyłem.
Zdobycie klucza API jest w bardzo dziwny sposób utrudnione, podobnie jak wyciągnięcie identyfikatora postu z Instagrama którego oczekuje Graph. Identyfikator nie ma nic wspólnego z adresem postu (ale czasami ma) i na dzisiaj najpewniejszą metodą na jego zdobycie jest wydobycie go z kodu HTML posta którego chcemy zbadać.
Kiedy już te wszystkie dane miałem, okazało się że i tak nie zdobędę komentarzy dopóki nie dostarczę Facebookowi ikony, polityki prywatności i kilku innych informacji – dopiero wtedy zespół pracowników oceni, czy prawa do czytania komentarzy z Instagrama można mi przyznać.
Zamiast korzyć się przed dewastatorem Internetu poszedłem inną drogą – wyłuskanie ostatniego komentarza ze strony internetowej Instagrama z pomocą BeautifulSoup zajęło mi około 10 minut (6 razy mniej niż cała zabawa z Graphem).
def last_comment(postid):
data = requests.get('https://instagram.com/p/'+postid).text
soup = BeautifulSoup(data)
scripts = soup.find_all('script')
try:
graph = None
for x in scripts:
if 'edge_media_to_comment' in x.text:
js = x.text[x.text.find('{'):x.text.rfind(';')]
j = json.loads(js)
return j['entry_data']['PostPage'][0]['graphql']['shortcode_media']['edge_media_to_comment']['edges'][-1]['node']['text']
except:
pass
Pozostało przetestować cały skrypt w ostatecznej formie. Urządzeniem sterującym został leciwy laptop Samsung NC10 na którym doskonale radzi sobie najnowszy Debian (wciąż wspierający architekturę i686). Skrypt został skonfigurowany jako usługa systemd uruchamiana przy starcie systemu i automatycznie resetowana w wypadku błędu:
[Unit]
Description=Tablica LED
Wants=network-online.target
After=network-online.target
[Service]
WorkingDirectory=/home/led/led
ExecStart=/home/led/led/set.py
Restart=always
RestartSec=3
User=root
[Install]
WantedBy=multi-user.target
Uruchamianie usługi jako root z katalogu użytkownika może nie jest najelegantsze, ale na potrzeby wystawy spełnia swoje zadanie. Skrypt przetestowałem na chyba najlepszym wejściu – poście jednej z Instagramowych gwiazdeczek które dostają tysiące komentarzy pod każdym nowym postem – w różnych językach i pełnych emotek.

Działa znakomicie, komentarze sprawdzane są co 30 sekund i po kilku godzinach nie było widać żadnych śladów blokowania ruchu ze strony Instagrama. Czy wszystko gotowe? Prawie. Wśród autorów wystawy pojawił się pomysł podłączenia drugiej tablicy, która miała wyświetlać teksty z innego źródła, np. lokalnie zainstalowanego tabletu.
Wybrałem się więc do sklepu po niestandardowy kabel USB A↔A – dostałem go bez problemów w najbliższym elektronicznym za 10 złotych. Kiedy zacząłem wkładać go do gniazda w drugiej tablicy zdarzyło się coś czego w życiu bym się nie spodziewał – tablica zgasła, po chwili zaczęła wydobywać się z niej strużka dymu i pomieszczenie zaczęło wypełniać się swądem palonej elektroniki.

Dlaczego?! Jak duży prąd musiał popłynąć, żeby wywołać dym? I gdzie było spięcie? Druga strona przewodu nie była podłączona! Kable sprawdziłem miernikiem – jedyna różnica w ich budowie była w połączeniu osłony wtyczki, sam kabel nie miał żadnego zwarcia. Tablica na szczęście dalej działała, ale teraz musi być już ciągle połączona kablem (oryginalnym) z komputerem.
Usunąłem metalowe osłony z dwóch stron kabla, ale nie przetestowałem tej modyfikacji – autorzy wystawy nagle zrezygnowali z uruchomienia drugiej tablicy. W wolnej chwili zajrzę do jej wnętrza, ciekawi mnie co spaliłem i jak to naprawić.
Dzięki rezygnacji z drugiej tablicy projekt się uprościł i jednocześnie zakończył. Po zakończeniu wystawy postaram się lepiej przebadać protokół sterowania i udostępnię go szerzej – być może pozwoli to komuś jeszcze wskrzesić do życia jakąś tablicę, do której już dawno zaginęło oryginalne oprogramowanie. A może nawet przyda się, kiedy XYLED przestanie działać z nowszymi wersjami Windows.