HomeLập trìnhPythonDự án Python...

Dự án Python – Cách xây dựng JARVIS của Tony Stark bằng Python


Bạn có nhớ JARVIS, trợ lý cá nhân ảo của Tony Stark không? Nếu bạn đã xem bất kỳ bộ phim nào về Người sắt hoặc Avengers, tôi chắc chắn rằng bạn sẽ làm được.

Bạn đã bao giờ tự hỏi liệu bạn có thể tạo trợ lý cá nhân của riêng mình không? Đúng? Tony Stark có thể giúp chúng ta điều đó!

tony-snap2_rv5gmh

Rất tiếc, bạn đã quên anh ấy không còn nữa? Thật buồn khi anh ấy không còn có thể cứu chúng tôi nữa. Nhưng này, ngôn ngữ lập trình yêu thích của bạn Python có thể giúp bạn điều đó.

Đúng, bạn nghe đúng đấy. Chúng ta có thể tạo JARVIS của riêng mình bằng Python. Hãy đi sâu vào nó!

Thiết lập dự án

Trong khi viết mã cho dự án này, bạn sẽ bắt gặp nhiều mô-đun và thư viện bên ngoài khác nhau. Hãy cùng tìm hiểu về chúng và cài đặt chúng. Nhưng trước khi cài đặt chúng, hãy tạo một môi trường ảo và kích hoạt nó.

Chúng tôi sẽ tạo một môi trường ảo bằng cách sử dụng virtualenv. Python hiện đã được cài đặt sẵn virtualenv thư viện. Vì vậy, để tạo một môi trường ảo, bạn có thể sử dụng lệnh dưới đây:

$ python -m venv env

Lệnh trên sẽ tạo một môi trường ảo có tên env. Bây giờ, chúng ta cần kích hoạt môi trường bằng lệnh:

$ . env/Scripts/activate

Để xác minh xem môi trường đã được kích hoạt hay chưa, bạn có thể xem (env) trong thiết bị đầu cuối của bạn. Bây giờ, chúng ta có thể cài đặt các thư viện.

  1. pyttsx3: pyttsx là thư viện văn bản thành giọng nói đa nền tảng, độc lập với nền tảng. Ưu điểm chính của việc sử dụng thư viện này để chuyển đổi văn bản thành giọng nói là nó hoạt động ngoại tuyến. Để cài đặt mô-đun này, hãy nhập lệnh dưới đây trong thiết bị đầu cuối:

    $ pip install pyttsx3
  2. Nhận dạng giọng nói: Điều này cho phép chúng tôi chuyển đổi âm thanh thành văn bản để xử lý thêm. Để cài đặt mô-đun này, hãy nhập lệnh dưới đây trong thiết bị đầu cuối:
    $ pip install SpeechRecognition
  3. pywhatkit: Đây là thư viện dễ sử dụng sẽ giúp chúng ta tương tác với trình duyệt rất dễ dàng. Để cài đặt mô-đun, hãy chạy lệnh sau trong thiết bị đầu cuối:
    $ pip install pywhatkit
  4. wikipedia: Chúng tôi sẽ sử dụng điều này để lấy nhiều loại thông tin từ trang web Wikipedia. Để cài đặt mô-đun này, hãy nhập lệnh dưới đây trong thiết bị đầu cuối:
    $ pip install wikipedia
  5. yêu cầu: Đây là một thư viện HTTP trang nhã và đơn giản dành cho Python cho phép bạn gửi các yêu cầu HTTP/1.1 cực kỳ dễ dàng. Để cài đặt mô-đun, hãy chạy lệnh sau trong thiết bị đầu cuối:
    $ pip install requests

Tệp .env

Chúng tôi cần tệp này để lưu trữ một số dữ liệu riêng tư như Khóa API, Mật khẩu, v.v. có liên quan đến dự án. Hiện tại, hãy lưu trữ tên của người dùng và bot.

Tạo một tệp có tên .env và thêm nội dung sau vào đó:

USER=Ashutosh
BOTNAME=JARVIS

