کنترل‌های چت Twitch خود را برای روبات‌ها کدنویسی کنید - یا فقط در مورد هر چیز دیگری!

گره منبع: 805836

Twitch Pokemon بازی می کند در سال 2014 در صحنه پخش زنده در آن زمان نوپا منتشر شد و به بینندگان Twitch اجازه داد تا از طریق دستورات چت ساده، فرمان شبیه‌ساز Game Boy را که Pokemon Red را اجرا می‌کند، بر عهده بگیرند. از آن زمان، همین مفهوم در مورد هر چیزی که زیر نور خورشید است به کار رفته است. سایر بازی‌های ویدیویی، نصب لینوکس و حتی تجارت در بورس نیویورک همگی از طریق چت توییچ بازی‌سازی شده‌اند.

TwitchPlaysPokemon شوری را در کنترل جمع‌سپاری بازی‌های ویدیویی، روبات‌ها و تقریباً هر چیز دیگری آغاز کرد.

تو ای خواننده تشنه در این فکر هستی که چگونه می توانی برشی از این عمل خوشمزه را بدست آوری. نترسید، زیرا با کمی کد سرگردان، می‌توانید به چت Twitch اجازه دهید تقریباً هر چیزی را در رایانه شما، روی یا اطراف آن کنترل کند.

این فقط IRC است

نکته جالب در مورد چت Twitch این است که بر روی vanilla IRC (Internet Relay Chat) اجرا می شود. این پروتکل برای همیشه وجود داشته است و کتابخانه ها برای آسان کردن رابط وجود دارند. درست مانند استریمر اصلی پشت پوکمون Twitch Plays، ما از پایتون استفاده خواهیم کرد زیرا برای آزمایش‌های کوچک سرگرم‌کننده مانند این عالی است. با این گفته، هر زبانی خوب عمل می کند - فقط تکنیک های مشابه را در نحو مربوطه اعمال کنید.

SimpleTwitchCommander، همانطور که من آن را در Github نامگذاری کرده ام، آشنایی با برنامه نویسی پایه پایتون را فرض می کند. کد به شما امکان می دهد از دو طریق دستورات را از چت دریافت کنید. دستورات چت را می‌توان جدول‌بندی کرد و فقط دستوری که بیشترین رای را دارد اجرا می‌شود، یا می‌توان مستقیماً روی هر فرمانی عمل کرد. در واقع دریافت این کد برای کنترل ربات، بازی ویدیویی یا وایپر حیوان خانگی به عهده شماست. کاری که ما در اینجا انجام می دهیم این است که با چت توییچ ارتباط برقرار کنیم و دستورات را بیرون بکشیم تا بتوانید آن را وادار کنید هر کاری که دوست دارید انجام دهد. با این گفته، برای این مثال، ما کدی را برای تجزیه دستورات یک ربات چرخ دار ساده تنظیم کرده ایم. بیایید شیرجه بزنیم

کد راه رفتن

 import socket from emoji import demojize from apscheduler.schedulers.background import BackgroundScheduler 
با این کد، شما نیز می توانید به عنوان افراد تصادفی از اینترنت تماشا کنید ربات خود را مستقیماً داخل یک بوته برانید.

اولین کاری که باید در کد ما انجام دهیم این است که کتابخانه های مورد نیاز خود را وارد کنیم. کتابخانه‌ها عالی هستند، آنها هدایایی از برنامه‌نویسان با استعداد هستند که زندگی ما را آسان‌تر می‌کنند - یا حداقل ما امیدواریم که اینطور باشد. ما در این مورد از چهار کتابخانه استفاده می‌کنیم، اما شما می‌توانید فقط با سه کتابخانه اول بسته به برنامه‌تان، از پس آن برآیید. اولین، و شاید مهم ترین، این است 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__() یک روال خاص پایتون است که زمانی که یک شی از یک کلاس ایجاد می شود، نامیده می شود. به زبان ساده، وقتی ما تماس می گیریم TwitchControl، کد در __init__() اول اجرا می شود در اینجا، ما متغیرهایی ایجاد می کنیم که آدرس سرور چت 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، و در هر بازه دو ثانیه بررسی می کند voteDict برای دیدن اینکه کدام دستور بیشترین رای را در چت به دست آورده است و سپس برنده را اجرا می کند. ما برمی گردیم و شمارش رأی را در مدتی دیگر بررسی خواهیم کرد. در حال حاضر، بیایید به حلقه اصلی نگاه کنیم که پس از تنظیم اولیه همه چیز اجرا می شود.

 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 روتینی که قبلاً تنظیم کردیم، این به طور خودکار هر دو ثانیه اجرا می شود.

 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 یک تابع ساده است که از توابع دیکشنری داخلی پایتون برای تعیین دستوری که بیشترین رای را داشته است استفاده می کند. توجه داشته باشید که ما همچنین بررسی می کنیم که آیا همه رای ها برابر با صفر هستند - در این صورت، ما نباید هیچ کاری انجام دهیم، بنابراین کد nullCheck می شود. پس از مشخص شدن برنده، کد دستور مربوطه را می توان اجرا کرد.

چه چیزی را در Twitch آزاد خواهید کرد؟

کمی دیگ بخار بیشتری برای به هم زدن چیزها وجود دارد، اما اساساً، اینها بلوک هایی هستند که باعث می شوند همه چیز کار کند. اگر می‌خواهید در خانه کار کنید، چیز واقعی را از Github بگیرید. بدیهی است که از اینجا به بعد، شکل دادن کد به هدف خاص شما صرفاً یک موضوع سفارشی سازی است. اگر به دنبال کنترل یک ربات هستید، دستورات خود را برای سرووها یا موتورها در نقاط لازم قرار دهید، یا دستورالعمل ها را به صورت سریال به میکروکنترلر خود ارسال کنید که این وظایف را انجام می دهد. از طرف دیگر، اگر با یک بازی در یک شبیه ساز کار می کنید، کد پایتون را به سادگی از فشار دادن دکمه های مربوطه شبیه سازی کنید.

کد به هیچ وجه بهینه نیست. نوشتن این مقاله حدود دو برابر زمان نوشتن خود کد طول کشید. احتمالاً با استفاده از کدهای مدیریت رشته ایده‌آل‌تر و دیگر ترفندهایی از این دست، دستاوردهای بزرگی حاصل می‌شود. کار بیشتر در جمع کردن همه اینها در یک کتابخانه مرتب به عنوان تمرینی برای خواننده باقی مانده است. امیدواریم این شما را به خوبی در راه داشتن سرگرمی جمع‌سپاری در توییچ قرار دهد! مثل همیشه هک مبارک.

منبع: https://hackaday.com/2021/04/08/code-your-own-twitch-chat-controls-for-robots-or-just-about-anything-else/

تمبر زمان:

بیشتر از هک یک روز