وقتی صفحه دانلود یک برنامه را باز میکنید، سایت خودش فایل مناسب سیستمعامل شما را پیشنهاد میدهد. بعضی سایتها برای بازدیدکنندهای که با گوشی آمده صفحه موبایل جداگانهای میفرستند. سایت این کار را بدون پرسیدن از شما انجام میدهد، چون مرورگر شما همراه هر درخواست متنی یکسطری میفرستد که خودش را معرفی میکند. نام این سطر User-Agent است (در فارسی «عامل کاربر»).
نیمه اول این نوشته برای همه است: رشته User-Agent تکه به تکه چگونه خوانده میشود، مقدار خودتان را چگونه میبینید و در Chrome، در Windows 11 و در Android چگونه آن را تغییر میدهید. نیمه دوم فنیتر است: کاهش User-Agent در Chrome، هدرهای Client Hints که جای آن را گرفتهاند، چیزهایی که با تغییر User-Agent عوض نمیشوند و اینکه اسکریپتی که خودتان نوشتهاید چگونه باید خودش را معرفی کند.
User-Agent چیست؟
وقتی مرورگر شما صفحهای را درخواست میکند، فقط نشانی را برای سرور نمیفرستد. بالای درخواست سطرهای اطلاعاتی کوتاهی به نام «هدر» (header) هم میرود: چه زبانهایی را ترجیح میدهید، چه نوع فایلهایی را میپذیرید و درخواست را چه نرمافزاری فرستاده است. مورد آخر همان هدر User-Agent است.
استاندارد HTTP یعنی RFC 9110 این هدر را فیلدی تعریف میکند که درباره نرمافزار آغازکننده درخواست اطلاعات میدهد. سرورها این اطلاعات را برای سه کار به کار میبرند: فهمیدن اینکه یک مشکل سازگاری در کدام مرورگر رخ میدهد، تنظیم پاسخ بر اساس محدودیتهای کلاینت و نگه داشتن آمار مرورگر و سیستمعامل. استاندارد توصیه میکند کلاینت این هدر را با هر درخواست بفرستد.
عبارت «user agent» در اصل نام نرمافزار است، نه نام هدر: هر برنامهای که از طرف شما درخواست میفرستد یک عامل کاربر است. مرورگر، ربات موتور جستوجو، برنامه گوشی، فرمان curl و یک اسکریپت Python همگی در این تعریف میگنجند و هر کدام یک مقدار User-Agent دارند.
دو برداشت نادرست را از همین ابتدا اصلاح کنیم. User-Agent نشانی IP و موقعیت شما را در خود ندارد. نشانی IP از خود اتصال خوانده میشود؛ اینکه چگونه عوض میشود را در راهنمای تغییر نشانی IP توضیح دادهایم. User-Agent احراز هویت هم نیست: اظهار خود کلاینت است و سرور نمیتواند با نگاه کردن به هدر درستی این اظهار را بسنجد.
رشته User-Agent چگونه خوانده میشود؟
یک Chrome بهروز روی Windows این مقدار را میفرستد (نمونه از صفحه User-Agent در MDN است):
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36در این سطر کنار Chrome نامهای Mozilla، AppleWebKit، Gecko و Safari هم دیده میشود. دلیلش تاریخی است. سایتها سالها قاعدههایی نوشتند از این دست: «اگر در User-Agent این نام بود، صفحه پیشرفته را بفرست». هر مرورگر تازه برای اینکه از آن صفحه محروم نماند، نام مرورگرهای قدیمیتر را به سطر خودش افزود. به تعبیر MDN، Mozilla/5.0 نشانهای عمومی است که میگوید مرورگر با Mozilla سازگار است و به دلایل تاریخی امروز تقریباً هر مرورگری آن را میفرستد.
| بخش | چه میگوید؟ |
|---|---|
Mozilla/5.0 | بازمانده سازگاری؛ مرورگرها را از هم جدا نمیکند |
(Windows NT 10.0; Win64; x64) | سیستمعامل و معماری پردازنده |
AppleWebKit/537.36 (KHTML, like Gecko) | نام موتورها که باز هم برای سازگاری افزوده شدهاند |
Chrome/143.0.0.0 | مرورگر واقعی و نسخه اصلی آن |
Safari/537.36 | نامی که برای سایتهای نوشتهشده بر پایه Safari افزوده شده است |
قاعده عملی خواندن این است: سیستمعامل درون نخستین پرانتز است و نام واقعی مرورگر بیشتر نزدیک انتهای سطر میآید. Edge به انتهای سطر Edg/ میافزاید و Firefox با Firefox/ تمام میشود. در گوشیها واژه Mobile وارد سطر میشود؛ سایتهایی که بر اساس User-Agent صفحه موبایل را انتخاب میکنند به همین واژه نگاه میکنند.
یک نکته دیگر: حتی اگر Windows 11 داشته باشید، درون پرانتز Windows NT 10.0 نوشته میشود. Microsoft در مستندات خودش آشکارا میگوید رشتههای User-Agent برای جدا کردن Windows 10 از Windows 11 بهروزرسانی نخواهند شد. دلیلش را پایینتر در بخش کاهش User-Agent میبینید.
User-Agent خودتان را چگونه ببینید؟
لازم نیست برنامهای نصب کنید. ابزارهای خود مرورگر کافی است:
- در Chrome یا Edge روی هر صفحهای کلید
F12را بزنید (یا سه نقطه گوشه بالا > ابزارهای بیشتر > ابزارهای برنامهنویسی). - در پنلی که باز میشود به زبانه Console بروید.
- عبارت
navigator.userAgentرا بنویسید و Enter بزنید. سطری که درون گیومه برمیگردد همان User-Agent است که مرورگر شما به JavaScript اعلام میکند. - برای دیدن آنچه واقعاً به سرور میرود به زبانه Network بروید، صفحه را تازهسازی کنید، روی نخستین درخواست فهرست کلیک کنید و در بخش «Request Headers» سطر
User-Agentرا پیدا کنید.
انتظار میرود گام سوم و چهارم یک مقدار را نشان دهند. اگر متفاوت بودند، یک افزونه یا یک تنظیم فقط یکی از این دو را عوض میکند.
اگر نمیخواهید از کنسول استفاده کنید، صفحهای که هدرهای درخواست دریافتی را همانطور که هست برمیگرداند هم کار را راه میاندازد. نشانی https://httpbin.org/headers را در مرورگر باز کنید تا همه هدرهایی را که سرور از شما گرفته ببینید؛ در بخش کد همین نوشته هم از همین نشانی استفاده میکنیم.
User-Agent چگونه تغییر داده میشود؟
اول بدانید چه چیزی را تغییر میدهید: User-Agent تنظیم سیستمعامل نیست، تنظیم هر مرورگر بهطور جداگانه است. نه در Windows 11 و نه در Android تنظیم واحدی برای User-Agent وجود ندارد که برای همه برنامهها معتبر باشد.
Chrome و Edge (Windows 11، Windows 10، macOS)
مسیر رسمی Chrome زبانه Network conditions در DevTools است. Edge هم بر پایه Chromium ساخته شده و همین ابزارها را دارد.
- با
F12ابزار DevTools را باز کنید. - از سه نقطه گوشه بالای پنل مسیر More tools > Network conditions را دنبال کنید. اگر در منو پیدایش نکردید، با
Ctrl+Shift+Pمنوی فرمان را باز کنید و «Network conditions» را بنویسید. - زیر عنوان User agent تیک گزینه «Use browser default» را بردارید.
- از فهرست یک مرورگر و دستگاه آماده انتخاب کنید یا با گزینه «Custom...» رشته خودتان را بنویسید.
- صفحه را تازهسازی کنید.
بخش «User agent client hints» در همین قسمت امکان ویرایش مقدارهای Client Hints را هم میدهد که پایینتر توضیح میدهیم. این تغییر تنظیم دائمی مرورگر نیست؛ فقط در زبانهای که DevTools در آن باز است و در مدت آزمون اعتبار دارد. در این نوشته نامهای انگلیسی DevTools را آوردهایم.
گوشی Android
در Android راه داخلی برای نوشتن دستی User-Agent وجود ندارد، اما پرکاربردترین تغییر با یک لمس انجام میشود. در Chrome روی سه نقطه کنار نوار نشانی بزنید و کادر سایت ویژه رایانه را علامت بزنید؛ Chrome با هویت دسکتاپ به آن سایت میرود و طرح پهن صفحه میآید. اگر میخواهید این حالت پیشفرض همه سایتها باشد، مسیر گفتهشده در راهنمای Chrome این است: تنظیمات > تنظیمات سایت > سایت ویژه رایانه.
User-Agent switcher چیست؟
افزونههایی که در فروشگاه مرورگرها با نام «User-Agent switcher» پیدا میشوند همین کار را بدون باز کردن DevTools و بهصورت ماندگار انجام میدهند: از فهرست یک هویت انتخاب میکنید و افزونه هدر User-Agent درخواستهای خروجی را با آن عوض میکند. پیش از نصب به مجوزی که میخواهد نگاه کنید. افزونه برای اینکه بتواند هدرها را تغییر دهد باید به ترافیک شما در همه سایتهایی که باز میکنید دسترسی داشته باشد؛ این مجوز را فقط به افزونهای بدهید که به منبعش اعتماد دارید و وقتی کارتان تمام شد خاموشش کنید.
چرا User-Agent را تغییر میدهند؟
همه دلیلهای مشروع نوعی آزمون هستند:
- آزمودن نمای موبایل از روی رایانه. دیدن اینکه سایت خودتان چه صفحهای برای گوشی میفرستد.
- ریشهیابی یک مشکل سازگاری. فهمیدن اینکه یک صفحه سازمانی قدیمی که میگوید «مرورگر شما پشتیبانی نمیشود» واقعاً کار میکند یا نه.
- دیدن آنچه سایت خودتان به رباتها نشان میدهد. پیدا کردن خطای پیکربندیای که به رباتهای موتور جستوجو محتوای متفاوتی برمیگرداند.
- بازتولید یک خطا. بررسی مشکلی که فقط در یک مرورگر خاص رخ میدهد، وقتی آن مرورگر در دسترستان نیست.
RFC 9110 این وضعیت را هم پیشبینی کرده است: اگر کلاینتی خودش را بهجای کلاینت دیگری معرفی کند، سرور میتواند فرض کند کاربر میخواهد پاسخ آمادهشده برای همان کلاینت را ببیند؛ حتی اگر آن پاسخ در مرورگر واقعی خوب کار نکند. مسئولیت با کسی است که تغییر را داده است.
کاهش User-Agent (UA reduction) چیست؟
رشتههای قدیمی User-Agent بسیار پرگوتر از امروز بودند: نسخه کامل چهاربخشی مرورگر، سطح وصله سیستمعامل و در Android مدل گوشی. این جزئیات وقتی کنار هم میآمدند تکهای آماده از اثر انگشت مرورگر میشدند که برای شناختن کاربر بدون کوکی به کار میرود. RFC 9110 هم همین هشدار را میدهد: مقدارهای بیش از حد مفصل User-Agent خطر شناخته شدن کاربر برخلاف خواست او را بالا میبرند.
Chrome به همین دلیل رشته را مرحله به مرحله ساده کرد. بر اساس جدول زمانی پروژه Chromium شمارههای نسخه فرعی در Chrome 101، اطلاعات سیستمعامل دسکتاپ در Chrome 107 و نسخه Android و مدل دستگاه در Chrome 110 ثابت شدند. در رشتهای که Chrome امروز میفرستد این بخشها واقعی نیستند و ثابتاند:
| بخش | اگر کاهش نبود (نمونه) | امروز |
|---|---|---|
| نسخه مرورگر | Chrome/143.0.12.45 | Chrome/143.0.0.0 (فقط نسخه اصلی واقعی است) |
| Windows | نسخه واقعی | همیشه Windows NT 10.0; Win64; x64 |
| macOS | نسخه واقعی | همیشه Intel Mac OS X 10_15_7 |
| Android | Android 16; Pixel 9 | همیشه Android 10; K |
دلیل اینکه در Windows 11 مقدار NT 10.0 و روی یک گوشی نو «Android 10» با مدلی به نام «K» میبینید همین است. نتیجه هم روشن است: ابزار آماریای که بخواهد از User-Agent یک Chrome بهروز نسخه سیستمعامل یا مدل گوشی را بخواند، نتیجه نادرست میدهد.
Client Hints چیست؟
بعضی سایتها واقعاً به اطلاعاتی که با سادهسازی از دست رفت نیاز دارند: آنها که میخواهند فایل نصب درست را پیشنهاد دهند یا بدانند یک خطا در کدام نسخه رخ میدهد. Chrome این اطلاعات را پاک نکرد، آن را وابسته به درخواست سایت کرد. نام این سازوکار User-Agent Client Hints است و آنطور که در راهنمای Client Hints در MDN آمده، اینگونه کار میکند:
- مرورگر در نخستین درخواست، همراه
User-Agentسادهشده سه هدر کوتاه میفرستد:Sec-CH-UA(برند مرورگر و نسخه اصلی)،Sec-CH-UA-Mobile(موبایل هست یا نه) وSec-CH-UA-Platform(نام سیستمعامل). - سروری که اطلاعات بیشتری میخواهد، در پاسخ خود با هدر
Accept-CHمینویسد کدام سرنخها را میخواهد. - مرورگر سرنخهایی را که اجازه میدهد به درخواستهای بعدی به همان سایت میافزاید.
- اگر سرنخی از همان نخستین درخواست ضروری باشد، سرور از هدر
Critical-CHاستفاده میکند؛ مرورگر درخواست را همراه آن سرنخ دوباره میفرستد.
سه هدر پیشفرض در یک درخواست Chrome اینگونه دیده میشوند:
Sec-CH-UA: "Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"«Not A(Brand» در این فهرست خطا نیست. به گفته MDN مرورگرها عمداً یک برند ساختگی به فهرست میافزایند؛ هدف این است که سرورها عادت نکنند با دیدن نامی ناآشنا درخواست را رد کنند. این پیشگیریای است برای اینکه ماجرای Mozilla/5.0 تکرار نشود.
| نوع سرنخ | هدرها | چه زمانی فرستاده میشود؟ |
|---|---|---|
| کمجزئیات | Sec-CH-UA، Sec-CH-UA-Mobile، Sec-CH-UA-Platform | در هر درخواست، خودبهخود (فقط HTTPS) |
| پرجزئیات | Sec-CH-UA-Platform-Version، Sec-CH-UA-Full-Version-List، Sec-CH-UA-Model، Sec-CH-UA-Arch | فقط اگر سرور با Accept-CH بخواهد |
همین اطلاعات در JavaScript با navigator.userAgentData در دسترس است. سطرهای زیر را در کنسول Chrome بچسبانید تا مقدارهای خودتان را ببینید:
console.log(navigator.userAgent);
if (navigator.userAgentData) {
const details = await navigator.userAgentData.getHighEntropyValues([
"platformVersion",
"model",
"fullVersionList",
]);
console.log(details);
}در Windows 11 این کد برای platformVersion نسخه اصلی 13 یا بالاتر برمیگرداند؛ این همان روشی است که مستندات Microsoft برای جدا کردن Windows 10 از Windows 11 نشان میدهد. روی دستگاه Windows 11 که آزمودیم، User-Agent همچنان Windows NT 10.0 میگفت و مقدار platformVersion برابر 19.0.0 آمد.
مرز آن را هم بدانید. Client Hints امروز فقط در مرورگرهای مبتنی بر Chromium (Chrome، Edge، Opera) وجود دارد. در دادههای سازگاری MDN مرورگرهای Firefox و Safari این هدرها را نمیفرستند و شیء navigator.userAgentData هم در آنها تعریف نشده است. بررسی if در کد بالا به همین دلیل لازم است.
تغییر User-Agent چه چیزی را عوض نمیکند؟
User-Agent یک برچسب است و عوض کردن برچسب، محتوای جعبه را عوض نمیکند. وقتی سطر را «Safari روی iPhone» میکنید، این موارد سر جای خود میمانند:
- هدرهای Client Hints. اگر از ابزاری استفاده کردهاید که فقط هدر
User-Agentرا عوض میکند، Chrome همچنانSec-CH-UA-Platform: "Windows"میفرستد. Safari اصلاً این هدرها را نمیفرستد؛ یعنی درخواست شما هم میگوید Safari است و هم هدرهایی دارد که فقط Chromium میفرستد. - آنچه JavaScript میبیند. اندازه صفحهنمایش، فونتهای نصبشده، کارت گرافیک، پشتیبانی از صفحه لمسی. این سیگنالها را در نوشته اثر انگشت مرورگر چیست؟ برشمردهایم.
- خود اتصال. نخستین بستهای که مرورگر هنگام برقرار کردن اتصال رمزنگاریشده میفرستد در هر خانواده مرورگر چینش متفاوتی دارد و پیش از هدرها میرود. جزئیاتش در نوشته ما درباره اثر انگشت TLS و JA3 است.
- نشانی IP. درخواست همچنان از اتصال شما و با نشانی IP شما بیرون میرود.
به همین دلیل تغییر User-Agent ابزار آزمون است، نه ابزار نامرئی شدن. سامانههای حفاظت در برابر ربات به یک هدر تنها نگاه نمیکنند، به سازگاری سیگنالها با یکدیگر نگاه میکنند؛ تصویر کامل را از نگاه صاحب سایت در نوشته ما درباره شیوه کار تشخیص ربات آوردهایم. نرمافزارهایی که کار ساختن یک مجموعه هویت سازگار برای هر پروفایل را بر عهده میگیرند دسته جداگانهای هستند: مرورگر آنتیدیتکت چیست و چگونه کار میکند؟.
User-Agent در کد: مقدارهای پیشفرض و هویت صادقانه ربات
هر کلاینتی بیرون از مرورگر هم User-Agent دارد و اگر شما تنظیمش نکرده باشید، همان نام خود کتابخانه است. مقدارهای زیر را برای این نوشته روی دستگاه خودمان اندازه گرفتهایم؛ شماره نسخه نزد شما متفاوت خواهد بود:
| کلاینت | User-Agent پیشفرض |
|---|---|
curl | curl/8.21.0 |
| Python Requests | python-requests/2.34.2 |
Node.js (تابع داخلی fetch) | node |
این مقدارها نادرست نیستند، صادقانهاند. کمبودشان این است: به مدیر سایت نمیگویند شما که هستید و چگونه میشود با شما تماس گرفت. مدیری که در لاگهایش هزاران سطر python-requests میبیند تنها یک گزینه دارد و آن مسدود کردن است.
برای اسکریپت جمعآوری دادهای که منظم اجرا میشود، روش پذیرفتهشده این است که هویتی بنویسید که از قالب «محصول/نسخه (توضیح)» در RFC 9110 پیروی کند و نام ربات و یک راه تماس را در خود داشته باشد. رباتهای موتور جستوجو هم همین کار را میکنند؛ مقدار Googlebot به شکل Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) است. با curl یک سطر کافی است:
# See the default identity
curl -s https://httpbin.org/headers
# Write your own identity with -A
curl -s -A "ExamplePriceBot/1.0 (+https://example.com/bot-info)" https://httpbin.org/headersدر Python هویت را نه روی تکتک درخواستها، بلکه روی نشست بنویسید. به این ترتیب همه درخواستها با یک هویت میروند و تنظیم پروکسی هم در یک جا میماند:
import requests
URL = "https://httpbin.org/headers"
BOT_UA = "ExamplePriceBot/1.0 (+https://example.com/bot-info; bot@example.com)"
# 1) With nothing set: the library's own identity
print(requests.get(URL, timeout=20).json()["headers"]["User-Agent"])
# 2) A fixed, self-identifying identity and a proxy for the whole session
session = requests.Session()
session.headers["User-Agent"] = BOT_UA
proxy = "http://user:pass@pr.proxynet.io:8000"
session.proxies = {"http": proxy, "https": proxy}
for _ in range(3):
print(session.get(URL, timeout=20).json()["headers"]["User-Agent"])سطر اول python-requests/2.x را چاپ میکند و سه سطر بعدی هویتی را که نوشتهاید. در Node.js همین کار با فیلد headers در فراخوانی fetch انجام میشود:
const url = "https://httpbin.org/headers";
// 1) Default identity
let res = await fetch(url);
console.log((await res.json()).headers["User-Agent"]);
// 2) The identity you wrote yourself
res = await fetch(url, {
headers: { "User-Agent": "ExamplePriceBot/1.0 (+https://example.com/bot-info; bot@example.com)" },
});
console.log((await res.json()).headers["User-Agent"]);فایل را با پسوند .mjs ذخیره کنید؛ سطر اول خروجی node خواهد بود. تعریف پروکسی در Node.js موضوع جداگانهای است و نمونههای آزمودهشده آن در نوشته استفاده از پروکسی در Node.js آمده است. همه گزینههای پروکسی در سمت curl هم در نوشته استفاده از cURL با پروکسی هست.
چرا User-Agent تصادفی در هر درخواست فایدهای ندارد؟
بیشتر راهنماهای اسکرپینگ در اینترنت پیشنهاد میکنند یک «فهرست بهروز User-Agent» دانلود کنید و در هر درخواست یکی را تصادفی بردارید. سازوکار را در بخش پیش دیدید: فقط برچسب عوض میشود. وقتی همان نشانی IP، همان کوکی و همان رد اتصال در یک درخواست بگوید Chrome روی Windows است و در درخواست بعدی Safari روی iPhone، ترافیکی پدید میآید که به هیچ کاربر واقعی شبیه نیست. یک هویت یگانه و ثابت که خودش را معرفی میکند هم سازگار است و هم برای مدیر سایت طرف گفتوگویی باقی میگذارد. نمونههای سازگاری را در بخش «هدرها و هویت کلاینت سازگار» از نوشته وب اسکرپینگ بدون مسدود شدن آوردهایم.
چرا معرفی کردن خود بهجای Googlebot توصیه نمیشود؟
بعضی راهنماها پیشنهاد میکنند مقدار Googlebot را در User-Agent بنویسید. به دو دلیل این کار را نکنید. نخست اینکه کار نمیکند: Google به سایتها توصیه میکند ربات او را با جستوجوی DNS معکوس یا با بازههای IP که منتشر میکند تأیید کنند. نشانی IP که میگوید Googlebot است اما در جستوجوی DNS معکوس زیر googlebot.com، google.com یا googleusercontent.com حل نمیشود، زودتر از یک ربات معمولی مسدود میشود. دوم اینکه استفاده از هویت یک سازمان دیگر، بیرون رفتن از چارچوب اجازهای است که سایت به شما داده است. تنها کاربرد مشروع همان آزمونی است که بالاتر گفتیم: دیدن اینکه سایت خودتان به این هویت چه برمیگرداند.
نام صادقانه ربات یک فایده دیگر هم دارد. سطر User-agent: در فایل robots.txt همین واژه را به کار میبرد اما چیز جداگانهای است: سطری است که صاحب سایت در آن مشخص میکند قاعده را برای کدام ربات نوشته است. اگر نام ربات شما مشخص باشد، صاحب سایت میتواند قاعدهای ویژه شما بنویسد و شما هم از آن پیروی میکنید. روش خواندن این فایل در نوشته فایل robots.txt چیست و چگونه آن را بخوانیم؟ آمده است.
پروکسی و User-Agent: پروکسی IP را عوض میکند و هویت را شما
پروکسی و User-Agent زیاد با هم اشتباه گرفته میشوند، چون هر دو بخشی از پرسش «سایت مرا چگونه میبیند» هستند. تقسیم کار روشن است: پروکسی عوض میکند که درخواست از کدام نشانی IP و از کدام کشور بیرون برود. به User-Agent دست نمیزند. در اتصال HTTPS نمیتواند هم دست بزند: پروکسی فقط تونل رمزنگاریشده را برقرار میکند و هدرهای درون تونل را نمیبیند. در نمونه Python بالا، User-Agent که سایت میبیند با پروکسی و بدون پروکسی یکی است.
قاعدهای که از اینجا بیرون میآید این است که این دو باید یک داستان را بگویند. اگر سایت موبایل خودتان یا بکاند برنامهتان را از نگاه کاربر گوشی در Türkiye میآزمایید، کنار User-Agent موبایل نشانی IP مناسب است که از شبکه اپراتور موبایل بیرون میآید؛ برای این کار پروکسی موبایل به کار میرود. اگر قیمت یا تبلیغی را که کاربر خانگی میبیند راستیآزمایی میکنید، هویت مرورگر دسکتاپ همراه پروکسی مسکونی جفتی سازگار است. «گوشی» که از IP مرکز داده میآید، یا درخواستی که از IP آلمان میآید و Accept-Language: tr میفرستد، هر قدر هم User-Agent با دقت انتخاب شده باشد متناقض است.
کاربردها
- آزمون مقایسهای نسخه موبایل و دسکتاپ. باز کردن یک صفحه با دو هویت و با IP کشور هدف و دیدن تفاوتها: آزمون برنامه.
- جمعآوری منظم داده با نام خودتان. هویت ثابت ربات، پیروی از robots.txt و محدودیت سرعت با هم کار میکنند: استخراج داده.
- خزش سایت و بررسی پیوندها. اگر خزنده (crawler) خودتان را مینویسید، سطر هویت نخستین قلم پیکربندی است: خزنده وب.
- دنبال کردن تفاوت موبایل و دسکتاپ در نتایج جستوجو. رتبهبندی با نوع دستگاه و موقعیت تغییر میکند: پروکسی سئو.
- خودکارسازی مرورگر. در Playwright مقدار User-Agent هنگام ساختن context داده میشود و روی همه صفحههای آن context اعمال میشود: Playwright چیست و چگونه با پروکسی استفاده میشود؟.
اشتباهات رایج
- گمان اینکه با تغییر User-Agent نشانی IP هم پنهان میشود. این دو لایه جدا هستند؛ در User-Agent اطلاعات IP وجود ندارد.
- عوض کردن فقط هدر و فراموش کردن Client Hints. Chrome با
Sec-CH-UA-Platformهمچنان سیستمعامل واقعی را میگوید. - خواندن نسخه سیستمعامل از User-Agent. در Chrome بهروز این فیلدها ثابتاند؛ Windows 11 و نسخههای تازه Android در رشته دیده نمیشوند.
- استفاده از یک «فهرست User-Agent» قدیمی که در اینترنت پیدا شده است. درخواستی که نسخهای از Chrome مربوط به سالها پیش را اعلام میکند به ترافیک واقعی مرورگر شبیه نیست و بعضی سایتها برای نسخههای قدیمی صفحه ناقص میفرستند.
- انتخاب هویت تصادفی یا معرفی خود بهجای Googlebot. اولی همراه همان IP و همان کوکی نشانه ناسازگاری است و دومی از تأیید DNS معکوس نمیگذرد.
- نصب افزونه switcher بدون نگاه کردن به مجوزهایش. افزونهای که هدرها را عوض میکند میتواند همه ترافیک شما را ببیند.
- روشن گذاشتن تغییر پس از آزمون. وقتی «سایت ویژه رایانه» یا افزونه روشن بماند، سایتها بههمریخته دیده میشوند و کسی دلیلش را به یاد نمیآورد.
راهنمای انتخاب
| نیاز | پیشنهاد |
|---|---|
| میخواهم User-Agent خودم را ببینم | navigator.userAgent در کنسول یا httpbin.org/headers |
| میخواهم نمای موبایل را روی رایانه بیازمایم | DevTools > More tools > Network conditions |
| میخواهم صفحه دسکتاپ را روی گوشی باز کنم | «سایت ویژه رایانه» در منوی Chrome |
| باید بدانم بازدیدکننده از Windows 11 استفاده میکند یا نه | Sec-CH-UA-Platform-Version یا getHighEntropyValues |
| اسکرپری مینویسم که منظم اجرا میشود | یک هویت ثابت و یگانه برای ربات با نام و نشانی تماس |
| میخواهم ببینم از کشور و دستگاه دیگر چگونه دیده میشوم | User-Agent متناسب با دستگاه همراه IP پروکسی از همان نوع |
| میخواهم ببینم سایتم به رباتها چه نشان میدهد | آزمون با هویت ربات فقط روی سایت خودتان |
| میخواهم با User-Agent از حفاظت ضدربات یک سایت بگذرم | این راه کار نمیکند؛ API رسمی یا اجازه صاحب سایت |
پرسشهای متداول
User-Agent یعنی چه؟
در معنای لغوی یعنی «عامل کاربر»: نرمافزاری که از طرف شما به اینترنت درخواست میفرستد. در کاربرد روزمره منظور متنی است که در هدر User-Agent میآید و آن نرمافزار با هر درخواست میفرستد تا نام، نسخه و سیستمعامل خود را بگوید.
آیا User-Agent نشانی IP یا موقعیت مرا نشان میدهد؟
خیر. در این رشته فقط اطلاعات نرمافزار و سیستمعامل هست. سایت نشانی IP شما را از خود اتصال و موقعیت تقریبیتان را از همان نشانی IP به دست میآورد. تغییر User-Agent بر هیچکدام اثر ندارد.
آیا تغییر User-Agent قانونی است؟
تغییر دادن هدری که مرورگر خودتان میفرستد بهخودیخود کار ممنوعی نیست؛ مرورگرها در ابزارهای برنامهنویسی خود منویی آماده برای همین کار دارند. آنچه تعیینکننده است کاری است که پس از تغییر انجام میدهید. رفتار کردن مانند ربات یک سازمان دیگر یا دور زدن شرایط استفاده یک سایت، مستقل از اینکه هدر را چگونه تنظیم کردهاید، دردسر درست میکند. چارچوب حقوقی جمعآوری داده را در نوشته آیا اسکرپینگ وب قانونی است؟ بررسی کردهایم.
چرا در Windows 11 مقدار User-Agent همان Windows 10 را نشان میدهد؟
مرورگرهای مبتنی بر Chromium فیلد سیستمعامل را روی مقدار Windows NT 10.0 ثابت کردهاند. نسخه واقعی از هدر Sec-CH-UA-Platform-Version به دست میآید؛ نسخه اصلی 13 و بالاتر یعنی Windows 11.
آیا Client Hints جای User-Agent را گرفته است؟
هنوز نه. هدر User-Agent همچنان در همه مرورگرها فرستاده میشود؛ Chrome فقط محتوای آن را ساده کرده است. Client Hints سازوکاری افزوده است که جزئیات را از راهی مبتنی بر اجازه به سایتهایی میدهد که آن را بخواهند و فعلاً فقط در مرورگرهای مبتنی بر Chromium وجود دارد. برای کاربران Firefox و Safari، سایتها هنوز به رشته User-Agent نگاه میکنند.
آیا با استفاده از پروکسی User-Agent عوض میشود؟
عوض نمیشود. پروکسی نشانی IP خروج درخواست را عوض میکند و هدرهایی که میفرستید همان میمانند. این دو را با هم برنامهریزی کنید: نوع دستگاه را User-Agent میگوید و موقعیت و نوع شبکه را پروکسی.
خلاصه
User-Agent اظهار یکسطری نرمافزار فرستنده درخواست است که در آن خودش را معرفی میکند. آغاز شدنش با Mozilla/5.0 بازمانده تاریخی سازگاری است و اطلاعات اصلی درون پرانتز و در انتهای سطر قرار دارد. Chrome این سطر را ساده کرد و جزئیات را به هدرهای Client Hints برد؛ دلیل اینکه Windows 11 به شکل NT 10.0 و گوشیهای نو به شکل Android 10; K دیده میشوند همین است. تغییر دادنش آسان است (زبانه Network conditions، کادر «سایت ویژه رایانه»، curl -A)، اما فقط برچسب عوض میشود: Client Hints، سیگنالهای JavaScript، رد اتصال و نشانی IP سر جای خود میمانند. در اسکریپت خودتان بهجای هویتهای تصادفی از یک هویت یگانه استفاده کنید که نام و نشانی تماس شما را دارد و هویت ربات دیگری را به خود نگیرید. برای نشانیهای IP سازگار با دستگاه و موقعیتی که میآزمایید میتوانید سرویسهای پروکسی ما را ببینید.