Để sử dụng nội dung từ .env tệp, chúng tôi sẽ cài đặt một mô-đun khác có tên python-tách rời như:

$ pip install python-decouple

Tìm hiểu thêm về Biến môi trường trong Python tại đây.

Cách thiết lập JARVIS bằng Python

Trước khi chúng tôi bắt đầu xác định một số chức năng quan trọng, trước tiên hãy tạo một công cụ phát biểu.

import pyttsx3
from decouple import config

USERNAME = config('USER')
BOTNAME = config('BOTNAME')


engine = pyttsx3.init('sapi5')

# Set Rate
engine.setProperty('rate', 190)

# Set Volume
engine.setProperty('volume', 1.0)

# Set Voice (Female)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)

Hãy phân tích đoạn văn bản trên. Trước hết, chúng tôi đã khởi tạo một engine sử dụng pyttsx3 mô-đun. sapi5 là một Microsoft Speech API giúp chúng tôi sử dụng giọng nói. Tìm hiểu thêm về nó ở đây.

Tiếp theo, chúng tôi đang thiết lập ratevolume thuộc tính của công cụ nói bằng cách sử dụng setProperty phương pháp.

Bây giờ, chúng ta có thể nhận được tiếng nói từ động cơ bằng cách sử dụng getProperty phương pháp. voices sẽ là một danh sách các giọng nói có sẵn trong hệ thống của chúng tôi. Nếu chúng tôi in nó, chúng tôi có thể thấy như dưới đây:

[<pyttsx3.voice.Voice object at 0x000001AB9FB834F0>, <pyttsx3.voice.Voice object at 0x000001AB9FB83490>]

Người đầu tiên là giọng nam và người kia là giọng nữ. JARVIS là một nam trợ lý trong phim, nhưng tôi đã chọn thiết lập voice thuộc tính cho nữ cho hướng dẫn này bằng cách sử dụng setProperty phương pháp.

Lưu ý: Nếu bạn gặp lỗi liên quan đến PyAudio, hãy tải xuống bánh xe PyAudio từ đây và cài đặt nó trong môi trường ảo.

Ngoài ra, sử dụng config phương pháp từ tách rờichúng tôi đang nhận được giá trị của USERBOTNAME từ các biến môi trường.

Bật chức năng Nói

Hàm speak sẽ chịu trách nhiệm nói bất kỳ văn bản nào được truyền cho nó. Hãy xem mã:

# Text to Speech Conversion
def speak(text):
    """Used to speak whatever text is passed to it"""
    
    engine.say(text)
    engine.runAndWait()

bên trong speak() phương thức, công cụ sẽ nói bất kỳ văn bản nào được truyền cho nó bằng cách sử dụng say() phương pháp. Sử dụng runAndWait() phương pháp này, nó sẽ chặn trong vòng lặp sự kiện và trả về khi hàng đợi lệnh bị xóa.

Kích hoạt chức năng chào hỏi

Chức năng này sẽ được sử dụng để chào người dùng mỗi khi chương trình được chạy. Theo thời gian hiện tại, nó chào Chào buổi sáng, Chào buổi chiều, hoặc Chào buổi tối cho người dùng.

from datetime import datetime


def greet_user():
    """Greets the user according to the time"""
    
    hour = datetime.now().hour
    if (hour >= 6) and (hour < 12):
        speak(f"Good Morning {USERNAME}")
    elif (hour >= 12) and (hour < 16):
        speak(f"Good afternoon {USERNAME}")
    elif (hour >= 16) and (hour < 19):
        speak(f"Good Evening {USERNAME}")
    speak(f"I am {BOTNAME}. How may I assist you?")

Đầu tiên, chúng tôi nhận được giờ hiện tại, nghĩa là nếu thời gian hiện tại là 11:15 sáng, giờ sẽ là 11. Nếu giá trị của giờ nằm ​​trong khoảng từ 6 đến 12, chúc người dùng buổi sáng tốt lành. Nếu giá trị nằm trong khoảng từ 12 đến 16, hãy chúc buổi chiều tốt lành và tương tự, nếu giá trị nằm trong khoảng từ 16 đến 19, hãy chúc buổi tối tốt lành. Chúng tôi đang sử dụng phương pháp speak để nói chuyện với người dùng.

