---
title: "Browser Use با پروکسی: راه‌اندازی عامل مرورگر هوش مصنوعی"
description: "Browser Use با Python یک مرورگر واقعی را به دست مدل زبانی می‌دهد. راه‌اندازی عامل با پروکسی دارای رمز عبور، بررسی IP خروجی و محدود کردن سایت‌ها را شرح می‌دهیم."
url: https://proxynet.io/fa/blog/browser-use-proxy
date: 2026-10-05
author: "Acar Diveroli"
category: "یکپارچه‌سازی, هوش مصنوعی"
lang: fa
---

# Browser Use با پروکسی: راه‌اندازی عامل مرورگر هوش مصنوعی

عامل Browser Use شما از روی لپ‌تاپتان بی‌دردسر یک سفارش آزمایشی در فروشگاه آزمایشی (staging) ثبت می‌کند. همین کار را که به یک سرور ابری می‌برید، سایت از یک IP دیتاسنتر در کشوری دیگر باز می‌شود: فروشگاه واحد پول دیگری نشان می‌دهد و فایروال محیط آزمایشی‌تان، که فقط IPهای شناخته‌شده را راه می‌دهد، عامل را برمی‌گرداند. پروکسی را به شکل `http://user:pass@pr.proxynet.io:8000` اضافه می‌کنید و حالا هر صفحه با `net::ERR_NO_SUPPORTED_PROXIES` شکست می‌خورد.

این راهنما توضیح می‌دهد Browser Use چگونه کار می‌کند و نصب، پروکسی با نام کاربری و رمز عبور، بررسی IP خروجی، نشست ثابت و چرخشی، محدودیت دامنه، اطلاعات محرمانه و گام تأیید انسانی را پوشش می‌دهد. همه اسکریپت‌ها را با ⁦browser-use 0.13.10⁩ و ⁦Python 3.13⁩ و از طریق یک پروکسی آزمایشی محلی که رمز عبور می‌خواهد آزمودیم. چون روی دستگاه آزمایش کلید API هیچ LLM در دسترس نبود، پاسخ‌های مدل را یک اسکریپت از پیش نوشته‌شده می‌داد؛ مرورگر، پروکسی، فیلتر دامنه و پنهان‌سازی اطلاعات محرمانه واقعاً اجرا شدند.

> **نکته: پاسخ کوتاه**
>
> Browser Use یک کتابخانه متن‌باز Python (با مجوز MIT) است که به مدل زبانی امکان می‌دهد یک مرورگر Chromium را به کار بگیرد: مدل صفحه را می‌خواند، کنش‌هایی مانند کلیک یا تایپ را انتخاب می‌کند و کتابخانه آن‌ها را اجرا می‌کند. آن را با `uv pip install browser-use` نصب کنید و Chromium را با `uvx browser-use install` بگیرید. پروکسی به مرورگر تعلق دارد: `Browser(proxy=ProxySettings(server="http://pr.proxynet.io:8000", username="user", password="pass"))`. اطلاعات ورود درون آدرس سرور کار نمی‌کند و SOCKS5 با رمز عبور هم همین‌طور. برای کارهای چندمرحله‌ای از نشست ثابت استفاده کنید و از جانگهدارهای `sensitive_data` تا رمزهای عبور هرگز به مدل نرسند.

## Browser Use چیست؟

