1. Home
  2. Netherland
  3. Bot Django
  4. mass_dm_bot-Script-1

mass_dm_bot-Script-1


✅ Step 1: 📁 Project Structure তৈরি

mass_dm_bot/
├── main.py              # ✅ মূল স্ক্রিপ্ট চালানোর ফাইল
├── helpers.py           # ✅ হেল্পার ফাংশন (Excel হ্যান্ডলিং)
├── config.json          # ✅ কনফিগারেশন ফাইল (বেস URL, মডেল নাম ইত্যাদি)

✅ Step 2: 🧰 প্রয়োজনীয় লাইব্রেরি ইনস্টল

🔧 টার্মিনাল/কমান্ড প্রম্পটে নিচের কমান্ড দিন:

pip install playwright pandas openpyxl

📦 লাইব্রেরির ব্যাখ্যা:

  • playwright: ওয়েব ব্রাউজার অটোমেশন (ফর্ম পূরণ, ক্লিক, ন্যাভিগেশন)
  • pandas: Excel/CSV থেকে ডেটা লোড ও প্রসেস করার জন্য
  • openpyxl: .xlsx ফাইল পড়া/লেখার জন্য

✅ Step 3: 🌐 Playwright ব্রাউজার বাইনারি ইনস্টল

playwright install

⚠️ এটি প্রায় ২০০-৩০০MB ব্রাউজার ফাইল ডাউনলোড করবে (Chromium, Firefox, WebKit)। আপনার ইন্টারনেট সংযোগ ও ডিস্ক স্পেস চেক করুন।


✅ Step 4: 🔍 Installation Verification

playwright --version

🛠 যদি Error আসে:

'playwright' is not recognized as an internal or external command

তাহলে আপনি হয়তো VirtualEnv এর মধ্যে ইনস্টল করেননি অথবা PATH যুক্ত হয়নি। সেক্ষেত্রে এভাবে চালান:

python -m playwright install

✅ Step 5: 🛠 config.json তৈরি

📄 config.json

{
  "base_url": "https://f2f.com/",
  "cookies_file": "cookies.json",
  "models": ["Fleurtjee", "Dessa", "Lucia"],
  "headless": false,
  "executable_path": "C:\\Users\\user\\AppData\\Local\\ms-playwright\\chromium-1179\\chrome-win\\chrome.exe"
}

✅ এই ফাইলটি ব্রাউজার স্ক্রিপ্টের কনফিগারেশন হিসেবে কাজ করবে।

👉 executable_path:

  • Linux: /usr/bin/google-chrome বা /usr/bin/chromium-browser
  • Windows: C:/Program Files/Google/Chrome/Application/chrome.exe
  • Mac: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

📄 helpers.py

import os
import pandas as pd

def load_messages(file_path):
    """Excel ফাইল থেকে মেসেজ লোড করে"""
    if not os.path.exists(file_path):
        print(f"❌ File not found: {file_path}")
        return []

    df = pd.read_excel(file_path)
    return df.iloc[:, 0].dropna().astype(str).tolist()

def save_messages(file_path, messages):
    """Excel ফাইলে মেসেজ সেভ করে"""
    df = pd.DataFrame(messages, columns=["Messages"])
    df.to_excel(file_path, index=False)
    print(f"✅ Saved messages to {file_path}")

def move_to_used(messages, used_file):
    """Used মেসেজ গুলো নতুন Excel ফাইলে রেখে দেয়"""
    used = load_messages(used_file)
    all_used = used + messages
    save_messages(used_file, all_used)

✅ Step 7: 🚀 main.py – Config ও মেসেজ লোড টেস্ট

📄 main.py

import json
from helpers import load_messages

# ✅ config ফাইল লোড
with open("config.json", "r") as f:
    config = json.load(f)

print("📦 Config loaded successfully.")
print(f"🔗 Base URL: {config['base_url']}")
print(f"👩‍💻 Models: {', '.join(config['models'])}")

# ✅ টেস্ট মেসেজ লোডিং
message_file = "13.xlsx"
messages = load_messages(message_file)

print(f"🔍 Total Messages loaded from {message_file}: {len(messages)}")
for i, msg in enumerate(messages[:5], 1):  # শুধু প্রথম ৫টি মেসেজ প্রিন্ট করব
    print(f"{i}. ➤ {msg}")

তুমি চাইলে future scaling এর জন্য utils/, data/, logs/ ফোল্ডার রাখতে পারো:

তুমি এখন ব্রাউজার অটোমেশন (Playwright দিয়ে DM/send/interaction) অংশে যেতে পারো। চাইলে আমি Step 8: Playwright ব্রাউজার দিয়ে লগইন, cookies লোড, মডেল পেজে মেসেজ পাঠানো – এই অংশটাও লিখে দিতে পারি।