Đọc thêm  Chuỗi đảo ngược Python – Đảo ngược chuỗi trong Python được giải thích bằng các ví dụ

Cách lấy đầu vào của người dùng

Chúng tôi sử dụng chức năng này để lấy lệnh từ người dùng và nhận dạng lệnh bằng cách sử dụng speech_recognition mô-đun.

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

Chúng tôi đã nhập khẩu speech_recognition mô-đun như sr. Các Nhận dạng lớp trong speech_recognition mô-đun giúp chúng tôi nhận ra âm thanh. Cùng một mô-đun có một Cái mic cờ rô lớp cho phép chúng tôi truy cập vào micrô của thiết bị. Vì vậy, với micrô là sourcechúng tôi cố gắng nghe âm thanh bằng cách sử dụng listen() phương pháp trong Nhận dạng lớp.

Chúng tôi cũng đã thiết lập pause_threshold đến 1, nghĩa là nó sẽ không phàn nàn ngay cả khi chúng ta tạm dừng một giây trong khi nói.

Tiếp theo, sử dụng recognize_google() phương pháp từ Nhận dạng class, chúng tôi cố gắng nhận dạng âm thanh. Các recognize_google() phương thức thực hiện nhận dạng giọng nói trên âm thanh được truyền tới nó, sử dụng API nhận dạng giọng nói của Google.

Chúng tôi đã đặt ngôn ngữ thành en-in, đó là tiếng Anh Ấn Độ. Nó trả về bản ghi của âm thanh không là gì ngoài một chuỗi. Chúng tôi đã lưu trữ nó trong một biến gọi là query.

Nếu truy vấn có lối ra hoặc dừng lại trong đó, có nghĩa là chúng tôi đang yêu cầu trợ lý dừng lại ngay lập tức. Vì vậy, trước khi dừng, chúng tôi chào người dùng một lần nữa theo giờ hiện tại. Nếu giờ nằm ​​trong khoảng từ 21 đến 6, hãy ước Chúc ngủ ngon cho người dùng, khác, một số tin nhắn khác.

chúng tôi tạo ra một utils.py tệp chỉ có một danh sách chứa một vài câu lệnh như sau:

opening_text = [
    "Cool, I'm on it sir.",
    "Okay sir, I'm working on it.",
    "Just a second sir.",
]

Nếu truy vấn không có hai từ đó (thoát hoặc dừng), chúng tôi sẽ nói điều gì đó để cho người dùng biết rằng chúng tôi đã nghe thấy họ. Vì vậy, chúng tôi sẽ sử dụng phương pháp lựa chọn từ mô-đun ngẫu nhiên để chọn ngẫu nhiên bất kỳ câu lệnh nào từ mô-đun ngẫu nhiên. opening_text danh sách. Sau khi nói, chúng tôi thoát khỏi chương trình.

Trong toàn bộ quá trình này, nếu chúng tôi gặp phải một ngoại lệ, chúng tôi xin lỗi người dùng và đặt query thành Không. Cuối cùng, chúng tôi trả lại query.

Cách thiết lập chức năng ngoại tuyến

Bên trong functions thư mục, tạo một tệp Python có tên os_ops.py. Trong tệp này, chúng tôi sẽ tạo các chức năng khác nhau để tương tác với HĐH.

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"
}

Trong tập lệnh trên, chúng tôi đã tạo một từ điển có tên paths có tên phần mềm làm khóa và đường dẫn của nó làm giá trị. Bạn có thể thay đổi đường dẫn theo hệ thống của mình và thêm nhiều đường dẫn phần mềm hơn nếu cần.

Cách mở máy ảnh

Chúng tôi sẽ sử dụng chức năng này để mở máy ảnh trong hệ thống của chúng tôi. Chúng tôi sẽ sử dụng subprocess mô-đun để chạy lệnh.

