هدفمون تو این مقاله اینه که ببینیم یک بات چجوری میشه با استفاده از پایتون برای اسکایپ ساخت که یک سری کارامون رو اتومات انجام بده (مثل فرستادن گزارش روزانه و ... ) برای اپلیکیشنهای دیگه هم به زودی مینویسم.
اول از همه این که اگر تو کشور ایران نبودیم میتونستیم از Azure یک ماشین گرفت و اونجا خیلی راحت میتونستیم بات رو بسازیم. اما به دلیل محدودیتهایی که همیشه داریم محبوریم بریم خودمون کارها رو انجام بدیم. پس کلا اگر میتونید و براتون میصرفه خیلی بهتره که با استفاده از Azure بات رو ساخت که کلی امکانات بیشتری دارد.
برای شروع نیاز به پکیج Skpy داریم که میتوانید با استفاده از pip آن را نصب کنید.
pip install Skpy
پس از نصب شدن نیاز هست که یک اکانت اسکایپ داشته باشید، که میتویند به سایت اسکایپ برید و ثبتنام کنید. از اونجایی که نسخه وب هم داره نیاز به نصب اپلیکشن برای ثبتنام نیست.
خوب در قدم اول باید با استفاده از پایتون وارد اسکایپی که ساختید شوید،
from skpy import Skype
user = 'YOUR_USERNAME'
password = 'YOUR_PASSWORD'
sk = Skype(user, password)
اگر user و password را درست وارد کرده باشید برای وارد شدن به اکانتتون چند ثانیه زمان میبرد. اگر هم اشتباه هم وارد کرده باشید بهتون error میده.
برای شروع نیاز است که یک گروه بسازیم و کارهایی که مد نظرمون هست را داخل آن انجام دهیم. به دلیل این که نمیشه تنهایی یک گروه را ساخت باید با یک اکانت دیگه این کار رو انجام داد. اگر اکانت دیگهای خودتون دارید میتوانید از آن استفاده کنید یا از اکانت کسانی که میخواهید آن ها داخل گروه باشند استفاده کنید.
ch = sk.chats.create(["USER_ID_ANOTHER_ACCOUNT"])
فقط برای اضافه کردن باید id اکانت کسی که میخواهید اضافه کنید را داشته باشید که میتوانید به اکانت موردنظرتون بروید و قسمت Skype Name را کپی کنید. در همین جا میتوان داخل لیست کسانی که قرار است در گروه باشند را اضافه کنید، البته راه راحتتر این است که با استفاده از اپلیکیشن (یا وب اپ) بقیه رو به گروه اضافه کنید.
اگر ch را پرینت کنید، چند تا دیتا نشان میدهد که یکی از آنها id چت است که از آن برای رفتن داخل آن چت نیاز داریم، بقیه دیتا ها افراد در گروه، ادمینها و ... را نشان میدهد.
chat_id = ch.id
همچنین، اگر بات رو میخواهید به یکی از گروههایی که دارید اضافه کنید نیاز به id آن چت دارید که با استفاده از کد زیر میتوانید چتهای اخیری که در اسکایپتان وجود را ببندید و با استفاده از تاپیک چت id آن را پیدا کنید. البته قبل از آن باید اکانتی که برای بات هست را به گروه اضافه کنید.
sk.chats.recent()
بعد این که id رو پیدا کردید نیاز دارید وارد آن بشید که با کد زیر این کار رو انجام میدیم:
ch = sk.chats.chat(chat_id)
خوب پس تا اینجا یک گروه داریم که id آن را داریم و میتوانیم پیام یا فایل دریافت یا ارسال کنیم. کار رو به دو قسمت تقسیم میکنیم. ۱) دریافت پیام یا فایل ۲) فرستادن پیام یا فایل
برای این که بخواهیم چت های یک گروه را ببینیم ۲ روش وجود دارد، اگر بخواهید آنالیزی روی چت های قدیمی انجام دهید و نیاز به لایو بودن ندارید. از کد زیر میتوانید استفاده کنید:
ch.getMsgs()
اگر آن را پرینت کنید بهتون یک لیست از ۳۰ چت آخر نشان میدهد و اگر آن را داخل یک لوپ تکرار کنید تا اولین چتی که در گروه قرار دارد میبینید و پس از آن دیگه لیست خالی بهتون جواب میده. پس اگر نیاز هست کل چتهای یک گروه را آنالیز کنید آن را داخل یک لوپ while قرار بدید و وقتی که جواب list خالی شد break کنید.
all_msg = [] while True:
this_series = ch.getMsgs()
all_msg += this_series
if len(this_series) == 0:
break
اگر یکی از پیامها رو بررسی کنیم چند تا دیتا داخل آن ها وجود دارد، با time میتوانید تایمی که پیام فرستاده شده (برحسب utc)، با userID میتوانید id کسی که پیام رو فرستاده ببینید و با content هم نوشته پیام رو میشه دید. (در کد زیر فرض شده است که حداقل یک پیام وجود داشته باشد)
all_msg[0].time
all_msg[0].userID
all_msg[0].content
در روش بالا همان طور که گفتم برای آنالیز کردن پیامها است. اما استفاده دیگهای که میشه کرد اینه که اگر پیغامی داخل گروه آمد اکشنی داشته باشید ( جوابی بدید یا فایلی بفرستید) برای این کار میتوانید از کد زیر استفاده کنید:
while True:
for event in sk.getEvents(): if (isinstance(this_event, SkypeNewMessageEvent) and
this_event.msg.chat.id == ch.id):
return ('New message received', this_event.msg)
کد بالا رو تو یکه while گذاشتیم که به صورت پیوسته چک کند که پیامی آمده است یا نه، در قسمت sk.getEvents تمامی ایونت هایی که در اکانت اتفاق میافتد را بهتون میدهد ( از ایونت منظور هر اتفاقی که تو اسکایپتون میافته، هر گروهی اگر پیام بیاد یا هر چیزه دیگه) خوب پس اول نیاز داریم که مطمئن بشیم که این ایونت که اومده پیام باشه که با isinstance(event, SkypeNewMessageEvent) چک میکنیم و قسمت بعدی چک میکنیم که پیام اومده تو گروه مد نظر ما باشه. داخل this_event.msg مثل بالا time, id, content و ... وجود دارد که میتوانید ریکشن مورد نظرتون را برای هر پیام نشان دهید. این روش در مقایسه با روش بالا ریسپانس تایم کمتر و استیبلتر است.
دریافت کردن فایل هم به روش بالا میباشد، تنها تفاوتی که وجود دارد فایلهای فرستاده شده به بایتس تبدیل شده است و برای هر فایلی نیاز به تبدیل کردن آن است، در مثال زیر یک فایل عکس را مشاهده میکنیم:
from PIL import Image import io picture_msg = all_msg[0].fileContent stream = io.BytesIO(picture_msg) Image.open(stream)
برای این کار از ۲ تا پکیج استفاده کردیم، که یکی برای تبدیل کردن بایت هست و دیگری هم برای نمایش عکس میباشد. با استفاده از getMsgs که در بالا توضیح دادهشد پیام ها رو گرفته و فرض شده که اولین پیام که وجود دارد عکس است (تایپ آن SkypeImageMsg) که با استفاده از fileContent محتوای آن فایل رو میخونیم و بعد آن را به عکس تبدیل میکنیم.
اگر فایل دریافت شده csv باشد، میتوانیم از کد زیر استفاده کنیم
import pandas as pd csv_msg = all_msg[0].fileContent) data = io.BytesIO(csv_msg) pd.read_csv(data)
به همین ترتیب تمامی فایلهایی که فرستاده میشود را میتوانیم باز کنیم و بررسی کنیم.
در این قسمت میخواهیم نحوه فرستادن پیام یا یک فایلی مثل عکس یا اکسل رو ببینیم.
برای فرستادن یک پیام میتوان از کد زیر استفاده کرد:
ch.sendMsg('ِSend text massege')
برای فرستادن فایلها میتوان از sendFile استفاده کرد که در آن انواع فایلها رو میتوانیم بفرستیم، اگر بخواهیم یک عکس را به طور مثال بفرسیتم و آن عکس به صورت عکس فرستاده شود ( نه فایل، تفاوت آن این است که عکس اگر فرستاده شود یک پریویو نشان میدهد از عکس) به این صورت است :
ch.sendFile( open(path_file, 'rb'), "name_file.png", image=True)
در این مقاله پیش نیاز نوشتن یک بات رو توضیح دادم و کلی کار میشه رو این اجرا کرد از بررسی پیامهای آمده در گروههای مختلف تا فرستادن فایل و عکس به صورت روزانه و فرستادن دیتا یا فایلی در ازای هر پیام. اگر به gitHub این پکیج برید کلی کار دیگه هم میتوان به باتی که مینویسید اضافه کرد.