বললে আমি এটা সম্পূর্ণ করবো ✅


চেক করো chromium executable path

Python script থেকে Playwright এর chromium path বের করতে পারো এভাবে:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    print("Chromium Executable Path:", p.chromium.executable_path)

🚀 Step 6: Browser Setup এবং Cookie Load

Helper.py

গুগল ক্রোমে এর cookie playwrite এ কনভার্ট করে ব্যবহার করতে হয় সরাসরি সাপোর্ট করবে না

import json
import os


def load_playwright_cookies(cookies_file):
    """
    ✅ Chrome cookies অথবা Playwright cookies ফরম্যাট থেকে cookie লোড করবে।
    """
    if not os.path.exists(cookies_file):
        print("⚠️ Cookies file not found.")
        return []

    with open(cookies_file, 'r') as f:
        cookies_data = json.load(f)

    # ✅ যদি Playwright cookies format হয় (list of dict with name, value, domain, etc.)
    if isinstance(cookies_data, list) and all('name' in c for c in cookies_data):
        print("🍪 Playwright cookies loaded successfully.")
        return cookies_data

    # ✅ যদি Chrome cookies format হয় (list of dict with domain, name, value, etc.)
    elif isinstance(cookies_data, list) and all('domain' in c for c in cookies_data):
        converted = []
        for c in cookies_data:
            converted.append({
                'name': c.get('name'),
                'value': c.get('value'),
                'domain': c.get('domain'),
                'path': c.get('path', '/'),
                'expires': c.get('expirationDate', -1),
                'httpOnly': c.get('httpOnly', False),
                'secure': c.get('secure', False),
                'sameSite': 'Lax'
            })
        print("🍪 Chrome cookies converted to Playwright format successfully.")
        return converted

    else:
        print("❌ Invalid cookie format.")
        return []


def save_cookies(context, cookies_file):
    """
    ✅ Current session cookies Save করে cookies_file এ
    """
    cookies = context.cookies()
    with open(cookies_file, 'w') as f:
        json.dump(cookies, f, indent=2)
    print(f"💾 Cookies saved to {cookies_file}")

main.py

from playwright.sync_api import sync_playwright
import json
import os
from helpers import load_playwright_cookies, save_cookies


# ✅ Load config
with open("config.json", "r") as f:
    config = json.load(f)

print("📦 Config loaded successfully.")

# ✅ Start Playwright
playwright = sync_playwright().start()

# ✅ Browser Launch
browser = playwright.chromium.launch(
    headless=config.get("headless", False),
    executable_path=config.get("executable_path", None),
    args=["--no-sandbox", "--disable-gpu", "--window-size=1920,1080"]
)

context = browser.new_context()
page = context.new_page()

print("🚀 Browser launched successfully.")

# ✅ Load Cookies
cookies_file = config.get("cookies_file", "cookies.json")
cookies = load_playwright_cookies(cookies_file)

if cookies:
    context.add_cookies(cookies)
    print("🍪 Cookies applied successfully.")
else:
    print("⚠️ Proceeding without cookies.")

# ✅ Go to Base URL
base_url = config.get("base_url", "https://f2f.com/")
page.goto(base_url, wait_until="networkidle")
print(f"🌐 Navigated to {base_url}")

# ✅ Go to Agency Creators Page
page.goto(base_url + "agency/creators/", wait_until="networkidle")
print("✅ Navigated to agency creators page.")

# ✅ Check Title
print("🧠 Page Title:", page.title())

# ✅ Save Cookies
save_cookies(context, cookies_file)

# ✅ Close Everything
browser.close()
playwright.stop()
print("👋 Browser closed successfully.")

ব্যাখ্যা:

  • 🔹 setup_browser(config): এই ফাংশন পুরো ব্রাউজার চালায়।
  • 🔹 Cookies Load: লগইন করা কুকি থাকলে তা লোড করে লগইন স্কিপ করে দেয়।
  • 🔹 Config Driven: headless mode, executable path, cookies path সব কনফিগ ফাইল থেকেই নেয়।
  • 🔹 ব্রাউজার ওপেন হয় https://f2f.com/agency/creators/ পেজে।


🚀 Step 8: navigate_to_model() — মডেল প্রোফাইলে যাওয়ার ফাংশন


ফাংশন এর কাজ:

  • পেজে থাকা সার্চ বারে মডেল নাম টাইপ করবে।
  • সার্চ রেজাল্ট থেকে প্রথম প্রোফাইল সিলেক্ট করে ক্লিক করবে।
  • যদি না পায়, তাহলে রিলোড দিয়ে আবার চেষ্টা করবে।

helpers.py এ Function যোগ:

from playwright.sync_api import Page


