seogeo 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- seogeo-0.2.0/LICENSE +21 -0
- seogeo-0.2.0/PKG-INFO +453 -0
- seogeo-0.2.0/README.md +405 -0
- seogeo-0.2.0/pyproject.toml +88 -0
- seogeo-0.2.0/seogeo/__init__.py +3 -0
- seogeo-0.2.0/seogeo/aibots.py +59 -0
- seogeo-0.2.0/seogeo/batch.py +116 -0
- seogeo-0.2.0/seogeo/brief.py +226 -0
- seogeo-0.2.0/seogeo/checks/__init__.py +6 -0
- seogeo-0.2.0/seogeo/checks/base.py +294 -0
- seogeo-0.2.0/seogeo/checks/geo.py +591 -0
- seogeo-0.2.0/seogeo/checks/performance.py +157 -0
- seogeo-0.2.0/seogeo/checks/technical.py +519 -0
- seogeo-0.2.0/seogeo/checks/traffic.py +218 -0
- seogeo-0.2.0/seogeo/ci.py +136 -0
- seogeo-0.2.0/seogeo/cli.py +889 -0
- seogeo-0.2.0/seogeo/compare.py +80 -0
- seogeo-0.2.0/seogeo/config.py +71 -0
- seogeo-0.2.0/seogeo/crawler.py +169 -0
- seogeo-0.2.0/seogeo/diff.py +68 -0
- seogeo-0.2.0/seogeo/fixes.py +230 -0
- seogeo-0.2.0/seogeo/i18n.py +774 -0
- seogeo-0.2.0/seogeo/integrations/__init__.py +1 -0
- seogeo-0.2.0/seogeo/integrations/ai_visibility.py +284 -0
- seogeo-0.2.0/seogeo/integrations/analytics.py +80 -0
- seogeo-0.2.0/seogeo/integrations/entity.py +129 -0
- seogeo-0.2.0/seogeo/integrations/google_auth.py +96 -0
- seogeo-0.2.0/seogeo/integrations/lighthouse_local.py +86 -0
- seogeo-0.2.0/seogeo/integrations/pagespeed.py +160 -0
- seogeo-0.2.0/seogeo/integrations/rendering.py +145 -0
- seogeo-0.2.0/seogeo/integrations/search_console.py +92 -0
- seogeo-0.2.0/seogeo/integrations/validate.py +205 -0
- seogeo-0.2.0/seogeo/leadgen.py +79 -0
- seogeo-0.2.0/seogeo/logs.py +116 -0
- seogeo-0.2.0/seogeo/mcp.py +149 -0
- seogeo-0.2.0/seogeo/models.py +147 -0
- seogeo-0.2.0/seogeo/notify.py +168 -0
- seogeo-0.2.0/seogeo/parser.py +172 -0
- seogeo-0.2.0/seogeo/pdf.py +93 -0
- seogeo-0.2.0/seogeo/pipeline.py +238 -0
- seogeo-0.2.0/seogeo/plan.py +113 -0
- seogeo-0.2.0/seogeo/report.py +159 -0
- seogeo-0.2.0/seogeo/sitefiles.py +131 -0
- seogeo-0.2.0/seogeo/storage.py +275 -0
- seogeo-0.2.0/seogeo/templates/_panel.html +73 -0
- seogeo-0.2.0/seogeo/templates/_style.css +132 -0
- seogeo-0.2.0/seogeo/templates/api-docs.html +54 -0
- seogeo-0.2.0/seogeo/templates/compare.html +39 -0
- seogeo-0.2.0/seogeo/templates/diff.html +78 -0
- seogeo-0.2.0/seogeo/templates/index.html +151 -0
- seogeo-0.2.0/seogeo/templates/job.html +38 -0
- seogeo-0.2.0/seogeo/templates/lead.html +96 -0
- seogeo-0.2.0/seogeo/templates/login.html +15 -0
- seogeo-0.2.0/seogeo/templates/report.html +354 -0
- seogeo-0.2.0/seogeo/templates/site.html +97 -0
- seogeo-0.2.0/seogeo/urls.py +54 -0
- seogeo-0.2.0/seogeo/web/__init__.py +0 -0
- seogeo-0.2.0/seogeo/web/app.py +860 -0
- seogeo-0.2.0/seogeo.egg-info/PKG-INFO +453 -0
- seogeo-0.2.0/seogeo.egg-info/SOURCES.txt +82 -0
- seogeo-0.2.0/seogeo.egg-info/dependency_links.txt +1 -0
- seogeo-0.2.0/seogeo.egg-info/entry_points.txt +2 -0
- seogeo-0.2.0/seogeo.egg-info/requires.txt +25 -0
- seogeo-0.2.0/seogeo.egg-info/top_level.txt +1 -0
- seogeo-0.2.0/setup.cfg +4 -0
- seogeo-0.2.0/tests/test_ai_visibility.py +241 -0
- seogeo-0.2.0/tests/test_api.py +167 -0
- seogeo-0.2.0/tests/test_checks.py +103 -0
- seogeo-0.2.0/tests/test_content_tools.py +209 -0
- seogeo-0.2.0/tests/test_customers.py +114 -0
- seogeo-0.2.0/tests/test_diff.py +109 -0
- seogeo-0.2.0/tests/test_entity.py +125 -0
- seogeo-0.2.0/tests/test_features.py +215 -0
- seogeo-0.2.0/tests/test_geo.py +138 -0
- seogeo-0.2.0/tests/test_i18n.py +115 -0
- seogeo-0.2.0/tests/test_integrations.py +283 -0
- seogeo-0.2.0/tests/test_leadgen.py +79 -0
- seogeo-0.2.0/tests/test_notify.py +171 -0
- seogeo-0.2.0/tests/test_panel.py +148 -0
- seogeo-0.2.0/tests/test_parser.py +65 -0
- seogeo-0.2.0/tests/test_pdf.py +106 -0
- seogeo-0.2.0/tests/test_pipeline_report.py +199 -0
- seogeo-0.2.0/tests/test_rendering.py +120 -0
- seogeo-0.2.0/tests/test_setup.py +241 -0
seogeo-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Muhsin (mujo5) and seoGeo contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
seogeo-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: seogeo
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: SEO ve GEO (Generative Engine Optimization) denetim aracı
|
|
5
|
+
Author: Muhsin (mujo5)
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/mujo5/seoGeo
|
|
8
|
+
Project-URL: Repository, https://github.com/mujo5/seoGeo
|
|
9
|
+
Project-URL: Issues, https://github.com/mujo5/seoGeo/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/mujo5/seoGeo/releases
|
|
11
|
+
Keywords: seo,geo,aeo,ai-visibility,llms-txt,site-audit,crawler
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: Information Technology
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
|
|
22
|
+
Classifier: Topic :: System :: Monitoring
|
|
23
|
+
Requires-Python: >=3.11
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: httpx>=0.27
|
|
27
|
+
Requires-Dist: beautifulsoup4>=4.12
|
|
28
|
+
Requires-Dist: lxml>=5.0
|
|
29
|
+
Requires-Dist: typer>=0.12
|
|
30
|
+
Requires-Dist: rich>=13.0
|
|
31
|
+
Requires-Dist: jinja2>=3.1
|
|
32
|
+
Provides-Extra: google
|
|
33
|
+
Requires-Dist: google-api-python-client>=2.100; extra == "google"
|
|
34
|
+
Requires-Dist: google-auth>=2.23; extra == "google"
|
|
35
|
+
Requires-Dist: google-auth-oauthlib>=1.1; extra == "google"
|
|
36
|
+
Provides-Extra: web
|
|
37
|
+
Requires-Dist: fastapi>=0.110; extra == "web"
|
|
38
|
+
Requires-Dist: uvicorn>=0.29; extra == "web"
|
|
39
|
+
Requires-Dist: python-multipart>=0.0.9; extra == "web"
|
|
40
|
+
Provides-Extra: dev
|
|
41
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
43
|
+
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
44
|
+
Requires-Dist: mypy>=1.13; extra == "dev"
|
|
45
|
+
Provides-Extra: all
|
|
46
|
+
Requires-Dist: seogeo[google,web]; extra == "all"
|
|
47
|
+
Dynamic: license-file
|
|
48
|
+
|
|
49
|
+
# seoGeo — SEO ve GEO denetim aracı
|
|
50
|
+
|
|
51
|
+
[English](README.en.md) · Türkçe
|
|
52
|
+
|
|
53
|
+
Bir web sitesini tarayıp **teknik SEO** ve **GEO** (Generative Engine Optimization: ChatGPT,
|
|
54
|
+
Perplexity, Claude, Gemini, Google AI Overviews gibi yapay zeka cevap motorlarında görünürlük)
|
|
55
|
+
açısından inceler. Bağlanırsa **PageSpeed Insights**, **Google Search Console** ve **GA4**
|
|
56
|
+
verilerini de ekler. Sonuçta kural tabanlı, önceliklendirilmiş bir aksiyon planı ve HTML rapor üretir.
|
|
57
|
+
|
|
58
|
+
## Kurulum
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python3 -m venv .venv
|
|
62
|
+
.venv/bin/pip install -e '.[all]' # yalnızca tarama/denetim için: pip install -e .
|
|
63
|
+
cp .env.example .env # anahtarları buraya yazın
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Kullanım
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Tam denetim: tarama + (varsa) GSC/GA4/PageSpeed + aksiyon planı + HTML rapor
|
|
70
|
+
.venv/bin/seogeo audit ornek.com -n 100 --html rapor.html -o denetim.json --save
|
|
71
|
+
|
|
72
|
+
# Kayıtlı denetimi yeniden taramadan aç / filtrele
|
|
73
|
+
.venv/bin/seogeo audit -f denetim.json --only geo -s warning --all
|
|
74
|
+
|
|
75
|
+
# İki denetimi karşılaştır: yeni/çözülen sorunlar + skor değişimi
|
|
76
|
+
.venv/bin/seogeo diff -f denetim.json # önceki = geçmişteki son kayıt
|
|
77
|
+
.venv/bin/seogeo diff -f yeni.json -p eski.json # açıkça karşılaştır
|
|
78
|
+
|
|
79
|
+
# Kayıtlı denetimden HTML rapor
|
|
80
|
+
.venv/bin/seogeo report -f denetim.json -o rapor.html
|
|
81
|
+
|
|
82
|
+
# PDF rapor (bilgisayardaki Chrome ile; --html de .pdf uzantısını tanır)
|
|
83
|
+
.venv/bin/seogeo report -f denetim.json -o rapor.pdf
|
|
84
|
+
.venv/bin/seogeo audit ornek.com --html rapor.pdf
|
|
85
|
+
|
|
86
|
+
# Denetimden düzeltme dosyaları: llms.txt, JSON-LD şemaları, meta önerileri
|
|
87
|
+
.venv/bin/seogeo audit ornek.com -o denetim.json && .venv/bin/seogeo fixes -f denetim.json -o fixes/
|
|
88
|
+
|
|
89
|
+
# Rakip karşılaştırma: aynı ölçütlerle yan yana
|
|
90
|
+
.venv/bin/seogeo compare sitem.com rakip.com -n 30
|
|
91
|
+
|
|
92
|
+
# İçerik brief: GSC sorularından yazar dosyası (rakip kıyası opsiyonel)
|
|
93
|
+
.venv/bin/seogeo brief -f denetim.json -c rakip.json -o briefs/
|
|
94
|
+
|
|
95
|
+
# Çok müşteri: sıralı denetim + rapor dosyaları + skor düşüşü bildirimi
|
|
96
|
+
.venv/bin/seogeo batch musteriler.json -o raporlar/
|
|
97
|
+
|
|
98
|
+
# Sunucu loglarında gerçek AI bot trafiği
|
|
99
|
+
.venv/bin/seogeo logs /var/log/nginx/access.log --days 28
|
|
100
|
+
|
|
101
|
+
# CI kapısı: SARIF/JUnit çıktısı + skor eşiği (GitHub Actions örneği aşağıda)
|
|
102
|
+
.venv/bin/seogeo audit ornek.com --format sarif -o denetim.sarif --fail-on warning
|
|
103
|
+
|
|
104
|
+
# Web paneli: denetim başlatma, raporlar, skor geçmişi, zamanlanmış denetim
|
|
105
|
+
.venv/bin/seogeo serve # http://127.0.0.1:8000
|
|
106
|
+
|
|
107
|
+
# MCP sunucusu: Claude'a bağlayın → "sitemin GEO durumu ne?"
|
|
108
|
+
# claude mcp add seogeo -- /yol/.venv/bin/seogeo mcp
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Önemli seçenekler (`seogeo audit --help`):
|
|
112
|
+
|
|
113
|
+
| Seçenek | Açıklama |
|
|
114
|
+
|---|---|
|
|
115
|
+
| `-n`, `-d` | En fazla sayfa ve link derinliği |
|
|
116
|
+
| `--pagespeed N`, `--strategy` | PageSpeed ile ölçülecek sayfa sayısı (0 = kapalı), `mobile`/`desktop` |
|
|
117
|
+
| `--google-credentials`, `--gsc-property`, `--no-gsc` | Search Console bağlantısı |
|
|
118
|
+
| `--ga4-property` | GA4 mülk kimliği |
|
|
119
|
+
| `--inspect N` | GSC URL Denetimi yapılacak sayfa sayısı (günlük kota 2000) |
|
|
120
|
+
| `--no-ai-probe` | Ana sayfayı AI bot kimlikleriyle test etmeyi kapatır |
|
|
121
|
+
| `--ai-visibility N` | AI görünürlük testi: N örnek soru sorulur (ücretli API; bkz. aşağıda) |
|
|
122
|
+
| `--save` | Web panelinin geçmişine kaydeder (`~/.seogeo/audits`) |
|
|
123
|
+
|
|
124
|
+
Periyodik takip için paneldeki **"Zamanlanmış denetim"** formunu kullanabilirsiniz (panel açık
|
|
125
|
+
kaldığı sürece çalışır) ya da `seogeo audit ... --save` komutunu cron ile koşturabilirsiniz;
|
|
126
|
+
panelde site sayfası skorların zaman içindeki değişimini gösterir. İki kayıt arasındaki farkı
|
|
127
|
+
panelde rapor üstündeki **"Öncekiyle farkı"** bağlantısından veya `seogeo diff` ile görürsünüz.
|
|
128
|
+
|
|
129
|
+
## Veri kaynaklarını bağlama
|
|
130
|
+
|
|
131
|
+
PageSpeed, Search Console ve GA4 entegrasyonları **ücretsizdir** ve faturalandırma hesabı /
|
|
132
|
+
kredi kartı gerektirmez (PageSpeed: 25.000 sorgu/gün; Search Console ve GA4 Data API: kota
|
|
133
|
+
dahilinde ücretsiz). Bunların dışındaki **AI görünürlük testi** isteğe bağlıdır ve kendi
|
|
134
|
+
anahtarınızla ücretli bir LLM API'si kullanabilir.
|
|
135
|
+
|
|
136
|
+
### Performans ölçümü (iki seçenek)
|
|
137
|
+
- **Anahtarsız — yerel Lighthouse:** `PAGESPEED_API_KEY` yoksa araç bilgisayarınızdaki Chrome ile
|
|
138
|
+
Lighthouse çalıştırır (Node.js gerekir; ilk kullanımda `npx` resmi `lighthouse` paketini indirir).
|
|
139
|
+
Yalnızca laboratuvar verisi üretir. Zorlamak için: `--psi-engine local`.
|
|
140
|
+
- **PageSpeed Insights API (önerilir):** gerçek kullanıcı Core Web Vitals verisini de getirir.
|
|
141
|
+
Google anahtarsız kullanım kotasını kaldırdı; ücretsiz anahtar gerekir:
|
|
142
|
+
1. [Google Cloud Console](https://console.cloud.google.com/) → yeni proje (faturalandırma gerekmez)
|
|
143
|
+
2. "API'ler ve Hizmetler" → Kitaplık → **PageSpeed Insights API** → Etkinleştir
|
|
144
|
+
3. Kimlik bilgileri → Kimlik bilgisi oluştur → **API anahtarı** → anahtarı yalnızca bu API ile
|
|
145
|
+
sınırlayın → `.env` içinde `PAGESPEED_API_KEY=`
|
|
146
|
+
|
|
147
|
+
Ölçüm sayfa başına ~20-40 sn sürer. Sayfalar trafiğe (GSC/GA4) göre, yoksa ana sayfa ve sığ
|
|
148
|
+
sayfalar arasından seçilir.
|
|
149
|
+
|
|
150
|
+
### Google Search Console ve GA4
|
|
151
|
+
Aynı Cloud projesinde **Google Search Console API** ve **Google Analytics Data API**'yi etkinleştirin.
|
|
152
|
+
Sonra iki yöntemden birini seçin:
|
|
153
|
+
|
|
154
|
+
**A) Servis hesabı (otomasyon / sunucu için önerilir)**
|
|
155
|
+
1. IAM → Servis hesapları → hesap oluştur → Anahtarlar → JSON indir
|
|
156
|
+
2. Search Console → Ayarlar → Kullanıcılar ve izinler → servis hesabının e-postasını ekleyin
|
|
157
|
+
3. GA4 → Yönetici → Mülk erişim yönetimi → aynı e-postayı **Görüntüleyen** olarak ekleyin
|
|
158
|
+
4. `.env`: `SEOGEO_GOOGLE_CREDENTIALS=/yol/servis-hesabi.json`
|
|
159
|
+
|
|
160
|
+
**B) Kendi Google hesabınızla (OAuth)** — not: OAuth izin ekranı "Test" durumundayken Google
|
|
161
|
+
yenileme token'larını 7 günde geçersiz kılar; bu durumda haftada bir `seogeo google-login` gerekir.
|
|
162
|
+
Bu yüzden düzenli kullanım için servis hesabı daha pratiktir.
|
|
163
|
+
1. Kimlik bilgileri → OAuth istemci kimliği → uygulama türü **Masaüstü uygulaması** → JSON indir
|
|
164
|
+
2. `.env`: `SEOGEO_GOOGLE_CREDENTIALS=/yol/client_secret.json`
|
|
165
|
+
3. Bir kez giriş yapın: `.venv/bin/seogeo google-login` (token `~/.seogeo/` altına kaydedilir)
|
|
166
|
+
|
|
167
|
+
GA4 mülk kimliği: GA4 → Yönetici → Mülk ayarları → "Mülk kimliği" → `SEOGEO_GA4_PROPERTY=`
|
|
168
|
+
|
|
169
|
+
### AI görünürlük testi (isteğe bağlı)
|
|
170
|
+
|
|
171
|
+
Teknik GEO sinyallerinin ötesinde, sitenin cevap motorlarında gerçekten anılıp anılmadığını ölçer:
|
|
172
|
+
sayfa başlıklarınızdan örnek sorular üretilir, her soru temiz bir oturumda sorulur ve cevapta
|
|
173
|
+
alan adınız geçip geçmediğine bakılır. Sonuç raporda ve `ai-visibility-low` kuralında görünür.
|
|
174
|
+
|
|
175
|
+
OpenAI uyumlu herhangi bir sohbet API'si çalışır (OpenAI, OpenRouter, yerel sunucu…):
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
SEOGEO_AI_API_KEY=...
|
|
179
|
+
SEOGEO_AI_BASE_URL=https://api.openai.com/v1 # varsayılan
|
|
180
|
+
SEOGEO_AI_MODEL=gpt-4o-mini # varsayılan
|
|
181
|
+
SEOGEO_AI_QUESTIONS=3 # anahtar varken soru sayısı (0: kapalı)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Anahtar tanımlıyken `audit` varsayılan olarak 3 soru sorar; `--ai-visibility 0` ile kapatıp
|
|
185
|
+
`--ai-visibility 5` ile artırabilirsiniz. Test, API anahtarınız olan bir servise soru başına
|
|
186
|
+
istek atar; maliyeti sağlayıcınız belirler.
|
|
187
|
+
|
|
188
|
+
**İkinci motor — Perplexity (gerçek alıntı):** `PERPLEXITY_API_KEY` tanımlarsanız her soru
|
|
189
|
+
iki motora sorulur. Perplexity, cevapta **hangi URL'lerin alıntılandığını** birebir
|
|
190
|
+
döndürür — raporda soru başına motor çipleri ve "alıntı ↗" bağlantıları görünür, kart
|
|
191
|
+
üstünde motor başına görünürlük yüzdesi listelenir.
|
|
192
|
+
|
|
193
|
+
### Skor düşüşü bildirimleri (isteğe bağlı)
|
|
194
|
+
|
|
195
|
+
Denetim kaydedilirken önceki kayıtla karşılaştırılır; bir alan skoru eşiği kadar düşerse
|
|
196
|
+
webhook'a JSON gönderilir ve/veya e-posta gider:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
SEOGEO_NOTIFY_WEBHOOK=https://hooks.sirket.com/seogeo # Slack/Discord/genel webhook
|
|
200
|
+
SEOGEO_NOTIFY_EMAIL=duyru@example.com # virgülle birden çok
|
|
201
|
+
SEOGEO_NOTIFY_SCORE_DROP=5 # bildirim eşiği (puan)
|
|
202
|
+
|
|
203
|
+
# E-posta için SMTP (port 465: SSL, 587: STARTTLS)
|
|
204
|
+
SEOGEO_SMTP_HOST=smtp.example.com
|
|
205
|
+
SEOGEO_SMTP_USER=... SEOGEO_SMTP_PASS=... SEOGEO_SMTP_FROM=...
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
CLI'da `audit --save --notify`, panelde zamanlanmış denetimler otomatik bildirim yapar.
|
|
209
|
+
Eşik aşılmadıysa hiçbir şey gönderilmez.
|
|
210
|
+
|
|
211
|
+
### PDF raporu
|
|
212
|
+
|
|
213
|
+
`--html` çıktısı `.pdf` ile bitince rapor, bilgisayarınızdaki Chrome/Chromium ile PDF'e
|
|
214
|
+
çevrilir (ek bağımlılık yok; Lighthouse'un kullandığı Chrome bulunur). Chrome yolu
|
|
215
|
+
standart konumlardan değilse `SEOGEO_CHROME=/yol/chrome` ile verin. Panelde rapor üstünde
|
|
216
|
+
"PDF indir" bağlantısı da aynı yöntemi kullanır.
|
|
217
|
+
|
|
218
|
+
### Varlık (entity) denetimi
|
|
219
|
+
|
|
220
|
+
Marka, bilgi grafiğinde var mı? Her denetimde marka adı çıkarılıp (kurum şeması > başlık >
|
|
221
|
+
host) Wikidata ve Vikipedi'de aranır; iki kaynakta da yoksa `entity-web-missing` bilgisi
|
|
222
|
+
üretir. Kapatmak için `--no-entity-probe` veya `SEOGEO_ENTITY_PROBE=0`.
|
|
223
|
+
|
|
224
|
+
### Render denetimi (diferansiyel)
|
|
225
|
+
|
|
226
|
+
AI tarayıcıları JS çalıştırmaz; Google çalıştırır. Chrome varsa ana sayfa + ilk içerik
|
|
227
|
+
sayfaları headless render edilir ve ham HTML ile karşılaştırılır:
|
|
228
|
+
|
|
229
|
+
- `js-render-empty` (kritik): ham HTML'de anlamlı metin yok — AI botlar sayfayı boş görüyor
|
|
230
|
+
- `js-render-gap` (uyarı): render edilmiş DOM belirgin şekilde daha zengin — ana içerik JS'e bağımlı
|
|
231
|
+
|
|
232
|
+
Raporda sayfa sayfa "ham kelime vs render kelime" tablosu çıkar. Kapatmak için
|
|
233
|
+
`--no-render-probe` veya `SEOGEO_RENDER_PROBE=0`; Chrome yolu için `SEOGEO_CHROME`,
|
|
234
|
+
sayfa başına JS bekleme süresi için `SEOGEO_RENDER_WAIT` (ms).
|
|
235
|
+
|
|
236
|
+
### Düzeltme üreteci
|
|
237
|
+
|
|
238
|
+
`seogeo fixes -f denetim.json -o fixes/` denetimden uygulanabilir dosyalar üretir:
|
|
239
|
+
**llms.txt** (tarama verisinden), eksik **Organization/Article/FAQPage JSON-LD** taslakları
|
|
240
|
+
(veriyle doldurulur, kalanlar yer tutucu) ve **meta-onerileri.md** (uzun/kısa/eksik title
|
|
241
|
+
ve description için sayfa sayfa somut öneriler). Yer tutucuları doldurup uygulayın.
|
|
242
|
+
|
|
243
|
+
### Rakip karşılaştırma
|
|
244
|
+
|
|
245
|
+
`seogeo compare sitem.com rakip.com -n 30` aynı kural motoruyla birden çok siteyi tarayıp
|
|
246
|
+
yan yana tablo verir: skorlar, AI bot engelleri, llms.txt, kurum şeması, şemasız sayfa %,
|
|
247
|
+
soru başlığı olmayan sayfa %. Panelde `/compare` sayfası kayıtlı sitelerin son durumunu
|
|
248
|
+
listeler.
|
|
249
|
+
|
|
250
|
+
### CI kapısı (SARIF / JUnit / GitHub Actions)
|
|
251
|
+
|
|
252
|
+
```yaml
|
|
253
|
+
# .github/workflows/geo.yml
|
|
254
|
+
- run: pip install -e '.[all,dev]'
|
|
255
|
+
- run: seogeo audit example.com -n 100 --format sarif -o denetim.sarif --fail-on warning
|
|
256
|
+
- uses: github/codeql-action/upload-sarif@v3 # isteğe bağlı: SARIF'i Security sekmesine yükle
|
|
257
|
+
with: { sarif_file: denetim.sarif }
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
`--fail-on critical|warning` bu önemde sorun varsa, `--fail-under 60` herhangi bir alan
|
|
261
|
+
skoru düşükse komut 1 ile çıkar; `--format junit` Jenkins/GitLab'a, `--format github`
|
|
262
|
+
Actions günlüğüne `::error`/`::warning` satırları yazar.
|
|
263
|
+
|
|
264
|
+
### MCP sunucusu
|
|
265
|
+
|
|
266
|
+
`seogeo mcp` stdio üzerinden MCP konuşur; Claude gibi istemcilere üç araç verir:
|
|
267
|
+
`run_audit` (hızlı denetim), `list_audits`, `get_audit`. Kurulum:
|
|
268
|
+
`claude mcp add seogeo -- /yol/.venv/bin/seogeo mcp` → "sitemin GEO durumu ne, en üst
|
|
269
|
+
aksiyon ne?" sorularını doğrudan asistana sorabilirsiniz.
|
|
270
|
+
|
|
271
|
+
### Çok dil desteği (i18n)
|
|
272
|
+
|
|
273
|
+
`SEOGEO_LANG=en` ile tüm kural başlıkları, çözüm önerileri, kategoriler, önem etiketleri,
|
|
274
|
+
CLI durum/ilerleme mesajları ve rapor başlıkları İngilizce üretilir (103 kuralın tamamı
|
|
275
|
+
çevrilidir); varsayılan Türkçe'dir. Panel şablonları bu sürümde Türkçe kalır.
|
|
276
|
+
|
|
277
|
+
### Depolama: SQLite (ajans ölçeği)
|
|
278
|
+
|
|
279
|
+
Onlarca müşteri × haftalık denetimlerde JSON dosyaları yerine tek veritabanı:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
SEOGEO_STORAGE=sqlite # geçmiş ~/.seogeo/seogeo.db dosyasına yazılır
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
API/panel/diff/tüm komutlar aynı şekilde çalışır; JSON indirme ucu her iki modda da
|
|
286
|
+
aynı biçimi döndürür.
|
|
287
|
+
|
|
288
|
+
### Ajans modu (white-label)
|
|
289
|
+
|
|
290
|
+
Raporlarda "seoGeo" yerine kendi markanız: `SEOGEO_REPORT_BRAND=Ajans Adı`, alt nota
|
|
291
|
+
ek metin: `SEOGEO_REPORT_FOOTER=...`. HTML ve PDF çıktıları bunu kullanır.
|
|
292
|
+
|
|
293
|
+
### Lead magnet API (başka sistemle entegrasyon)
|
|
294
|
+
|
|
295
|
+
Panelde `/lead` sayfası ve programatik uç nokta: potansiyel müşterinin sitesine **10 sayfalık
|
|
296
|
+
hızlı denetim** (~40 sn) attırıp satışa hazır özet alın — harf notu, skorlar, ilk 3 hızlı
|
|
297
|
+
kazanç ve tek cümlelik değerlendirme:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
curl -s http://localhost:8000/api/lead-audit \
|
|
301
|
+
-H 'Content-Type: application/json' \
|
|
302
|
+
-d '{"url": "musteri.com", "max_pages": 10}'
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
```json
|
|
306
|
+
{
|
|
307
|
+
"url": "https://musteri.com/", "host": "musteri.com", "grade": "C",
|
|
308
|
+
"scores": {"seo": 72, "geo": 41, "perf": null, "traffic": null},
|
|
309
|
+
"critical": 2, "warning": 11, "pages": 10,
|
|
310
|
+
"quick_wins": [{"title": "llms.txt yok", "effort": "Düşük", "affected": "site geneli",
|
|
311
|
+
"recommendation": "llms.txt, sitenin özetini…"}],
|
|
312
|
+
"ai_bots": {"allowed": 9, "blocked": 4, "total": 13},
|
|
313
|
+
"summary": "Siteniz teknik SEO'da iyileştirmeye açık (72/100) ama AI cevap motorlarında …",
|
|
314
|
+
"audit_id": "musteri.com_20261006-…", "report_url": "/audits/musteri.com_20261006-…"
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
- `GET /api/lead-audit?url=…` varyantı no-code araçlar için; `save: false` ile geçmişi işgal etmez
|
|
319
|
+
- `SEOGEO_API_TOKEN` tanımlarsanız uç nokta `X-Api-Token` başlığı ister
|
|
320
|
+
- Eşzamanlı denetim 2 ile sınırlı, sayfa sayısı 5–25 aralığına sıkıştırılır
|
|
321
|
+
- `/lead` sayfası form + sonuç kartı biçiminde hazır landing demosudur; kendi
|
|
322
|
+
landing sayfanıza `POST /api/lead-audit` çağrısıyla gömebilirsiniz
|
|
323
|
+
|
|
324
|
+
Ayrıca CLI'ı subprocess ile çalıştırıp `--format json` çıktısını kendi sisteminizde
|
|
325
|
+
işleyebilir, skor düşüşü webhook'larını CRM'inize bağlayabilirsiniz.
|
|
326
|
+
|
|
327
|
+
### REST API
|
|
328
|
+
|
|
329
|
+
Panelin tüm işlevleri JSON uç noktalarıyla da vardır (panelde `/api-docs` sayfası):
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
GET /api/audits?host=&limit= kayıtlı denetimler (meta)
|
|
333
|
+
GET /api/audits/{id} skorlar, sayılar, üst aksiyonlar
|
|
334
|
+
POST /api/jobs arka planda denetim başlat → 202 {job_id}
|
|
335
|
+
GET /api/jobs/{id} iş durumu (running|done|error, audit_id)
|
|
336
|
+
GET /api/sites her sitenin son denetim özeti
|
|
337
|
+
GET /api/schedules zamanlanmış denetimler
|
|
338
|
+
POST /api/schedules ekle/güncelle {"url", "interval_hours", ...}
|
|
339
|
+
DELETE /api/schedules/{id} sil
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Tümü `SEOGEO_API_TOKEN` tanımlıysa `X-Api-Token` başlığı ister (panel token'ından ayrıdır).
|
|
343
|
+
|
|
344
|
+
### AI görünürlük geçmişi
|
|
345
|
+
|
|
346
|
+
`--ai-visibility` ile çalıştırılan her denetim, soru bazlı alıntılanma sonucunu saklar.
|
|
347
|
+
Site geçmişi sayfasında soru × tarih matrisi (✓/✗) ve kolon başına görünürlük yüzdesi
|
|
348
|
+
gösterilir — müşteriye "3 ayda ş sorunlarında alıntılanmaya başladık" diyebileceğiniz
|
|
349
|
+
kanıt grafiği budur.
|
|
350
|
+
|
|
351
|
+
## Neler denetleniyor?
|
|
352
|
+
|
|
353
|
+
Skorlar dört alanda ayrı ayrı hesaplanır. Dış veriye dayanan alanlar ancak o veri bağlıysa puanlanır.
|
|
354
|
+
|
|
355
|
+
| Alan | Kapsam |
|
|
356
|
+
|---|---|
|
|
357
|
+
| **SEO** | Durum kodları, yönlendirme zincirleri, kırık iç linkler, noindex/canonical, title/description (eksik, uzun, kopya), H1 ve başlık hiyerarşisi, ince/kopya içerik, görsel alt/boyut, hreflang, robots.txt, sitemap tutarlılığı, yetim sayfalar, HTTPS, URL yapısı |
|
|
358
|
+
| **GEO** | AI botlarının robots.txt erişimi (arama ve eğitim botları ayrı), CDN/WAF engeli (bot kimliğiyle gerçek istek), bot doğrulama sayfaları, JS'e bağımlı içerik, nosnippet, llms.txt, schema.org (Organization+sameAs, Article, Product, FAQ, Breadcrumb), E-E-A-T (yazar, tarih, güncellik, hakkımızda/iletişim/KVKK), alıntılanabilirlik (soru başlıkları, kısa cevap paragrafı, liste/tablo, istatistik, kaynak, bölümleme), soru sorgularına cevap fırsatı (GSC), AI asistanlarından gelen trafik (GA4), örnek sorularla AI görünürlük testi (anahtar tanımlıysa) |
|
|
359
|
+
| **Performans** | Core Web Vitals saha verisi (LCP, INP, CLS; p75), saha verisi yoksa laboratuvar ölçümü, Lighthouse skorları, tasarruf miktarına göre iyileştirme fırsatları |
|
|
360
|
+
| **Arama Performansı** | Pozisyona göre düşük CTR, ilk sayfaya yakın (8-20. sıra) sorgular, anahtar kelime yamyamlığı, gösterim almayan sayfalar, URL Denetimi (indekslenmemiş, Google'ın farklı canonical seçmesi), düşük etkileşimli giriş sayfaları, trafik alan hata sayfaları |
|
|
361
|
+
|
|
362
|
+
**Aksiyon planı:** her sorun için `etki = önem × etkilenen sayfaların trafik ağırlığı`,
|
|
363
|
+
`öncelik = etki ÷ efor` hesaplanır. Böylece çok trafik alan sayfalardaki kolay düzeltilebilir
|
|
364
|
+
kritik sorunlar en üste çıkar. Rapor ayrıca "hızlı kazanımlar" ve sayfa bazında yapılacaklar listesi içerir.
|
|
365
|
+
|
|
366
|
+
## Proje yapısı
|
|
367
|
+
|
|
368
|
+
```
|
|
369
|
+
seogeo/
|
|
370
|
+
crawler.py, parser.py, sitefiles.py tarama, HTML ayrıştırma, robots/sitemap/llms.txt, AI bot testi
|
|
371
|
+
aibots.py AI tarayıcı listesi (token, sahibi, amacı)
|
|
372
|
+
checks/ kurallar: technical, geo, performance, traffic (+ base: altyapı/skor)
|
|
373
|
+
integrations/ pagespeed, google_auth, search_console, analytics,
|
|
374
|
+
ai_visibility (GSC sorulu), entity (Wikidata/Vikipedi),
|
|
375
|
+
rendering (ham vs render DOM)
|
|
376
|
+
pipeline.py tarama → varlık → GSC/GA4 → PageSpeed → AI görünürlük → kurallar
|
|
377
|
+
plan.py önceliklendirme
|
|
378
|
+
diff.py iki denetim arasındaki fark
|
|
379
|
+
fixes.py düzeltme dosyaları: llms.txt, JSON-LD, meta önerileri
|
|
380
|
+
compare.py rakip/site karşılaştırma tablosu
|
|
381
|
+
ci.py SARIF / JUnit / GitHub Actions çıktıları + skor kapısı
|
|
382
|
+
mcp.py MCP sunucusu (run_audit, list_audits, get_audit)
|
|
383
|
+
notify.py skor düşüşü bildirimleri (webhook + e-posta)
|
|
384
|
+
pdf.py HTML raporu Chrome ile PDF'e çevirme
|
|
385
|
+
report.py + templates/ HTML rapor ve panel şablonları
|
|
386
|
+
storage.py, web/app.py denetim geçmişi, işler/zamanlama ve FastAPI paneli
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
Yeni kural eklemek için `checks/` altındaki bir modülde `rule(...)` ile tanımlayıp
|
|
390
|
+
`@page_check`, `@content_check` veya `@site_check` ile kontrol fonksiyonu yazmanız yeterli.
|
|
391
|
+
|
|
392
|
+
## Testler
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
.venv/bin/pytest # testler
|
|
396
|
+
.venv/bin/ruff check seogeo tests # lint
|
|
397
|
+
.venv/bin/mypy seogeo # tip kontrolü
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Üçü de CI'da (GitHub Actions, `.github/workflows/ci.yml`) Python 3.11 ve 3.13 için koşar.
|
|
401
|
+
|
|
402
|
+
## Kurulum ve yayınlama
|
|
403
|
+
|
|
404
|
+
### Docker ile kurulum
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
docker compose up -d # http://localhost:8000 (chromium dahil: PDF + render denetimi çalışır)
|
|
408
|
+
docker compose logs -f
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
İmaj otomatik yayınlanır: `ghcr.io/mujo5/seogeo:latest` (main push) ve sürüm tag'lerinde
|
|
412
|
+
sürüm numaralı imaj. Kalıcı veri `seogeo-data` volume'ünde (`/data` = ~/.seogeo karşılığı).
|
|
413
|
+
|
|
414
|
+
### Kurulum sihirbazı
|
|
415
|
+
|
|
416
|
+
Anahtarları elle .env'e yazmak yerine:
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
.venv/bin/seogeo setup # etkileşimli: sorar → canlı doğrular → .env'e yazar
|
|
420
|
+
.venv/bin/seogeo setup --test # mevcut ayarları sormadan canlı doğrular (durum tablosu)
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
Sihirbaz her anahtarı kaydetmeden önce gerçek API çağrısıyla test eder; geçersiz anahtar
|
|
424
|
+
uyarısıyla devam edip etmeme size kalmıştır. PageSpeed anahtarı için:
|
|
425
|
+
Google Cloud Console → yeni proje (faturalandırma gerekmez) → "PageSpeed Insights API"
|
|
426
|
+
etkinleştir → Kimlik bilgileri → API anahtarı. Google (GSC+GA4) için servis hesabı JSON'u
|
|
427
|
+
önerilir (adımlar README'de "Google" bölümünde). AI testi için OpenAI/OpenRouter anahtarı.
|
|
428
|
+
|
|
429
|
+
### Kaynak koddan kurulum yukarıda. PyPI'dan kurulum (yayınladıktan sonra):
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
pip install seogeo # temel tarama/denetim
|
|
433
|
+
pip install 'seogeo[all]' # Google + web paneli dahil
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Yeni sürüm yayınlamak için (Trusted Publishing — PyPI token'ı gerekmez):
|
|
437
|
+
1. pypi.org → hesap → Publishing → pending publisher ekle: `mujo5/seoGeo`, workflow `release.yml`, environment `pypi`, project `seogeo`
|
|
438
|
+
2. `git tag v0.2.1 && git push --tags` → build + PyPI otomatik
|
|
439
|
+
3. Haftalık GEO denetimi: `.github/workflows/geo.yml` (cron/manuel, `--fail-on critical --fail-under 60`)
|
|
440
|
+
|
|
441
|
+
## Sınırlar
|
|
442
|
+
|
|
443
|
+
- JavaScript çalıştırılmaz; sayfa ham HTML'i üzerinden değerlendirilir. Bu, çoğu AI tarayıcısının
|
|
444
|
+
gördüğüyle aynıdır, ancak tamamen JS ile render edilen sitelerde SEO kontrolleri eksik kalır.
|
|
445
|
+
- AI bot erişim testi bot kimliği taklit edilerek yapılır; botları IP ile doğrulayan sistemler
|
|
446
|
+
gerçek botlara farklı davranabilir.
|
|
447
|
+
- Alıntılanabilirlik ve CTR eşikleri sezgiseldir (genel rehberlere dayanır); bu yüzden çoğu
|
|
448
|
+
"bilgi" düzeyindedir ve site bağlamında yorumlanmalıdır.
|
|
449
|
+
- AI görünürlük testi cevapta alan adının geçmesine bakar; cevabın içeriği değil "hatırlanma"
|
|
450
|
+
ölçülür ve tek koşuda rastlantısal değişkenlik olabilir.
|
|
451
|
+
- Web paneli tek kullanıcılı panel güvenliği için tasarlandı: `SEOGEO_PANEL_TOKEN` ile korunur,
|
|
452
|
+
ama yine de yalnızca güvenilir ağlarda çalıştırın. Zamanlanmış denetimler panel açık kaldığı
|
|
453
|
+
sürece çalışır (kalıcı değildir); kesintisiz takip için cron + `audit --save` kullanın.
|