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.
Files changed (84) hide show
  1. seogeo-0.2.0/LICENSE +21 -0
  2. seogeo-0.2.0/PKG-INFO +453 -0
  3. seogeo-0.2.0/README.md +405 -0
  4. seogeo-0.2.0/pyproject.toml +88 -0
  5. seogeo-0.2.0/seogeo/__init__.py +3 -0
  6. seogeo-0.2.0/seogeo/aibots.py +59 -0
  7. seogeo-0.2.0/seogeo/batch.py +116 -0
  8. seogeo-0.2.0/seogeo/brief.py +226 -0
  9. seogeo-0.2.0/seogeo/checks/__init__.py +6 -0
  10. seogeo-0.2.0/seogeo/checks/base.py +294 -0
  11. seogeo-0.2.0/seogeo/checks/geo.py +591 -0
  12. seogeo-0.2.0/seogeo/checks/performance.py +157 -0
  13. seogeo-0.2.0/seogeo/checks/technical.py +519 -0
  14. seogeo-0.2.0/seogeo/checks/traffic.py +218 -0
  15. seogeo-0.2.0/seogeo/ci.py +136 -0
  16. seogeo-0.2.0/seogeo/cli.py +889 -0
  17. seogeo-0.2.0/seogeo/compare.py +80 -0
  18. seogeo-0.2.0/seogeo/config.py +71 -0
  19. seogeo-0.2.0/seogeo/crawler.py +169 -0
  20. seogeo-0.2.0/seogeo/diff.py +68 -0
  21. seogeo-0.2.0/seogeo/fixes.py +230 -0
  22. seogeo-0.2.0/seogeo/i18n.py +774 -0
  23. seogeo-0.2.0/seogeo/integrations/__init__.py +1 -0
  24. seogeo-0.2.0/seogeo/integrations/ai_visibility.py +284 -0
  25. seogeo-0.2.0/seogeo/integrations/analytics.py +80 -0
  26. seogeo-0.2.0/seogeo/integrations/entity.py +129 -0
  27. seogeo-0.2.0/seogeo/integrations/google_auth.py +96 -0
  28. seogeo-0.2.0/seogeo/integrations/lighthouse_local.py +86 -0
  29. seogeo-0.2.0/seogeo/integrations/pagespeed.py +160 -0
  30. seogeo-0.2.0/seogeo/integrations/rendering.py +145 -0
  31. seogeo-0.2.0/seogeo/integrations/search_console.py +92 -0
  32. seogeo-0.2.0/seogeo/integrations/validate.py +205 -0
  33. seogeo-0.2.0/seogeo/leadgen.py +79 -0
  34. seogeo-0.2.0/seogeo/logs.py +116 -0
  35. seogeo-0.2.0/seogeo/mcp.py +149 -0
  36. seogeo-0.2.0/seogeo/models.py +147 -0
  37. seogeo-0.2.0/seogeo/notify.py +168 -0
  38. seogeo-0.2.0/seogeo/parser.py +172 -0
  39. seogeo-0.2.0/seogeo/pdf.py +93 -0
  40. seogeo-0.2.0/seogeo/pipeline.py +238 -0
  41. seogeo-0.2.0/seogeo/plan.py +113 -0
  42. seogeo-0.2.0/seogeo/report.py +159 -0
  43. seogeo-0.2.0/seogeo/sitefiles.py +131 -0
  44. seogeo-0.2.0/seogeo/storage.py +275 -0
  45. seogeo-0.2.0/seogeo/templates/_panel.html +73 -0
  46. seogeo-0.2.0/seogeo/templates/_style.css +132 -0
  47. seogeo-0.2.0/seogeo/templates/api-docs.html +54 -0
  48. seogeo-0.2.0/seogeo/templates/compare.html +39 -0
  49. seogeo-0.2.0/seogeo/templates/diff.html +78 -0
  50. seogeo-0.2.0/seogeo/templates/index.html +151 -0
  51. seogeo-0.2.0/seogeo/templates/job.html +38 -0
  52. seogeo-0.2.0/seogeo/templates/lead.html +96 -0
  53. seogeo-0.2.0/seogeo/templates/login.html +15 -0
  54. seogeo-0.2.0/seogeo/templates/report.html +354 -0
  55. seogeo-0.2.0/seogeo/templates/site.html +97 -0
  56. seogeo-0.2.0/seogeo/urls.py +54 -0
  57. seogeo-0.2.0/seogeo/web/__init__.py +0 -0
  58. seogeo-0.2.0/seogeo/web/app.py +860 -0
  59. seogeo-0.2.0/seogeo.egg-info/PKG-INFO +453 -0
  60. seogeo-0.2.0/seogeo.egg-info/SOURCES.txt +82 -0
  61. seogeo-0.2.0/seogeo.egg-info/dependency_links.txt +1 -0
  62. seogeo-0.2.0/seogeo.egg-info/entry_points.txt +2 -0
  63. seogeo-0.2.0/seogeo.egg-info/requires.txt +25 -0
  64. seogeo-0.2.0/seogeo.egg-info/top_level.txt +1 -0
  65. seogeo-0.2.0/setup.cfg +4 -0
  66. seogeo-0.2.0/tests/test_ai_visibility.py +241 -0
  67. seogeo-0.2.0/tests/test_api.py +167 -0
  68. seogeo-0.2.0/tests/test_checks.py +103 -0
  69. seogeo-0.2.0/tests/test_content_tools.py +209 -0
  70. seogeo-0.2.0/tests/test_customers.py +114 -0
  71. seogeo-0.2.0/tests/test_diff.py +109 -0
  72. seogeo-0.2.0/tests/test_entity.py +125 -0
  73. seogeo-0.2.0/tests/test_features.py +215 -0
  74. seogeo-0.2.0/tests/test_geo.py +138 -0
  75. seogeo-0.2.0/tests/test_i18n.py +115 -0
  76. seogeo-0.2.0/tests/test_integrations.py +283 -0
  77. seogeo-0.2.0/tests/test_leadgen.py +79 -0
  78. seogeo-0.2.0/tests/test_notify.py +171 -0
  79. seogeo-0.2.0/tests/test_panel.py +148 -0
  80. seogeo-0.2.0/tests/test_parser.py +65 -0
  81. seogeo-0.2.0/tests/test_pdf.py +106 -0
  82. seogeo-0.2.0/tests/test_pipeline_report.py +199 -0
  83. seogeo-0.2.0/tests/test_rendering.py +120 -0
  84. 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.