Zakoduj własne elementy sterujące czatem na Twitchu dla robotów — lub po prostu o cokolwiek innego!

Węzeł źródłowy: 805836

Twitch Plays Pokémon wkroczył na rodzącą się wówczas scenę transmisji na żywo w 2014 roku, pozwalając widzom Twitcha przejąć kontrolę nad emulatorem Game Boya, na którym działa Pokemon Red, za pomocą prostych poleceń na czacie. Od tego czasu tę samą koncepcję zastosowano do wszystkiego pod słońcem. Inne gry wideo, instalowanie Linuksa, a nawet handel na nowojorskiej giełdzie — wszystko to zostało poddane zabawie za pośrednictwem czatu na Twitchu.

TwitchGraPokemon zapoczątkował szał na crowdsourcingową kontrolę nad grami wideo, robotami i prawie wszystkim innym.

Ty, spragniony czytelniku, zastanawiasz się, jak zdobyć kawałek tej pysznej akcji. Nie obawiaj się, bo przy odrobinie zrujnowanego kodu możesz pozwolić czacie Twitchowi przejąć kontrolę nad praktycznie wszystkim na twoim komputerze, na nim i wokół niego.

To tylko IRC

Wspaniałą rzeczą w czacie na Twitchu jest to, że działa on na standardowym IRC (Internet Relay Chat). Protokół istnieje od zawsze i istnieją biblioteki ułatwiające komunikację. Podobnie jak oryginalny streamer stojący za Twitch Plays Pokemon, będziemy używać języka Python, ponieważ świetnie nadaje się do zabawnych małych eksperymentów, takich jak ten. Powiedziawszy to, każdy język będzie dobry — wystarczy zastosować te same techniki w odpowiedniej składni.

SimpleTwitchDowódca, jak nazwałem to na Githubie, zakłada pewną znajomość podstawowego programowania w języku Python. Kod umożliwi przyjmowanie poleceń z czatu na dwa sposoby. Polecenia z czatu można zestawić w tabeli i tylko to, które uzyskało najwięcej głosów, lub każde polecenie może zostać wykonane bezpośrednio. Właściwie uzyskanie tego kodu do sterowania robotem, grą wideo lub zwierzęcym viperem zależy od Ciebie. To, co tutaj robimy, to łączenie się z czatem na Twitchu i wyciąganie poleceń, dzięki czemu możesz robić, co chcesz. Powiedziawszy to, na potrzeby tego przykładu przygotowaliśmy kod do analizowania poleceń dla prostego robota kołowego. Zanurzmy się.

Chodzenie po kodzie

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Dzięki temu kodowi i Ty możesz oglądać losowe osoby z Internetu wjedź robotem prosto w krzaki.

Pierwszą rzeczą do zrobienia w naszym kodzie jest zaimportowanie potrzebnych bibliotek. Biblioteki są świetne, to prezenty od utalentowanych programistów, które ułatwiają nam życie — a przynajmniej mamy taką nadzieję. W tym przypadku używamy czterech bibliotek, ale w zależności od aplikacji możesz skorzystać tylko z pierwszych trzech. Pierwszym i być może najważniejszym jest tzw socket biblioteka, która obsługuje całą naszą komunikację sieciową. The emoji Biblioteka zapewnia nam przydatne narzędzie do usuwania emotikonów z wiadomości czatu, ponieważ mogą powodować bałagan. APScheduler jest używany w naszym systemie głosowania na polecenia, który pozwala użytkownikom Twitcha głosować na żądaną akcję, zamiast po prostu przepuszczać każde polecenie Twitcha.

class TwitchControl:

Ta instrukcja konfiguruje klasę dla naszego programu.

 def __init__(self): self.server = 'irc.chat.twitch.tv' self.port = 6667 self.nickname = 'yourtwitchusername' self.token = 'oauth:youroauthkeyhere' self.channel = '#yourtwitchchannel' self.sched = BackgroundScheduler() self.sock = socket.socket() self.sock.connect((self.server,self.port)) self.sock.send(f"PASS {self.token}n".encode('utf-8')) self.sock.send(f"NICK {self.nickname}n".encode('utf-8')) self.sock.send(f"JOIN {self.channel}n".encode('utf-8')) 

__init__() to specjalna procedura Pythona wywoływana, gdy obiekt jest tworzony z klasy. Krótko mówiąc, kiedy wzywamy TwitchControl, kod w __init__() biegnie pierwszy. Tutaj tworzymy zmienne przechowujące adres serwera czatu Twitcha, port oraz dane logowania i kanału Twitcha. Token OAuth pozwala serwerowi Twitcha dowiedzieć się, kto łączy się z kanałem czatu, i możesz tutaj wygenerować swój własny.

 self.voteDict = {"null": 0, "fwd" : 0, "rev" : 0, "left" : 0, "right" : 0} 

Następnie tworzymy specjalną zmienną zwaną słownikiem i nadajemy jej nazwę voteDict. Słowniki są świetne, ponieważ pozwalają nam przechowywać dane w schludnych, małych parach. W naszym przypadku mamy pożądane polecenia i przy każdym z nich znajduje się numer. Będzie to odpowiadać liczbie głosów na każde polecenie na czacie. Na początku inicjujemy je od 0.

 self.sched.add_job(self.voteCount, 'interval', seconds=2) self.sched.start() 

