Ana sayfa / Yapay zekâ rehberi
Yapay zekâ ile pano, bot ve rapor
VeriApi.Pro'yu Claude, ChatGPT, Cursor ve diğer yapay zekâ asistanlarıyla kullanarak dakikalar içinde pano, bildirim botu ve rapor hazırlayın. Kod yazdırmak için prompt şablonları, asistanın veriyi doğrudan sorgulaması için MCP sunucusu.
Asistanlar neden ilk denemede doğru istek kurar?
- Makine tarafından okunabilir şema: tüm uçlar, parametreleri ve açıklamalarıyla
/v1/openapi.jsonadresinde. Asistana bu adresi verin; uç ve parametre adlarını tahmin etmesi gerekmez. - Tek ve sığ yanıt zarfı: her uç
{"veri", "kaynak", "guncelleme", "bayat"}döner, hata hep{"hata": {"kod", "mesaj"}}. Bir uç için yazılan kod diğerlerinde de çalışır. - Tutarlı Türkçe alan adları ve konum parametreleri:
il,ilce,konum,enlem/boylamher uçta aynı anlamda. - Model için özet:
/llms.txtve/llms-full.txtsohbete eklenebilir.
Asistanlar yine de hata yapabilir: üretilen kodu çalıştırmadan önce okuyun, anahtarınızı sohbete yapıştırmayın
(şablonlarda va_ANAHTARINIZ yer tutucusu ve ortam değişkeni kullanılır).
1. Prompt şablonları
Kopyalayıp asistana yapıştırın; il, eşik, saat gibi ayrıntıları değiştirin. Her şablonun sonunda asistanın şemayı, kimliği, atfı ve önbelleği doğru kurması için ortak bir kurallar bölümü var.
Döviz, deprem ve hava panosu Pano
Tek HTML dosyası + PHP vekil: anahtar sunucuda kalır, ücretsiz paketle çalışır.
Bana tek sayfalık bir pano yaz: index.html (bağımlılıksız, sade CSS, SVG çizgi grafik) ve proxy.php.
Kartlar:
1. Anlık döviz: USD, EUR, GBP — değer ve günlük değişim yüzdesi (GET /v1/doviz?kod=USD,EUR,GBP).
2. Doların son 30 iş günü çizgi grafik (GET /v1/doviz/gecmis?kod=USD&gun=30; gunler yeniden eskiye gelir,
hafta sonu ve tatillerde kur yok). Saatleri Europe/Istanbul saat diliminde göster.
3. Türkiye'deki son M3+ depremler: büyüklük, en yakın il/ilçe, saat (GET /v1/deprem/son?min_buyukluk=3&yurtici=true&limit=8).
4. Düzce'nin anlık havası ve bugünkü namaz vakitleri (GET /v1/hava?il=duzce, GET /v1/namaz?il=duzce).
proxy.php yalnızca bu yolları iletsin, yanıtları dosyada önbelleğe alsın (döviz ve deprem 10 dk, grafik 1 saat,
hava 30 dk, namaz 6 saat), API hata verirse son iyi yanıtı dönsün. Sayfa 10 dakikada bir yenilensin.
Veri kaynağı: VeriApi.Pro (Türkiye veri API'si).
- OpenAPI şeması: https://api.veriapi.pro/v1/openapi.json — uç ve parametre adlarını yalnızca buradan al, uydurma.
- Kısa özet: https://veriapi.pro/llms.txt
- Kimlik: her istekte X-API-Key başlığı. Anahtarı koda yazma, VERIAPI_KEY ortam değişkeninden oku; tarayıcıya gönderme.
- Her istekte anlamlı bir User-Agent başlığı gönder (Python urllib'in varsayılanı engellenebilir).
- Yanıt: {"veri": …, "kaynak": [{"atif": …}], "guncelleme": "…", "bayat": false}; hata: {"hata": {"kod", "mesaj"}}.
- kaynak[].atif metnini verinin altında göster; bayat true ise "gecikmeli" etiketi koy.
- Kota: yanıtları önbelleğe al; aynı veriyi gereğinden sık isteme.
Deprem bildirim botu Bot
Telegram'a yeni M4+ depremleri yazan, cron ile 5 dakikada bir çalışan Python betiği.
Python 3 ile (yalnızca standart kütüphane) bir deprem bildirim betiği yaz; cron ile 5 dakikada bir çalışacak.
- GET /v1/deprem/son?min_buyukluk=4&saat=2&yurtici=true
- Daha önce bildirilen deprem id'lerini bir JSON dosyasında tut, yalnızca yenileri gönder.
- Telegram Bot API ile mesaj at: büyüklük, en_yakin.il / en_yakin.ilce (yoksa bolge), derinlik_km, saat ve atıf.
- TG_TOKEN, TG_CHAT, VERIAPI_KEY ortam değişkenlerinden okunsun.
- Mesajın sonuna "Bu bir erken uyarı değildir" notu ekle.
Veri kaynağı: VeriApi.Pro (Türkiye veri API'si).
- OpenAPI şeması: https://api.veriapi.pro/v1/openapi.json — uç ve parametre adlarını yalnızca buradan al, uydurma.
- Kısa özet: https://veriapi.pro/llms.txt
- Kimlik: her istekte X-API-Key başlığı. Anahtarı koda yazma, VERIAPI_KEY ortam değişkeninden oku; tarayıcıya gönderme.
- Her istekte anlamlı bir User-Agent başlığı gönder (Python urllib'in varsayılanı engellenebilir).
- Yanıt: {"veri": …, "kaynak": [{"atif": …}], "guncelleme": "…", "bayat": false}; hata: {"hata": {"kod", "mesaj"}}.
- kaynak[].atif metnini verinin altında göster; bayat true ise "gecikmeli" etiketi koy.
- Kota: yanıtları önbelleğe al; aynı veriyi gereğinden sık isteme.
İl/ilçe seçmeli namaz vakti widget'ı Widget
Ziyaretçinin il ve ilçe seçtiği, iftara kalan süreyi gösteren site bileşeni.
Siteme gömülecek bir namaz vakti bileşeni yaz (sunucu tarafı PHP + küçük bir JavaScript).
- İl listesi: GET /v1/konumlar/iller; seçilen ilin ilçeleri: GET /v1/konumlar/iller/{il}/ilceler.
- Vakitler: GET /v1/namaz?il=…&ilce=…&gun=1 (imsak, gunes, ogle, ikindi, aksam, yatsi).
- Sıradaki vakte geri sayım göster; Ramazan'da "iftara kalan" başlığı kullan.
- İl/ilçe listesini 1 gün, vakitleri gün sonuna kadar önbelleğe al.
- Altına kaynak atfını yaz (namaz Diyanet yöntemiyle hesaplanır, resmî Diyanet verisi değildir).
Veri kaynağı: VeriApi.Pro (Türkiye veri API'si).
- OpenAPI şeması: https://api.veriapi.pro/v1/openapi.json — uç ve parametre adlarını yalnızca buradan al, uydurma.
- Kısa özet: https://veriapi.pro/llms.txt
- Kimlik: her istekte X-API-Key başlığı. Anahtarı koda yazma, VERIAPI_KEY ortam değişkeninden oku; tarayıcıya gönderme.
- Her istekte anlamlı bir User-Agent başlığı gönder (Python urllib'in varsayılanı engellenebilir).
- Yanıt: {"veri": …, "kaynak": [{"atif": …}], "guncelleme": "…", "bayat": false}; hata: {"hata": {"kod", "mesaj"}}.
- kaynak[].atif metnini verinin altında göster; bayat true ise "gecikmeli" etiketi koy.
- Kota: yanıtları önbelleğe al; aynı veriyi gereğinden sık isteme.
Haftalık akaryakıt raporu Rapor
İllerin benzin / motorin fiyatlarını karşılaştıran Markdown rapor (ücretli paket).
Her pazartesi çalışacak bir Python betiği yaz: İstanbul, Ankara, İzmir ve Düzce için benzin ve motorin
ortalama fiyatlarını, son 7 günün değişimini ve Türkiye ortalamasını Markdown tablo olarak rapor.md'ye yazsın.
- GET /v1/akaryakit?il=…&tur=benzin,motorin&dagitici=false
- GET /v1/akaryakit/gecmis?il=…&gun=7
- GET /v1/akaryakit/turkiye
- Fiyatlar dağıtıcıların EPDK'ya bildirdiği tavsiye fiyatlardır, pompa fiyatı değildir; raporda belirt.
- Bu uçlar ücretli pakette; 403 gelirse anlaşılır bir mesaj yazdır.
Veri kaynağı: VeriApi.Pro (Türkiye veri API'si).
- OpenAPI şeması: https://api.veriapi.pro/v1/openapi.json — uç ve parametre adlarını yalnızca buradan al, uydurma.
- Kısa özet: https://veriapi.pro/llms.txt
- Kimlik: her istekte X-API-Key başlığı. Anahtarı koda yazma, VERIAPI_KEY ortam değişkeninden oku; tarayıcıya gönderme.
- Her istekte anlamlı bir User-Agent başlığı gönder (Python urllib'in varsayılanı engellenebilir).
- Yanıt: {"veri": …, "kaynak": [{"atif": …}], "guncelleme": "…", "bayat": false}; hata: {"hata": {"kod", "mesaj"}}.
- kaynak[].atif metnini verinin altında göster; bayat true ise "gecikmeli" etiketi koy.
- Kota: yanıtları önbelleğe al; aynı veriyi gereğinden sık isteme.
MCP bağlıyken sorulabilecekler Sohbet
MCP sunucusunu bağladıktan sonra asistana doğrudan sorabilirsiniz; kod gerekmez. Kredi ve maaş hesapları ücretli pakette.
- Düzce Akçakoca'da bugün iftar kaçta, yarın imsak kaçta? - Son 24 saatte Türkiye'de 4'ten büyük deprem oldu mu? En yakın ilçeleriyle listele. - Dolar ve euro bugün kaç TL, son 30 günde dolar yüzde kaç arttı? - 2.000.000 TL, 36 ay, aylık %3,2 faizli konut kredisinin taksiti ve toplam maliyeti ne? - 85.000 TL brüt maaşın bu ay netini ve işverene maliyetini hesapla. - Önümüzdeki 3 ayda resmî tatiller hangi günlere denk geliyor, köprü yapılabilecek günler hangileri?
2. MCP sunucusu
MCP (Model Context Protocol) bağlandığında asistan veriyi kendisi sorgular: “Akçakoca'da bugün iftar kaçta?” sorusuna uç adresi yazmadan yanıt verir. Sunucu adresi:
https://api.veriapi.pro/v1/mcp
- Uzak sunucu (Streamable HTTP); kurulum, Node ya da Python gerekmez.
- Kimlik:
X-API-Keybaşlığı ya daAuthorization: Bearer. Başlık giremeyen istemcilerde?anahtar=. - Her araç çağrısı normal bir API isteği gibi kotanızdan düşer; araç listesi ve uç araması düşmez. Ücretli uçlar ücretsiz pakette hata döner.
Terminalde bir kez çalıştırın; tüm projelerde kullanılabilir (--scope user).
claude mcp add --transport http --scope user veriapi https://api.veriapi.pro/v1/mcp \ --header "X-API-Key: va_ANAHTARINIZ"
Ayarlar → Bağlayıcılar → Özel bağlayıcı ekle. Başlık girilemediği için anahtar adreste; bu adresi kimseyle paylaşmayın, sızarsa panelden anahtarı yenileyin.
https://api.veriapi.pro/v1/mcp?anahtar=va_ANAHTARINIZ
~/.cursor/mcp.json (tüm projeler) ya da projede .cursor/mcp.json:
{
"mcpServers": {
"veriapi": {
"url": "https://api.veriapi.pro/v1/mcp",
"headers": { "X-API-Key": "va_ANAHTARINIZ" }
}
}
}
Projede .vscode/mcp.json; anahtar ilk kullanımda sorulur ve VS Code'da gizli saklanır:
{
"inputs": [
{ "type": "promptString", "id": "veriapi-key", "description": "VeriApi.Pro API anahtarı", "password": true }
],
"servers": {
"veriapi": {
"type": "http",
"url": "https://api.veriapi.pro/v1/mcp",
"headers": { "X-API-Key": "${input:veriapi-key}" }
}
}
}
Anahtarınız yok mu? Ücretsiz hesap açın, panelde anahtar oluşturun
ve va_ANAHTARINIZ yerine yazın.
Araçlar (27)
En çok kullanılan uçlar ayrı araç; geri kalan
tüm uçlara uc_ara ve uc_cagir ile ulaşılır.
| Araç | Ne yapar |
|---|---|
| konumlar_iller | 81 il |
| konumlar_iller_il_ilceler | İlin ilçeleri |
| konumlar_bul | Konum çöz (slug, il/ilçe ya da en yakın koordinat) |
| doviz | Döviz kurları (TRY karşılığı; anlık Kapalıçarşı ya da merkez bankası referans) |
| doviz_gecmis | TCMB döviz alış / satış kuru geçmişi (günlük, 5 yıla kadar) |
| cevir_doviz | Döviz çevirici (anlık Kapalıçarşı ya da referans kurla, TRY dahil) |
| altin | Altın fiyatları (alış, satış, değişim) (ücretli) |
| altin_gecmis | Altın fiyat geçmişi (günlük; kaynak bağlanınca dolar) (ücretli) |
| piyasa_fiyat | Anlık fiyatlar (alış, satış, günlük değişim) (ücretli) |
| deprem_son | Son depremler (Türkiye ve çevresi, son 7 gün) |
| namaz | Namaz vakitleri, iftar ve sahur (Diyanet yöntemiyle hesap) |
| takvim_tatiller | Resmî tatiller ve dini bayramlar |
| takvim_gun | Gün bilgisi: hafta numarası, iş günü, tatil |
| hava | Anlık hava, 24 saatlik ve 7 günlük tahmin |
| hava_detay | Ayrıntılı hava: hissedilen, çiy noktası, basınç, görüş, hamle; 16 güne kadar tah (ücretli) |
| akaryakit | İl bazında benzin, motorin, LPG ve diğer yakıtlar (dağıtıcı bazında) (ücretli) |
| akaryakit_turkiye | Türkiye ortalaması (en yüksek hacimli 8 dağıtıcı) (ücretli) |
| akaryakit_gecmis | İlin günlük ortalama fiyat geçmişi (toplama başladığımız günden itibaren) (ücretli) |
| eczane_nobetci | Nöbetçi eczaneler (il, isteğe bağlı ilçe) (ücretli) |
| ekonomi_enflasyon | TÜFE: endeks, aylık, yıllık ve 12 aylık ortalama değişim |
| mevzuat_asgari_ucret | Asgari ücret (brüt, net, günlük) |
| hesapla_kredi | Kredi ödeme planı: aylık taksit, toplam faiz, KKDF, BSMV, yıllık maliyet (ücretli) |
| hesapla_mevduat | Vadeli mevduat getirisi: brüt faiz, stopaj, net getiri (ücretli) |
| vergi_maas | Brütten nete maaş (12 aylık bordro) ya da netten brüte (ücretli) |
| hesapla_kidem | Kıdem tazminatı (tavan, damga vergisi, net) (ücretli) |
| uc_ara | Uç ara |
| uc_cagir | Uç çağır |
3. Çalışan pano kodu
Birinci prompt şablonunun çıktısı bu iki dosyaya benzer; isterseniz doğrudan kullanın. PHP olan
her hostingde çalışır: iki dosyayı aynı klasöre koyun, VERIAPI_KEY ortam değişkenini tanımlayın
(ya da proxy.php'deki getenv satırına anahtarı yazın). Anahtar tarayıcıya hiç gitmez.
- Kartlar: anlık döviz, doların son 30 iş günü (SVG grafik), son M3+ depremler, Düzce'nin havası ve namaz vakitleri.
- Yalnızca ücretsiz paketteki uçlar; vekilin ortak önbelleğiyle günde ~364 istek, ziyaretçi sayısından bağımsız.
- Kaynak atfı her kartın altında;
bayatveri “Gecikmeli” diye işaretlenir.
<!doctype html>
<html lang="tr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Döviz, deprem ve hava panosu</title>
<style>
body { margin: 0; font-family: system-ui, sans-serif; background: #f8fafc; color: #0f172a; }
main { max-width: 1100px; margin: 0 auto; padding: 24px; display: grid; gap: 16px;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.kart { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px; }
h2 { margin: 0 0 12px; font-size: 15px; color: #475569; }
.satir { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0; border-bottom: 1px solid #f1f5f9; }
.artti { color: #15803d; } .azaldi { color: #b91c1c; }
.atif { margin: 10px 0 0; font-size: 11px; color: #94a3b8; }
.bayat { color: #b45309; }
svg { width: 100%; height: 90px; }
</style>
</head>
<body>
<main>
<section class="kart"><h2>Döviz (anlık)</h2><div id="doviz">Yükleniyor…</div><p class="atif" id="doviz-atif"></p></section>
<section class="kart"><h2>Dolar — son 30 iş günü (TCMB)</h2>
<svg id="grafik" viewBox="0 0 300 90" preserveAspectRatio="none" role="img" aria-label="Dolar kuru grafiği"></svg>
<div id="grafik-ozet"></div><p class="atif" id="grafik-atif"></p></section>
<section class="kart"><h2>Son depremler (M3+)</h2><div id="deprem">Yükleniyor…</div><p class="atif" id="deprem-atif"></p></section>
<section class="kart"><h2>Düzce: hava ve namaz vakitleri</h2><div id="sehir">Yükleniyor…</div><p class="atif" id="sehir-atif"></p></section>
</main>
<script>
const api = async (yol, q = {}) => {
const r = await fetch("proxy.php?" + new URLSearchParams({ yol, ...q }));
const j = await r.json();
if (!r.ok) throw new Error(j.hata?.mesaj || r.status);
return j;
};
const sayi = (n, d = 2) => n.toLocaleString("tr-TR", { minimumFractionDigits: d, maximumFractionDigits: d });
const esc = (s) => String(s).replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ })[c]);
const yaz = (id, html) => { document.getElementById(id).innerHTML = html; };
const atif = (id, ...yanitlar) => {
const metin = [...new Set(yanitlar.flatMap((j) => j.kaynak.map((k) => k.atif)))].join(" · ");
const bayat = yanitlar.some((j) => j.bayat) ? '<span class="bayat">Gecikmeli veri · </span>' : "";
yaz(id, bayat + esc(metin));
};
const hata = (id) => (e) => yaz(id, "Veri alınamadı: " + esc(e.message));
async function doviz() {
const j = await api("/v1/doviz", { kod: "USD,EUR,GBP" });
yaz("doviz", j.veri.kurlar.map((k) => `<div class="satir"><span>${esc(k.ad)}</span>
<span>${sayi(k.deger, 4)} ₺ <small class="${k.degisim_yuzde >= 0 ? "artti" : "azaldi"}">%${sayi(k.degisim_yuzde)}</small></span></div>`).join(""));
atif("doviz-atif", j);
}
async function grafik() {
const j = await api("/v1/doviz/gecmis", { kod: "USD", gun: 30 });
const g = j.veri.gunler.slice().reverse(); // API yeniden eskiye verir
const v = g.map((x) => x.satis);
const min = Math.min(...v), max = Math.max(...v), adim = 300 / Math.max(v.length - 1, 1);
const noktalar = v.map((y, i) => `${(i * adim).toFixed(1)},${(84 - ((y - min) / (max - min || 1)) * 78).toFixed(1)}`).join(" ");
yaz("grafik", `<polyline points="${noktalar}" fill="none" stroke="#2563eb" stroke-width="2" vector-effect="non-scaling-stroke"/>`);
const fark = ((v.at(-1) - v[0]) / v[0]) * 100;
yaz("grafik-ozet", `<div class="satir"><span>${g[0].tarih} → ${g.at(-1).tarih}</span>
<span>${sayi(v.at(-1), 4)} ₺ <small class="${fark >= 0 ? "artti" : "azaldi"}">%${sayi(fark)}</small></span></div>`);
atif("grafik-atif", j);
}
async function deprem() {
const j = await api("/v1/deprem/son", { min_buyukluk: 3, yurtici: true, limit: 8 });
const saat = (z) => new Date(z).toLocaleString("tr-TR", { timeZone: "Europe/Istanbul", day: "numeric", month: "short", hour: "2-digit", minute: "2-digit" });
yaz("deprem", j.veri.depremler.map((d) => `<div class="satir">
<span><b>${sayi(d.buyukluk, 1)}</b> ${esc(d.en_yakin ? d.en_yakin.il + " / " + d.en_yakin.ilce : d.bolge)}</span>
<span>${saat(d.zaman)}</span></div>`).join("") || "Kayıt yok");
atif("deprem-atif", j);
}
async function sehir() {
const [h, n] = await Promise.all([api("/v1/hava", { il: "duzce" }), api("/v1/namaz", { il: "duzce" })]);
const a = h.veri.anlik, g = n.veri.gunler[0];
const vakitler = [["İmsak", g.imsak], ["Öğle", g.ogle], ["İkindi", g.ikindi], ["Akşam", g.aksam], ["Yatsı", g.yatsi]];
yaz("sehir", `<div class="satir"><span>${esc(a.durum.ad)}</span><span>${sayi(a.sicaklik, 1)} °C</span></div>
<div class="satir"><span>Nem · rüzgâr</span><span>%${Math.round(a.nem)} · ${Math.round(a.ruzgar_kmh)} km/sa</span></div>`
+ vakitler.map(([ad, saat]) => `<div class="satir"><span>${ad}</span><span>${saat}</span></div>`).join(""));
atif("sehir-atif", h, n);
}
function yenile() {
doviz().catch(hata("doviz"));
grafik().catch(hata("grafik-ozet"));
deprem().catch(hata("deprem"));
sehir().catch(hata("sehir"));
}
yenile();
setInterval(yenile, 10 * 60 * 1000); // vekilin önbelleği zaten 10 dk; daha sık yenilemek kota harcamaz ama boşuna
</script>
</body>
</html>
<?php
// VeriApi.Pro vekili: anahtar sunucuda kalır, yanıtlar dosyada önbelleğe alınır.
// Ücretsiz paket (günde 500 birim) için hesap: döviz 144 + deprem 144 + grafik 24 + hava 48 + namaz 4 = 364 istek/gün,
// sayfayı kaç kişi açarsa açsın değişmez (önbellek ortak).
$KEY = getenv('VERIAPI_KEY');
$IZINLI = [ // yol => önbellek süresi (saniye)
'/v1/doviz' => 600,
'/v1/doviz/gecmis' => 3600,
'/v1/deprem/son' => 600,
'/v1/hava' => 1800,
'/v1/namaz' => 21600,
];
header('Content-Type: application/json; charset=utf-8');
$yol = $_GET['yol'] ?? '';
if (!isset($IZINLI[$yol])) {
http_response_code(400);
exit('{"hata":{"kod":400,"mesaj":"Bu yol vekilde izinli değil"}}');
}
$q = $_GET;
unset($q['yol']);
ksort($q);
$url = 'https://api.veriapi.pro' . $yol . ($q ? '?' . http_build_query($q) : '');
$cache = sys_get_temp_dir() . '/veriapi_' . md5($url) . '.json';
if (is_file($cache) && filemtime($cache) > time() - $IZINLI[$yol]) {
readfile($cache);
exit;
}
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['X-API-Key: ' . $KEY],
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($code === 200) {
file_put_contents($cache, $body, LOCK_EX);
echo $body;
} elseif (is_file($cache)) {
readfile($cache); // API'ye ulaşılamadı: son iyi yanıt
} else {
http_response_code($code ?: 502);
echo $body ?: '{"hata":{"kod":502,"mesaj":"API\'ye ulaşılamadı"}}';
}
4. Zamanlanmış görevler
Sunucunuzda cron ile çalışan küçük betikler (Python 3, yalnızca standart kütüphane) ya da zamanlanmış görev özelliği olan bir asistanda MCP bağlıyken tek prompt.
Yeni M4+ depremleri Telegram'a yazar; günde 288 istek. Deprem verisi olay kayda girdikten sonra gelir, erken uyarı değildir.
#!/usr/bin/env python3
"""Yeni M4+ depremleri Telegram'a yazar. Erken uyarı değildir: deprem olduktan sonra kayda girer.
crontab -e: */5 * * * * VERIAPI_KEY=va_ANAHTARINIZ TG_TOKEN=… TG_CHAT=… /usr/bin/python3 /opt/deprem_bot.py
Kota: 5 dakikada 1 istek = günde 288 birim (ücretsiz paket 500).
"""
import json
import os
import pathlib
import urllib.parse
import urllib.request
API = "https://api.veriapi.pro"
KEY = os.environ["VERIAPI_KEY"]
TG_TOKEN, TG_CHAT = os.environ["TG_TOKEN"], os.environ["TG_CHAT"]
SEEN = pathlib.Path.home() / ".veriapi_deprem.json"
def get(path, **params):
# User-Agent şart: Cloudflare varsayılan "Python-urllib" kimliğini engelliyor (hata 1010)
req = urllib.request.Request(f"{API}{path}?{urllib.parse.urlencode(params)}",
headers={"X-API-Key": KEY, "User-Agent": "veriapi-ornek/1.0"})
with urllib.request.urlopen(req, timeout=15) as r:
return json.load(r)
def telegram(text):
data = urllib.parse.urlencode({"chat_id": TG_CHAT, "text": text}).encode()
urllib.request.urlopen(f"https://api.telegram.org/bot{TG_TOKEN}/sendMessage", data, timeout=15)
seen = set(json.loads(SEEN.read_text())) if SEEN.exists() else set()
yanit = get("/v1/deprem/son", min_buyukluk=4, saat=2, yurtici="true")
for d in reversed(yanit["veri"]["depremler"]): # eskiden yeniye
if d["id"] in seen:
continue
yer = f'{d["en_yakin"]["il"]} / {d["en_yakin"]["ilce"]}' if d["en_yakin"] else d["bolge"]
atif = " · ".join(k["atif"] for k in yanit["kaynak"])
telegram(f'M{d["buyukluk"]} deprem: {yer}, derinlik {d["derinlik_km"]} km, saat {d["zaman"][11:16]}\n{atif}')
seen.add(d["id"])
SEEN.write_text(json.dumps(sorted(seen)[-500:]))
Her sabah döviz, hava ve namaz vakitleri tek mesajda; günde 3 istek.
#!/usr/bin/env python3
"""Sabah özeti: döviz, hava ve namaz vakitleri tek mesajda (Telegram). 3 istek/gün.
crontab -e: 0 8 * * * VERIAPI_KEY=va_ANAHTARINIZ TG_TOKEN=… TG_CHAT=… /usr/bin/python3 /opt/sabah.py
"""
import json
import os
import urllib.parse
import urllib.request
API = "https://api.veriapi.pro"
KEY = os.environ["VERIAPI_KEY"]
IL = os.environ.get("IL", "duzce")
def get(path, **params):
# User-Agent şart: Cloudflare varsayılan "Python-urllib" kimliğini engelliyor (hata 1010)
req = urllib.request.Request(f"{API}{path}?{urllib.parse.urlencode(params)}",
headers={"X-API-Key": KEY, "User-Agent": "veriapi-ornek/1.0"})
with urllib.request.urlopen(req, timeout=15) as r:
return json.load(r)
doviz = get("/v1/doviz", kod="USD,EUR")
hava = get("/v1/hava", il=IL)
namaz = get("/v1/namaz", il=IL)
a, g = hava["veri"]["anlik"], namaz["veri"]["gunler"][0]
satirlar = [f'Günaydın — {hava["veri"]["konum"]["ad"]}, {g["tarih"]}']
satirlar += [f'{k["kod"]}: {k["deger"]:.2f} ₺ ({k["degisim_yuzde"]:+.2f}%)' for k in doviz["veri"]["kurlar"]]
satirlar.append(f'Hava: {a["durum"]["ad"]}, {a["sicaklik"]:.0f} °C')
satirlar.append(f'İmsak {g["imsak"]} · Öğle {g["ogle"]} · Akşam {g["aksam"]} · Yatsı {g["yatsi"]}')
atiflar = {k["atif"] for y in (doviz, hava, namaz) for k in y["kaynak"]}
satirlar.append("\n" + " · ".join(sorted(atiflar)))
data = urllib.parse.urlencode({"chat_id": os.environ["TG_CHAT"], "text": "\n".join(satirlar)}).encode()
urllib.request.urlopen(f'https://api.telegram.org/bot{os.environ["TG_TOKEN"]}/sendMessage', data, timeout=15)
Zamanlanmış görev destekleyen bir asistanda, VeriApi.Pro MCP sunucusu bağlıyken:
Her sabah 08:00'de VeriApi.Pro araçlarıyla şunu hazırla ve bana gönder: - Dolar ve euronun güncel kuru ve dünden değişimi - Düzce'nin bugünkü hava durumu ve namaz vakitleri - Son 24 saatte Türkiye'de 4'ten büyük deprem olduysa listesi Her verinin altına kaynak atfını yaz; "bayat" işaretli veri varsa belirt.
Sonraki adımlar
- Tüm uçlar: hangi verinin olduğuna bakın, şablondaki uçları değiştirin.
- Dokümantasyon: kimlik, kota, hata kodları ve atıf kuralları.
- Paket hesaplayıcı: panonuzun ya da botunuzun günlük kaç birim harcayacağını hesaplayın.