با استفاده از یک عامل سفارشی در ChatGPT، میتوانید فرآیند ممیزی سئوی وبسایت خود را به صورت خودکار انجام دهید. این عامل قادر است کد HTML صفحات وب را دریافت و محتوای آنها را تجزیه و تحلیل کند و در نهایت، توصیههای کاربردی برای بهبود سئوی سایت ارائه دهد.
ChatGPT فراتر از یک پلتفرم ساده برای پرسش و پاسخ است. اگرچه میتوانید به صورت مستقیم از آن برای دریافت راهنمایی در زمینه سئو استفاده کنید، اما قدرت واقعی این پلتفرم زمانی آشکار میشود که شما عامل (یا نماینده) اختصاصی خود را ایجاد کنید.
با توجه به اینکه انجام ممیزیهای سئو برای وبسایتهای سازمانی یک امر ضروری است، من به دنبال راهی برای سادهسازی برخی از مراحل این فرآیند بودم. راه حل من، ایجاد یک عامل ChatGPT سفارشی بود که در این مطلب با شما به اشتراک خواهم گذاشت تا بتوانید آن را مطابق با نیازهای خود تغییر دهید و سفارشیسازی کنید.
منبع searchenginejournal
سعی خواهم کرد توضیحات را تا حد امکان غیرفنی ارائه دهم. فقط کافی است مراحل زیر را دنبال کنید تا همه چیز به درستی کار کند.
مراحل ایجاد عامل ChatGPT برای ممیزی سئو:
- پیکربندی ChatGPT: تنظیمات اولیه ChatGPT خود را انجام دهید.
- ایجاد کد Cloudflare: کد Cloudflare اختصاصی خود را برای دریافت دادههای HTML صفحات وب ایجاد کنید.
- به کار گماردن کارشناسان ممیزی سئو: عامل ChatGPT خود را برای انجام ممیزیهای سئو فعال کنید.
جهت کسب اطلاعات بیشتر میتوانید مقاله نوشتن عناوین سئو و متای جذاب به کمک هوش مصنوعی را مطالعه فرمایید.
نتایج نهایی: در پایان این فرآیند، شما یک ربات خواهید داشت که اطلاعات مهمی از جمله موارد زیر را در اختیار شما قرار میدهد:

- عنوان صفحه (Page Title)
- توضیحات متا (Meta Description)
- سربرگها (Headings)
- تعداد کلمات (Word Count)
- و موارد دیگر مرتبط با سئو.
علاوه بر این، بر اساس یافتههای این عامل، فهرستی از اقدامات عملی برای بهبود وضعیت سئوی وبسایت خود دریافت خواهید کرد.
ایجاد یک Worker برای صفحات Cloudflare برای عامل شما
کارکنان صفحات Cloudflare نقش مهمی در کمک به عامل شما برای جمعآوری اطلاعات از وبسایت مورد نظر برای تجزیه و تحلیل و بررسی وضعیت فعلی سئوی آن ایفا میکنند.
برای شروع، میتوانید از یک حساب کاربری رایگان Cloudflare استفاده کنید. برای ثبتنام، مراحل زیر را دنبال کنید:
- به وبسایت http://pages.dev/ مراجعه کنید.
- یک حساب کاربری ایجاد کنید.
من از حساب گوگل برای ثبتنام استفاده کردم زیرا برایم راحتتر بود، اما شما میتوانید روشی را انتخاب کنید که برایتان مناسبتر است. پس از ثبتنام، به صفحهای مشابه تصویر زیر خواهید رسید:

در این صفحه، به قسمت Add new > Workers بروید.

سپس میتوانید یک الگو را انتخاب کنید، یک مخزن (Repository) را وارد کنید یا با گزینه Hello World! شروع کنید. من گزینه Hello World! را انتخاب کردم زیرا سادهترین راه برای شروع است.