def open_camera():
    sp.run('start microsoft.windows.camera:', shell=True)

Cách mở Notepad và Discord

Chúng tôi sẽ sử dụng các chức năng này để mở Notepad++ và Discord trong hệ thống.

def open_notepad():
    os.startfile(paths['notepad'])


def open_discord():
    os.startfile(paths['discord'])

Cách mở Dấu nhắc Lệnh

Chúng tôi sẽ sử dụng chức năng này để mở dấu nhắc lệnh trong hệ thống của chúng tôi.

def open_cmd():
    os.system('start cmd')

Cách mở Máy tính

Chúng tôi sẽ sử dụng chức năng này để mở máy tính trên hệ thống của chúng tôi.

def open_calculator():
    sp.Popen(paths['calculator'])

Cách thiết lập chức năng trực tuyến

Chúng tôi sẽ thêm một số chức năng trực tuyến. Họ đang:

  1. Tìm địa chỉ IP của tôi
  2. Tìm kiếm trên Wikipedia
  3. Phát video trên YouTube
  4. Tìm kiếm trên Google
  5. Gửi tin nhắn WhatsApp
  6. Gửi email
  7. Nhận tiêu đề tin tức mới nhất
  8. Nhận báo cáo thời tiết
  9. Nhận phim thịnh hành
  10. Nhận truyện cười ngẫu nhiên
  11. Nhận lời khuyên ngẫu nhiên

Hãy tạo một tệp có tên online_ops.py trong functions thư mục và bắt đầu tạo các chức năng này lần lượt. Hiện tại, hãy thêm đoạn mã sau vào tệp:

import requests
import wikipedia
import pywhatkit as kit
from email.message import EmailMessage
import smtplib
from decouple import config

Trước khi bắt đầu làm việc với API, nếu bạn chưa quen với API và cách tương tác với chúng bằng Python, hãy xem hướng dẫn này.

Cách thêm chức năng Tìm địa chỉ IP của tôi

ipify cung cấp API địa chỉ IP công cộng đơn giản. Chúng tôi chỉ cần thực hiện một yêu cầu GET trên URL này: https://api64.ipify.org/?format=json. Nó trả về dữ liệu JSON dưới dạng:

{
  "ip": "117.214.111.199"
}

Sau đó chúng ta có thể chỉ cần trả lại ip từ dữ liệu JSON. Vì vậy, hãy tạo phương thức này:

def find_my_ip():
    ip_address = requests.get('https://api64.ipify.org?format=json').json()
    return ip_address["ip"]

Cách thêm Chức năng Tìm kiếm trên Wikipedia

Để tìm kiếm trên Wikipedia, chúng tôi sẽ sử dụng wikipedia mô-đun mà chúng tôi đã cài đặt trước đó trong hướng dẫn này.

def search_on_wikipedia(query):
    results = wikipedia.summary(query, sentences=2)
    return results

Bên trong wikipedia mô-đun, chúng tôi có một summary() phương thức chấp nhận truy vấn làm đối số. Ngoài ra, chúng tôi cũng có thể vượt qua số lượng câu cần thiết. Sau đó, chúng tôi chỉ cần trả lại kết quả.

Cách thêm chức năng phát video trên YouTube

Để phát video trên YouTube, chúng tôi đang sử dụng PyWhatKit. Chúng tôi đã nhập nó dưới dạng kit.

def play_on_youtube(video):
    kit.playonyt(video)

PyWhatKit có một playonyt() phương thức chấp nhận một chủ đề làm đối số. Sau đó, nó sẽ tìm kiếm chủ đề trên YouTube và phát video phù hợp nhất. Nó sử dụng PyAutoGUI dưới mui xe.

Đọc thêm  Cách xây dựng ứng dụng web trên điện thoại của bạn – Hướng dẫn ứng dụng Android Python & Pydroid

Cách thêm chức năng Tìm kiếm trên Google

