Kódolja saját Twitch Chat-vezérlőit robotokhoz – vagy bármi máshoz!

Forrás csomópont: 805836

A Twitch Pokémonokat játszik 2014-ben berobbant az akkor születőben lévő élő közvetítés színterébe, és lehetővé tette a Twitch-nézőknek, hogy egyszerű chat-parancsokkal átvegyék a Pokemon Red-et futtató Game Boy-emulátor irányítását. Azóta ugyanazt a koncepciót alkalmazzák mindenre a nap alatt. A többi videojátékot, a Linux telepítését és még a New York-i tőzsdén való kereskedést is a Twitch chaten keresztül sikerült megjátszani.

TwitchPlaysPokemon őrületet indított a videojátékok, robotok és szinte minden más tömeges irányítása terén.

Te, szomjas olvasó, azon tűnődsz, hogyan kaphatsz egy szeletet ebből a finom akcióból. Ne féljen, mert egy kis zaklatott kóddal hagyhatja, hogy a Twitch chat szinte bármit átvegyen a számítógépén, rajta vagy körül.

Ez csak IRC

A Twitch chat nagyszerűsége az, hogy vanilla IRC-n (Internet Relay Chat) fut. A protokoll örökké létezett, és könyvtárak léteznek, hogy megkönnyítsék az interfészeket. Csakúgy, mint az eredeti streamer a Twitch Plays Pokemon mögött, mi is a Pythont fogjuk használni, mert nagyszerű az ehhez hasonló szórakoztató kis kísérletekhez. Ezzel együtt bármely nyelv jól működik – csak alkalmazza ugyanazokat a technikákat a megfelelő szintaxisban.

SimpleTwitchCommander, ahogy a Githubon elneveztem, feltételezi, hogy ismeri az alapvető Python programozást. A kód kétféle módon teszi lehetővé a parancsok átvételét a chatből. A chat parancsai táblázatba foglalhatók, és csak a legtöbb szavazatot kapott végrehajtható, vagy minden egyes parancs közvetlenül végrehajtható. Valójában az Ön feladata, hogy megszerezze-e ezt a kódot robotja, videojátéka vagy házi viperája irányításához. Amit itt csinálunk, az az, hogy összekapcsoljuk a Twitch chattel, és kihúzzuk a parancsokat, hogy azt csinálhassa, amit csak akar. Ezzel együtt, ebben a példában beállítottuk a kódot egy egyszerű kerekes robot parancsainak elemzésére. Merüljünk el.

Kódjárás

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
Ezzel a kóddal Ön is véletlenszerű emberekként nézhet az internetről hajtsa be a robotját egyenesen egy bokorba.

A kódunkban az első lépés a szükséges könyvtárak importálása. A könyvtárak nagyszerűek, tehetséges programozók ajándékai, amelyek megkönnyítik az életünket – vagy legalábbis reméljük, hogy így lesz. Ebben az esetben négy könyvtárat használunk, de az alkalmazástól függően csak az első hárommal boldogulhat. Az első és talán a legfontosabb az socket könyvtár, amely az összes hálózati kommunikációnkat kezeli. A emoji A könyvtár egy ügyes eszközt biztosít számunkra a hangulatjelek eltávolításához a csevegőüzenetekből, mivel azok összezavarodhatnak. APScheduler parancsszavazó rendszerünkhöz használjuk, amely lehetővé teszi a Twitch-felhasználók számára, hogy szavazzanak a kívánt műveletre, ahelyett, hogy egyszerűen átengednének minden Twitch-parancsot.

class TwitchControl:

Ez a kijelentés beállítja a programunk osztályát.

 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__() egy speciális Python-rutin, amelyet akkor hívnak meg, amikor egy objektumot létrehoznak egy osztályból. Egyszerűen fogalmazva, amikor hívjuk TwitchControl, a kód benne __init__() először fut. Itt olyan változókat hozunk létre, amelyek tárolják a Twitch chat-szerverének címét, a portot, valamint a Twitch bejelentkezési és csatorna adatait. Az oauth token az, hogy a Twitch szerver tudja, hogy ki csatlakozik a chat-csatornához, és itt létrehozhatja a sajátját.

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