به صفحه بعدی بروید و روی دکمه Deploy کلیک کنید. در نهایت، به صفحهای هدایت میشوید که پیام “Success! Your project is deployed at: your-subdomain.pages.dev” را نمایش میدهد
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const { searchParams } = new URL(request.url);
const targetUrl = searchParams.get('url');
const userAgentName = searchParams.get('user-agent');
if (!targetUrl) {
return new Response(
JSON.stringify({ error: "Missing 'url' parameter" }),
{ status: 400, headers: { 'Content-Type': 'application/json' } }
);
}
const userAgents = {
googlebot: 'Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.184 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
samsung5g: 'Mozilla/5.0 (Linux; Android 13; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36',
iphone13pmax: 'Mozilla/5.0 (iPhone14,3; U; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/19A346 Safari/602.1',
msedge: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246',
safari: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9',
bingbot: 'Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/',
chrome: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
};
const userAgent = userAgents[userAgentName] || userAgents.chrome;
const headers = {
'User-Agent': userAgent,
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip',
'Cache-Control': 'no-cache',
'Pragma': 'no-cache',
};
try {
let redirectChain = [];
let currentUrl = targetUrl;
let finalResponse;
// Follow redirects
while (true) {
const response = await fetch(currentUrl, { headers, redirect: 'manual' });
// Add the current URL and status to the redirect chain only if it's not already added
if (!redirectChain.length || redirectChain[redirectChain.length - 1].url !== currentUrl) {
redirectChain.push({ url: currentUrl, status: response.status });
}
// Check if the response is a redirect
if (response.status >= 300 && response.status < 400 && response.headers.get('location')) {
const redirectUrl = new URL(response.headers.get('location'), currentUrl).href;
currentUrl = redirectUrl; // Follow the redirect
} else {
// No more redirects; capture the final response
finalResponse = response;
break;
}
}
if (!finalResponse.ok) {
throw new Error(`Request to ${targetUrl} failed with status code: ${finalResponse.status}`);
}
const html = await finalResponse.text();
// Robots.txt
const domain = new URL(targetUrl).origin;
const robotsTxtResponse = await fetch(`${domain}/robots.txt`, { headers });
const robotsTxt = robotsTxtResponse.ok ? await robotsTxtResponse.text() : 'robots.txt not found';
const sitemapMatches = robotsTxt.match(/Sitemap:\s*(https?:\/\/[^\s]+)/gi) || [];
const sitemaps = sitemapMatches.map(sitemap => sitemap.replace('Sitemap: ', '').trim());
// Metadata
const titleMatch = html.match(/<title[^>]*>\s*(.*?)\s*<\/title>/i);
const title = titleMatch ? titleMatch[1] : 'No Title Found';
const metaDescriptionMatch = html.match(/<meta\s+name=["']description["']\s+content=["'](.*?)["']\s*\/?>/i);
const metaDescription = metaDescriptionMatch ? metaDescriptionMatch[1] : 'No Meta Description Found';
const canonicalMatch = html.match(/<link\s+rel=['"]canonical['"]\s+href=['"](.*?)['"]\s*\/?>/i);
const canonical = canonicalMatch ? canonicalMatch[1] : 'No Canonical Tag Found';
// Open Graph and Twitter Info
const ogTags = {
ogTitle: (html.match(/<meta\s+property="og:title"\s+content="(.*?)"\s*\/?>/i) || [])[1] || 'No Open Graph Title',
ogDescription: (html.match(/<meta\s+property="og:description"\s+content="(.*?)"\s*\/?>/i) || [])[1] || 'No Open Graph Description',
ogImage: (html.match(/<meta\s+property="og:image"\s+content="(.*?)"\s*\/?>/i) || [])[1] || 'No Open Graph Image',
};
const twitterTags = {
twitterTitle: (html.match(/<meta\s+(name|property)="twitter:title"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Title',
twitterDescription: (html.match(/<meta\s+(name|property)="twitter:description"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Description',
twitterImage: (html.match(/<meta\s+(name|property)="twitter:image"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Image',
twitterCard: (html.match(/<meta\s+(name|property)="twitter:card"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Card Type',
twitterCreator: (html.match(/<meta\s+(name|property)="twitter:creator"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Creator',
twitterSite: (html.match(/<meta\s+(name|property)="twitter:site"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Site',
twitterLabel1: (html.match(/<meta\s+(name|property)="twitter:label1"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Label 1',
twitterData1: (html.match(/<meta\s+(name|property)="twitter:data1"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Data 1',
twitterLabel2: (html.match(/<meta\s+(name|property)="twitter:label2"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Label 2',
twitterData2: (html.match(/<meta\s+(name|property)="twitter:data2"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Data 2',
twitterAccountId: (html.match(/<meta\s+(name|property)="twitter:account_id"\s+content="(.*?)"\s*\/?>/i) || [])[2] || 'No Twitter Account ID',
};
// Headings
const headings = {
h1: [...html.matchAll(/<h1[^>]*>(.*?)<\/h1>/gis)].map(match => match[1]),
h2: [...html.matchAll(/<h2[^>]*>(.*?)<\/h2>/gis)].map(match => match[1]),
h3: [...html.matchAll(/<h3[^>]*>(.*?)<\/h3>/gis)].map(match => match[1]),
};
// Images
const imageMatches = [...html.matchAll(/<img\s+[^>]*src="(.*?)"[^>]*>/gi)];
const images = imageMatches.map(img => img[1]);
const imagesWithoutAlt = imageMatches.filter(img => !/alt=".*?"/i.test(img[0])).length;
// Links
const linkMatches = [...html.matchAll(/<a\s+[^>]*href="(.*?)"[^>]*>/gi)];
const links = {
internal: linkMatches.filter(link => link[1].startsWith(domain)).map(link => link[1]),
external: linkMatches.filter(link => !link[1].startsWith(domain) && link[1].startsWith('http')).map(link => link[1]),
};
// Schemas (JSON-LD)
const schemaJSONLDMatches = [...html.matchAll(/<script[^>]*type="application\/ld\+json"[^>]*>(.*?)<\/script>/gis)];
const schemas = schemaJSONLDMatches.map(match => {
try {
return JSON.parse(match[1].trim());
} catch {
return { error: "Invalid JSON-LD", raw: match[1].trim() };
}
});
// Microdata
const microdataMatches = [...html.matchAll(/<[^>]*itemscope[^>]*>/gi)];
const microdata = microdataMatches.map(scope => {
const typeMatch = scope[0].match(/itemtype=["'](.*?)["']/i);
return {
type: typeMatch ? typeMatch[1] : 'Unknown',
raw: scope[0],
};
});
// Response Headers
const responseHeaders = Array.from(finalResponse.headers.entries());
// Construct final JSON output
return new Response(
JSON.stringify({
targetUrl,
redirectChain,
sitemaps,
metadata: { title, metaDescription, canonical },
headings,
schemas,
openGraph: ogTags,
twitterCards: twitterTags,
images: { total: images.length, withoutAlt: imagesWithoutAlt, imageURLs: images },
links,
microdata,
robotsTxt,
responseHeaders,
//rawHTML: html,
}),
{ headers: { 'Content-Type': 'application/json' } }
);
} catch (error) {
return new Response(
JSON.stringify({ error: error.message }),
{ status: 500, headers: { 'Content-Type': 'application/json' } }
);
}
}
از این صفحه خارج نشوید. در عوض، روی دکمه Edit code کلیک کنید. تمام کدهای موجود در ویرایشگر را حذف کنید و کد زیر را جایگزین کنید:در این مرحله، دو کار مهم باید انجام دهید:
- کپی کردن آدرس اینترنتی (URL) worker خود: آدرس اینترنتی که Cloudflare به worker شما اختصاص داده است را کپی کنید.
- استقرار (Deploy) worker خود: مطمئن شوید که تغییرات اعمال شده و worker شما مستقر شده است.
این آدرس اینترنتی (URL) در بخش بعدی مورد نیاز شما خواهد بود. میتوانید آن را در همان صفحهای که پیام استقرار موفقیتآمیز را نشان میدهد، پیدا کنید.

قبل از خروج از صفحه، حتماً روی دکمه Deploy کلیک کنید. اگر میخواهید خروجی اولیه را در این مرحله مشاهده کنید، میتوانید آدرس اینترنتی خود را در مرورگر وارد کرده و عبارت /?url=https://www.searchenginejournal.com را به انتهای آن اضافه کنید.
آدرس اینترنتی شما چیزی شبیه به این خواهد بود: https://YOURURL.workers.dev/?url=https://searchenginejournal.com.
برای آزمایش، میتوانید آدرس اینترنتی (URL) را به هر وبسایت دیگری که میخواهید تغییر دهید. توجه داشته باشید که خروجی در این مرحله ممکن است ظاهر چندان جذابی نداشته باشد، بنابراین اکنون زمان آن رسیده است که به بخش جالب پیکربندی GPT خود بپردازیم.
توجه: این worker با وبسایتهایی که با جاوا اسکریپت رندر میشوند به درستی کار نمیکند. با این حال، برای اکثر وبسایتهای دیگر، باید به خوبی کار کند. در صورت تمایل، میتوانید کد آن را برای پشتیبانی از رندر جاوا اسکریپت بهبود دهید.
پیکربندی GPT خودتان برای تقلید از عامل من
در این مرحله، باید GPT خود را پیکربندی کنید. برای این کار، ChatGPT را باز کنید و به قسمت Explore GPTs بروید.

سپس روی دکمه + Create کلیک کنید.
اکنون دو تب Create و Configure را مشاهده خواهید کرد. به بخش Configure بروید و اطلاعات مورد نیاز را وارد کنید.
شما میتوانید تغییرات جزئی در تنظیمات ایجاد کنید، اما توصیه میکنم برای ساختن یک پایه قوی برای ممیزیکننده خود، تمام مواردی که در زیر اضافه میکنم را دنبال کنید.
در این بخش، موارد زیر را اضافه خواهید کرد:

Name: OnPage SEO Audit
Description: Analyze SEO performance of any webpage using custom user-agents. Get detailed insights into metadata, redirect chains, Open Graph tags, Twitter Cards, sitemaps, and more. Perfect for SEO professionals and developers.
Instructions:
Trigger: When a user submits a URL (required) and an optional user-agent:
Instruction: Use the provided inputs to make an API request to retrieve SEO data. Default to the chrome user-agent if not provided.
Trigger: When the API returns valid data:
Instruction: Analyze the data and provide:
A summary of the page's SEO performance.
Actionable suggestions for improvement, categorized into metadata, technical SEO, and content.
Follow-up questions to clarify user priorities or goals, such as:
"Do you have specific goals for this page, such as improving search visibility, click-through rates, or user engagement?"
"Would you like me to focus on technical SEO or content-related improvements first?"
Example Response:
"The page's meta description is missing, which can impact click-through rates. Would you like me to suggest a draft description?"
Trigger: When the API returns HTTP 403:
Instruction:
Retry the request using the chrome user-agent.
If the issue persists:
Notify the user of the problem.
Suggest verifying the URL or user-agent compatibility.
Trigger: When the API returns a 400 error:
Instruction:
Clearly explain the error and provide actionable steps to resolve it (e.g., verify the URL format or ensure required parameters are provided).
Trigger: When data is incomplete or missing:
Instruction:
Request additional information from the user or permission to explore fallback data sources.
Example Follow-Up:
"The API response is missing a meta description for this page. Can you confirm if this was intentional, or should we explore other sources?"
Additional Guidelines:
Include:
A categorized summary of the page's SEO performance (e.g., metadata, technical SEO, content).
A prioritized list of recommended actions.
Visual examples or detailed explanations, when applicable.
Proactively address multiple detected issues with follow-up questions:
"The page has several critical issues, including missing Open Graph tags and a non-canonical URL. Would you like me to prioritize recommendations for social media or canonicalization first?"
Conversation starters User-Agent: Googlebot, URL: https://example.com Analyze the SEO details for https://example.com using Googlebot. Analyze the page using the Samsung Galaxy S22 user-agent. What metadata is available for https://example.com with Chrome? Capabilities Web Search Code Interpreter & Data Analysis
- Name: یک نام برای GPT خود انتخاب کنید (مثلاً: SEO Auditor).

- Description: یک توضیح مختصر برای عملکرد GPT بنویسید (مثلاً: Performs on-page SEO audits by fetching and analyzing website content).
- Instructions: دستورالعملهای زیر را کپی و در این قسمت قرار دهید (حتماً URL خود را جایگزین کنید):
- Conversation starters: چند عبارت شروع کننده مکالمه را وارد کنید تا کاربران راحتتر بتوانند از GPT شما استفاده کنند (مثلاً: “Analyze the SEO details of a page”, “Audit this URL: [URL]”, “How is the on-page SEO of [URL]?”).
- Action: در این قسمت، یک اکشن جدید ایجاد خواهید کرد. روی + Create new action کلیک کنید.
- Name: یک نام برای اکشن خود انتخاب کنید (مثلاً: fetchAndAuditSEOData).
- Description: یک توضیح برای عملکرد این اکشن بنویسید (مثلاً: Fetches the HTML content of a URL and analyzes it for SEO).
- API Endpoint: در اینجا، آدرس اینترنتی (URL) که از Cloudflare Worker خود کپی کردهاید را وارد کنید.
- Authentication: گزینه None را انتخاب کنید.
- Schema: کد زیر را کپی و در قسمت Schema قرار دهید (مطمئن شوید که
servers > urlرا با URL خودتان جایگزین کردهاید):
مطمئن شوید که URL خود را در قسمت servers > url به درستی جایگزین کردهاید. شما باید این اکشن را در زیر عنوان Available actions: fetchAndAuditSEOData مشاهده کنید.
{
"openapi": "3.1.0",
"info": {
"title": "Enhanced SEO Analysis and Audit API",
"description": "Fetch SEO data for analysis. Use the returned data to generate actionable SEO recommendations using AI or experts.",
"version": "1.2.0"
},
"servers": [
{
"url": "https://CHANGETOYOURURL.com/",
"description": "Base URL for Enhanced SEO Analysis API"
}
],
"paths": {
"/": {
"get": {
"operationId": "fetchAndAuditSEOData",
"summary": "Fetch and Audit SEO Data",
"description": "Retrieve SEO analysis data using a user-agent and URL and perform a basic SEO audit.",
"parameters": [
{
"name": "user-agent",
"in": "query",
"description": "The user-agent for the request.",
"required": true,
"schema": {
"type": "string",
"enum": ["chrome", "googlebot", "iphone13pmax", "samsung5g"]
}
},
{
"name": "url",
"in": "query",
"description": "The URL of the webpage to analyze.",
"required": true,
"schema": {
"type": "string",
"format": "uri"
}
}
],
"responses": {
"200": {
"description": "Successful response with audit results",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"metadata": {
"type": "object",
"properties": {
"title": { "type": "string" },
"metaDescription": { "type": "string" },
"canonical": { "type": "string" }
}
},
"redirectChain": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": { "type": "string" },
"status": { "type": "integer" }
}
}
},
"openGraph": {
"type": "object",
"properties": {
"ogTitle": { "type": "string" },
"ogDescription": { "type": "string" },
"ogImage": { "type": "string" }
}
},
"twitterCards": {
"type": "object",
"properties": {
"twitterTitle": { "type": "string" },
"twitterDescription": { "type": "string" },
"twitterImage": { "type": "string" }
}
},
"sitemaps": {
"type": "array",
"items": { "type": "string" }
},
"robotsTxt": {
"type": "string"
},
"audit": {
"type": "object",
"properties": {
"issues": {
"type": "array",
"items": { "type": "string" }
},
"recommendations": {
"type": "array",
"items": { "type": "string" }
}
}
},
"auditSummary": {
"type": "array",
"items": {
"type": "string"
}
},
"nextSteps": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
},
"400": {
"description": "Bad Request",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"error": { "type": "string" }
}
}
}
}
}
}
}
}
}
}
- Privacy Policy: در بخش Privacy Policy، پیوندی به سیاست حفظ حریم خصوصی خود اضافه کنید.
- Terms of Use: در صورت نیاز، پیوندی به شرایط استفاده خود اضافه کنید.
در نهایت، روی دکمه Create در بالا سمت راست کلیک کنید و دستورالعملهای بعدی را دنبال کنید.
اکنون میتوانید GPT خود را مشاهده کنید؛ این GPT مشابه یک ابزار On-Page SEO Audit خواهد بود.
آزمایش GPT و آشنایی با گزینههای موجود
شما مراحل زیادی را با موفقیت پشت سر گذاشتهاید و اکنون زمان آن رسیده است که GPT خود را آزمایش کنید.
روی کاشی دوم، Analyze SEO details of a page (یا عبارتی مشابه که در Conversation starters وارد کردهاید) کلیک کنید. این گزینه به طور پیشفرض روی example.com تنظیم شده است، اما میتوانید از آن بخواهید URL مورد نظر شما را آزمایش کند.
بیایید امتحان کنیم: عبارت “Use netflix.com as the URL” را وارد کنید و منتظر پاسخ GPT بمانید.
سفارشیسازی بیشتر GPT شما
شاید بخواهید با بازگشت به صفحه پیکربندی GPT و بهروزرسانی برخی موارد، آن را بیشتر سفارشیسازی کنید.
برای تنظیم موارد زیر، میتوانید Conversation starters خود را بهروزرسانی کنید:
- User Agents: میتوانید تنظیمات مربوط به User Agents را تغییر دهید.
- ویرایش دستورالعملها: با افزودن محرکها و پاسخهای خاص، دستورالعملها را ویرایش کنید تا نیازهای شما را بهتر برآورده کنند.
اگر تمایل دارید، میتوانید به بخش کدنویسی Worker خود بروید و خط const userAgents را اضافه کنید تا User Agentهای سفارشی به لیست اضافه شوند.

اکنون میتوانید به عامل GPT سفارشی خود بروید و به سادگی URL صفحهای که میخواهید اسکن شود را مشخص کنید. انجام این کار با پرسیدن عباراتی شبیه به “Change the URL to THEDESIREDURL” آسان است و عامل شما خلاصه نتایج را ارائه خواهد داد.
خلاصه
این عامل GPT سفارشی تنها یک نمونه از چگونگی ترکیب قدرت ChatGPT با Cloudflare Workers برای سادهسازی وظایف اصلی سئو است.
با این عامل آزمایش کنید و آن را مطابق با نیازهای خاص خود تغییر دهید.
هوش مصنوعی ظرفیت بالایی برای کمک به انجام بسیاری از وظایف دارد و این روند رو به رشد است. بنابراین، پذیرش این فناوری به عنوان یک دستیار و ابزار مؤثر، فرصتهای جدیدی را برای کمک به متخصصان سئو در مقیاس وسیعتر فراهم میکند.