Powyższe linie zostały skonfigurowane APscheduler aby uruchomić funkcję w regularnych 2-sekundowych odstępach. Ta funkcja ma swoją nazwę voteCounti co dwie sekundy sprawdza voteDict aby zobaczyć, które polecenie zdobyło najwięcej głosów na czacie, a następnie wykonuje zwycięzcę. Za chwilę wrócimy i przyjrzymy się liczbie głosów. Na razie spójrzmy na główną pętlę uruchamianą po zainicjowaniu wszystkiego.

 def loop(self): while True: resp = self.sock.recv(2048).decode('utf-8') if resp.startswith('PING'): self.sock.send("PONGn".encode('utf-8')) elif len(resp) > 0: respClean = demojize(resp) print(respClean) msgComponents=respClean.split(" ",3) msgUser=msgComponents[0] #get username from message msgUser = msgUser[msgUser.find(':')+1: msgUser.find('!')] msgContent=msgComponents[3] #print message content 

Kiedy już wejdziemy w pętlę while, musimy odebrać dane z serwera IRC. Jeśli dane to „PING”, odpowiadamy „PONG”, zgodnie z typową praktyką IRC, aby utrzymać połączenie przy życiu. W przeciwnym razie czyścimy dane za pomocą funkcji demojize, która zastępuje wszelkie emoji w wiadomości zwykłym tekstem. Następnie używamy funkcji łańcuchowych, aby podzielić nieprzetworzoną wiadomość z serwera na jej elementy: nazwę użytkownika, który wysłał wiadomość, i rzeczywistą treść wiadomości. W tym momencie możemy bezpośrednio wyszukać polecenie, a jeśli chcemy, aby uruchamiało to bezpośrednio wiadomości, możemy to zrobić tutaj.

 if msgContent.find("LIGHTS") >=0: print("Turning Lights On!") #code to turn lights on here 

Alternatywnie, jeśli chcemy zbierać polecenia na czacie i zobaczyć, które z nich jest najpopularniejsze, również możemy to zrobić. Za każdym razem, gdy zostanie wykryte jedno z poniższych poleceń, odpowiadające mu pole w pliku voteDict słownik jest zwiększany o 1.

 if msgContent.find("FWD") >=0: self.voteDict["fwd"] = self.voteDict["fwd"] +1 if msgContent.find("REV") >=0: self.voteDict["rev"] = self.voteDict["rev"] +1 if msgContent.find("LEFT") >=0: self.voteDict["left"] = self.voteDict["left"] +1 if msgContent.find("RIGHT") >=0: self.voteDict["right"] = self.voteDict["right"] +1 

To wszystko, co robi nasza główna pętla. Otrzymuje dane z serwera IRC na bieżąco, przetwarza je i zwiększa liczbę głosów na podstawie przychodzących poleceń. Aby faktycznie podjąć działania w oparciu o te głosy, musimy przejść do naszego voteCount funkcjonować. Dzięki do APscheduler procedurę, którą skonfigurowaliśmy wcześniej, uruchamia się ona automatycznie co dwie sekundy.

 def voteCount(self): #function responsible for checking votes and executing commands print('Counting votes and executing command') voteWinner = max(self.voteDict, key=self.voteDict.get) print("biggest vote:" + voteWinner) nullCheck=all(x==0 for x in self.voteDict.values()) if nullCheck: print('doing a nullo') elif voteWinner=="fwd": print('going Forward') #code to go forward here elif voteWinner=="rev": print('going Reverse') #code to go reverse here elif voteWinner=="left": print('going Left') #code to go left here elif voteWinner=="right": print('going Right') #code to go right here self.voteDict = {"null" : 0, "fwd" : 0, "rev" : 0, "left" : 0, "right" : 0} 

voteCount to prosta funkcja, która wykorzystuje wbudowane funkcje słownikowe Pythona w celu określenia polecenia, które uzyskało najwięcej głosów. Zauważ, że sprawdzamy również, czy wszystkie głosy są równe zero — w takim przypadku nie możemy nic robić, stąd kod nullCheck. Po wyłonieniu zwycięzcy można wykonać kod odpowiedniego polecenia.

Co uwolnisz na Twitchu?

Jest trochę więcej szablonów do łączenia różnych elementów, ale zasadniczo są to bloki, dzięki którym wszystko działa. Jeśli chcesz majsterkować w domu, zdobądź prawdziwą rzecz z Githuba. Oczywiście od tego momentu jest to po prostu kwestia dostosowania, aby ukształtować kod do konkretnego celu. Jeśli chcesz sterować robotem, umieść polecenia dotyczące serwomechanizmów lub silników w niezbędnych miejscach lub wyślij instrukcje przez port szeregowy do mikrokontrolera, który obsługuje te zadania. Alternatywnie, jeśli pracujesz z grą w emulatorze, poproś kod Pythona o emulację odpowiednich naciśnięć przycisków.

Kod nie jest w żaden sposób zoptymalizowany; napisanie tego artykułu zajęło około dwa razy więcej czasu niż napisanie samego kodu. Prawdopodobnie można osiągnąć ogromne korzyści, stosując bardziej wyidealizowany kod zarządzania ciągami znaków i inne tego typu ulepszenia. Dalszą pracę nad uporządkowaniem tego wszystkiego w schludną bibliotekę pozostawiam czytelnikowi jako ćwiczenie. Mamy nadzieję, że dzięki temu łatwiej będzie wam cieszyć się dobrą zabawą na Twitchu! Jak zwykle miłego hackowania.

Źródło: https://hackaday.com/2021/04/08/code-your-own-twitch-chat-controls-for-robots-or-just-about-anything-else/

Znak czasu:

Więcej z Zhakuj dzień