def navigate_to_model(page: Page, model_name: str):
    """
    ✅ সার্চ বক্সে মডেল নাম লিখে প্রোফাইলে যাবে।
    """
    search_selector = 'input[placeholder="Search creator"]'
    profile_selector = 'div._5UgUoq_tableBodyCell a.PquJEW_creatorWrapper'

    # ✅ Search Box খোঁজা
    try:
        page.wait_for_selector(search_selector, timeout=5000)
    except Exception:
        print("❌ Search box not found. Reloading page...")
        page.reload(wait_until="networkidle")
        page.wait_for_selector(search_selector)

    print(f"🔍 Searching for model: {model_name}")

    # ✅ Search box ক্লিয়ার এবং টাইপ
    page.fill(search_selector, "")
    page.type(search_selector, model_name)
    page.keyboard.press('Enter')

    page.wait_for_timeout(3000)  # কিছুক্ষণ অপেক্ষা

    # ✅ Profile Link ক্লিক
    try:
        page.wait_for_selector(profile_selector, timeout=5000)
        page.click(profile_selector)
        print(f"✅ Opened {model_name}'s profile.")
        page.wait_for_timeout(3000)  # লোড হওয়ার জন্য অপেক্ষা
        return True
    except Exception as e:
        print(f"❌ Failed to open {model_name}'s profile → {e}")
        return False

main.py এ টেস্ট করবো:

from playwright.sync_api import sync_playwright
import json
import os
from helpers import load_playwright_cookies, save_cookies, navigate_to_model


# ✅ Load config
with open("config.json", "r") as f:
    config = json.load(f)

print("📦 Config loaded successfully.")

# ✅ Start Playwright
playwright = sync_playwright().start()

# ✅ Browser Launch
browser = playwright.chromium.launch(
    headless=config.get("headless", False),
    executable_path=config.get("executable_path", None),
    args=["--no-sandbox", "--disable-gpu", "--window-size=1920,1080"]
)

context = browser.new_context()
page = context.new_page()

print("🚀 Browser launched successfully.")

# ✅ Load Cookies
cookies_file = config.get("cookies_file", "cookies.json")
cookies = load_playwright_cookies(cookies_file)

if cookies:
    context.add_cookies(cookies)
    print("🍪 Cookies applied successfully.")
else:
    print("⚠️ Proceeding without cookies.")

# ✅ Go to Base URL
base_url = config.get("base_url", "https://f2f.com/")
page.goto(base_url, wait_until="networkidle")
print(f"🌐 Navigated to {base_url}")

# ✅ Go to Agency Creators Page
page.goto(base_url + "agency/creators/", wait_until="networkidle")
print("✅ Navigated to agency creators page.")

# ✅ Check Title
print("🧠 Page Title:", page.title())


# ✅ Test navigate to model
models = config.get("models", [])
for model in models:
    success = navigate_to_model(page, model)
    if success:
        print(f"🎯 Successfully visited {model}")
    else:
        print(f"❌ Failed to visit {model}")

    # ✅ Back to creators page
    page.goto(base_url + "agency/creators/", wait_until="networkidle")


# ✅ Save Cookies
save_cookies(context, cookies_file)

# ✅ Close Everything
browser.close()
playwright.stop()
print("👋 Browser closed successfully.")

Step 8 এর ব্যাখ্যা:

  • 🔍 সার্চ বক্স খুঁজে নেয়।
  • ✅ মডেল নাম টাইপ করে এন্টার দেয়।
  • 🔗 সার্চ রেজাল্টের প্রথম প্রোফাইলে ক্লিক করে।
  • ↩️ প্রতিবার কাজ শেষ হলে আবার agency/creators/ পেজে ফিরে আসে।

Step 9 এর কাজঃ

  • 🔥 Config ফাইলে থাকা phases থেকে প্রতিটি phase এর জন্য কাজ করবে।
  • ✅ বর্তমান সময় (current_time) চেক করে Phase টাইম এর সাথে মিল খুঁজবে।
  • ⏰ যদি মিল পায়, তাহলে সেই Phase এর কাজ শুরু হবে।
  • ❌ যদি টাইম ম্যাচ না করে, তাহলে সেই Phase স্কিপ করবে।
  • Phase এর ইনফরমেশন প্রিন্ট করবে: মডেল, message ফাইল, media (photo/video/none), folder map।

Config.json

{
  "base_url": "https://f2f.com/",
  "cookies_file": "cookies.json",
  "models": ["Fleurtjee", "Dessa", "Lucia"],
  "headless": false,
  "executable_path": "C:\\Users\\user\\AppData\\Local\\ms-playwright\\chromium-1179\\chrome-win\\chrome.exe",
  "phases": {
    "01:02": {
      "enabled": true,
      "message_file": "13.xlsx",
      "used_file": "used.13.xlsx",
      "models": ["Fleurtjee", "Dessa"],
      "media": "photo",
      "folder_map": "photo_folders.xlsx"
    },
    "17:00": {
      "enabled": true,
      "message_file": "17.xlsx",
      "used_file": "used.17.xlsx",
      "models": ["Lucia"],
      "media": "video",
      "folder_map": "video_folders.xlsx"
    },
    "21:00": {
      "enabled": false,
      "message_file": "21.xlsx",
      "used_file": "used.21.xlsx",
      "models": ["Sara_visser"],
      "media": "none",
      "folder_map": null
    }
  }
}

