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.
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
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.
- Akció
- Alkalmazás
- körül
- cikkben
- Legnagyobb
- Bit
- hívás
- ellenőrzése
- Ellenőrzések
- kód
- közlés
- tartalom
- létrehozása
- dátum
- Emoji
- csere
- Gyakorol
- végén
- vezetéknév
- Előre
- móka
- funkció
- játék
- Games
- gif
- GitHub
- nagy
- hacker
- itt
- Hogyan
- HTTPS
- hatalmas
- Internet
- IT
- csatlakozik
- nyelv
- könyvtár
- linux
- Hosszú
- vezetés
- Legnepszerubb
- Tiszta
- hálózat
- New York
- Más
- Emberek (People)
- Pokemon
- Népszerű
- Program
- Programozás
- vontatás
- Piton
- Nyers
- Olvasó
- fordított
- robot
- robotok
- futás
- futás
- készlet
- Egyszerű
- So
- osztott
- kezdődött
- nyilatkozat
- készlet
- tárolni
- rendszer
- idő
- jelképes
- Kereskedés
- tv
- Rángatózik
- us
- Felhasználók
- videó
- videojátékok
- Szavazás
- Szavazás
- Nézz
- WHO
- Munka
- írás
- X
- nulla