পাইথন প্রজেক্টস ও লাইব্রেরি

Agent 2: Price Drop Monitor Agent

১. এই এজেন্ট কী কাজ করবে?

অনেক সময় আমরা দারাজ বা অন্য কোনো ই-কমার্স সাইটে ডিসকাউন্টের জন্য অপেক্ষা করি। এই এজেন্টকে আপনি আপনার কাঙ্ক্ষিত প্রোডাক্টের লিংক এবং আপনার টার্গেট প্রাইস বলে দেবেন। সে কিছুক্ষণ পর পর চেক করবে এবং দাম আপনার টার্গেটের নিচে নামলেই আপনাকে অ্যালার্ট (Email বা মেসেজ) পাঠাবে।

২. কী কী টুলস এবং লাইব্রেরি লাগবে?

  • requests: পেজ লোড করার জন্য।
  • beautifulsoup4: দামের টেক্সটটি খুঁজে বের করার জন্য।
  • smtplib: (পাইথনের সাথেই থাকে) ইমেইল পাঠানোর জন্য।
  • schedule বা time: বারবার চেক করার রুটিন তৈরির জন্য।

৩. এ টু জেড কোড (A to Z Code)

নিচের কোডটি agent_price_monitor.py নামে সেভ করুন। (এখানে উদাহরণ হিসেবে books.toscrape.com ব্যবহার করা হয়েছে, কারণ দারাজের স্ট্রাকচার প্রায়ই পরিবর্তন হয়)।

import requests
from bs4 import BeautifulSoup
import time
import smtplib
from email.message import EmailMessage

class PriceMonitorAgent:
    def __init__(self, url, target_price, your_email, email_password):
        self.url = url
        self.target_price = target_price
        self.your_email = your_email
        self.email_password = email_password

    def check_price(self):
        print(f"[Agent] প্রাইস চেক করা হচ্ছে...")
        response = requests.get(self.url)
        soup = BeautifulSoup(response.text, "html.parser")
        
        # books.toscrape.com এ প্রাইস থাকে <p class="price_color"> ট্যাগে
        price_text = soup.find("p", class_="price_color").get_text(strip=True)
        
        # '£51.77' থেকে শুধু '51.77' বের করে ফ্লোট বা ডেসিমাল নাম্বারে রূপান্তর
        current_price = float(price_text.replace('£', ''))
        print(f"[Agent] বর্তমান দাম: £{current_price}")

        if current_price <= self.target_price:
            print("[Agent] দাম কমেছে! ইমেইল পাঠানো হচ্ছে...")
            self.send_email_alert(current_price)
            return True # দাম কমে গেলে ট্রু রিটার্ন করবে, যেন এজেন্ট থেম যায়
        else:
            print("[Agent] দাম এখনো কমেনি। কিছুক্ষণ পর আবার চেক করবো।")
            return False

    def send_email_alert(self, current_price):
        msg = EmailMessage()
        msg.set_content(f"Good news! Your product price has dropped to £{current_price}.\nBuy here: {self.url}")
        msg['Subject'] = "Price Drop Alert!"
        msg['From'] = self.your_email
        msg['To'] = self.your_email # নিজেকেই ইমেইল পাঠানো

        try:
            # Gmail এর SMTP সার্ভার ব্যবহার করে ইমেইল পাঠানো
            server = smtplib.SMTP('smtp.gmail.com', 587)
            server.starttls()
            server.login(self.your_email, self.email_password)
            server.send_message(msg)
            server.quit()
            print("[Agent] অ্যালার্ট ইমেইল সফলভাবে পাঠানো হয়েছে!")
        except Exception as e:
            print(f"[Agent] ইমেইল পাঠাতে সমস্যা হয়েছে: {e}")

if __name__ == "__main__":
    url = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
    target_price = 50.00 # আমাদের টার্গেট
    
    # Gmail-এ 'App Password' তৈরি করে এখানে দিতে হবে (আপনার রেগুলার পাসওয়ার্ড নয়)
    my_email = "your_email@gmail.com"
    my_app_password = "your_app_password"

    agent = PriceMonitorAgent(url, target_price, my_email, my_app_password)
    
    # ইনফিনিট লুপ দিয়ে বারবার চেক করানো
    while True:
        is_dropped = agent.check_price()
        if is_dropped:
            break # দাম কমে গেলে লুপ বন্ধ করে দাও
        
        # ৬ ঘণ্টা (২১৬০০ সেকেন্ড) পর পর আবার চেক করবে
        # শেখার জন্য আপনি ৫ সেকেন্ড দিয়ে ট্রাই করে দেখতে পারেন: time.sleep(5)
        time.sleep(21600) 

৪. কীভাবে এটি আরও অ্যাডভান্সড করবেন?

  • ইমেইলের বদলে টেলিগ্রাম বট (Telegram Bot) ব্যবহার করে মোবাইলে সাথে সাথে মেসেজ পেতে পারেন। এটি সেটআপ করা ইমেইলের চেয়েও সহজ!
  • একসাথে অনেকগুলো প্রোডাক্টের লিস্ট মনিটর করাতে পারেন।