چگونه بات اینستاگرام بسازیم با Playwright
این یک راهنمای جامع و گام به گام برای ساخت بات اینستاگرام با استفاده از Playwright است. این راهنما شامل مقدمهای بر Playwright، نحوه راهاندازی محیط، نوشتن اسکریپتهای اولیه برای تعامل با اینستاگرام، و نکات پیشرفتهتر برای ساخت یک بات قدرتمند خواهد بود.
۱. مقدمه
در این بخش، با Playwright و قابلیتهای آن برای اتوماسیون مرورگر آشنا خواهید شد. همچنین، دلایل انتخاب Playwright برای اتوماسیون وظایف وب، به خصوص وبسایتهایی مانند اینستاگرام که ممکن است از روشهای سنتیتر جلوگیری کنند، توضیح داده خواهد شد.
۲. Playwright چیست؟
Playwright یک فریمورک اتوماسیون مرورگر متنباز است که توسط مایکروسافت توسعه یافته است. این فریمورک به شما امکان میدهد تا مرورگرهای کروم، فایرفاکس و سافاری را به صورت برنامهنویسی کنترل کنید. Playwright از زبانهای برنامهنویسی مختلفی مانند JavaScript، TypeScript، Python، .NET و Java پشتیبانی میکند.
مزایای کلیدی Playwright:
سرعت و قابلیت اطمینان: Playwright برای اجرای سریع و قابل اعتماد تستهای مرورگر طراحی شده است.
پشتیبانی از مرورگرهای متعدد: امکان تست و اتوماسیون در کروم، فایرفاکس و سافاری.
قابلیتهای پیشرفته: پشتیبانی از شبکهبندی، پایش زمان، شبیهسازی دستگاهها و موارد دیگر.
API ساده و کاربرپسند: یادگیری و استفاده از Playwright نسبتاً آسان است.
اجرا در محیطهای مختلف: امکان اجرا در مرورگرهای Headless (بدون رابط کاربری گرافیکی) و Headful.
۳. راهاندازی محیط
برای شروع، شما نیاز به نصب Node.js و npm (یا yarn) دارید. پس از آن، Playwright را نصب خواهیم کرد.
۳.۱. نصب Node.js و npm
اگر Node.js را روی سیستم خود نصب ندارید، میتوانید آن را از وبسایت رسمی Node.js دانلود و نصب کنید: https://nodejs.org/
npm به همراه Node.js نصب میشود.
۳.۲. ایجاد یک پروژه جدید
یک پوشه برای پروژه خود ایجاد کنید و وارد آن شوید:
mkdir instagram-bot
cd instagram-bot
یک فایل package.json برای مدیریت وابستگیهای پروژه ایجاد کنید:
npm init -y
۳.۳. نصب Playwright
Playwright را به عنوان یک وابستگی در پروژه خود نصب کنید:
npm install playwright
این دستور Playwright و مرورگرهای لازم (Chromium، Firefox، WebKit) را نصب خواهد کرد.
۳.۴. نصب درایورهای مرورگر (اختیاری، معمولاً Playwright خودش مدیریت میکند)
در اکثر موارد، Playwright به طور خودکار درایورهای مرورگر لازم را دانلود و مدیریت میکند. اگر نیاز به نصب دستی داشتید، از دستور زیر استفاده کنید:
npx playwright install
۴. نوشتن اسکریپتهای اولیه برای تعامل با اینستاگرام
در این بخش، اولین اسکریپتهای خود را برای تعامل با اینستاگرام با استفاده از Playwright مینویسیم. ما از زبان JavaScript برای مثالها استفاده خواهیم کرد.
۴.۱. راهاندازی یک مرورگر و صفحه جدید
ابتدا، یک فایل JavaScript (مثلاً bot.js) ایجاد کنید و کد زیر را در آن بنویسید:
// bot.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false }); // headless: false برای مشاهده مرورگر
const page = await browser.newPage();
// آدرس اینستاگرام را باز کنید
await page.goto('https://www.instagram.com/');
// اینجا دستورات بعدی را اضافه خواهیم کرد
await browser.close();
})();
با اجرای node bot.js در ترمینال، مرورگر باز شده و به صفحه اینستاگرام میرود. headless: false باعث میشود پنجره مرورگر را ببینید. برای اجرای بدون رابط کاربری، آن را به true تغییر دهید.
۴.۲. ورود به حساب کاربری
برای تعامل با اینستاگرام، ابتدا باید وارد حساب کاربری خود شوید. این شامل پیدا کردن فیلدهای نام کاربری و رمز عبور، پر کردن آنها و کلیک بر روی دکمه ورود است.
نکات مهم:
انتخابگرها (Selectors): برای تعامل با عناصر صفحه، نیاز به انتخابگرهای CSS یا XPath داریم. برای پیدا کردن این انتخابگرها، میتوانید از ابزارهای توسعهدهنده مرورگر (Inspect Element) استفاده کنید.
زمانبندی (Waiting): اینستاگرام ممکن است برای بارگذاری عناصر کمی زمان نیاز داشته باشد. Playwright مکانیزمهای انتظار داخلی دارد که به شما کمک میکند از این موضوع مطمئن شوید.
در ادامه، کد مربوط به ورود را اضافه میکنیم:
// bot.js (تکمیل شده)
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://www.instagram.com/');
// صبر کنید تا فرم ورود بارگذاری شود
await page.waitForSelector('input[name="username"]');
// نام کاربری و رمز عبور خود را جایگزین کنید
const username = 'YOUR_INSTAGRAM_USERNAME';
const password = 'YOUR_INSTAGRAM_PASSWORD';
// نام کاربری را وارد کنید
await page.type('input[name="username"]', username);
// رمز عبور را وارد کنید
await page.type('input[name="password"]', password);
// روی دکمه ورود کلیک کنید
await page.click('button[type="submit"]');
// صبر کنید تا صفحه اصلی بارگذاری شود (یا هر صفحه پس از ورود)
// یک انتخابگر که فقط پس از ورود قابل مشاهده است را انتخاب کنید.
// مثال: یک آیکون یا لینک خاص. اگر مطمئن نیستید، ممکن است نیاز باشد
// صبر بیشتری داشته باشید یا از روشهای دیگر استفاده کنید.
// در این مثال، فرض میکنیم صفحه اصلی بعد از چند ثانیه بارگذاری میشود.
await page.waitForTimeout(5000); // ۵ ثانیه صبر برای بارگذاری صفحه پس از ورود
console.log('با موفقیت وارد حساب کاربری شد.');
// اینجا دستورات بعدی را اضافه خواهیم کرد
await browser.close();
})();
توجه: انتخابگرهای input[name="username"]، input[name="password"] و button[type="submit"] ممکن است در طول زمان توسط اینستاگرام تغییر کنند. اگر کد کار نکرد، باید از ابزارهای توسعهدهنده مرورگر برای یافتن انتخابگرهای جدید استفاده کنید.
۴.۳. پیمایش در صفحه
پس از ورود، میتوانید در صفحه پیمایش کنید. برای مثال، جستجو برای یک کاربر یا رفتن به صفحه پروفایل.
۴.۳.۱. جستجو برای یک کاربر
// ... (کد قبلی تا ورود) ...
console.log('با موفقیت وارد حساب کاربری شد.');
// جستجو برای یک کاربر
const userToSearch = 'instagram'; // نام کاربری مورد نظر برای جستجو
// باز کردن نوار جستجو (ممکن است نیاز به کلیک روی آیکون جستجو داشته باشد)
// انتخابگر آیکون جستجو را پیدا کنید. مثال: '.coreSpriteMagnifyingGlass'
// await page.click('.coreSpriteMagnifyingGlass');
// await page.waitForTimeout(1000); // صبر کنید تا نوار جستجو باز شود
// جستجو را تایپ کنید
await page.type('input[placeholder="جستجو"]', userToSearch); // انتخابگر فیلد جستجو را پیدا کنید
// صبر کنید تا نتایج جستجو نمایش داده شوند
await page.waitForSelector('a[href="/' + userToSearch + '/"]'); // مثال: لینک پروفایل کاربر
// روی نتیجه جستجو کلیک کنید (مثلاً لینک پروفایل)
await page.click('a[href="/' + userToSearch + '/"]');
console.log(`به صفحه پروفایل ${userToSearch} رفتیم.`);
await page.waitForTimeout(3000); // برای مشاهده نتیجه
// ... (بخش پایانی browser.close()) ...
نکته: انتخابگرهای مربوط به جستجو و نتایج آن نیز ممکن است تغییر کنند.
۴.۴. اقدامات رایج (لایک، کامنت، فالو)
این اقدامات نیاز به پیدا کردن عناصر خاص (دکمه لایک، فیلد کامنت) و تعامل با آنها دارند.
۴.۴.۱. لایک کردن پستها
برای لایک کردن پستها، شما باید ابتدا به صفحه یک پست بروید و سپس دکمه لایک را پیدا و کلیک کنید.
// ... (کد قبلی تا ورود) ...
console.log('با موفقیت وارد حساب کاربری شد.');
// فرض کنید میخواهیم پست اول در صفحه اصلی را لایک کنیم
// ابتدا به صفحه اصلی بروید (اگر قبلاً نرفتهاید)
await page.goto('https://www.instagram.com/');
await page.waitForTimeout(3000); // صبر برای بارگذاری صفحه اصلی
// پیدا کردن لینک اولین پست (این انتخابگر بسیار شکننده است و ممکن است تغییر کند)
// معمولاً پستها در تگ article یا div قرار دارند.
// یک راه معمول برای یافتن پستها، استفاده از selectory است که محتوای اصلی را پوشش میدهد.
// مثال: '.x1i10hfl.xjb2edn.x1qjc9v5.xoz3g0p.x78zum5.x1fctz27.x1cnmrsk.x224z8j.x9f61.x3nfvp2.x12ldu5w.xdzapef.xudw02j.xlj23xu.x1b0d499.x1k03706.x1vjbno.xgeu5q.x1e558r.x1d52u6.x1i786lq.xqq0jjt.x1he2f7m.x2g4l5.xagzlp6.x1o1c6wk.x1w9c8w6'
// یا پیدا کردن اولین المنت 'a' که به post ختم می شود.
// این انتخابگرها باید با دقت بیشتری بررسی شوند.
// فرض میکنیم لینک اولین پست را پیدا کردهایم
// یک انتخابگر کلیتر برای اولین پست: 'div[data-testid="feed-post-container"] a'
const firstPostSelector = 'article div a[href^="/p/"]'; // این یک مثال است، ممکن است نیاز به تنظیم داشته باشد
const firstPostLink = await page.$(firstPostSelector);
if (firstPostLink) {
await firstPostLink.click();
await page.waitForTimeout(3000); // صبر برای بارگذاری صفحه پست
// دکمه لایک را پیدا کنید (ممکن است آیکون قلب باشد)
// انتخابگر دکمه لایک را پیدا کنید. مثال: 'svg[aria-label="لایک"]' یا 'span:has(svg[aria-label="لایک"])'
const likeButtonSelector = 'svg[aria-label="لایک"]';
const likeButton = await page.$(likeButtonSelector);
if (likeButton) {
await likeButton.click();
console.log('پست با موفقیت لایک شد.');
} else {
console.log('دکمه لایک یافت نشد.');
}
} else {
console.log('اولین پست یافت نشد.');
}
await page.waitForTimeout(3000); // برای مشاهده نتیجه
// ... (بخش پایانی browser.close()) ...
نکات مهم برای لایک کردن:
انتخابگر دکمه لایک: اینستاگرام از یک آیکون SVG برای دکمه لایک استفاده میکند. aria-label آن معمولاً "لایک" یا "Unlike" است. ما باید حالتی را پیدا کنیم که "لایک" باشد.
یافتن پستها: پیدا کردن یک انتخابگر قابل اطمینان برای "اولین پست" دشوار است زیرا ساختار HTML دائماً تغییر میکند. بهتر است پستها را با دقت بیشتری شناسایی کنید، مثلاً با استفاده از لینکهایشان.
۴.۴.۲. کامنت گذاشتن
// ... (کد قبلی تا لایک کردن) ...
// فرض کنید پست با موفقیت لایک شد و ما هنوز در صفحه پست هستیم
const commentSelector = 'textarea[aria-label="افزودن نظر"]'; // انتخابگر فیلد کامنت
const commentText = 'این یک کامنت از طرف بات من است!';
await page.type(commentSelector, commentText);
await page.waitForTimeout(1000); // کمی صبر کنید
// دکمه ارسال کامنت را پیدا کنید (معمولاً با 'Send' یا آیکون مشابه)
// انتخابگر دکمه ارسال را پیدا کنید. مثال: 'button span:contains("ارسال")'
const sendButtonSelector = 'button span:contains("ارسال")'; // این یک مثال است
await page.click(sendButtonSelector);
console.log('کامنت با موفقیت ارسال شد.');
// ... (بخش پایانی browser.close()) ...
نکات مهم برای کامنت گذاشتن:
انتخابگر فیلد کامنت: همانند دکمه لایک، این نیز ممکن است تغییر کند.
انتخابگر دکمه ارسال: معمولاً دکمه ارسال بعد از تایپ کردن در فیلد کامنت فعال میشود.
۵. نکات پیشرفتهتر برای ساخت یک بات قدرتمند
برای ساخت یک بات اینستاگرام قابل اطمینان و قدرتمند، نیاز به در نظر گرفتن چندین عامل دارید:
۵.۱. مدیریت خطاها (Error Handling)
چه اتفاقی میافتد اگر یک صفحه بارگذاری نشود، یک انتخابگر یافت نشود، یا اینستاگرام شما را بلاک کند؟ استفاده از بلوکهای try...catch و منطق بازگشت (retry logic) برای اطمینان از اجرای روان بات ضروری است.
// مثال مدیریت خطا
try {
await page.goto('https://www.instagram.com/');
await page.waitForSelector('input[name="username"]', { timeout: 30000 }); // مهلت ۳۰ ثانیه
// ... بقیه کدهای ورود
} catch (error) {
console.error('خطا در ورود به حساب کاربری:', error);
// اینجا میتوانید عملیات بازیابی یا خروج را انجام دهید
await browser.close();
process.exit(1); // خروج با کد خطا
}
۵.۲. استفاده از پراکسیها (Proxies)
برای جلوگیری از شناسایی شدن توسط اینستاگرام و جلوگیری از بلاک شدن IP، استفاده از پراکسیها توصیه میشود. Playwright امکان پیکربندی مرورگر برای استفاده از پراکسی را دارد.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true, // معمولاً با پراکسی، headless اجرا میشود
proxy: {
server: 'socks5://YOUR_PROXY_IP:PORT', // یا http://YOUR_PROXY_IP:PORT
username: 'YOUR_PROXY_USERNAME', // در صورت نیاز
password: 'YOUR_PROXY_PASSWORD', // در صورت نیاز
},
});
// ... بقیه کد
})();
نکته: انتخاب سرور پراکسی مناسب و امن بسیار مهم است.
۵.۳. شبیهسازی رفتار انسانی (Human-like Behavior)
اینستاگرام به طور فعال رباتها را شناسایی و بلاک میکند. برای جلوگیری از این موضوع، بات شما باید تا حد امکان شبیه رفتار یک کاربر واقعی رفتار کند:
تأخیرهای تصادفی: به جای استفاده از waitForTimeout با مقادیر ثابت، از اعداد تصادفی برای ایجاد تأخیر بین اقدامات استفاده کنید.
const randomDelay = (min, max) => {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
await page.waitForTimeout(randomDelay(2000, 5000)); // ۲ تا ۵ ثانیه تأخیر تصادفی
حرکات موس: شبیهسازی حرکات طبیعی موس قبل از کلیک کردن.
اسکرول کردن: اسکرول کردن صفحه به صورت طبیعی.
تایپ کردن با سرعت متفاوت: شبیهسازی تایپ کردن با سرعتهای مختلف.
۵.۴. مدیریت اطلاعات حساب کاربری (Credential Management)
هرگز اطلاعات ورود (نام کاربری و رمز عبور) را مستقیماً در کد خود قرار ندهید. از متغیرهای محیطی (environment variables) یا فایلهای پیکربندی امن برای ذخیره و دسترسی به این اطلاعات استفاده کنید.
۵.۵. اتوماسیون وظایف پیچیدهتر
جمعآوری داده (Data Scraping): استخراج اطلاعات از صفحات پروفایل، پستها، یا نظرات.
ارسال پیام مستقیم (DM): ارسال پیام به کاربران دیگر.
مدیریت استوری: مشاهده استوریها (البته این مورد ریسک بالایی دارد).
دنبال کردن/آنفالو کردن: خودکار کردن فرآیند دنبال کردن یا آنفالو کردن کاربران.
این وظایف نیازمند شناسایی دقیقتر عناصر و منطق پیچیدهتری برای پردازش دادهها هستند.
۵.۶. تشخیص و مقابله با اقدامات امنیتی اینستاگرام
اینستاگرام ممکن است هنگام تشخیص فعالیت غیرعادی، از شما بخواهد هویت خود را تأیید کنید (مثلاً از طریق کپچا، ارسال کد به ایمیل، یا تأیید هویت از طریق برنامه). بات شما باید بتواند این موارد را مدیریت کند یا حداقل گزارش دهد تا شما بتوانید به صورت دستی مداخله کنید.
۶. نکات مهم و هشدارها
قوانین اینستاگرام: همیشه قوانین و شرایط استفاده اینستاگرام را مطالعه کنید. استفاده بیش از حد از رباتها و انجام اقداماتی که خلاف قوانین است، منجر به مسدود شدن حساب کاربری شما خواهد شد.
تغییرات مداوم UI: اینستاگرام رابط کاربری خود را دائماً تغییر میدهد. این بدان معناست که انتخابگرهای شما ممکن است به طور مکرر نیاز به بهروزرسانی داشته باشند.
مسئولیتپذیری: شما مسئول تمام اقداماتی هستید که بات شما انجام میدهد. با احتیاط عمل کنید.
محدودیت نرخ (Rate Limiting): اینستاگرام اقدامات را بر اساس تعداد در واحد زمان محدود میکند. برای جلوگیری از بلاک شدن، تعداد اقدامات خود را محدود کنید.
۷. نتیجهگیری
ساخت بات اینستاگرام با Playwright یک فرآیند قدرتمند است که به شما امکان میدهد وظایف تکراری را خودکار کنید. با دنبال کردن این راهنما و توجه به نکات پیشرفتهتر، میتوانید باتهای موثر و قابل اطمینانتری بسازید. به یاد داشته باشید که آزمایش مداوم و بهروزرسانی کد، کلید موفقیت در این زمینه است.