کنترل وسایل خانه با پیام واتساپ و رزبری پای (خانه هوشمند Whatsapp)
محتویات
WhatsApp یکی از محبوب ترین پیام رسان ها است که توسط اکثر مردم استفاده میشود. به تازگی واتسپ سیاست حفظ حریم خصوصی خود را بروزرسانی کرد اما هنوز هم تقریبا 2 میلیارد نفر از واتساپ استفاده میکنند. افراد و کاربران زیادی در زمینه های مختلف از این اپلیکیشن استفاده میکنند. در گذشته از ربات های فوق العاده تلگرام برای هوشمند کردن خانه ها استفاده میشد اما با از دسترس خارج شدن این پیام رسان در ایران، واتساپ گزینه بسیار مناسبی برای هوشمند کردن خانه به شمار میرود.
در این آموزش ما با پایتون و رزبری پای سیستم خانه هوشمند را طراحی میکنیم که دستورات را از واتسپ میگیرد و پاسخ مناسب به آن را ارسال میکند. در این پروژه ما میخواهیم یک LED را با ارسال پیام در واتسپ کنترل کنیم. توجه داشته باشید میتوانید این پروژه را برای دستورات و کاربرد های مختلف گسترش دهید.
استفاده از واتس اپ در رزبری پای
میتوانید آموزش نصب واتساپ در رزبری پای را مشاهده کنید. اما این روش محدودیت های زیادی دارد و ما در این آموزش از روش دیگری استفاده میکنیم.
چرا از API رسمی WhatsApp Business برای اتوماسیون استفاده نمی کنیم؟
واتس اپ API مخصوص به خود را برای اهداف تجاری دارد که با استفاده از آن می توانید پیام های WhatsApp را با استفاده از پایتون برنامه ریزی کنید. استفاده از API برای برقراری ارتباط با مشتری ها در شغل های مختلف مناسب است اما برای پروژه کوچک ما دریافت دسترسی API بسیار دشوار است.
برای حل این مسئله ، می توانیم یک هک کوچک ایجاد کنیم که با استفاده از آن می توانیم به مطالب موجود در نسخه وب WhatsApp دسترسی پیدا کنیم تا پیام را به صورت رایگان بخوانیم و به آن پاسخ دهیم. برای این پروژه ، شما فقط به Raspberry Pi و اتصال به اینترنت نیاز دارید.
Selenium یا pyautogui ؟
ما تصمیم گرفتیم برای هوشمند سازی خانه مبتنی بر رزبری پای و واتس اپ از روش کم هزینه و ساده استفاده کنیم. بنابراین باید بین سلنیوم و پیاتوگوئی یک کدام را انتخاب کنیم. برای کسانی که تازه وارد هستند ، سلنیوم ابزاری است که عمدتا برای آزمایش برنامه های وب طراحی شده است. اما میتوانید از سلنیوم برای هوشمند کردن موارد مبتنی بر وب مثل ارسال توئیت، ارسال پست در فیسبوک و … استفاده کنید.
گزینه های دیگر برای اتوماسیون WhatsApp pyautoGUI و OpenCV است. این بسته در اصل به ما کمک می کند تا آنچه را که در صفحه است را بخوانیم تا اقدامات دلخواه را انجام دهیم. بنابراین بیشتر کارهایی که می توانید با استفاده از صفحه کلید و ماوس روی رزبری پای انجام دهید ، می تواند با استفاده از بسته pyautogui و paperclip روی پایتون انجام شود. بعداً به جزئیات نحوه انجام این کار خواهیم پرداخت.
در این آموزش ، ما از pyautogui استفاده کرده ایم. شما می توانید هر دو گزینه را بررسی کرده و انتخاب کنید که کدام برای شما مناسب تر است.
نصب بسته های پایتون برای ارتباط WhatsApp در رزبری پای
قبل از شروع ، باید تمام بسته های مورد نیاز پروژه خود را نصب کنیم. همانطور که قبلا ذکر شد ، ما OpenCV استفاده می کنیم ، بنابراین مطمئن شوید که OpenCV را قبلاً روی Pi خود نصب کرده اید. مقاله نصب OpenCV در رزبری پای را مشاهده کنید.
ما باید Pyperclip و pyautogui را نصب کنیم تا پیام های WhatsApp کنترل شود. Pyautogui برای خواندن عناصر روی صفحه و ایجاد حرکت های ماوس و صفحه کلید استفاده می شود و pyperclip برای کپی و پیست اطلاعات بین صفحه وب و برنامه پایتون استفاده می شود.
pip3 install pyperclip pip3 install pyautogui
مدار کنترل LED با واتساپ و رزبری پای
در قسمت سخت افزار و مدار، فقط باید یک ال ای دی را به برد رزبری پای متصل کنید.
اگر مبتدی هستید آموزش کنترل LED با رزبری پای را بررسی کنید. در غیر این صورت ، فقط شماتیک بالا را اجرا کنید.
کد پایتون ارسال و دریافت پیام WhatsApp در Raspberry Pi
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در این ما قسمت های مهم را بررسی میکنیم.
در داخل پوشه ، کد اصلی Python را به همراه پنج تصویر دیگر خواهید یافت. این تصاویر در شناسایی قسمتهای مختلف در صفحه WhatsApp به ما کمک می کنند. همیشه مطمئن شوید که فایل Python خود را در همان دایرکتوری که این تصاویر وجود دارد ، اجرا کنید. همچنین ، اگر تصاویر جدیدی برای برنامه خود اضافه می کنید ، مطمئن شوید که آنها با فرمت .JPG هستند زیرا Raspberry Pi با فرمت های دیگر مشکل دارد.
حال ، بیایید نگاهی دقیق تر به کد خود بیندازیم تا درک بهتری داشته باشیم.
فرخوانی تمام بسته های مورد نیاز:
در ابتدای کد باید بسته های مورد نیاز برای کد را فراخوانی کنیم.
import pyautogui as pygu #برای حرکت ماوس و کار با کیبورد from time import sleep #برای تاخیر import pyperclip #برای کپی و پیست اطلاعات import webbrowser #برای بازکردن مرورگر وب import RPi.GPIO as IO #برای ارتباط با پین های GPIO import time #برای تامین تاخیر و زمان
تنظیم پین های GPIO و باز کردن مرورگر WhatsApp:
از پین 40 GPIO برای کنترل LED استفاده می شود ، بنابراین ما آن را به عنوان خروجی تنظیم کرده و یک مرورگر وب را راه اندازی کرده ایم که به طور پیش فرض Chromium Pi است. سپس ما web.whatsapp.com را باز کرده ایم تا اتوماسیون WhatsApp را انجام دهیم. مطمئن شوید که قبلاً کد QR خود را اسکن کرده اید و اگر اولین بار است ، “always login” را تیک زده اید.
IO.setmode (IO.BOARD) # برنامه نویسی پین های GPIO IO.setup(40,IO.OUT) # تنظیم پین 40 به عنوان خروجی #بازکردن مرورگر وب و صفحه نسخه وب واتساپ webbrowser.open_new('https://web.whatsapp.com/')
آماده سازی الگو های پیام:
در مرحله بعدی ، ما سه پیام آماده کرده ایم که به عنوان پاسخ به کاربر ارسال خواهیم کرد. شما می توانید به تعداد مورد نیاز خود پیام های مختلف ایجاد کنید. تمام ویژگی های قالب بندی WhatsApp مانند * bold * برای بولد کردن و :smiley برای لبخند در اینجا نیز کار می کند.
default_message = [ "Hi I am your Whatsapp Bot :robot \n from RaspberryPi. I can help you with basic home automation. You can try any of the following :notes \n commands", "*turn on light* - _Turns on the led connected to pi_", "*turn off light* - _Turns off the led connected to pi_"] turn_on_light = [ "Sure, your :bulb \n Light is now turned on" ] turn_off_light = [ "Okay, Your LED is not turned off" ]
بررسی باز شدن WhatsApp در مرورگر وب:
برای بررسی اینکه آیا صفحه چت WhatsApp در مرورگر وب با موفقیت باز شده است ، از روش زیر استفاده می شود. برای بررسی درست بودن صفحه از تصویر whatsapp_header.jpg (در فایل کد بالا می توان یافت) استفاده می کنیم. ما فقط در صورت با موفقیت باز شدن صفحه به برنامه ادامه خواهیم داد.
اساساً ، ما در حال جستجو برای تصویر “whatsapp_header.jpg” در صفحه خود هستیم. اگر آن تصویر را پیدا کنیم ، می توانیم تأیید کنیم که این صفحه خاص باز شده است.
def open_whatsapp(): # بررسی باز شدن صفحه مرورگر find_whatsapp_header = None while find_whatsapp_header is None: find_whatsapp_header = pygu.locateOnScreen("Whatsapp_header.JPG", confidence=.8) use_here_button_pos = pygu.locateOnScreen("use_here_button.JPG", confidence=.8) if (use_here_button_pos): print("Whatsapp is being used somewhere else, clicking on use here") sleep(2) pygu.moveTo(use_here_button_pos[0], use_here_button_pos[1], duration=0.5) pygu.click() print(".") sleep(2) return 1
بررسی وجود چت جدید:
به همین ترتیب ، در این روش ، تصویر “green_circle.jpg” را جستجو خواهیم کرد. اگر آن تصویر پیدا شود ، به دایره رفته و روی آن کلیک می کنیم. اگر کاربر برای اولین بار در حال چت است ، ممکن است بخواهیم قبل از ادامه روی دکمه ok کلیک کنیم ، در غیر این صورت می توانیم ادامه دهیم. اگر چت جدیدی در دسترس باشد این روش 1 را برمی گرداند و در غیر اینصورت 0 را برمی گرداند. همچنین گپ را باز کرده و آن را برای خواندن یا ارسال پیام آماده می کند.
#بررسی وجود پیام جدید def new_chat_available(): # خواندن پیام جدید green_circle_pos = pygu.locateOnScreen("green_circle.JPG", confidence=.8) if (green_circle_pos): sleep(2) pygu.moveTo(green_circle_pos[0], green_circle_pos[1], duration=0.5) pygu.click() sleep(1) ok_button_pos = pygu.locateOnScreen("ok_button.JPG", confidence=.8) if (ok_button_pos): pygu.moveTo(ok_button_pos[0], ok_button_pos[1], duration=0.5) pygu.click() return 1 else: sleep(1) return 0
خواندن آخرین پیام ارسال شده توسط کاربر:
این روش با جستجوی تصویر “smily_paperclip.jpg” در صفحه ، آخرین پیام را می خواند. سپس از آنجا ، با استفاده از py.mpveTo() به قسمت متن منتقل می شود. توجه داشته باشید که مقادیر 50 و 35 به کار رفته در این روش به سختی رمزگذاری شده اند و برای Raspberry Pi کار می کنند. شما ممکن است بخواهید آن را در صورت لزوم تغییر دهید.
سپس با سه بار کلیک بر روی جعبه سفید می توانیم آخرین پیام را بخوانیم. با این کار پیام کامل انتخاب می شود ، سپس می توانیم با استفاده از Ctrl+C پیام را کپی کنیم و بعداً از pyperclip برای دریافت این مقدار استفاده کنیم. همانطور که مشاهده می کنید ، این عملکرد اطلاعات کپی شده را با استفاده از pyperclip.paste() برمی گرداند.
def read_last_message(): smily_paperclip_pos = pygu.locateOnScreen("smily_paperclip.JPG", confidence=.6) pygu.moveTo(smily_paperclip_pos[0], smily_paperclip_pos[1]) pygu.moveTo(smily_paperclip_pos[0] + 50, smily_paperclip_pos[1] - 35, duration=0.5) sleep(1) pygu.tripleClick() pygu.hotkey('ctrl', 'c') sleep(0.1) return (pyperclip.paste())
پاسخ مناسب برای پیام دریافتی:
این روش آخرین پیام خوانده شده را به عنوان ورودی دریافت می کند و آن را با مجموعه ای از جوابهای از پیش تعریف شده که از کاربر انتظار داریم مقایسه می کند. در این پروژه ما انتظار دریافت “CD_bot” ، “turn on light”یا “turn off light” را داریم ، ما با متن از پیش تعریف شده پاسخ خواهیم داد. همچنین طبق دستور دریافت شده وضعیت پین GPIO LED را نیز تغییر می دهیم.
def get_response(incoming_message): if "CD_bot" in incoming_message: return default_message if "turn on light" in incoming_message: IO.output(40,1) # روشن کردن ال ای دی return turn_on_light if "turn off light" in incoming_message: IO.output(40,0) # خاموش کردن ال ای دی return turn_off_light else: return ""
ارسال پیام WhatsApp به عنوان پاسخ به صورت خودکار:
اکنون ، ما آخرین پیام چت را خوانده ایم و پیام را برای ارسال مجدد آماده کرده ایم. تنها چیزی که باقی مانده است ارسال پیام است. برای انجام این کار ، روش زیر به نام send_message() را داریم. این تابع پاسخ را به عنوان یک پارامتر دریافت می کند و آن را با استفاده از روش typewrite در pyautogui در پنجره چت تایپ می کند. سپس برای رفتن به خط جدید از shift + enter استفاده کرده و سپس در نهایت enter را فشار میدهیم تا پیام ارسال شود.
def send_message(message_content): for content in message_content: pygu.typewrite(content, interval=.02) pygu.hotkey('shift', 'enter') #شیفت و اینتر برای رفتن به خط بعد pygu.hotkey('enter') #اینتر برای ارسال پیام
بررسی مجدد وجود پیام جدید:
فقط در صورتی که چت هنوز باز نشده باشد، می توانیم به دنبال تصویر green_circle باشیم. اگر کاربر در گپ باز شده پیام جدیدی ارسال کند ، باید آن را با بررسی رنگ پیکسل ماوس شناسایی کنیم. پیام های دریافتی واتس اپ همیشه دارای رنگ سفید به عنوان رنگ پس زمینه هستند. بنابراین ما به راحتی می توانیم رنگ را در زیر مکان نما جستجو کنیم ، اگر رنگ آن سفید باشد ، با خواندن پیام همانطور که قبلاً بحث کردیم ، ادامه خواهیم داد.
def new_message_available(): current_mouse_pos = pygu.position() pointer_color = pygu.pixel(current_mouse_pos[0], current_mouse_pos[1]) if (pointer_color == (255, 255, 255)): #جستجو رنگ سفید return 1 else: return 0
باز کردن واتساپ، خواندن پیام جدید، ارسال پاسخ:
اکنون که روش متفاوتی را برای هر کارآماده کرده ایم ، تنها کاری که باید انجام دهیم این است که از آنها به طور مناسب در یک while استفاده کنیم تا اسکریپت پایتون ما همواره به دنبال پیام های جدید باشد و متناسب با آن پاسخ دهد.
if (open_whatsapp()): #باز شدن صفحه واتساپ با موفقیت print("##Whatsapp page ready for automation##") while(1): if (new_chat_available() or new_message_available()): print("New chat or message is available") incoming_message = read_last_message() #خواندن آخرین پیام دریافتی message_content = get_response(incoming_message) #تصمیم گیری پاسخ به پیام ورودی send_message(message_content) #ارسال پیام
اکنون می توانید هر دستگاهی را کنترل کنید یا اطلاعاتی مانند دما و رطوبت اتاق خود را در WhatsApp مانند گفتگو با دوست خود دریافت کنید. بهترین قسمت این پروژه این است که شما به راحتی می توانید اطلاعات را با هر کسی که WhatsApp نصب کرده است به اشتراک بگذارید ، تمام کاری که آنها برای دسترسی به ربات شما باید انجام دهند این است که نام ربات شما (مثلا “CD_bot”) را تایپ کنند. همچنین می توانید این مورد را به گروه WhatsApp اضافه کنید تا همه افراد گروه بتوانند به این ربات دسترسی پیدا کنند.
موارد موجود در فایل : سورس کامل، تصاویر مورد نیاز
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
با سلام
برای کنترل لوازم الکترونیکی میتوان از دستورات پیامرسان ها داخلی استفاده کرد
سلام عزیز
بله
لوازم مورد نیاز برای از لحاظ سخت افزاری چیست؟
سلام عزیز، در تصویر شماتیک مشاهده میکنید
برد بورد، ال ای دی یا رله، رزبری پای
بسیار آموزنده و ارزشمند
متشکرم
سلام عزیز
خوشحالم که براتون مفید بوده