কোড: Step 9 (Phase Time অনুযায়ী কাজ)

from playwright.sync_api import sync_playwright
import json
import os
from helpers import load_playwright_cookies, save_cookies, navigate_to_model
from datetime import datetime


# ✅ Config Load
with open("config.json", "r") as f:
    config = json.load(f)

print("📦 Config loaded successfully.")

# ✅ Playwright Start
playwright = sync_playwright().start()

# ✅ Browser Launch
browser = playwright.chromium.launch(
    headless=config.get("headless", False),
    executable_path=config.get("executable_path", None),
    args=["--no-sandbox", "--disable-gpu", "--window-size=1920,1080"]
)

context = browser.new_context()
page = context.new_page()

print("🚀 Browser launched successfully.")

# ✅ Cookies Load
cookies_file = config.get("cookies_file", "cookies.json")
cookies = load_playwright_cookies(cookies_file)

if cookies:
    context.add_cookies(cookies)
    print("🍪 Cookies applied successfully.")
else:
    print("⚠️ Proceeding without cookies.")

# ✅ Base URL Visit
base_url = config.get("base_url", "https://f2f.com/")
page.goto(base_url, wait_until="networkidle")
print(f"🌐 Navigated to {base_url}")

# ✅ Creators Page Visit
page.goto(base_url + "agency/creators/", wait_until="networkidle")
print("✅ Navigated to agency creators page.")

# ✅ Title Check
print("🧠 Page Title:", page.title())



# 🔥================= 🔥 Step 9: Phase অনুযায়ী কাজ + টাইম চেক 🔥 ===================

phases = config.get("phases", {})

# ✅ বর্তমান সময়
current_time = datetime.now()
current_hour = current_time.strftime("%H:%M")

print(f"\n🕑 বর্তমান সময়: {current_hour}")

for phase_name, details in phases.items():
    enabled = details.get("enabled", False)

    if not enabled:
        print(f"❌ Phase {phase_name} DISABLED → স্কিপ...\n")
        continue

    # ✅ Phase Time vs Current Time Check
    if current_hour != phase_name:
        print(f"⏩ Phase {phase_name} SKIPPED → কারণ এখন {current_hour}, Phase time {phase_name} না।\n")
        continue

    print(f"\n==============================")
    print(f"▶️ Phase {phase_name} ENABLED এবং TIME MATCHED → কাজ শুরু...")
    print("==============================")

    models = details.get("models", [])
    message_file = details.get("message_file")
    used_file = details.get("used_file")
    media = details.get("media", "none")
    folder_map = details.get("folder_map")

    for model in models:
        # ✅ মডেল প্রোফাইলে ঢোকা
        success = navigate_to_model(page, model)
        if success:
            print(f"🎯 {model} এর প্রোফাইলে সফলভাবে প্রবেশ।")

            # ✅ 🔥 Phase ইনফো প্রিন্ট
            print(f"⏰ [{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] → Phase: {phase_name} চলছে")
            print(f"   📄 Message File: {message_file}")
            print(f"   📑 Used File: {used_file}")
            print(f"   🗂️ Media Type: {media}")
            print(f"   📂 Folder Map: {folder_map}")

            # 👉 পরবর্তী স্টেপ এখানে আসবে (Photo/Video Select এবং Message Send)

        else:
            print(f"❌ {model} এর প্রোফাইলে যেতে ব্যর্থ।")

        # ✅ প্রতিবার মডেল চেক শেষ হলে creators page এ ফিরে আসা
        page.goto(base_url + "agency/creators/", wait_until="networkidle")
        print("↩️ Creators page এ ফিরে আসা।\n")

# 🔥================= 🔥 Step 9 END 🔥 ===================


# ✅ Cookies Save
save_cookies(context, cookies_file)

# ✅ Browser Close
browser.close()
playwright.stop()
print("👋 Browser বন্ধ।")

Step 9 এর পুরো কাজ:

  • 🔥 Phase Enable থাকলে কাজ করবে।
  • ⏰ Phase Time বর্তমান সময়ের সাথে ম্যাচ করলে কাজ করবে।
  • ✅ Navigate করে মডেল এর প্রোফাইলে যাবে।
  • 📄 Phase এর ইনফো (message file, media, folder map) প্রিন্ট করবে।
  • ↩️ কাজ শেষে আবার creators পেজে ফিরে আসবে।

How can we help?