Ezután létrehozunk egy speciális változót, amelyet szótárnak nevezünk, és adjuk neki a nevet voteDict. A szótárak nagyszerűek, mivel lehetővé teszik, hogy ügyes kis párokban tároljuk az adatokat. Esetünkben megvannak a kívánt parancsaink, és mindegyik mellett van egy szám. Ez a chat egyes parancsaira leadott szavazatok számának felel meg. Kezdetben 0-ra inicializáljuk ezeket.

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

A fenti vonalak beálltak APscheduler egy függvény szabályos 2 másodperces időközönkénti futtatásához. Ez a funkció a névhez tartozik voteCount, és minden két másodperces intervallumban ellenőrzi voteDict hogy megnézze, melyik parancs kapta a legtöbb szavazatot a chatben, majd végrehajtja a győztest. Egy kicsit visszajövünk, és megnézzük a voteCount-ot. Most nézzük meg a fő ciklust, amely minden inicializálása után fut.

 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 

Miután beléptünk a while ciklusba, adatokat kell fogadnunk az IRC szervertől. Ha az adat „PING”, akkor a tipikus IRC gyakorlatnak megfelelően „PONG”-val válaszolunk, hogy életben tartsuk a kapcsolatot. Ellenkező esetben a demojize funkcióval tisztítjuk az adatokat, amely az üzenetben szereplő hangulatjeleket egyszerű szövegre cseréli. Ezután karakterlánc-függvényekkel bontjuk fel a szerverről érkező nyers üzenetet összetevőire: az üzenetet küldő felhasználónévre és az üzenet tényleges tartalmára. Ezen a ponton közvetlenül kereshetünk parancsot, és ha azt szeretnénk, hogy az közvetlenül az üzenetekből induljon ki, itt megtehetjük.

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

Alternatív megoldásként azt is megtehetjük, ha parancsokat szeretnénk gyűjteni a chatben, és megnézni, melyiket választották a legnépszerűbbnek. Valahányszor a következő parancsok egyikét észleli, a megfelelő mező a voteDict a szótár 1-gyel növekszik.

 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 

A fő hurkunk csak ennyit tesz. Adatokat fogad az IRC szervertől, ahogy beérkezik, feldolgozza azokat, és növeli a bejövő parancsok szavazatszámát. Ahhoz, hogy ténylegesen cselekedjünk ezekkel a szavazatokkal, el kell mennünk a sajátunkhoz voteCount funkció. Köszönhetően a APscheduler korábban beállított rutin, ez automatikusan lefut két másodpercenként.

 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} 

A voteCount egy egyszerű függvény, amely a Python beépített szótárfüggvényeit használja a legtöbb szavazatot kapott parancs meghatározására. Ne feledje, hogy azt is ellenőrizzük, hogy minden szavazat nulla-e – ebben az esetben semmit sem szabad tennünk, ezért a nullCheck kód. A győztes meghatározása után végrehajtható a megfelelő parancs kódja.

Mit fogsz felszabadítani a Twitchen?

A dolgok összefűzéséhez egy kicsit több alapja van, de alapvetően ezek azok a blokkok, amelyektől minden működik. Ragadja meg az igazit a Githubtól, ha otthon szeretne bütykölni. Nyilvánvaló, hogy innentől kezdve egyszerűen testreszabás kérdése, hogy a kódot az adott célnak megfelelően alakítsuk. Ha robotot szeretne vezérelni, adja ki a szervók vagy motorok parancsait a szükséges helyekre, vagy küldje el soros utasításokat a feladatokat kezelő mikrovezérlőnek. Alternatív megoldásként, ha egy játékkal emulátorban dolgozik, a Python kód egyszerűen emulálja a megfelelő gombnyomásokat.

A kód semmilyen módon nincs optimalizálva; ennek a cikknek a megírása körülbelül kétszer annyi ideig tartott, mint magának a kódnak a megírása. Valószínűleg hatalmas előnyökkel járhat az ideálisabb karakterlánc-kezelő kód és más hasonló módosítások alkalmazása. A további munka, hogy mindezt egy takaros könyvtárba csomagolja, az olvasó gyakorlataként maradjon meg. Remélhetőleg ezzel jó úton haladsz egy kis tömeges szórakozás felé a Twitchen! Mint mindig, boldog hackelést.

Forrás: https://hackaday.com/2021/04/08/code-your-own-twitch-chat-controls-for-robots-or-just-about-anything-else/

Időbélyeg:

Még több Hack A Day