Một lần nữa chúng ta sẽ sử dụng PyWhatKit để tìm kiếm trên Google.

def search_on_google(query):
    kit.search(query)

Nó có một phương pháp search() giúp chúng tôi tìm kiếm trên Google ngay lập tức.

Cách thêm chức năng gửi tin nhắn WhatsApp

Chúng tôi sẽ sử dụng PyWhatKit một lần nữa để gửi tin nhắn WhatsApp.

def send_whatsapp_message(number, message):
    kit.sendwhatmsg_instantly(f"+91{number}", message)

Phương pháp của chúng tôi chấp nhận hai đối số – số điện thoại numbermessage. Sau đó, nó gọi sendwhatmsg_instantly() phương thức gửi tin nhắn WhatsApp. Đảm bảo rằng bạn đã đăng nhập vào tài khoản WhatsApp của mình trên WhatsApp cho Web.

Cách thêm chức năng gửi email

Để gửi email, chúng tôi sẽ sử dụng tích hợp sẵn smtplib mô-đun từ Python.

EMAIL = config("EMAIL")
PASSWORD = config("PASSWORD")


def send_email(receiver_address, subject, message):
    try:
        email = EmailMessage()
        email['To'] = receiver_address
        email["Subject"] = subject
        email['From'] = EMAIL
        email.set_content(message)
        s = smtplib.SMTP("smtp.gmail.com", 587)
        s.starttls()
        s.login(EMAIL, PASSWORD)
        s.send_message(email)
        s.close()
        return True
    except Exception as e:
        print(e)
        return False

Phương pháp chấp nhận receiver_address, subjectmessage như những lập luận. Chúng tôi tạo một đối tượng của SMTP lớp học từ smtplib mô-đun. phải mất chủ nhà số cổng như các tham số.

Sau đó, chúng tôi bắt đầu một phiên và đăng nhập bằng địa chỉ email và mật khẩu và gửi email. Hãy chắc chắn rằng bạn thêm E-MAIL MẬT KHẨU MỞ KHÓA bên trong .env tập tin.

Cách thêm chức năng Nhận tiêu đề tin tức mới nhất

Để lấy các tiêu đề tin tức mới nhất, chúng tôi sẽ sử dụng NewsAPI. Đăng ký tài khoản miễn phí trên NewsAPI và nhận Khóa API. thêm TIN TỨC_API_KEY bên trong .env tập tin.

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]

Trong phương pháp trên, trước tiên chúng ta tạo một danh sách trống có tên news_headlines. Sau đó, chúng tôi đang thực hiện yêu cầu GET trên URL API được chỉ định trong Tài liệu NewsAPI. Một phản hồi JSON mẫu từ yêu cầu trông giống như sau:

{
  "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:"
    }
  ]
}

Vì tin tức được chứa trong một danh sách có tên articleschúng tôi đang tạo một biến articles với giá trị res['articles']. Bây giờ chúng tôi đang lặp lại điều này articles danh sách và nối thêm article["title"] đến news_headlines danh sách. Sau đó, chúng tôi sẽ trả lại năm tiêu đề tin tức đầu tiên từ danh sách này.

Cách thêm chức năng Nhận báo cáo thời tiết

Để nhận báo cáo thời tiết, chúng tôi đang sử dụng API OpenWeatherMap. Đăng ký tài khoản miễn phí và nhận ID ứng dụng. Hãy chắc chắn rằng bạn thêm OPENWEATHER_APP_ID bên trong .env tập tin.

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}℃"

Theo API OpenWeatherMap, chúng tôi cần thực hiện yêu cầu GET trên URL được đề cập ở trên với tên thành phố. Chúng tôi sẽ nhận được phản hồi JSON dưới dạng:

