✅ 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 পেজে ফিরে আসবে।