geo-visibility-cli 0.2.1__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.
- geo_visibility_cli-0.2.1/LICENSE +21 -0
- geo_visibility_cli-0.2.1/PKG-INFO +218 -0
- geo_visibility_cli-0.2.1/README.md +189 -0
- geo_visibility_cli-0.2.1/pyproject.toml +59 -0
- geo_visibility_cli-0.2.1/setup.cfg +4 -0
- geo_visibility_cli-0.2.1/src/geo_check/__init__.py +3 -0
- geo_visibility_cli-0.2.1/src/geo_check/analysis.py +358 -0
- geo_visibility_cli-0.2.1/src/geo_check/cli.py +180 -0
- geo_visibility_cli-0.2.1/src/geo_check/dryrun.py +38 -0
- geo_visibility_cli-0.2.1/src/geo_check/history.py +156 -0
- geo_visibility_cli-0.2.1/src/geo_check/html_report.py +177 -0
- geo_visibility_cli-0.2.1/src/geo_check/perplexity.py +84 -0
- geo_visibility_cli-0.2.1/src/geo_check/questions.py +54 -0
- geo_visibility_cli-0.2.1/src/geo_check/report.py +356 -0
- geo_visibility_cli-0.2.1/src/geo_check/robots.py +139 -0
- geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/PKG-INFO +218 -0
- geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/SOURCES.txt +25 -0
- geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/dependency_links.txt +1 -0
- geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/entry_points.txt +2 -0
- geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/requires.txt +3 -0
- geo_visibility_cli-0.2.1/src/geo_visibility_cli.egg-info/top_level.txt +1 -0
- geo_visibility_cli-0.2.1/tests/test_cli_and_client.py +153 -0
- geo_visibility_cli-0.2.1/tests/test_competitors.py +126 -0
- geo_visibility_cli-0.2.1/tests/test_history_html_action.py +282 -0
- geo_visibility_cli-0.2.1/tests/test_questions_analysis.py +47 -0
- geo_visibility_cli-0.2.1/tests/test_report_and_site.py +214 -0
- geo_visibility_cli-0.2.1/tests/test_robots.py +61 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Douglas Gouvea Manoel
|
|
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.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: geo-visibility-cli
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Check how AI answer engines mention your brand (GEO visibility) and whether your site allows AI crawlers.
|
|
5
|
+
Author: Douglas Gouvea
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/DouglasGouvea/geo-visibility-cli
|
|
8
|
+
Project-URL: Repository, https://github.com/DouglasGouvea/geo-visibility-cli
|
|
9
|
+
Project-URL: Issues, https://github.com/DouglasGouvea/geo-visibility-cli/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/DouglasGouvea/geo-visibility-cli/blob/main/CHANGELOG.md
|
|
11
|
+
Keywords: geo,generative-engine-optimization,ai-visibility,ai-search,perplexity,robots.txt,ai-crawlers,local-seo,cli
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Topic :: Internet
|
|
22
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Provides-Extra: test
|
|
27
|
+
Requires-Dist: pytest; extra == "test"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
# geo-visibility-cli
|
|
31
|
+
|
|
32
|
+
[](https://github.com/DouglasGouvea/geo-visibility-cli/actions/workflows/ci.yml)
|
|
33
|
+
[](LICENSE)
|
|
34
|
+
[](https://pypi.org/project/geo-visibility-cli/)
|
|
35
|
+
|
|
36
|
+
Check how AI answer engines mention your local business, and whether your site lets AI crawlers in.
|
|
37
|
+
|
|
38
|
+
`geo-check` asks buyer-style questions ("What is the best dentist in Campinas?") through the Perplexity API, several times each, then reports:
|
|
39
|
+
|
|
40
|
+
- how often your brand is mentioned (mention rate),
|
|
41
|
+
- which domains are cited most,
|
|
42
|
+
- candidate competitor names (**heuristic**, always review manually),
|
|
43
|
+
- plain-language takeaways,
|
|
44
|
+
- optionally, which AI crawlers your `robots.txt` allows or blocks (GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, ClaudeBot, Claude-Web, anthropic-ai, Google-Extended, CCBot, Bytespider, Applebot-Extended).
|
|
45
|
+
|
|
46
|
+
Only Perplexity is queried in this version. Results vary between runs; treat them as a sample, not a ranking.
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
From PyPI (once published):
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install geo-visibility-cli
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
From source:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
python3 -m venv .venv
|
|
60
|
+
.venv/bin/pip install -e . pytest
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Requires Python >= 3.10, no runtime dependencies.
|
|
64
|
+
|
|
65
|
+
## Usage
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
export PERPLEXITY_API_KEY="..." # from your Perplexity account; never commit it
|
|
69
|
+
geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --site https://example.com --lang en
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
| Option | Default | Description |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `category`, `city` | required | What you sell and where |
|
|
75
|
+
| `--brand` | required | Brand name (case/accent-insensitive match) |
|
|
76
|
+
| `--site URL` | none | Also check `robots.txt` for AI crawlers |
|
|
77
|
+
| `--lang pt\|en` | auto-detect from the category | Language of questions and report |
|
|
78
|
+
| `--runs N` | `3` | Times each question is asked |
|
|
79
|
+
| `--out DIR` | `./reports` | Where the report files go |
|
|
80
|
+
| `--format md\|html\|json` | `md` | `md`: Markdown + JSON files, report printed to stdout. `html`: single self-contained `.html` (inline CSS, no JavaScript) + JSON, paths printed. `json`: only the `.json` file, also printed to stdout |
|
|
81
|
+
| `--history-dir DIR` | none | Append each run to `DIR` and add a "Changes since last check" section |
|
|
82
|
+
| `--dry-run` | off | Deterministic simulation, no network, no API key |
|
|
83
|
+
| `--version` | | Print the version and exit |
|
|
84
|
+
|
|
85
|
+
The Markdown report is printed to stdout and the JSON path is printed at the end.
|
|
86
|
+
|
|
87
|
+
### History and changes
|
|
88
|
+
|
|
89
|
+
With `--history-dir geo-history`, every run writes a timestamped JSON record (brand, category, city, timestamp, mention rate, cited domains, competitors) to that folder. When an earlier run exists for the same brand/category/city, the report gets a **Changes since last check** section: mention-rate change in points, new/lost cited domains, new/lost competitor candidates. The HTML report also draws a bar chart of the mention rate over time. Works with `--dry-run` too.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --history-dir geo-history --format html
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Try it without a key:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --dry-run
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Real example output
|
|
102
|
+
|
|
103
|
+
_Real run, November 2026._ Query: category `dentista`, city `Campinas`, brand `OdontoCompany`.
|
|
104
|
+
|
|
105
|
+
| Metric | Result |
|
|
106
|
+
|---|---|
|
|
107
|
+
| Answers collected | 15 |
|
|
108
|
+
| Mention rate | **0%** (0/15) |
|
|
109
|
+
|
|
110
|
+
Top cited domains:
|
|
111
|
+
|
|
112
|
+
| Domain | Citations |
|
|
113
|
+
|---|---|
|
|
114
|
+
| doctoralia.com.br | 96 |
|
|
115
|
+
| dentmap.com.br | 12 |
|
|
116
|
+
| acheioprofissional.com.br | 9 |
|
|
117
|
+
|
|
118
|
+
AI-recommended competitors (candidates, heuristic): Dra. Júlia Jacob, Dr. Sérgio Moura Guimarães, Dr. Guilherme Garcia.
|
|
119
|
+
|
|
120
|
+
Takeaway (as printed by the report, in Portuguese):
|
|
121
|
+
|
|
122
|
+
> **Invisível para a IA.** Nenhuma das 15 respostas citou OdontoCompany. Hoje, quem pergunta à IA por dentista em Campinas não é direcionado a você.
|
|
123
|
+
|
|
124
|
+
In short: the brand never appeared, and the AI answers lean heavily on one directory (doctoralia.com.br). A complete profile with recent reviews there is the first thing to fix.
|
|
125
|
+
|
|
126
|
+
> Competitor names come from a heuristic over the answer text. They can include false positives and miss real competitors; check them by hand before acting on them.
|
|
127
|
+
|
|
128
|
+
## GitHub Action
|
|
129
|
+
|
|
130
|
+
Run it on a schedule and keep the report as a build artifact:
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
name: Weekly GEO check
|
|
134
|
+
|
|
135
|
+
on:
|
|
136
|
+
schedule:
|
|
137
|
+
- cron: "0 9 * * 1" # every Monday, 09:00 UTC
|
|
138
|
+
workflow_dispatch:
|
|
139
|
+
|
|
140
|
+
jobs:
|
|
141
|
+
geo-check:
|
|
142
|
+
runs-on: ubuntu-latest
|
|
143
|
+
steps:
|
|
144
|
+
- uses: DouglasGouvea/geo-visibility-cli@main
|
|
145
|
+
with:
|
|
146
|
+
category: dentist
|
|
147
|
+
city: Campinas
|
|
148
|
+
brand: Clinica Exemplo
|
|
149
|
+
site: https://example.com
|
|
150
|
+
dry-run: "false"
|
|
151
|
+
env:
|
|
152
|
+
PERPLEXITY_API_KEY: ${{ secrets.PERPLEXITY_API_KEY }}
|
|
153
|
+
- uses: actions/upload-artifact@v4
|
|
154
|
+
with:
|
|
155
|
+
name: geo-report
|
|
156
|
+
path: reports/
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Store the key as a repository secret (`PERPLEXITY_API_KEY`); it is read from the environment only. The action writes the report files to `./reports`, which the last step uploads.
|
|
160
|
+
|
|
161
|
+
| Input | Default | Description |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| `category`, `city`, `brand` | required | Same as the CLI |
|
|
164
|
+
| `site` | none | Check `robots.txt` for AI crawlers |
|
|
165
|
+
| `lang` | auto-detect | `pt` or `en` |
|
|
166
|
+
| `runs` | `3` | Runs per question |
|
|
167
|
+
| `history-dir` | none | Enables history and the "changes since last check" section |
|
|
168
|
+
| `format` | `md` | `md`, `html` or `json` |
|
|
169
|
+
| `dry-run` | `false` | Simulate without network or API key |
|
|
170
|
+
|
|
171
|
+
[`examples/weekly.yml`](examples/weekly.yml) is a ready-to-copy workflow: weekly cron plus manual trigger, `history-dir: geo-history`, `format: html`, and a final step that commits `geo-history/` and the latest report back to the repository (only when something changed). It needs `permissions: contents: write`.
|
|
172
|
+
|
|
173
|
+
## Tests
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
.venv/bin/python3 -m pytest -q
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
No test touches the network.
|
|
180
|
+
|
|
181
|
+
## Em português
|
|
182
|
+
|
|
183
|
+
`geo-check` mostra se a sua empresa aparece quando alguém pergunta a uma IA (hoje, a Perplexity) por um serviço na sua cidade, por exemplo "Qual o melhor dentista em Campinas?". Ele repete cada pergunta várias vezes e entrega:
|
|
184
|
+
|
|
185
|
+
- a **taxa de menção** da sua marca,
|
|
186
|
+
- os **domínios mais citados** pela IA (onde vale ter perfil e avaliações),
|
|
187
|
+
- **possíveis concorrentes** (heurística: confira manualmente),
|
|
188
|
+
- um resumo em linguagem simples do que isso significa,
|
|
189
|
+
- com `--site`, quais robôs de IA o seu `robots.txt` permite ou bloqueia.
|
|
190
|
+
|
|
191
|
+
Como usar:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
pip install geo-visibility-cli # ou: pip install -e . dentro do repositório
|
|
195
|
+
export PERPLEXITY_API_KEY="..." # sua chave da Perplexity; nunca versione
|
|
196
|
+
geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --site https://exemplo.com.br
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- `--lang pt|en`: idioma das perguntas e do relatório (padrão: detectado pela categoria).
|
|
200
|
+
- `--runs N`: quantas vezes cada pergunta é feita (padrão 3).
|
|
201
|
+
- `--out DIR`: pasta dos arquivos do relatório (padrão `./reports`).
|
|
202
|
+
- `--format md|html|json`: formato do relatório (padrão `md`). `html` gera um único arquivo autônomo (CSS embutido, sem JavaScript); `json` grava só o `.json`.
|
|
203
|
+
- `--history-dir DIR`: guarda cada execução em `DIR` e acrescenta ao relatório a seção "Mudanças desde a última checagem" (variação da taxa de menção em pontos, domínios e concorrentes novos/perdidos) quando já existe uma execução anterior da mesma marca/categoria/cidade. No HTML, aparece também um gráfico de barras da taxa de menção ao longo do tempo. Funciona com `--dry-run`.
|
|
204
|
+
- `--dry-run`: simula tudo, sem rede e sem chave. Bom para testar.
|
|
205
|
+
- O relatório em Markdown vai para a saída padrão.
|
|
206
|
+
- GitHub Action: além de `category`, `city`, `brand`, `site` e `dry-run`, aceita `lang`, `runs`, `history-dir` e `format`. O exemplo [`examples/weekly.yml`](examples/weekly.yml) roda toda semana e grava o histórico (`geo-history/`) e o último relatório de volta no repositório.
|
|
207
|
+
- Só a Perplexity é consultada nesta versão. Os resultados variam entre execuções: é uma amostra, não um ranking.
|
|
208
|
+
|
|
209
|
+
Exemplo real (novembro de 2026): dentista em Campinas, marca OdontoCompany, 15 respostas, 0% de menção; a IA cita sobretudo doctoralia.com.br (96 citações). Veja a seção "Real example output".
|
|
210
|
+
|
|
211
|
+
## Full audit / Auditoria completa
|
|
212
|
+
|
|
213
|
+
- Full audit (ChatGPT, Gemini, Perplexity): https://www.fiverr.com/dougmanoel/audit-how-chatgpt-gemini-and-perplexity-mention-your-business
|
|
214
|
+
- Free checker: https://geo-visibility-check.vercel.app
|
|
215
|
+
|
|
216
|
+
## License
|
|
217
|
+
|
|
218
|
+
MIT, see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# geo-visibility-cli
|
|
2
|
+
|
|
3
|
+
[](https://github.com/DouglasGouvea/geo-visibility-cli/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://pypi.org/project/geo-visibility-cli/)
|
|
6
|
+
|
|
7
|
+
Check how AI answer engines mention your local business, and whether your site lets AI crawlers in.
|
|
8
|
+
|
|
9
|
+
`geo-check` asks buyer-style questions ("What is the best dentist in Campinas?") through the Perplexity API, several times each, then reports:
|
|
10
|
+
|
|
11
|
+
- how often your brand is mentioned (mention rate),
|
|
12
|
+
- which domains are cited most,
|
|
13
|
+
- candidate competitor names (**heuristic**, always review manually),
|
|
14
|
+
- plain-language takeaways,
|
|
15
|
+
- optionally, which AI crawlers your `robots.txt` allows or blocks (GPTBot, OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, ClaudeBot, Claude-Web, anthropic-ai, Google-Extended, CCBot, Bytespider, Applebot-Extended).
|
|
16
|
+
|
|
17
|
+
Only Perplexity is queried in this version. Results vary between runs; treat them as a sample, not a ranking.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
From PyPI (once published):
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pip install geo-visibility-cli
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
From source:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
python3 -m venv .venv
|
|
31
|
+
.venv/bin/pip install -e . pytest
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Requires Python >= 3.10, no runtime dependencies.
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
export PERPLEXITY_API_KEY="..." # from your Perplexity account; never commit it
|
|
40
|
+
geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --site https://example.com --lang en
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
| Option | Default | Description |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| `category`, `city` | required | What you sell and where |
|
|
46
|
+
| `--brand` | required | Brand name (case/accent-insensitive match) |
|
|
47
|
+
| `--site URL` | none | Also check `robots.txt` for AI crawlers |
|
|
48
|
+
| `--lang pt\|en` | auto-detect from the category | Language of questions and report |
|
|
49
|
+
| `--runs N` | `3` | Times each question is asked |
|
|
50
|
+
| `--out DIR` | `./reports` | Where the report files go |
|
|
51
|
+
| `--format md\|html\|json` | `md` | `md`: Markdown + JSON files, report printed to stdout. `html`: single self-contained `.html` (inline CSS, no JavaScript) + JSON, paths printed. `json`: only the `.json` file, also printed to stdout |
|
|
52
|
+
| `--history-dir DIR` | none | Append each run to `DIR` and add a "Changes since last check" section |
|
|
53
|
+
| `--dry-run` | off | Deterministic simulation, no network, no API key |
|
|
54
|
+
| `--version` | | Print the version and exit |
|
|
55
|
+
|
|
56
|
+
The Markdown report is printed to stdout and the JSON path is printed at the end.
|
|
57
|
+
|
|
58
|
+
### History and changes
|
|
59
|
+
|
|
60
|
+
With `--history-dir geo-history`, every run writes a timestamped JSON record (brand, category, city, timestamp, mention rate, cited domains, competitors) to that folder. When an earlier run exists for the same brand/category/city, the report gets a **Changes since last check** section: mention-rate change in points, new/lost cited domains, new/lost competitor candidates. The HTML report also draws a bar chart of the mention rate over time. Works with `--dry-run` too.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
geo-check "dentist" "Campinas" --brand "Clinica Exemplo" --history-dir geo-history --format html
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Try it without a key:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --dry-run
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Real example output
|
|
73
|
+
|
|
74
|
+
_Real run, November 2026._ Query: category `dentista`, city `Campinas`, brand `OdontoCompany`.
|
|
75
|
+
|
|
76
|
+
| Metric | Result |
|
|
77
|
+
|---|---|
|
|
78
|
+
| Answers collected | 15 |
|
|
79
|
+
| Mention rate | **0%** (0/15) |
|
|
80
|
+
|
|
81
|
+
Top cited domains:
|
|
82
|
+
|
|
83
|
+
| Domain | Citations |
|
|
84
|
+
|---|---|
|
|
85
|
+
| doctoralia.com.br | 96 |
|
|
86
|
+
| dentmap.com.br | 12 |
|
|
87
|
+
| acheioprofissional.com.br | 9 |
|
|
88
|
+
|
|
89
|
+
AI-recommended competitors (candidates, heuristic): Dra. Júlia Jacob, Dr. Sérgio Moura Guimarães, Dr. Guilherme Garcia.
|
|
90
|
+
|
|
91
|
+
Takeaway (as printed by the report, in Portuguese):
|
|
92
|
+
|
|
93
|
+
> **Invisível para a IA.** Nenhuma das 15 respostas citou OdontoCompany. Hoje, quem pergunta à IA por dentista em Campinas não é direcionado a você.
|
|
94
|
+
|
|
95
|
+
In short: the brand never appeared, and the AI answers lean heavily on one directory (doctoralia.com.br). A complete profile with recent reviews there is the first thing to fix.
|
|
96
|
+
|
|
97
|
+
> Competitor names come from a heuristic over the answer text. They can include false positives and miss real competitors; check them by hand before acting on them.
|
|
98
|
+
|
|
99
|
+
## GitHub Action
|
|
100
|
+
|
|
101
|
+
Run it on a schedule and keep the report as a build artifact:
|
|
102
|
+
|
|
103
|
+
```yaml
|
|
104
|
+
name: Weekly GEO check
|
|
105
|
+
|
|
106
|
+
on:
|
|
107
|
+
schedule:
|
|
108
|
+
- cron: "0 9 * * 1" # every Monday, 09:00 UTC
|
|
109
|
+
workflow_dispatch:
|
|
110
|
+
|
|
111
|
+
jobs:
|
|
112
|
+
geo-check:
|
|
113
|
+
runs-on: ubuntu-latest
|
|
114
|
+
steps:
|
|
115
|
+
- uses: DouglasGouvea/geo-visibility-cli@main
|
|
116
|
+
with:
|
|
117
|
+
category: dentist
|
|
118
|
+
city: Campinas
|
|
119
|
+
brand: Clinica Exemplo
|
|
120
|
+
site: https://example.com
|
|
121
|
+
dry-run: "false"
|
|
122
|
+
env:
|
|
123
|
+
PERPLEXITY_API_KEY: ${{ secrets.PERPLEXITY_API_KEY }}
|
|
124
|
+
- uses: actions/upload-artifact@v4
|
|
125
|
+
with:
|
|
126
|
+
name: geo-report
|
|
127
|
+
path: reports/
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Store the key as a repository secret (`PERPLEXITY_API_KEY`); it is read from the environment only. The action writes the report files to `./reports`, which the last step uploads.
|
|
131
|
+
|
|
132
|
+
| Input | Default | Description |
|
|
133
|
+
|---|---|---|
|
|
134
|
+
| `category`, `city`, `brand` | required | Same as the CLI |
|
|
135
|
+
| `site` | none | Check `robots.txt` for AI crawlers |
|
|
136
|
+
| `lang` | auto-detect | `pt` or `en` |
|
|
137
|
+
| `runs` | `3` | Runs per question |
|
|
138
|
+
| `history-dir` | none | Enables history and the "changes since last check" section |
|
|
139
|
+
| `format` | `md` | `md`, `html` or `json` |
|
|
140
|
+
| `dry-run` | `false` | Simulate without network or API key |
|
|
141
|
+
|
|
142
|
+
[`examples/weekly.yml`](examples/weekly.yml) is a ready-to-copy workflow: weekly cron plus manual trigger, `history-dir: geo-history`, `format: html`, and a final step that commits `geo-history/` and the latest report back to the repository (only when something changed). It needs `permissions: contents: write`.
|
|
143
|
+
|
|
144
|
+
## Tests
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
.venv/bin/python3 -m pytest -q
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
No test touches the network.
|
|
151
|
+
|
|
152
|
+
## Em português
|
|
153
|
+
|
|
154
|
+
`geo-check` mostra se a sua empresa aparece quando alguém pergunta a uma IA (hoje, a Perplexity) por um serviço na sua cidade, por exemplo "Qual o melhor dentista em Campinas?". Ele repete cada pergunta várias vezes e entrega:
|
|
155
|
+
|
|
156
|
+
- a **taxa de menção** da sua marca,
|
|
157
|
+
- os **domínios mais citados** pela IA (onde vale ter perfil e avaliações),
|
|
158
|
+
- **possíveis concorrentes** (heurística: confira manualmente),
|
|
159
|
+
- um resumo em linguagem simples do que isso significa,
|
|
160
|
+
- com `--site`, quais robôs de IA o seu `robots.txt` permite ou bloqueia.
|
|
161
|
+
|
|
162
|
+
Como usar:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
pip install geo-visibility-cli # ou: pip install -e . dentro do repositório
|
|
166
|
+
export PERPLEXITY_API_KEY="..." # sua chave da Perplexity; nunca versione
|
|
167
|
+
geo-check "dentista" "Campinas" --brand "Clinica Exemplo" --site https://exemplo.com.br
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
- `--lang pt|en`: idioma das perguntas e do relatório (padrão: detectado pela categoria).
|
|
171
|
+
- `--runs N`: quantas vezes cada pergunta é feita (padrão 3).
|
|
172
|
+
- `--out DIR`: pasta dos arquivos do relatório (padrão `./reports`).
|
|
173
|
+
- `--format md|html|json`: formato do relatório (padrão `md`). `html` gera um único arquivo autônomo (CSS embutido, sem JavaScript); `json` grava só o `.json`.
|
|
174
|
+
- `--history-dir DIR`: guarda cada execução em `DIR` e acrescenta ao relatório a seção "Mudanças desde a última checagem" (variação da taxa de menção em pontos, domínios e concorrentes novos/perdidos) quando já existe uma execução anterior da mesma marca/categoria/cidade. No HTML, aparece também um gráfico de barras da taxa de menção ao longo do tempo. Funciona com `--dry-run`.
|
|
175
|
+
- `--dry-run`: simula tudo, sem rede e sem chave. Bom para testar.
|
|
176
|
+
- O relatório em Markdown vai para a saída padrão.
|
|
177
|
+
- GitHub Action: além de `category`, `city`, `brand`, `site` e `dry-run`, aceita `lang`, `runs`, `history-dir` e `format`. O exemplo [`examples/weekly.yml`](examples/weekly.yml) roda toda semana e grava o histórico (`geo-history/`) e o último relatório de volta no repositório.
|
|
178
|
+
- Só a Perplexity é consultada nesta versão. Os resultados variam entre execuções: é uma amostra, não um ranking.
|
|
179
|
+
|
|
180
|
+
Exemplo real (novembro de 2026): dentista em Campinas, marca OdontoCompany, 15 respostas, 0% de menção; a IA cita sobretudo doctoralia.com.br (96 citações). Veja a seção "Real example output".
|
|
181
|
+
|
|
182
|
+
## Full audit / Auditoria completa
|
|
183
|
+
|
|
184
|
+
- Full audit (ChatGPT, Gemini, Perplexity): https://www.fiverr.com/dougmanoel/audit-how-chatgpt-gemini-and-perplexity-mention-your-business
|
|
185
|
+
- Free checker: https://geo-visibility-check.vercel.app
|
|
186
|
+
|
|
187
|
+
## License
|
|
188
|
+
|
|
189
|
+
MIT, see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "geo-visibility-cli"
|
|
7
|
+
dynamic = ["version"] # single source: geo_check.__version__
|
|
8
|
+
description = "Check how AI answer engines mention your brand (GEO visibility) and whether your site allows AI crawlers."
|
|
9
|
+
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE"]
|
|
13
|
+
authors = [{ name = "Douglas Gouvea" }]
|
|
14
|
+
keywords = [
|
|
15
|
+
"geo",
|
|
16
|
+
"generative-engine-optimization",
|
|
17
|
+
"ai-visibility",
|
|
18
|
+
"ai-search",
|
|
19
|
+
"perplexity",
|
|
20
|
+
"robots.txt",
|
|
21
|
+
"ai-crawlers",
|
|
22
|
+
"local-seo",
|
|
23
|
+
"cli",
|
|
24
|
+
]
|
|
25
|
+
classifiers = [
|
|
26
|
+
"Development Status :: 4 - Beta",
|
|
27
|
+
"Environment :: Console",
|
|
28
|
+
"Intended Audience :: Developers",
|
|
29
|
+
"Operating System :: OS Independent",
|
|
30
|
+
"Programming Language :: Python :: 3",
|
|
31
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
32
|
+
"Programming Language :: Python :: 3.10",
|
|
33
|
+
"Programming Language :: Python :: 3.11",
|
|
34
|
+
"Programming Language :: Python :: 3.12",
|
|
35
|
+
"Topic :: Internet",
|
|
36
|
+
"Topic :: Internet :: WWW/HTTP",
|
|
37
|
+
]
|
|
38
|
+
dependencies = []
|
|
39
|
+
|
|
40
|
+
[project.urls]
|
|
41
|
+
Homepage = "https://github.com/DouglasGouvea/geo-visibility-cli"
|
|
42
|
+
Repository = "https://github.com/DouglasGouvea/geo-visibility-cli"
|
|
43
|
+
Issues = "https://github.com/DouglasGouvea/geo-visibility-cli/issues"
|
|
44
|
+
Changelog = "https://github.com/DouglasGouvea/geo-visibility-cli/blob/main/CHANGELOG.md"
|
|
45
|
+
|
|
46
|
+
[project.optional-dependencies]
|
|
47
|
+
test = ["pytest"]
|
|
48
|
+
|
|
49
|
+
[project.scripts]
|
|
50
|
+
geo-check = "geo_check.cli:main"
|
|
51
|
+
|
|
52
|
+
[tool.setuptools.dynamic]
|
|
53
|
+
version = { attr = "geo_check.__version__" }
|
|
54
|
+
|
|
55
|
+
[tool.setuptools.packages.find]
|
|
56
|
+
where = ["src"]
|
|
57
|
+
|
|
58
|
+
[tool.pytest.ini_options]
|
|
59
|
+
testpaths = ["tests"]
|