![]() |
|
||||||
| Web Programlama Bir web programlama dili ve veritabanı ile dinamik içerikli web siteleri yapmayı amaçlar. |
| ||
|
|
LinkBack | Seçenekler | Stil |
|
|
#1 |
|
Çevrimiçi
|
Otomatik Haber Botu — vBulletin Entegrasyonu
![]() Otomatik Haber Botu — vBulletin Entegrasyonu RSS Çekme · Görsel İşleme · Yeniden Yazma · Otomatik Paylaşım PHP 8.2+ · MySQL · Cron Job · 2026 Güncel ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ SİSTEM NELER YAPIYOR? Bu sistem belirlediginiz RSS kaynaklarini otomatik olarak tarar, haberlerin gorsellerini indirir ve isler, icerigi kendi cumlelerinizle yeniden yazar, duplikatlari eler ve forum hesabinizdan ozgun bir konu olarak paylaşir. Hicbir manuel mudahale gerekmez. Kod:
sitem.com/
└── bot/
├── config.php ← API anahtarlari, DB, RSS listesi
├── newsbot.php ← Ana calisma dosyasi (cron buraya bakar)
├── rss_parser.php ← RSS/Atom feed okuyucu
├── rewriter.php ← Icerik yeniden yazici
├── image_handler.php ← Gorsel indirme, yeniden boyutlandirma
├── vb_poster.php ← vBulletin API / veritabani yazici
├── duplicate_check.php ← Hash bazli duplikat kontrolu
├── logger.php ← Hata ve basari loglari
└── logs/
└── bot.log
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ VERİTABANI TABLOLARI Tablolar ilk calistirmada otomatik olusturulur: Kod:
-- Yayinlanan haberlerin kaydı (duplikat engeli)
CREATE TABLE IF NOT EXISTS bot_posts (
id INT AUTO_INCREMENT PRIMARY KEY,
rss_url VARCHAR(512) NOT NULL,
title_hash CHAR(64) NOT NULL UNIQUE, -- SHA-256
topic_id INT NULL, -- vBulletin thread ID
posted_at DATETIME DEFAULT NOW(),
INDEX idx_hash (title_hash)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Hata ve basari loglari
CREATE TABLE IF NOT EXISTS bot_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
level ENUM('info','warn','error') DEFAULT 'info',
message TEXT,
created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ config.php Kod:
<?php
// ── Veritabani ─────────────────────────────────────────────
define('DB_HOST', 'localhost');
define('DB_NAME', 'forum_db');
define('DB_USER', 'forum_user');
define('DB_PASS', 'guclu_sifre');
// ── vBulletin Bot Hesabi ────────────────────────────────────
define('VB_BOT_USER_ID', 99); // Bot hesabinin user ID'si
define('VB_TABLE_PREFIX', 'vb_'); // vBulletin tablo oneki
define('VB_DEFAULT_FORUM_ID', 12); // Haberlerin acilacagi forum ID
// ── Yeniden Yazma Ayarlari ──────────────────────────────────
// Secenekler: 'openai', 'anthropic', 'local' (kendi algoritmasi)
define('REWRITER_ENGINE', 'openai');
define('OPENAI_API_KEY', 'sk-...');
define('OPENAI_MODEL', 'gpt-4o-mini');
// ── Gorsel Ayarlari ─────────────────────────────────────────
define('IMG_SAVE_PATH', '/home/user/public_html/bot/images/');
define('IMG_PUBLIC_URL', 'https://sitem.com/bot/images/');
define('IMG_MAX_WIDTH', 900);
define('IMG_MAX_HEIGHT', 500);
define('IMG_WATERMARK', false); // Watermark eklensin mi?
define('IMG_WM_TEXT', 'sitem.com');
// ── RSS Kaynaklari ──────────────────────────────────────────
define('RSS_SOURCES', [
['url' => 'https://www.ntv.com.tr/son-dakika-haberleri.rss', 'forum_id' => 12, 'kategori' => 'Gundem'],
['url' => 'https://www.haberturk.com/rss', 'forum_id' => 13, 'kategori' => 'Ekonomi'],
['url' => 'https://shiftdelete.net/feed', 'forum_id' => 14, 'kategori' => 'Teknoloji'],
// Buraya istediginiz kadar RSS ekleyebilirsiniz
]);
// ── Genel Ayarlar ───────────────────────────────────────────
define('BOT_MIN_WORD_COUNT', 80); // Bu kadar kelimeden az haberi atla
define('BOT_MAX_AGE_HOURS', 12); // Bu saatten eski haberi atla
define('BOT_SLEEP_BETWEEN', 2); // Haberler arasi bekleme (saniye)
define('BOT_DRY_RUN', false); // true = forum'a yazma, sadece test et
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ newsbot.php — ANA DOSYA Kod:
<?php
require_once __DIR__ . '/config.php';
require_once __DIR__ . '/rss_parser.php';
require_once __DIR__ . '/rewriter.php';
require_once __DIR__ . '/image_handler.php';
require_once __DIR__ . '/vb_poster.php';
require_once __DIR__ . '/duplicate_check.php';
require_once __DIR__ . '/logger.php';
$pdo = new PDO(
'mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';charset=utf8mb4',
DB_USER, DB_PASS,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
bot_ensure_tables($pdo);
foreach (RSS_SOURCES as $source) {
bot_log($pdo, 'info', "Kaynak taranıyor: " . $source['url']);
$items = rss_parse($source['url']);
if (!$items) {
bot_log($pdo, 'warn', "Okunamadı: " . $source['url']);
continue;
}
foreach ($items as $item) {
// --- Yas kontrolu ---
$pub = strtotime($item['pubDate'] ?? 'now');
if ((time() - $pub) > BOT_MAX_AGE_HOURS * 3600) continue;
// --- Duplikat kontrolu ---
$hash = hash('sha256', $item['title']);
if (duplicate_exists($pdo, $hash)) {
bot_log($pdo, 'info', "Duplikat atlandı: " . $item['title']);
continue;
}
// --- Gorsel islemle ---
$img_url = image_process($item['image'] ?? null);
// --- Icerik yeniden yaz ---
$yazi = rewrite_content(
$item['title'],
$item['description'] ?? '',
$source['kategori']
);
// --- Kelime sayisi kontrolu ---
if (str_word_count($yazi) < BOT_MIN_WORD_COUNT) {
bot_log($pdo, 'warn', "Yetersiz icerik: " . $item['title']);
continue;
}
// --- Forum'a paylas ---
if (!BOT_DRY_RUN) {
$topic_id = vb_post_thread(
$pdo,
$source['forum_id'],
$item['title'],
$yazi,
$img_url
);
if ($topic_id) {
duplicate_save($pdo, $hash, $source['url'], $topic_id);
bot_log($pdo, 'info', "Paylasıldı (topic: $topic_id): " . $item['title']);
}
} else {
bot_log($pdo, 'info', "[DRY RUN] Paylasılacaktı: " . $item['title']);
}
sleep(BOT_SLEEP_BETWEEN);
}
}
bot_log($pdo, 'info', "--- Bot turu tamamlandi ---");
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ rss_parser.php Kod:
<?php
function rss_parse(string $url): array {
$ctx = stream_context_create(['http' => [
'timeout' => 15,
'user_agent' => 'Mozilla/5.0 (NewsBot/2.0)',
'ignore_errors' => true,
]]);
$xml_str = @file_get_contents($url, false, $ctx);
if (!$xml_str) return [];
$xml = @Simplexml_load_string($xml_str, 'SimpleXMLElement', LIBXML_NOCDATA);
if (!$xml) return [];
$items = [];
// RSS 2.0 ve Atom destegi
$entries = $xml->channel->item ?? $xml->entry ?? [];
foreach ($entries as $entry) {
$ns = $entry->getNamespaces(true);
$media = isset($ns['media']) ? $entry->children($ns['media']) : null;
// Gorsel bul: media:content > enclosure > og:image
$img = null;
if ($media && isset($media->content)) {
$img = (string)($media->content->attributes()['url'] ?? '');
}
if (!$img && isset($entry->enclosure)) {
$type = (string)($entry->enclosure->attributes()['type'] ?? '');
if (str_starts_with($type, 'image/')) {
$img = (string)($entry->enclosure->attributes()['url'] ?? '');
}
}
if (!$img) {
// Ozet icerisinden ilk img src'yi cek
preg_match('/<img[^>]+src=["\']([^"\']+)["\']/', (string)($entry->description ?? ''), $m);
$img = $m[1] ?? null;
}
$items[] = [
'title' => trim(strip_tags((string)($entry->title ?? ''))),
'description' => trim(strip_tags((string)($entry->description ?? $entry->summary ?? ''))),
'link' => trim((string)($entry->link ?? '')),
'pubDate' => trim((string)($entry->pubDate ?? $entry->updated ?? '')),
'image' => $img,
];
}
return $items;
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ rewriter.php — İçerik Yeniden Yazıcı Kod:
<?php
function rewrite_content(string $baslik, string $ozet, string $kategori): string {
if (REWRITER_ENGINE === 'openai') {
return rewrite_openai($baslik, $ozet, $kategori);
}
return rewrite_local($baslik, $ozet);
}
// ── OpenAI ile yeniden yaz ──────────────────────────────────
function rewrite_openai(string $baslik, string $ozet, string $kategori): string {
$prompt = "Sen bir Turkce haber editörüsün. Asagidaki haber basligini ve ozetini kullanarak "
. "tamamen senden geliyormus gibi, ozgun, akici ve bilgilendirici bir haber metni yaz. "
. "Kaynak belirtme, alinti yapma, URL verme. "
. "Kategori: $kategori. "
. "Minimum 4 paragraf, her paragraf en az 3 cumle. "
. "Sadece metni dondur, baska hicbir sey yazma.\n\n"
. "Baslik: $baslik\nOzet: $ozet";
$ch = curl_init('https://api.openai.com/v1/chat/completions');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . OPENAI_API_KEY,
],
CURLOPT_POSTFIELDS => json_encode([
'model' => OPENAI_MODEL,
'messages' => [['role' => 'user', 'content' => $prompt]],
'max_tokens' => 800,
'temperature' => 0.75,
]),
CURLOPT_TIMEOUT => 30,
]);
$resp = curl_exec($ch);
curl_close($ch);
$data = json_decode($resp, true);
return trim($data['choices'][0]['message']['content'] ?? '');
}
// ── Yerel algoritma (API olmadan) ──────────────────────────
function rewrite_local(string $baslik, string $ozet): string {
// Cumleler arası farklılık yaratan basit bir yeniden yazdirici
$cumleler = preg_split('/(?<=[.!?])\s+/', $ozet);
$yeni = [];
$giris = ["Bu gelismeler gundeme tasindi.", "Konu genis kitlelerin ilgisini cekiyor.",
"Detaylar netlik kazaniyor.", "Gelismeler dikkat cekici boyutlara ulasti."];
$yeni[] = $baslik . " konusundaki gelismeler surmeye devam ediyor. " . $giris[array_rand($giris)];
foreach ($cumleler as $c) {
$c = trim($c);
if (mb_strlen($c) > 20) $yeni[] = $c;
}
$sonuc = ["Bu konudaki gelismeleri takip etmeye devam edin.",
"Konuya iliskin yeni bilgiler paylasildikca guncellenecektir.",
"Detayli bilgi icin forumumuzu takip edin."];
$yeni[] = $sonuc[array_rand($sonuc)];
return implode("\n\n", $yeni);
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ image_handler.php — Görsel işleme Kod:
<?php
function image_process(?string $url): ?string {
if (!$url || !filter_var($url, FILTER_VALIDATE_URL)) return null;
$ext = strtolower(pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION));
$izinli = ['jpg', 'jpeg', 'png', 'webp'];
if (!in_array($ext, $izinli)) $ext = 'jpg';
$dosya_adi = uniqid('haber_', true) . '.' . $ext;
$kaydet = IMG_SAVE_PATH . $dosya_adi;
// Indir
$ctx = stream_context_create(['http' => ['timeout' => 15, 'user_agent' => 'Mozilla/5.0']]);
$veri = @file_get_contents($url, false, $ctx);
if (!$veri) return null;
file_put_contents($kaydet, $veri);
// GD ile boyutlandir
$bilgi = @getimagesize($kaydet);
if (!$bilgi) { unlink($kaydet); return null; }
[$w, $h, $tip] = $bilgi;
if ($w > IMG_MAX_WIDTH || $h > IMG_MAX_HEIGHT) {
$oran = min(IMG_MAX_WIDTH / $w, IMG_MAX_HEIGHT / $h);
$yw = (int)($w * $oran);
$yh = (int)($h * $oran);
$kaynak = match($tip) {
IMAGETYPE_JPEG => imagecreatefromjpeg($kaydet),
IMAGETYPE_PNG => imagecreatefrompng($kaydet),
IMAGETYPE_WEBP => imagecreatefromwebp($kaydet),
default => null,
};
if ($kaynak) {
$hedef = imagecreatetruecolor($yw, $yh);
imagecopyresampled($hedef, $kaynak, 0, 0, 0, 0, $yw, $yh, $w, $h);
// Watermark
if (IMG_WATERMARK) {
$renk = imagecolorallocatealpha($hedef, 255, 255, 255, 80);
imagestring($hedef, 3, 8, $yh - 20, IMG_WM_TEXT, $renk);
}
imagejpeg($hedef, $kaydet, 88);
imagedestroy($kaynak);
imagedestroy($hedef);
}
}
return IMG_PUBLIC_URL . $dosya_adi;
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ vb_poster.php — Forum'a Yazma Kod:
<?php
function vb_post_thread(PDO $pdo, int $forum_id, string $baslik, string $icerik, ?string $img_url): ?int {
$prefix = VB_TABLE_PREFIX;
$user_id = VB_BOT_USER_ID;
$now = time();
// Gorsel BB kodunu hazirla
$gorsel_bb = $img_url
? "
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ duplicate_check.php ve logger.php Kod:
<?php
// ── duplicate_check.php ─────────────────────────────────────
function bot_ensure_tables(PDO $pdo): void {
$pdo->exec("CREATE TABLE IF NOT EXISTS bot_posts (
id INT AUTO_INCREMENT PRIMARY KEY,
rss_url VARCHAR(512) NOT NULL,
title_hash CHAR(64) NOT NULL UNIQUE,
topic_id INT NULL,
posted_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
$pdo->exec("CREATE TABLE IF NOT EXISTS bot_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
level ENUM('info','warn','error') DEFAULT 'info',
message TEXT,
created_at DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
}
function duplicate_exists(PDO $pdo, string $hash): bool {
$st = $pdo->prepare("SELECT 1 FROM bot_posts WHERE title_hash = ? LIMIT 1");
$st->execute([$hash]);
return (bool)$st->fetchColumn();
}
function duplicate_save(PDO $pdo, string $hash, string $url, int $topic_id): void {
$pdo->prepare("INSERT IGNORE INTO bot_posts (rss_url, title_hash, topic_id) VALUES (?,?,?)")
->execute([$url, $hash, $topic_id]);
}
// ── logger.php ──────────────────────────────────────────────
function bot_log(PDO $pdo, string $level, string $msg): void {
// Hem dosyaya hem DB'ye yaz
$satirr = "[" . date('Y-m-d H:i:s') . "] [$level] $msg\n";
file_put_contents(__DIR__ . '/logs/bot.log', $satirr, FILE_APPEND);
try {
$pdo->prepare("INSERT INTO bot_logs (level, message) VALUES (?,?)")
->execute([$level, $msg]);
} catch (Exception $e) {}
}
Adim 1 — Bot Kullanicisi Olustur Admin Panel → Kullaniciler → Kullanici Ekle kismina gidin. Kullanici adini HaberBotu, e-postasini bot@sitem.com olarak ayarlayin. Gercek bir e-posta adresi kullanin, aktivasyon maili buraya gelecek. Adim 2 — Ozel Grup Olustur Admin Panel → Kullanici Grupları → Yeni Grup Ekle kismina gidin. Grup adini "Haber Botlari" yapın. Asagidaki izinleri tam olarak bu sekilde yapilandirin:
Adim 3 — Botu Gruba Ata Admin Panel → Kullaniciler → HaberBotu hesabini duzenle → Birincil Grup: Haber Botlari sec → Kaydet. Adim 4 — Forum Izinleri Haberlerin acilacagi her forum icin: Forum Yonetimi → Izinler → Haber Botlari grubuna konu acma ve yanitlama izni verin. Diger forumlara erisimi tamamen kapatin. Adim 5 — Bot User ID'sini Bul Admin Panel → Kullaniciler → HaberBotu → URL'de userid=XX yazar. Bu sayiyi config.php dosyasindaki VB_BOT_USER_ID alani ile guncelle. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CRON JOB KURULUMU Kod:
# cPanel → Cron Jobs veya SSH ile crontab -e komutu # Her 30 dakikada bir calistir */30 * * * * /usr/bin/php /home/kullanici/public_html/bot/newsbot.php >> /home/kullanici/public_html/bot/logs/cron.log 2>&1 # Alternatif: Sadece mesai saatlerinde (08:00 - 23:00) */30 8-23 * * * /usr/bin/php /home/kullanici/public_html/bot/newsbot.php >> /home/kullanici/public_html/bot/logs/cron.log 2>&1 # Eski log dosyalarini her gece temizle (30 gunden eski) 0 3 * * * find /home/kullanici/public_html/bot/logs/ -name "*.log" -mtime +30 -delete Kod:
php /home/kullanici/public_html/bot/newsbot.php ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ÖNEMLI NOTLAR VE TAVSİYELER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ GEREKSİNİMLER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Test ortami: PHP 8.2 / MariaDB 10.6 / vBulletin 4.2.5 / cPanel. OpenAI API: gpt-4o-mini modeli. Gorsel isleme: GD Library. ![]() Fallen code. Broken systems. No mercy. |
| Yer İmleri |
| Konuyu 1 kişi okuyor: (0 üye ve 1 misafir) | |
|
|
| Forum | Bilgilendirme | Künye |
|
Powered by vBulletin® Version 3.8.11 Copyright ©2000 - 2026, vBulletin Solutions Inc. Forum Sahibi: Dea Dia ve Gece |
Sitemiz; yer sağlayıcı bir forum sitesidir. Forumel.Com adresimizde yapılan paylaşımlar, moderasyon ekibimizin onayına dahil olmadan direkt olarak yayınlanmaktadır. 5237 sayılı TCK (Türk Ceza Kanunu) ve 5651 Sayılı Kanun'un ilgili maddelerini ihlal eden kişilerin IP adresleri de dahil olmak üzere sair kişi veya adli mercilere müzekkere (Resmi Üst Yazı), tarafımıza tanzim edildiği takdirde paylaşılacaktır. Hukuka aykırı bir paylaşımın olduğunu düşündüğünüz mesaj ya da konuyu; İLETİŞİM linkine bildirim yoluyla iletebilirsiniz. 48 saat içerisinde mevcut şikâyetiniz üzerinden tarafınıza ulaşılacak, gerekli işlemler tesis edilecektir. |
|