Browser Use یک کتابخانه Python است که مدل زبانی را به عامل مرورگر تبدیل می‌کند. کار را به زبان ساده شرح می‌دهید و مدل درباره کلیک‌ها، تایپ و اسکرول تصمیم می‌گیرد. [مخزن GitHub](https://github.com/browser-use/browser-use) آن را «Agents that use the browser» (عامل‌هایی که از مرورگر استفاده می‌کنند) توصیف می‌کند. مجوز آن MIT است و آخرین نسخه روی [PyPI](https://pypi.org/project/browser-use/) امروز 0.13.10 است که در 4 سپتامبر 2026 منتشر شده و به ⁦Python 3.11⁩ یا جدیدتر نیاز دارد.

نسخه 0.13.10 مستقیم از طریق Chrome DevTools Protocol (CDP) با Chromium ارتباط برقرار می‌کند؛ Playwright جزو وابستگی‌های آن نیست. مدل می‌تواند از OpenAI، Anthropic، Google، یک سرور محلی Ollama یا مدل‌های میزبانی‌شده خود Browser Use تأمین شود. Browser Use Cloud، سرویسی جداگانه و پولی با مرورگرهای میزبانی‌شده، بخشی از این راهنما نیست.

اینکه یک عامل به‌طور کلی چگونه برنامه‌ریزی می‌کند و ابزار به کار می‌برد در [عامل‌های هوش مصنوعی چگونه کار می‌کنند؟](/fa/blog/how-ai-agents-work) آمده است و مرورگرهایی که عامل درونشان ساخته شده در [مرورگر هوش مصنوعی چیست؟](/fa/blog/what-is-an-ai-browser) توضیح داده شده‌اند.

## عامل Browser Use چگونه کار می‌کند؟

هر `agent.run()` این گام‌ها را طی می‌کند:

1. **مرورگر با یک پروفایل موقت تازه اجرا می‌شود.** پروکسی به شکل پرچم اجرا (launch flag) به Chromium داده می‌شود.
2. **آدرسی که در متن کار آمده مستقیم باز می‌شود**، بدون فراخوانی مدل.
3. **صفحه به متن تبدیل می‌شود.** هر عنصری که عامل می‌تواند به کار ببرد یک شماره می‌گیرد و متن قابل‌مشاهده هم همراهش می‌آید. با `use_vision=True` (پیش‌فرض) یک اسکرین‌شات هم افزوده می‌شود.
4. **مدل با JSON پاسخ می‌دهد:** ارزیابی گام قبلی، یک حافظه کوتاه، هدف بعدی و حداکثر پنج کنش، مانند `navigate`، `click`، `input`، `scroll`، `extract` یا `done`.
5. **کتابخانه کنش‌ها را اجرا می‌کند،** هر آدرس تازه را با قاعده‌های دامنه شما می‌سنجد و هر جا مدل جانگهدار نوشته باشد، مقدار محرمانه را جایگزین می‌کند.
6. **حلقه تکرار می‌شود** تا مدل `done` را فرا بخواند یا `max_steps` تمام شود.

در یک کتاب‌فروشی تمرینی، وضعیت مرورگری که مدل آزمایشی ما دریافت کرد سطرهایی مانند این‌ها داشت:

```text
[587]<a title=It's Only the Himalayas />
	It's Only the Himalayas
£45.17
[597]<i />
In stock
[604]<button type=submit />
	Add to basket
```

برای افزودن این کتاب به سبد خرید، مدل پاسخ `{"click": {"index": 604}}` را می‌داد. چون صفحه به شکل متن می‌رسد، `use_vision=False` هم کار می‌کند و اسکرین‌شات صفحه‌های حساس را از ارائه‌دهنده مدل دور نگه می‌دارد.

## Browser Use چگونه نصب می‌شود؟

راهنمای شروع سریع رسمی از uv استفاده می‌کند:

```bash
pip install uv
uv venv --python 3.12
source .venv/bin/activate        # Windows: .venv\Scripts\activate
uv pip install browser-use
uvx browser-use install          # downloads Chromium
```

ما با فرمان ساده `pip install browser-use==0.13.10` در یک محیط مجازی ⁦Python 3.13⁩ نصب کردیم و این روش هم کار کرد. سپس کلیدها را در یک فایل `.env` کنار اسکریپت خود بگذارید:

```bash
OPENAI_API_KEY=...
PROXY_SERVER=http://pr.proxynet.io:8000
PROXY_USERNAME=user
PROXY_PASSWORD=pass
ANONYMIZED_TELEMETRY=false
```

سطر آخر مهم است. Browser Use به‌طور پیش‌فرض تله‌متری (داده‌های استفاده) می‌فرستد و [صفحه تله‌متری آن](https://docs.browser-use.com/open-source/development/monitoring/telemetry) می‌گوید این داده‌ها ممکن است شامل متن کار، آدرس‌های بازدیدشده، ردپای کنش‌ها و نتیجه‌های نهایی باشند. اگر کارهای شما به مشتریان یا سایت‌های داخلی اشاره می‌کنند، آن را خاموش کنید.

روی دستگاه آزمایش ویندوزی دو چیز غافلگیرمان کرد. بدون `executable_path`، Browser Use گوگل کروم نصب‌شده را برگزید، البته با یک پروفایل موقت تازه، نه پروفایل روزمره شما. در نخستین اجرا هم سه افزونه، از جمله یک مسدودکننده تبلیغات، را مستقیم از نت‌بازار Chrome و بیرون از پروکسی دانلود کرد؛ `enable_default_extensions=False` آن‌ها را خاموش می‌کند.

## عامل را چگونه از طریق پروکسی اجرا کنیم؟

پروکسی یکی از تنظیمات `Browser` است و عامل همان مرورگر را دریافت می‌کند. این اسکریپت یک صفحه دسته‌بندی را باز می‌کند و سه کتاب را می‌خواند، در حالی که فقط از طریق پروکسی و فقط به یک دامنه می‌رود:

```python
"""Run a Browser Use agent through an authenticated proxy, limited to one site."""
import asyncio
import os

from dotenv import load_dotenv

load_dotenv()  # reads OPENAI_API_KEY, PROXY_* and ANONYMIZED_TELEMETRY from .env

from browser_use import Agent, Browser, ChatOpenAI
from browser_use.browser import ProxySettings

browser = Browser(
    headless=True,
    proxy=ProxySettings(
        server=os.environ["PROXY_SERVER"],  # http://pr.proxynet.io:8000
        username=os.environ["PROXY_USERNAME"],
        password=os.environ["PROXY_PASSWORD"],
    ),
    allowed_domains=["books.toscrape.com"],
    enable_default_extensions=False,
)

agent = Agent(
    task=(
        "Open https://books.toscrape.com/catalogue/category/books/travel_2/index.html "
        "and list the title and price of the first three books."
    ),
    llm=ChatOpenAI(model="gpt-4.1-mini"),
    browser=browser,
    use_vision=False,
)

async def main():
    history = await agent.run(max_steps=10)
    print("result:", history.final_result())
    print("pages: ", [u for u in history.urls() if u])
    print("steps: ", history.number_of_steps())

asyncio.run(main())
```

`ProxySettings` از `browser_use.browser` وارد (import) می‌شود، نه از سطح بالای بسته. [صفحه پارامترهای مرورگر](https://docs.browser-use.com/open-source/customize/browser/all-parameters) چهار فیلد را فهرست می‌کند:

| فیلد | چه مقداری می‌گیرد |
|---|---|
| `server` | `http://host:port` یا `socks5://host:port`، بدون اطلاعات ورود |
| `username` | نام کاربری پروکسی، برای نمونه همانی که سازنده نقطه اتصال (Endpoint Generator) می‌سازد |
| `password` | رمز عبور پروکسی |
| `bypass` | میزبان‌هایی که مستقیم وصل می‌شوند و از پروکسی نمی‌گذرند، جداشده با ویرگول |

Browser Use در پشت صحنه Chromium را با `--proxy-server` اجرا می‌کند و به چالش `407` پروکسی خودش از طریق CDP پاسخ می‌دهد. پروکسی آزمایشی ما برای صفحه کتاب دقیقاً همین را ثبت کرد (کوتاه‌شده، بدون مهر زمانی):

```text
407 CONNECT books.toscrape.com:443 (no credentials)
200 CONNECT books.toscrape.com:443 user=user
```

نام کاربری و رمز عبور پروکسی در هیچ‌یک از داده‌هایی که مدل دریافت کرد دیده نشدند.

## چرا user:pass در آدرس پروکسی کار نمی‌کند؟

چون Chromium اطلاعات ورودی را که درون تنظیم پروکسی‌اش نوشته شود نادیده می‌گیرد. [مستندات پروکسی Chromium](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md) می‌گوید Chrome از هیچ اطلاعات ورودی که درون تنظیمات پروکسی گنجانده شده باشد استفاده نمی‌کند. با `server="http://user:pass@…"` و بدون فیلدهای جداگانه، در آزمون ما هر پیمایش با `net::ERR_NO_SUPPORTED_PROXIES` پایان یافت. اطلاعات ورود را در `username` و `password` بگذارید.

SOCKS5 محدودیت دیگری دارد: Chromium برای SOCKS5 اصلاً هیچ روش احراز هویتی را پشتیبانی نمی‌کند. سرور آزمایشی SOCKS5 ما دید که مرورگر فقط روش «no authentication» (بدون احراز هویت) را پیشنهاد می‌کند و صفحه با `ERR_SOCKS_CONNECTION_FAILED` شکست خورد. برای SOCKS5، IP سرور خود را در پنل کاربری به لیست سفید IP بیفزایید (حداکثر 10 آدرس) و از پورت SOCKS5 که سازنده نقطه اتصال نشان می‌دهد، بدون نام کاربری، استفاده کنید. در این حالت DNS در سمت پروکسی ترجمه می‌شود. این دو روش ورود در [احراز هویت پروکسی: نام کاربری و رمز یا لیست سفید IP](/fa/blog/proxy-authentication-methods) و پروتکل‌ها در [تفاوت پروکسی SOCKS و HTTP](/fa/blog/socks-vs-http-proxy) مقایسه شده‌اند.

## IP خروجی عامل را چگونه بررسی کنیم؟

پیش از نخستین کار واقعی و بدون حضور مدل در حلقه بررسی کنید. این اسکریپت از همان `ProxySettings` استفاده می‌کند، یک صفحه نمایش IP (IP echo) را باز می‌کند و آنچه سایت دیده است را چاپ می‌کند:

```python
"""Open an IP echo page through the proxy before any agent runs."""
import asyncio
import os

from browser_use import Browser
from browser_use.browser import ProxySettings

async def main():
    browser = Browser(
        headless=True,
        proxy=ProxySettings(
            server=os.environ["PROXY_SERVER"],
            username=os.environ["PROXY_USERNAME"],
            password=os.environ["PROXY_PASSWORD"],
        ),
    )
    await browser.start()
    try:
        page = await browser.new_page("https://httpbin.org/ip")
        await asyncio.sleep(2)  # let the page load
        print(await page.evaluate("() => document.body.innerText"))
    finally:
        await browser.kill()

asyncio.run(main())
```

خروجی آن JSON سایت httpbin با فیلدی به نام `origin` است. از طریق یک نقطه اتصال Proxynet، این مقدار IP خروجی است، نه IP خود شما. اسکریپت را دو بار اجرا کنید: نام کاربری چرخشی ممکن است دو آدرس متفاوت نشان دهد و نام کاربری ثابت هر دو بار همان آدرس را.

گزارش پروکسی ما درخواست‌های خود Chrome به سرویس‌های Google و درخواست لوگوی Browser Use در صفحه آغازین خالی را هم نشان داد؛ اگر هزینه ترافیک را بر پایه حجم مصرف می‌پردازید، این درخواست‌ها هم حساب می‌شوند.

## چرخشی یا ثابت: عامل به کدام نشست نیاز دارد؟

پروکسی به مرورگر تعلق دارد، پس همه گام‌های یک کار از همان آدرس پروکسی بیرون می‌روند. آنچه تغییر می‌کند IP خروجی پشت آن آدرس است.

| کار | نشست | چرا |
|---|---|---|
| ورود به حساب و سپس کار در چند صفحه | ثابت، 10 تا 30 دقیقه | بسیاری از سایت‌ها نشست را به IP گره می‌زنند؛ آدرس تازه در میانه کار ممکن است به ورود دوباره بینجامد |
| خواندن یک صفحه مستقل در هر اجرا | چرخشی | هر اجرا ممکن است IP خروجی تازه‌ای بگیرد؛ چیزی از اجرای قبلی منتقل نمی‌شود |
| چند عامل به‌طور موازی | یک `Browser` برای هر عامل | هر مرورگر تنظیمات پروکسی و نشست خودش را دارد |
| آدرسی که سیستم‌های خودتان در فهرست مجاز گذاشته‌اند | پروکسی ISP | IP در طول روزها ثابت می‌ماند |

در Proxynet، نوع نشست (چرخشی یا ثابت)، کشور و شهر را در سازنده نقطه اتصال انتخاب می‌کنید و طول نشست ثابت از 1 تا 60 دقیقه است. نام کاربری‌ای که این ابزار می‌سازد همین انتخاب‌ها را در خود دارد، پس آن را همان‌طور که هست در `PROXY_USERNAME` بچسبانید. طول نشست ثابت را کمی بیشتر از طولانی‌ترین کار خود انتخاب کنید. محصولات: [پروکسی با نشست ثابت](https://proxynet.io/fa/sticky-proxy)، [پروکسی چرخشی](https://proxynet.io/fa/rotating-proxy)، [پروکسی ISP](https://proxynet.io/fa/static-isp-residential-proxy) و برای وقتی که بررسی به اتصال خانگی در کشوری مشخص نیاز دارد، [پروکسی مسکونی](https://proxynet.io/fa/residential-proxy). سازوکار چرخش در نوشته [چرخش IP](/fa/blog/ip-rotation-explained) آمده است.

## دسترسی عامل به سایت‌ها را چگونه محدود کنیم؟

`allowed_domains` فهرستی از الگوها می‌گیرد: `example.com`، `*.example.com` برای زیردامنه‌ها و `http*://example.com` برای هر دو طرح `http` و `https`. نویسه عام (wildcard) در دامنه سطح بالا (TLD) پذیرفته نمی‌شود. `prohibited_domains` برعکس عمل می‌کند؛ وقتی هر دو تنظیم شده باشند، فهرست مجاز اولویت دارد.

فقط فروشگاه محلی خودمان را مجاز کردیم و از مدل آزمایشی خواستیم دو راه خروج را امتحان کند. یک `navigate` مستقیم به میزبانی دیگر این پاسخ را به مدل برگرداند، در حالی که صفحه فعلی `about:blank` بود:

```text
Navigation failed: Navigation to http://partner.test:28140/ blocked by security policy
```

پیوندی در فروشگاه که به همان میزبان تغییر مسیر (redirect) می‌داد هم به `about:blank` رسید و مدل هرگز متن آن صفحه را ندید. اما گزارش خود سایت آزمایشی نشان داد که مرورگر هر دو صفحه بیرون از فهرست را پیش از آنکه بررسی جایگزینشان کند درخواست کرده بود، و تصویری از میزبان بیرون از فهرست در یک صفحه مجاز به‌طور عادی بارگذاری شد. در نسخه 0.13.10، فیلتر تعیین می‌کند عامل چه چیزی را می‌خواند و روی چه چیزی کنش انجام می‌دهد، نه اینکه مرورگر چه درخواستی می‌فرستد.

برای یک مرز واقعی، ترافیک خروجی را بیرون از عامل محدود کنید: یک فایروال یا فهرست مجاز در سمت پروکسی، یک کانتینر یا حساب کاربری جداگانه و بدون دسترسی به آدرس‌های داخلی. Playwright MCP هم درباره پرچم‌های مبدأ خود همین هشدار را دارد، همان‌طور که در [Playwright MCP چیست؟](/fa/blog/playwright-mcp) آمده است. الگوی کلی‌تر در [دسترسی امن LLM به وب](/fa/blog/llm-safe-web-access) شرح داده شده است.

## اطلاعات ورود را چگونه از مدل دور نگه داریم؟

هرگز رمز عبور را در متن کار ننویسید. متن کار در هر گام به ارائه‌دهنده مدل فرستاده می‌شود و اگر خاموشش نکنید، به تله‌متری هم می‌رود. Browser Use برای این کار سازوکار جانگهدار (placeholder) دارد، یعنی `sensitive_data`: مقدارهای واقعی را در کد می‌دهید، مدل فقط نام‌هایی مانند `x_user` و `x_pass` را می‌بیند و کتابخانه پس از پاسخ مدل، مقدار واقعی را در فیلد تایپ می‌کند.

در آزمون ما کنش مدل `<secret>x_pass</secret>` بود، گزارش اجرا `Typed <sensitive>` را چاپ کرد و وقتی صفحه نام کاربری را بازتاب داد، مدل `Signed in as <secret>x_user</secret>` را دریافت کرد. مقدارهای واقعی در هیچ ورودی مدل دیده نشدند. سه عادت این کار را کامل می‌کنند:

- **اطلاعات محرمانه را به یک دامنه محدود کنید**، تا هر جانگهدار فقط در سایتی که به آن تعلق دارد پر شود.
- **در صفحه‌هایی که اسکرین‌شات ممکن است مقدار را نشان دهد، `use_vision=False` را تنظیم کنید.**
- **برای کارهایی که صفحه‌های بیرونی را می‌خوانند، پروفایل روزمره Chrome خود را (`Browser.from_system_chrome()`) به عامل ندهید:** هر نشست واردشده‌ای که در آن است در دسترس عامل قرار می‌گیرد.

## گام تأیید انسانی را چگونه اضافه کنیم؟

منظور از تزریق پرامپت غیرمستقیم (indirect prompt injection) متنی در یک صفحه است که مدل آن را دستور تلقی می‌کند. [مدخل LLM01 در OWASP](https://genai.owasp.org/llmrisk/llm01-prompt-injection/) تأیید انسانی برای کنش‌های پرخطر را در میان راه‌های دفاعی فهرست می‌کند. Browser Use تابع `register_new_step_callback` را پس از آنکه مدل کنش‌هایش را انتخاب کرد و پیش از اجرای آن‌ها فرا می‌خواند، پس این callback می‌تواند عامل را متوقف کند:

```python
"""A Browser Use agent with an allow-list, placeholders for secrets and a human approval gate."""
import asyncio
import os

from dotenv import load_dotenv

load_dotenv()

from browser_use import Agent, Browser, ChatOpenAI
from browser_use.browser import ProxySettings

SITE = "https://shop.example.com"
READ_ONLY = {"navigate", "scroll", "find_text", "extract", "screenshot", "go_back", "wait", "done"}

browser = Browser(
    headless=True,
    proxy=ProxySettings(
        server=os.environ["PROXY_SERVER"],
        username=os.environ["PROXY_USERNAME"],
        password=os.environ["PROXY_PASSWORD"],
    ),
    allowed_domains=["shop.example.com"],
    enable_default_extensions=False,
)

def approve(browser_state, model_output, step):
    """Runs after the model has chosen its actions and before they are executed."""
    planned = [action.model_dump(exclude_none=True) for action in model_output.action]
    if all(next(iter(a)) in READ_ONLY for a in planned):
        return
    print(f"Step {step} wants to run: {planned}")
    if input("Allow? [y/N] ").strip().lower() != "y":
        agent.stop()

agent = Agent(
    task=f"Sign in at {SITE}/login with username x_user and password x_pass, then open the partner offer.",
    llm=ChatOpenAI(model="gpt-4.1-mini"),
    browser=browser,
    sensitive_data={"http*://shop.example.com": {"x_user": os.environ["SHOP_USER"], "x_pass": os.environ["SHOP_PASS"]}},
    use_vision=False,
    register_new_step_callback=approve,
)

async def main():
    history = await agent.run(max_steps=8)
    print("done:  ", history.is_done())
    print("errors:", [e for e in history.errors() if e])

asyncio.run(main())
```

این اسکریپت را با تغییر دامنه روی فروشگاه محلی خودمان اجرا کردیم. گام ورود ابتدا اجازه خواست؛ پس از `y`، عامل هر دو مقدار را تایپ کرد و کلیک کرد. یک کلیک بعدی دوباره اجازه خواست و پس از `n`، گزارش اجرا `Agent stopping` را نشان داد، کلیک هرگز اجرا نشد و `is_done()` مقدار `False` را برگرداند. هر کنشی بیرون از مجموعه فقط‌خواندنی، از جمله تایپ، اکنون منتظر یک انسان می‌ماند.

## Browser Use یا Playwright MCP؟

هر دو به مدل امکان استفاده از مرورگر می‌دهند؛ تفاوتشان در این است که حلقه را چه کسی اجرا می‌کند.

| | Browser Use | Playwright MCP |
|---|---|---|
| چه کسی حلقه عامل را اجرا می‌کند | کتابخانه، در کد Python شما | دستیاری که از پیش به کار می‌برید (Claude Code، Cursor) |
| پروکسی با رمز عبور | فیلدهای `ProxySettings` | `launchOptions.proxy` در یک فایل پیکربندی |
| محدودیت دامنه | `allowed_domains` | `--allowed-origins` |
| مناسب برای | عامل‌هایی درون سرویس خودتان | کارهای موردی از درون یک دستیار کدنویسی |

راه‌اندازی و پرچم‌های دومی در [Playwright MCP چیست؟](/fa/blog/playwright-mcp) آمده است.

## کاربردها

- **بررسی بومی‌سازی در سایت خودتان:** اینکه بازدیدکننده‌ای از یک کشور چه زبان، واحد پول و اعلان کوکی‌ای می‌بیند ([بومی‌سازی](/fa/localization)).
- **آزمون اکتشافی برنامه خودتان:** طی کردن روند ثبت‌نام یا پرداخت در محیط آزمایشی از موقعیت‌های گوناگون ([آزمون برنامه](/fa/app-testing)).
- **خواندن یک‌باره از صفحه‌ای که با JavaScript ساخته می‌شود:** چند مقدار از یک صفحه عمومی که در مرورگر رندر می‌شود ([صفحه‌های ایستا و پویا](/fa/blog/static-vs-dynamic-pages)). برای کارهای منظم، یک اسکریپت ساده ارزان‌تر است ([Playwright با پروکسی](/fa/blog/playwright-proxy)).
- **متن تمیز برای مدل به‌جای مرورگر:** وقتی عامل فقط باید بخواند، [Crawl4AI چیست؟](/fa/blog/crawl4ai-proxy) را ببینید.

عاملی که به‌جای شما وب را مرور می‌کند همچنان ترافیک خودکار است. ⁦Browser Use 0.13.10⁩ فایل robots.txt را نمی‌خواند (در بسته کدی برای آن نیافتیم)، پس [robots.txt](/fa/blog/robots-txt) و شرایط استفاده سایت را خودتان بخوانید، اگر API رسمی هست از آن استفاده کنید، به چند صفحه با سرعتی انسانی بسنده کنید و وقتی سایتی «نه» گفت متوقف شوید. اینکه چرا سایت‌ها بازدیدکنندگان خودکار را از دیگران تشخیص می‌دهند در [چرا سایت‌ها عامل‌های خرید هوش مصنوعی را مسدود می‌کنند؟](/fa/blog/ai-shopping-agents-blocked) آمده است. قابلیت‌های stealth و CAPTCHA که برای Browser Use Cloud تبلیغ می‌شوند خارج از موضوع این راهنما هستند و آن‌ها را توصیه نمی‌کنیم.

## اشتباهات رایج

| آنچه می‌بینید | علت | چه باید کرد |
|---|---|---|
| `net::ERR_NO_SUPPORTED_PROXIES` | اطلاعات ورود درون `server` نوشته شده است | آن‌ها را به `username` و `password` منتقل کنید |
| `net::ERR_TOO_MANY_RETRIES` | نام کاربری یا رمز عبور پروکسی نادرست است؛ پروکسی مدام با `407` پاسخ می‌دهد | اطلاعات ورود را دوباره از پنل کاربری کپی کنید |
| `net::ERR_PROXY_CONNECTION_FAILED` | میزبان یا پورت نادرست است، یا ترافیک خروجی مسدود است | همان آدرس را با cURL بیازمایید |
| `ERR_SOCKS_CONNECTION_FAILED` | `socks5://` همراه با رمز عبور | از نقطه اتصال HTTP استفاده کنید، یا از SOCKS5 با لیست سفید IP |
| `blocked by security policy` | آدرس بیرون از `allowed_domains` است | دامنه را اضافه کنید، یا بگذارید مسدود بماند |
| عامل در میانه کار دوباره وارد حساب می‌شود | IP خروجی چرخشی در میانه کار عوض شده است | از نشست ثابت استفاده کنید |

دو عادت بی‌آنکه خطایی نشان دهند دردسر می‌سازند: فایروال دانستن `allowed_domains` و اجرای نسخه‌ای که ثابت نشده است. API از نسخه‌ای به نسخه دیگر تغییر کرده است، پس نسخه‌ای را که آزموده‌اید ثابت کنید (`browser-use==0.13.10`) و پیش از ارتقا یادداشت‌های انتشار را بخوانید.

## راهنمای انتخاب

| نیاز | پیشنهاد |
|---|---|
| نخستین اجرای عامل از طریق پروکسی | `ProxySettings` با نقطه اتصال HTTP، نام کاربری و رمز عبور؛ سپس اسکریپت نمایش IP |
| کار چندمرحله‌ای همراه با ورود به حساب | نشست ثابتی طولانی‌تر از کار |
| اجراهای مستقل تک‌صفحه‌ای | نشست چرخشی |
| نگه داشتن عامل در یک سایت | `allowed_domains`، به‌علاوه یک فهرست مجاز خروجی بیرون از عامل |
| کنش‌هایی که چیزی را تغییر می‌دهند | یک callback تأیید که بتواند `agent.stop()` را فرا بخواند |

## پرسش‌های متداول

### آیا Browser Use رایگان است؟

این کتابخانه با مجوز MIT رایگان است. هزینه فراخوانی‌های مدل، دست‌کم یکی در هر گام، و هزینه ترافیک پروکسی را می‌پردازید. Browser Use Cloud و مدل‌های میزبانی‌شده آن جداگانه صورت‌حساب می‌شوند.

### آیا Browser Use هنوز از Playwright استفاده می‌کند؟

نه برای کنترل مرورگر. نسخه 0.13.10 مرورگر Chromium را از طریق Chrome DevTools Protocol کنترل می‌کند؛ فرمان نصب برای دریافت Chromium از دانلودکننده Playwright استفاده می‌کند و وضعیت ورود ذخیره‌شده از قالب فایل Playwright پیروی می‌کند.

### آیا می‌توان به‌جای API از یک مدل محلی استفاده کرد؟

صفحه مدل‌های پشتیبانی‌شده `ChatOllama(model="llama3.1:8b")` را برای یک سرور محلی Ollama نشان می‌دهد. ما مدل محلی را نیازموده‌ایم.

### آیا دو عامل می‌توانند هم‌زمان از دو کشور متفاوت استفاده کنند؟

بله، با دو شیء `Browser` که هر کدام `ProxySettings` خودش را دارد. یک مرورگر برای همه زبانه‌هایش یک پروکسی دارد.

### آیا Browser Use به robots.txt پایبند است؟

نه به‌خودی‌خود؛ نسخه 0.13.10 هیچ بررسی robots.txt ندارد. پیش از آنکه سایتی را به عامل بسپارید، این فایل را بخوانید.

### آیا پروکسی مانع مسدود شدن عامل من در سایت‌ها می‌شود؟

خیر. پروکسی آدرسی را که درخواست از آن می‌آید تغییر می‌دهد؛ رفتار مرورگر و سرعت درخواست‌ها همان می‌ماند. سرعت آهسته، صفحه‌های مجاز و API رسمی راه ماندگار است.

## خلاصه

Browser Use یک مرورگر واقعی Chromium را در اختیار مدل زبانی می‌گذارد و حلقه عامل را در کد Python خودتان اجرا می‌کند. پروکسی را با `ProxySettings` و فیلدهای جداگانه `username` و `password` روی مرورگر تنظیم کنید؛ اطلاعات ورود درون آدرس و SOCKS5 با رمز عبور هر دو در Chromium شکست می‌خورند. پیش از نخستین کار IP خروجی را بررسی کنید، برای هر کاری که ورود به حساب دارد از نشست ثابت استفاده کنید و `allowed_domains` را فیلتری برای عامل بدانید، نه مرز شبکه. اطلاعات محرمانه را در `sensitive_data` نگه دارید، تله‌متری را خاموش کنید و برای کنش‌هایی که چیزی را تغییر می‌دهند تأیید یک انسان را لازم کنید. نقطه‌های خروج مناسب برای عامل شما در صفحه [خدمات پروکسی ما](/fa/proxy) است.
