הגדרת פרויקט
בזמן שאתה או את בונים את הפרויקט הזה, תיתקלו במודולים שונים ובספריות חיצוניות.
בואו ללמוד עליהם וכיצד להתקין אותם. אבל לפני שנתקין אותם, בואו ניצור סביבה וירטואלית ונפעיל אותה.
אנחנו הולכים ליצור סביבה וירטואלית באמצעות virtualenv. Python עם ספרייה מותקנת מראש virtualenv. אז, כדי ליצור סביבה וירטואלית, השתמשו פקודה הבאה:
הפקודה לעיל תיצור סביבה וירטואלית בשם env. כעת, עלינו להפעיל את הסביבה באמצעות הפקודה:
כדי לוודא אם הסביבה הופעלה או לא, תוכלו לראות (env) בטרמינל שלך. כעת, נוכל להתקין את הספריות :
הספרייה pyttsx3 : pyttsx היא ספריית טקסט לדיבור חוצת פלטפורמות שאינה תלויה בפלטפורמה. היתרון העיקרי בשימוש בספרייה זו להמרת טקסט לדיבור הוא שהיא פועלת במצב לא מקוון. כדי להתקין מודול זה, הקלידו את הפקודה הרשמו למטה בטרמינל:
2. זיהוי דיבור : ה מאפשר לנו להמיר אודיו לטקסט לעיבוד נוסף. כדי להתקין מודול זה, הקלידו את הפקודה למטה בטרמינל:
3. הסיפרייה pywhatkit : זוהי ספרייה קלה לשימוש שתעזור לנו ליצור אינטראקציה עם הדפדפן בקלות רבה. כדי להתקין את המודול, הפעילו את הפקודה הבאה בטרמינל:
4. ויקיפדיה : נשתמש בזה כדי להביא מידע מגוון מאתר ויקיפדיה. כדי להתקין מודול זה, הקלידו את הפקודה למטה בטרמינל:
5. בקשות : זוהי ספריית HTTP אלגנטית ופשוטה עבור Python המאפשרת לשלוח בקשות HTTP/1.1 בקלות רבה. כדי להתקין את המודול, הפעל את הפקודה הבאה בטרמינל:
קובץ .env
אנחנו צריכים את הקובץ הזה כדי לאחסן כמה נתונים פרטיים כגון מפתחות API, סיסמאות וכן הלאה הקשורים לפרויקט. לעת עתה, בואו נאחסן את שם המשתמש והבוט.
צרו קובץ בשם .env והוסיפו שם את התוכן הבא:
כדי להשתמש בתוכן מהקובץ .env, נתקין מודול נוסף בשם python-decouple כ:
למידע נוסף על משתני סביבה ב-Python כאן .
כיצד להגדיר JARVIS עם Python
לפני שנתחיל להגדיר כמה פונקציות חשובות, בואו ניצור תחילה מנוע דיבור.
בואו ננתח את התסריט : קודם כל, אתחלנו את המנוע - engine באמצעות שימוש במודול pyttsx3 .
ה- sapi5 הוא כלי Microsoft Speech API שעוזר לנו להשתמש בקול.
למד עוד על זה כאן .
לאחר מכן, אנו מגדירים את מאפייני הקצב והנפח של מנוע הדיבור באמצעות שיטת setProperty.
הפונקציה SetProperty מדמה אינטראקציות עם פקדי קלט כפי שהיה מתבצע אם המשתמש היה מזין או מגדיר ערך בפקד. פונקציה זו זמינה רק אם אתם כותבים בדיקות ב- Power Apps Test Studio. ניתן להגדיר את המאפיינים הבאים באמצעות הפונקציה SetProperty.
כעת, אנו יכולים לקבל את הקולות מהמנוע באמצעות שיטת getProperty. קולות יופיעו בצורת רשימה של קולות זמינים במערכת שבנינו. אם נדפיס אותו, נוכל לראות כך:
[<pyttsx3.voice.Voice object at 0x000001AB9FB834F0>, <pyttsx3.voice.Voice object at 0x000001AB9FB83490>]
הראשון הוא קול גברי והשני הוא קול נשי. JARVIS היה עוזר זכר בסרטים, אבל בחרתי להגדיר את voice המאפיין לנקבה עבור הדרכה זו באמצעות השיטה setProperty.
הערה: אם אתם מקבלים שגיאה הקשורה ל-PyAudio, הורדו את PyAudio Wheel מכאן והתקינו אותו בתוך הסביבה הווירטואלית.
כמו כן, באמצעות השיטה config-decouple, אנו מקבלים את הערך של USER ומשתני BOTNAME הסביבה.
הפעילו את הפונקציה Speak
פונקציית הדיבור תהיה אחראית להקראת כל טקסט שיועבר אליה. בוא נראה את הקוד:
בשיטה speak(text), המנוע מדבר כל טקסט שמועבר אליו באמצעות השיטה say(text). באמצעות השיטה runAndWait(text) , הוא חוסם במהלך לולאת האירוע וחוזר כאשר תור הפקודות מתנקה.
הפעילו את הפונקציה Greet
פונקציה זו תשמש לברך את המשתמש בכל פעם שהתוכנית מופעלת. לפי השעה הנוכחית, הוא מברך את המשתמש בוקר טוב , צהריים טובים או ערב טוב .
ראשית, נקבל את השעה הנוכחית, כלומר אם השעה הנוכחית היא 11:15 בבוקר, השעה תהיה 11. אם ערך השעה הוא בין 6 ל-12, נאחל למשתמש בוקר טוב. אם הערך הוא בין 12 ל-16, איחולי צהריים טובים ובדומה, אם הערך הוא בין 16 ל-19, איחולי ערב טוב. אנו משתמשים בשיטת הדיבור כדי לדבר אל המשתמש.
כיצד לאסוף קלט משתמש ?
אנו משתמשים בפונקציה זו כדי לקחת את הפקודות מהמשתמש ולזהות את הפקודה באמצעות המודול speech_recognition .
import speech_recognition as sr from random import choice from utils import opening_text def take_user_input(): """Takes user input, recognizes it using Speech Recognition module and converts it into text""" r = sr.Recognizer() with sr.Microphone() as source: print('Listening....') r.pause_threshold = 1 audio = r.listen(source) try: print('Recognizing...') query = r.recognize_google(audio, language='en-in') if not 'exit' in query or 'stop' in query: speak(choice(opening_text)) else: hour = datetime.now().hour if hour >= 21 and hour < 6: speak("Good night sir, take care!") else: speak('Have a good day sir!') exit() except Exception: speak('Sorry, I could not understand. Could you please say that again?') query = 'None' return query
ייבאנו מודול זיהוי_דיבור בתור sr. מחלקת Recognizer בתוך מודול speech_recognition עוזרת לנו לזהות את האודיו.
לאותו מודול יש מחלקת Microphone שנותנת לנו גישה למיקרופון של המכשיר. אז עם המיקרופון כמקור, אנחנו מנסים להאזין לאודיו באמצעות שיטת listen() במחלקה Recognizer.
הגדרנו גם את ה-pause_threshold ל-1, כלומר הוא לא יתלונן גם אם נשהה לשנייה אחת במהלך הדיבור.
לאחר מכן, באמצעות שיטת recognizer() מהמחלקה Recognizer, אנו מנסים לזהות את האודיו.
שיטת זיהוי_google() מבצעת זיהוי דיבור באודיו המועבר אליה, באמצעות ה-API של Google Speech Recognition.
הגדרנו את השפה ל-en, שהיא אנגלית. זה מחזיר את תמלול האודיו שאינו אלא מחרוזת. אחסנו אותו במשתנה שנקרא query.
אם השאילתה מכילה את המילים : יציאה או עצירה, זה אומר שאנחנו מבקשים מהעוזר להפסיק מיד. לכן, לפני עצירה, אנו מברכיים את המשתמש שוב לפי השעה הנוכחית. אם השעה היא בין 21 ל-6, איחול למשתמש לילה טוב, אחרת, הודעה אחרת.
אנו יוצרים קובץ utils.py הכולל רק רשימה אחת המכילה כמה הצהרות כמו זה:
אם השאילתה לא מכילה את שתי המילים האלה (יציאה או עצירה), אנחנו אומרים משהו בקול כדי לספר למשתמש ששמענו אותו. לשם כך, נשתמש בשיטת הבחירה מהמודול האקראי כדי לבחור באקראי כל משפט מרשימת ה-opening_text. לאחר הדיבור, אנו יוצאים מהתוכנית.
במהלך כל התהליך הזה, אם אנו נתקלים במשהו חריג, אנו מתנצלים בפני המשתמש ומגדירים את השאילתה ל-None. בסופו של דבר, נחזיר את השאילתה.
כיצד להגדיר פונקציות לא מקוונות ?
בתוך תיקיית הפונקציות, צרו קובץ Python בשם os_ops.py. בקובץ זה, ניצור פונקציות שונות לאינטראקציה עם מערכת ההפעלה.
import os import subprocess as sp paths = { 'notepad': "C:\\Program Files\\Notepad++\\notepad++.exe", 'discord': "C:\\Users\\ashut\\AppData\\Local\\Discord\\app-1.0.9003\\Discord.exe", 'calculator': "C:\\Windows\\System32\\calc.exe" }
בסקריפט לעיל, יצרנו מילון בשם paths אשר שם תוכנה כמפתח והנתיב שלו כערך. אתה יכול לשנות את הנתיבים בהתאם למערכת שלך ולהוסיף נתיבים נוספים של תוכנה אם אתה צריך לעשות זאת.
כיצד להפעיל את המצלמה ?
נשתמש בפונקציה זו כדי לפתוח את המצלמה במערכת שלנו. אנו נשתמש במודול subprocess כדי להפעיל את הפקודה.
כיצד לפתוח את שורת הפקודה ?
נשתמש בפונקציה זו כדי לפתוח את שורת הפקודה במערכת שלנו.
כיצד לפתוח את המחשבון ?
כיצד הגדיר פונקציות מקוונות ?
נוסיף מספר פונקציות מקוונות. הם:
מצא את כתובת ה-IP שלי
חפש בויקיפדיה
הפעל סרטונים ביוטיוב
חפש בגוגל
שלח הודעת וואטסאפ
שלח אימייל
קבל כותרות חדשות אחרונות
קבל דוח מזג אוויר
קבל סרטים פופולריים
קבל בדיחות אקראיות
קבל עצה אקראית
בואו ניצור קובץ שנקרא online_ops.py בתוך functions הספרייה, ונתחיל ליצור את הפונקציות הללו בזו אחר זו. לעת עתה, הוסיפו את הקוד הבא לקובץ:
לפני שנתחיל לעבוד עם ממשקי API, אם אינך מכיר ממשקי API וכיצד ליצור איתם אינטראקציה באמצעות Python, עיין במדריך זה .
כיצד להוסיף את הפונקציה מצא את כתובת ה-IP שלי ?
ה ipify מספק API פשוט של כתובת IP ציבורית. אנחנו רק צריכים להגיש בקשת GET בכתובת האתר הזו: https://api64.ipify.org/?format=json . זה מחזיר נתוני JSON כ:
לאחר מכן נוכל להחזיר את ip הנתונים מה-JSON. אז בואו ניצור את השיטה הזו:
בתוך המודול wikipedia , יש לנו summary() שיטה שמקבלת שאילתה כארגומנט. בנוסף, אנו יכולים גם להעביר את מספר המשפטים הנדרשים. ואז אנחנו פשוט מחזירים את התוצאה.
כיצד להוסיף את הפונקציה הפעלת סרטונים ביוטיוב ?
להפעלת סרטונים ב-YouTube, אנו משתמשים ב- PyWhatKit . כבר ייבאנו אותו בתור kit.
ל- PyWhatKit יש playonyt() שיטה שמקבלת נושא כטיעון. לאחר מכן הוא מחפש את הנושא ב-YouTube ומפעיל את הסרטון המתאים ביותר. הוא משתמש ב- PyAutoGUI מתחת למכסה המנוע.
כיצד להוסיף את הפונקציה חיפוש בגוגל ?
שוב נשתמש ב- PyWhatKit לחיפוש בגוגל.
יש לו שיטה search() שעוזרת לנו לחפש בגוגל באופן מיידי.
כיצד להוסיף את הפונקציה שליחת הודעת WhatsApp ?
אנו נשתמש ב- PyWhatKit שוב לשליחת הודעות WhatsApp.
השיטה שלנו מקבלת שני טיעונים - מספר הטלפון number וה- message. לאחר מכן הוא קורא sendwhatmsg_instantly() לשיטה לשלוח הודעת WhatsApp. ודאו שכבר נכנסתם לחשבון WhatsApp שלך ב-WhatsApp for Web.
כיצד להוסיף את הפונקציה שליחת אימייל ?
לשליחת מיילים, אנו נשתמש במודול המובנה smtplib מבית Python.
השיטה מקבלת receiver_address, subject, message כטיעונים. אנו יוצרים אובייקט של מחלקת SMTP מהמודול smtplib. זה לוקח מארח ומספר יציאה בתור הפרמטרים.
לאחר מכן אנו מתחילים סשן ומתחברים עם כתובת המייל והסיסמה ושולחים את המייל. ודאו שאתם מוסיפים EMAIL ו- PASSWORD בקובץ .env.
כיצד להוסיף את הפונקציה קבלת כותרות חדשות אחרונות ?
כדי להביא את כותרות החדשות האחרונות, נשתמש ב- NewsAPI . אפשר להירשם לחשבון בחינם ב-NewsAPI ולקבל את מפתח ה-API. הוספו את ה-NEWS_API_KEY בקובץ .env.
NEWS_API_KEY = config("NEWS_API_KEY") def get_latest_news(): news_headlines = [] res = requests.get( f"https://newsapi.org/v2/top-headlines?country=in&apiKey={NEWS_API_KEY}&category=general").json() articles = res["articles"] for article in articles: news_headlines.append(article["title"]) return news_headlines[:5]
בשיטה שלעיל, אנו יוצרים תחילה רשימה ריקה בשם news_headlines. לאחר מכן אנו מבצעים בקשת GET על כתובת ה-API שצוינה בתיעוד NewsAPI . תגובת JSON לדוגמה מהבקשה נראית כך:
{ "status": "ok", "totalResults": 38, "articles": [ { "source": { "id": null, "name": "Sportskeeda" }, "author": "Aniket Thakkar", "title": "Latest Free Fire redeem code to get Weapon loot crate today (14 October 2021) - Sportskeeda", "description": "Gun crates are one of the ways that players in Free Fire can obtain impressive and appealing gun skins.", "url": "https://www.sportskeeda.com/free-fire/latest-free-fire-redeem-code-get-weapon-loot-crate-today-14-october-2021", "urlToImage": "https://staticg.sportskeeda.com/editor/2021/10/d0b83-16341799119781-1920.jpg", "publishedAt": "2021-10-14T03:51:50Z", "content": null }, { "source": { "id": null, "name": "NDTV News" }, "author": null, "title": "BSF Gets Increased Powers In 3 Border States: What It Means - NDTV", "description": "Border Security Force (BSF) officers will now have the power toarrest, search, and of seizure to the extent of 50 km inside three newstates sharing international boundaries with Pakistan and Bangladesh.", "url": "https://www.ndtv.com/india-news/bsf-gets-increased-powers-in-3-border-states-what-it-means-2574644", "urlToImage": "https://c.ndtvimg.com/2021-08/eglno7qk_-bsf-recruitment-2021_625x300_10_August_21.jpg", "publishedAt": "2021-10-14T03:44:00Z", "content": "This move is quickly snowballing into a debate on state autonomy. New Delhi: Border Security Force (BSF) officers will now have the power to arrest, search, and of seizure to the extent of 50 km ins… [+4143 chars]" }, { "source": { "id": "the-times-of-india", "name": "The Times of India" }, "author": "TIMESOFINDIA.COM", "title": "5 health conditions that can make your joints hurt - Times of India", "description": "Joint pain caused by these everyday issues generally goes away on its own when you stretch yourself a little and flex your muscles.", "url": "https://timesofindia.indiatimes.com/life-style/health-fitness/health-news/5-health-conditions-that-can-make-your-joints-hurt/photostory/86994969.cms", "urlToImage": "https://static.toiimg.com/photo/86995017.cms", "publishedAt": "2021-10-14T03:30:00Z", "content": "Depression is a mental health condition, but the symptoms may manifest even on your physical health. Unexpected aches and pain in the joints that you may experience when suffering from chronic depres… [+373 chars]" }, { "source": { "id": null, "name": "The Indian Express" }, "author": "Devendra Pandey", "title": "Rahul Dravid likely to be interim coach for New Zealand series - The Indian Express", "description": "It’s learnt that a few Australian coaches expressed interest in the job, but the BCCI isn’t keen as they are focussing on an Indian for the role, before they look elsewhere.", "url": "https://indianexpress.com/article/sports/cricket/rahul-dravid-likely-to-be-interim-coach-for-new-zealand-series-7570990/", "urlToImage": "https://images.indianexpress.com/2021/05/rahul-dravid.jpg", "publishedAt": "2021-10-14T03:26:09Z", "content": "Rahul Dravid is likely to be approached by the Indian cricket board to be the interim coach for Indias home series against New Zealand. Head coach Ravi Shastri and the core of the support staff will … [+1972 chars]" }, { "source": { "id": null, "name": "CNBCTV18" }, "author": null, "title": "Thursday's top brokerage calls: Infosys, Wipro and more - CNBCTV18", "description": "Goldman Sachs has maintained its 'sell' rating on Mindtree largely due to expensive valuations, while UBS expects a muted reaction from Wipro's stock. Here are the top brokerage calls for the day:", "url": "https://www.cnbctv18.com/market/stocks/thursdays-top-brokerage-calls-infosys-wipro-and-more-11101072.htm", "urlToImage": "https://images.cnbctv18.com/wp-content/uploads/2019/03/buy-sell.jpg", "publishedAt": "2021-10-14T03:26:03Z", "content": "MiniGoldman Sachs has maintained its 'sell' rating on Mindtree largely due to expensive valuations, while UBS expects a muted reaction from Wipro's stock. Here are the top brokerage calls for the day:" } ] }
מכיוון שהחדשות כלולות ברשימה בשם articles, אנו יוצרים משתנה articles עם הערך res['articles']. כעת אנו חוזרים על articles הרשימה הזו ומצרפים את הרשימה article["title"] לרשימה news_headlines. לאחר מכן אנו מחזירים את חמש כותרות החדשות הראשונות מהרשימה הזו.
כיצד להוסיף את הפונקציה קבל מצב מזג האוויר ?
כדי לקבל את מצב מזג האוויר, אנו משתמשים בממשק API של OpenWeatherMap .
הירשמו לחשבון בחינם וקבלו את מזהה ה-APP. ודאו שאתם מוסיפים את ה- OPENWEATHER_APP_ID בקובץ .env.
OPENWEATHER_APP_ID = config("OPENWEATHER_APP_ID")
def get_weather_report(city): res = requests.get( f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={OPENWEATHER_APP_ID}&units=metric").json() weather = res["weather"][0]["main"] temperature = res["main"]["temp"] feels_like = res["main"]["feels_like"] return weather, f"{temperature}℃", f"{feels_like}℃"
לפי ה- API של OpenWeatherMap , עלינו להגיש בקשת GET בכתובת ה-URL המוזכרת לעיל עם שם העיר. נקבל תגובת JSON כ:
נצטרך רק את התגובה weather, temperature, ומתוך feels_like התגובה לעיל.
כיצד להוסיף את הפונקציה סרטים פופולריים ?
כדי לקבל את הסרטים הפופולריים, נשתמש ב- The Movie Database (TMDB) API. הירשם לחשבון בחינם וקבל את מפתח ה-API. הוסף את ה- TMDB_API_KEY בקובץ .env.
בדיוק כפי שעשינו עבור כותרות החדשות האחרונות, אנחנו יוצרים רשימת trending_movies . לאחר מכן, בהתאם ל-TMDB API, אנו שולחים בקשת GET. תגובת JSON לדוגמה נראית כך:
{ "page": 1, "results": [ { "video": false, "vote_average": 7.9, "overview": "Shang-Chi must confront the past he thought he left behind when he is drawn into the web of the mysterious Ten Rings organization.", "release_date": "2021-09-01", "title": "Shang-Chi and the Legend of the Ten Rings", "adult": false, "backdrop_path": "/cinER0ESG0eJ49kXlExM0MEWGxW.jpg", "vote_count": 2917, "genre_ids": [28, 12, 14], "id": 566525, "original_language": "en", "original_title": "Shang-Chi and the Legend of the Ten Rings", "poster_path": "/1BIoJGKbXjdFDAqUEiA2VHqkK1Z.jpg", "popularity": 9559.446, "media_type": "movie" }, { "adult": false, "backdrop_path": "/dK12GIdhGP6NPGFssK2Fh265jyr.jpg", "genre_ids": [28, 35, 80, 53], "id": 512195, "original_language": "en", "original_title": "Red Notice", "overview": "An Interpol-issued Red Notice is a global alert to hunt and capture the world's most wanted. But when a daring heist brings together the FBI's top profiler and two rival criminals, there's no telling what will happen.", "poster_path": "/wdE6ewaKZHr62bLqCn7A2DiGShm.jpg", "release_date": "2021-11-04", "title": "Red Notice", "video": false, "vote_average": 6.9, "vote_count": 832, "popularity": 1990.503, "media_type": "movie" }, { "genre_ids": [12, 28, 53], "original_language": "en", "original_title": "No Time to Die", "poster_path": "/iUgygt3fscRoKWCV1d0C7FbM9TP.jpg", "video": false, "vote_average": 7.6, "overview": "Bond has left active service and is enjoying a tranquil life in Jamaica. His peace is short-lived when his old friend Felix Leiter from the CIA turns up asking for help. The mission to rescue a kidnapped scientist turns out to be far more treacherous than expected, leading Bond onto the trail of a mysterious villain armed with dangerous new technology.", "id": 370172, "vote_count": 1804, "title": "No Time to Die", "adult": false, "backdrop_path": "/1953j0QEbtN17WFFTnJHIm6bn6I.jpg", "release_date": "2021-09-29", "popularity": 4639.439, "media_type": "movie" }, { "poster_path": "/5pVJ9SuuO72IgN6i9kMwQwnhGHG.jpg", "video": false, "vote_average": 0, "overview": "Peter Parker is unmasked and no longer able to separate his normal life from the high-stakes of being a Super Hero. When he asks for help from Doctor Strange the stakes become even more dangerous, forcing him to discover what it truly means to be Spider-Man.", "release_date": "2021-12-15", "id": 634649, "adult": false, "backdrop_path": "/vK18znei8Uha2z7ZhZtBa40HIrm.jpg", "vote_count": 0, "genre_ids": [28, 12, 878], "title": "Spider-Man: No Way Home", "original_language": "en", "original_title": "Spider-Man: No Way Home", "popularity": 1084.815, "media_type": "movie" }, { "video": false, "vote_average": 6.8, "overview": "After finding a host body in investigative reporter Eddie Brock, the alien symbiote must face a new enemy, Carnage, the alter ego of serial killer Cletus Kasady.", "release_date": "2021-09-30", "adult": false, "backdrop_path": "/70nxSw3mFBsGmtkvcs91PbjerwD.jpg", "vote_count": 1950, "genre_ids": [878, 28, 12], "id": 580489, "original_language": "en", "original_title": "Venom: Let There Be Carnage", "poster_path": "/rjkmN1dniUHVYAtwuV3Tji7FsDO.jpg", "title": "Venom: Let There Be Carnage", "popularity": 4527.568, "media_type": "movie" } ], "total_pages": 1000, "total_results": 20000 } מהתגובה לעיל, אנחנו רק צריכים את השם של הסרט. אנחנו מקבלים את resultsהרשימה ואז עוברים עליה כדי לקבל את כותרת הסרט ולצרף אותה לרשימה trending_movies. בסופו של דבר, נחזיר את חמשת האלמנטים הראשונים של הרשימה.
כיצד להוסיף את הפונקציה קבל בדחיות אקראיות ?
כדי לקבל בדיחה אקראית, אנחנו רק צריכים לשלוח בקשת GET בכתובת האתר הזו: https://icanhazdadjoke.com/ .
כיצד להוסיף את הפונקציה קבל ייעוץ אקראי ?
כדי לקבל עצה אקראית, אנו משתמשים ב- Advice Slip API .