로봇을 위한 나만의 Twitch 채팅 컨트롤을 코딩하세요.

소스 노드 : 805836

재생 포켓몬 트 2014년 당시 초기 라이브 스트리밍 장면에 돌풍을 일으켰으며 Twitch 시청자가 간단한 채팅 명령을 통해 Pokemon Red를 실행하는 Game Boy 에뮬레이터를 명령할 수 있게 되었습니다. 그 이후로 해 아래 모든 것에 동일한 개념이 적용되었습니다. 다른 비디오 게임, Linux 설치, 심지어 뉴욕 증권 거래소에서의 거래까지 모두 Twitch 채팅을 통해 게임화되었습니다.

TwitchPlays포켓몬 비디오 게임, 로봇 및 기타 모든 것에 대한 크라우드소싱 제어 열풍이 시작되었습니다.

목마른 독자 여러분은 이 맛있는 액션의 한 조각을 어떻게 얻을 수 있는지 궁금합니다. 겁먹지 마세요. 약간의 허름한 코드만 있으면 Twitch 채팅이 컴퓨터 내부, 컴퓨터 주변의 거의 모든 것을 차지하도록 할 수 있습니다.

그냥 IRC에요

Twitch 채팅의 가장 큰 장점은 바닐라 IRC(인터넷 릴레이 채팅)에서 실행된다는 것입니다. 프로토콜은 영원히 존재해 왔으며 인터페이스를 쉽게 하기 위해 라이브러리가 존재합니다. Twitch Plays Pokemon의 오리지널 스트리머와 마찬가지로 우리도 이와 같은 재미있는 작은 실험에 적합하기 때문에 Python을 사용할 것입니다. 그렇다면 어떤 언어든 괜찮을 것입니다. 관련 구문에 동일한 기술을 적용하기만 하면 됩니다.

SimpleTwitchCommander, 내가 Github에 이름을 붙인 대로, 기본 Python 프로그래밍에 어느 정도 익숙하다고 가정합니다. 이 코드를 사용하면 두 가지 방법으로 채팅에서 명령을 받을 수 있습니다. 채팅의 명령은 표로 작성될 수 있으며 가장 많은 투표를 받은 명령만 실행되거나 모든 단일 명령이 직접 실행될 수 있습니다. 실제로 로봇, 비디오 게임 또는 애완용 독사를 제어하기 위해 이 코드를 얻는 것은 귀하에게 달려 있습니다. 여기서 우리가 하는 일은 Twitch 채팅과 인터페이스하여 원하는 대로 명령을 내릴 수 있도록 하는 것입니다. 즉, 이 예에서는 간단한 바퀴 달린 로봇에 대한 명령을 구문 분석하는 코드를 설정했습니다. 뛰어 들어 봅시다.

코드 워킹

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
이 코드를 사용하면 당신도 인터넷에서 무작위로 사람들을 볼 수 있습니다 로봇을 덤불 속으로 곧장 몰아넣으세요.

코드에서 가장 먼저 해야 할 일은 필요한 라이브러리를 가져오는 것입니다. 라이브러리는 훌륭합니다. 우리 삶을 더 쉽게 만들어주는 재능 있는 프로그래머가 제공하는 선물입니다. 적어도 우리는 그러기를 바랍니다. 이 경우 XNUMX개의 라이브러리를 사용하지만 애플리케이션에 따라 처음 XNUMX개만 사용해도 됩니다. 첫 번째이자 아마도 가장 중요한 것은 socket 모든 네트워크 통신을 처리하는 라이브러리입니다. 그만큼 emoji 라이브러리는 지저분해질 수 있는 채팅 메시지에서 이모티콘을 제거할 수 있는 깔끔한 도구를 제공합니다. APScheduler 이는 단순히 모든 Twitch 명령을 통과시키는 대신 Twitch 사용자가 원하는 작업에 투표할 수 있도록 하는 명령 투표 시스템에 사용됩니다.

class TwitchControl:

이 명령문은 우리 프로그램의 클래스를 설정합니다.

 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__() 클래스에서 객체가 생성될 때 호출되는 특별한 Python 루틴입니다. 쉽게 말하면 우리가 전화할 때 TwitchControl, 코드는 __init__() 먼저 실행됩니다. 여기서는 Twitch의 채팅 서버 주소, 포트, Twitch 로그인 및 채널 세부 정보를 저장하는 변수를 만듭니다. oauth 토큰은 Twitch 서버가 누가 채팅 채널에 연결하고 있는지 아는 방법입니다. 여기에서 직접 생성할 수 있습니다..

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