{
    "coord": {
        "lon": 85,
        "lat": 24.7833
    },
    "weather": [
        {
            "id": 721,
            "main": "Haze",
            "description": "haze",
            "icon": "50d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 26.95,
        "feels_like": 26.64,
        "temp_min": 26.95,
        "temp_max": 26.95,
        "pressure": 1011,
        "humidity": 36
    },
    "visibility": 3000,
    "wind": {
        "speed": 2.57,
        "deg": 310
    },
    "clouds": {
        "all": 57
    },
    "dt": 1637227634,
    "sys": {
        "type": 1,
        "id": 9115,
        "country": "IN",
        "sunrise": 1637195904,
        "sunset": 1637235130
    },
    "timezone": 19800,
    "id": 1271439,
    "name": "Gaya",
    "cod": 200
}

Chúng tôi sẽ chỉ cần weather, temperaturefeels_like từ câu trả lời trên.

Để có được những bộ phim thịnh hành, chúng tôi sẽ sử dụng API Cơ sở dữ liệu phim (TMDB). Đăng ký tài khoản miễn phí và nhận Khóa API. thêm TMDB_API_KEY bên trong .env tập tin.

TMDB_API_KEY = config("TMDB_API_KEY")


def get_trending_movies():
    trending_movies = []
    res = requests.get(
        f"https://api.themoviedb.org/3/trending/movie/day?api_key={TMDB_API_KEY}").json()
    results = res["results"]
    for r in results:
        trending_movies.append(r["original_title"])
    return trending_movies[:5]

Giống như chúng tôi đã làm cho các tiêu đề tin tức mới nhất, chúng tôi đang tạo ra trending_movies danh sách. Sau đó, theo API TMDB, chúng tôi đang thực hiện yêu cầu GET. Một phản hồi JSON mẫu trông như thế này:

{
  "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
}

Từ phản hồi trên, chúng tôi chỉ cần tiêu đề của bộ phim. chúng tôi nhận được results đó là một danh sách và sau đó lặp lại nó để lấy tiêu đề phim và nối nó vào trending_movies danh sách. Cuối cùng, chúng tôi trả về năm yếu tố đầu tiên của danh sách.

Đọc thêm  Tìm hiểu Django 3 và bắt đầu tạo trang web bằng Python

Cách thêm chức năng Nhận truyện cười ngẫu nhiên

Để nhận một trò đùa ngẫu nhiên, chúng ta chỉ cần thực hiện yêu cầu GET trên URL này: https://icanhazdadjoke.com/.

def get_random_joke():
    headers = {
        'Accept': 'application/json'
    }
    res = requests.get("https://icanhazdadjoke.com/", headers=headers).json()
    return res["joke"]

Cách thêm chức năng Nhận lời khuyên ngẫu nhiên

Để nhận được một lời khuyên ngẫu nhiên, chúng tôi đang sử dụng API Phiếu tư vấn.

def get_random_advice():
    res = requests.get("https://api.adviceslip.com/advice").json()
    return res['slip']['advice']

Cách tạo phương thức chính

Để chạy dự án, chúng ta sẽ cần tạo một phương thức chính. Tạo một main.py tập tin và thêm đoạn mã sau:

import requests
from functions.online_ops import find_my_ip, get_latest_news, get_random_advice, get_random_joke, get_trending_movies, get_weather_report, play_on_youtube, search_on_google, search_on_wikipedia, send_email, send_whatsapp_message
from functions.os_ops import open_calculator, open_camera, open_cmd, open_notepad, open_discord
from pprint import pprint


if __name__ == '__main__':
    greet_user()
    while True:
        query = take_user_input().lower()

        if 'open notepad' in query:
            open_notepad()

        elif 'open discord' in query:
            open_discord()

        elif 'open command prompt' in query or 'open cmd' in query:
            open_cmd()

        elif 'open camera' in query:
            open_camera()

        elif 'open calculator' in query:
            open_calculator()

        elif 'ip address' in query:
            ip_address = find_my_ip()
            speak(f'Your IP Address is {ip_address}.\n For your convenience, I am printing it on the screen sir.')
            print(f'Your IP Address is {ip_address}')

        elif 'wikipedia' in query:
            speak('What do you want to search on Wikipedia, sir?')
            search_query = take_user_input().lower()
            results = search_on_wikipedia(search_query)
            speak(f"According to Wikipedia, {results}")
            speak("For your convenience, I am printing it on the screen sir.")
            print(results)

        elif 'youtube' in query:
            speak('What do you want to play on Youtube, sir?')
            video = take_user_input().lower()
            play_on_youtube(video)

        elif 'search on google' in query:
            speak('What do you want to search on Google, sir?')
            query = take_user_input().lower()
            search_on_google(query)

        elif "send whatsapp message" in query:
            speak('On what number should I send the message sir? Please enter in the console: ')
            number = input("Enter the number: ")
            speak("What is the message sir?")
            message = take_user_input().lower()
            send_whatsapp_message(number, message)
            speak("I've sent the message sir.")

        elif "send an email" in query:
            speak("On what email address do I send sir? Please enter in the console: ")
            receiver_address = input("Enter email address: ")
            speak("What should be the subject sir?")
            subject = take_user_input().capitalize()
            speak("What is the message sir?")
            message = take_user_input().capitalize()
            if send_email(receiver_address, subject, message):
                speak("I've sent the email sir.")
            else:
                speak("Something went wrong while I was sending the mail. Please check the error logs sir.")

        elif 'joke' in query:
            speak(f"Hope you like this one sir")
            joke = get_random_joke()
            speak(joke)
            speak("For your convenience, I am printing it on the screen sir.")
            pprint(joke)

        elif "advice" in query:
            speak(f"Here's an advice for you, sir")
            advice = get_random_advice()
            speak(advice)
            speak("For your convenience, I am printing it on the screen sir.")
            pprint(advice)

        elif "trending movies" in query:
            speak(f"Some of the trending movies are: {get_trending_movies()}")
            speak("For your convenience, I am printing it on the screen sir.")
            print(*get_trending_movies(), sep='\n')

        elif 'news' in query:
            speak(f"I'm reading out the latest news headlines, sir")
            speak(get_latest_news())
            speak("For your convenience, I am printing it on the screen sir.")
            print(*get_latest_news(), sep='\n')

        elif 'weather' in query:
            ip_address = find_my_ip()
            city = requests.get(f"https://ipapi.co/{ip_address}/city/").text
            speak(f"Getting weather report for your city {city}")
            weather, temperature, feels_like = get_weather_report(city)
            speak(f"The current temperature is {temperature}, but it feels like {feels_like}")
            speak(f"Also, the weather report talks about {weather}")
            speak("For your convenience, I am printing it on the screen sir.")
            print(f"Description: {weather}\nTemperature: {temperature}\nFeels like: {feels_like}")

Mặc dù đoạn script trên trông khá dài nhưng nó rất đơn giản và dễ hiểu.

Nếu bạn nhìn kỹ, tất cả những gì chúng tôi đã làm là nhập các mô-đun cần thiết và các chức năng trực tuyến và ngoại tuyến. Sau đó, trong phương thức chính, điều đầu tiên chúng ta làm là chào người dùng bằng cách sử dụng greet_user() chức năng.

Tiếp theo, chúng tôi chạy một vòng lặp while để liên tục lấy đầu vào từ người dùng bằng cách sử dụng take_user_input() chức năng. Vì chúng tôi có chuỗi truy vấn của mình ở đây, chúng tôi có thể thêm bậc thang if-else để kiểm tra các điều kiện khác nhau trên query chuỗi.

Để chạy chương trình, bạn có thể sử dụng lệnh sau:

$ python main.py

Phần kết luận

Chúng tôi vừa tạo trợ lý cá nhân ảo của riêng mình với sự trợ giúp của Python. Bạn có thể thêm nhiều tính năng hơn cho ứng dụng nếu muốn. Bạn có thể thêm dự án này vào sơ yếu lý lịch của mình hoặc chỉ làm cho vui!

Xem video demo để thấy nó hoạt động:

Để biết mã đầy đủ, hãy xem kho lưu trữ GitHub này: https://github.com/ashutoshkrris/Virtual-Personal-Assistant-using-Python



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status