다음으로 사전이라는 특수 변수를 만들고 이름을 지정합니다. voteDict. 사전은 데이터를 깔끔한 작은 쌍으로 저장할 수 있다는 점에서 훌륭합니다. 우리의 경우 원하는 명령이 있고 각 명령 옆에 숫자가 있습니다. 이는 채팅의 각 명령에 대한 투표 수에 해당합니다. 처음부터 이를 0으로 초기화합니다.

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

위의 라인이 설정되었습니다. APscheduler 정기적으로 2초 간격으로 기능을 실행합니다. 그 기능은 이름으로 나옵니다 voteCount, 매 XNUMX초 간격으로 확인합니다. voteDict 채팅에서 어떤 명령이 가장 많은 표를 얻었는지 확인한 다음 승자를 실행합니다. 잠시 후에 voteCount를 살펴보겠습니다. 지금은 모든 것이 초기화된 후 실행되는 메인 루프를 살펴보겠습니다.

 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 

while 루프에 들어가면 IRC 서버로부터 데이터를 받아야 합니다. 데이터가 "PING"인 경우 일반적인 IRC 관행에 따라 "PONG"으로 응답하여 연결을 유지합니다. 그렇지 않으면 메시지의 모든 이모티콘을 일반 텍스트로 바꾸는 Demojize 기능을 사용하여 데이터를 정리합니다. 그런 다음 문자열 함수를 사용하여 서버의 원시 메시지를 해당 구성 요소, 즉 메시지를 보낸 사용자 이름과 실제 메시지 내용으로 분할합니다. 이 시점에서 명령을 직접 찾을 수 있으며 메시지에서 직접 실행되도록 하려면 여기에서 수행할 수 있습니다.

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

또는 채팅에서 명령을 수집하고 가장 인기 있는 명령이 무엇인지 확인하려는 경우에도 그렇게 할 수 있습니다. 다음 명령 중 하나가 감지될 때마다 해당 필드는 voteDict 사전은 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 

이것이 우리의 메인 루프가 하는 일의 전부입니다. IRC 서버로부터 데이터가 들어올 때 이를 수신하고 이를 처리하며 들어오는 명령의 투표 수를 증가시킵니다. 실제로 해당 투표에 따라 조치를 취하려면 다음 단계로 이동해야 합니다. voteCount 기능. 덕분에 APscheduler 이전에 설정한 루틴은 XNUMX초마다 자동으로 실행됩니다.

 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는 Python에 내장된 사전 함수를 사용하여 가장 많은 표를 얻은 명령을 결정하는 간단한 함수입니다. 또한 모든 투표가 XNUMX인지 확인합니다. 이 경우에는 아무것도 수행하면 안 되므로 nullCheck 코드가 생성됩니다. 승자가 결정되면 관련 명령에 대한 코드를 실행할 수 있습니다.

Twitch에서 무엇을 공개할 예정인가요?

여러 가지를 하나로 묶는 상용구가 조금 더 있지만 기본적으로 이것들은 모든 것을 작동시키는 블록입니다. 집에서 직접 손보고 싶다면 Github에서 실제 제품을 다운로드하세요.. 분명히 여기서부터는 특정 목적에 맞게 코드를 구성하는 것은 단순히 사용자 정의의 문제입니다. 로봇을 제어하려는 경우 서보 또는 모터에 대한 명령을 필요한 위치에 배치하거나 해당 작업을 처리하는 마이크로컨트롤러에 직렬을 통해 명령을 보내십시오. 또는 에뮬레이터에서 게임 작업을 하는 경우 Python 코드가 관련 버튼 누르기를 에뮬레이션하도록 하세요.

코드는 전혀 최적화되지 않았습니다. 이 기사를 작성하는 데는 코드 자체를 작성하는 것보다 약 두 배의 시간이 걸렸습니다. 보다 이상적인 문자열 관리 코드 및 기타 조정을 사용하면 엄청난 이점을 얻을 수 있습니다. 이 모든 것을 깔끔한 라이브러리에 정리하는 추가 작업은 독자의 연습 과제로 남겨집니다. 이를 통해 Twitch에서 크라우드소싱을 통해 즐거운 시간을 보내실 수 있기를 바랍니다! 언제나처럼 즐거운 해킹 되세요.

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

타임 스탬프 :

더보기 해킹 하루