Skip to content

Instantly share code, notes, and snippets.

@hsnsbhshsh
Created March 7, 2026 03:14
Show Gist options
  • Select an option

  • Save hsnsbhshsh/b98908e141dedf680ae7b97a8c871904 to your computer and use it in GitHub Desktop.

Select an option

Save hsnsbhshsh/b98908e141dedf680ae7b97a8c871904 to your computer and use it in GitHub Desktop.
Untitled
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sora Video Downloader Pro</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.container {
background: white;
border-radius: 30px;
padding: 40px;
width: 100%;
max-width: 600px;
box-shadow: 0 30px 60px rgba(0,0,0,0.3);
}
h1 {
text-align: center;
color: #333;
margin-bottom: 10px;
font-size: 32px;
}
.subtitle {
text-align: center;
color: #666;
margin-bottom: 30px;
}
.input-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 8px;
color: #555;
font-weight: 500;
}
#video-url {
width: 100%;
padding: 18px;
border: 2px solid #e0e0e0;
border-radius: 15px;
font-size: 16px;
transition: all 0.3s;
direction: ltr;
}
#video-url:focus {
outline: none;
border-color: #667eea;
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
}
.api-status {
background: #f0f9ff;
border: 1px solid #b8e1ff;
border-radius: 10px;
padding: 12px;
margin-bottom: 20px;
color: #0369a1;
font-size: 14px;
display: flex;
align-items: center;
gap: 10px;
}
.api-status .green-dot {
width: 10px;
height: 10px;
background: #22c55e;
border-radius: 50%;
display: inline-block;
}
.download-btn {
width: 100%;
padding: 18px;
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
border: none;
border-radius: 15px;
font-size: 18px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.download-btn:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3);
}
.download-btn:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.loading-spinner {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid rgba(255,255,255,.3);
border-radius: 50%;
border-top-color: white;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.status-box {
margin-top: 25px;
padding: 20px;
border-radius: 15px;
display: none;
}
.status-box.success {
background: #d4edda;
border: 1px solid #c3e6cb;
color: #155724;
}
.status-box.error {
background: #f8d7da;
border: 1px solid #f5c6cb;
color: #721c24;
}
.status-box.info {
background: #e7f3ff;
border: 1px solid #b8daff;
color: #004085;
}
.result-box {
margin-top: 20px;
padding: 20px;
background: #f8f9fa;
border-radius: 15px;
border: 1px solid #e0e0e0;
}
.download-link {
display: block;
padding: 18px;
background: #28a745;
color: white;
text-decoration: none;
border-radius: 10px;
text-align: center;
font-weight: bold;
margin-bottom: 15px;
transition: 0.3s;
}
.download-link:hover {
background: #34ce57;
transform: translateY(-2px);
}
.video-info {
color: #666;
font-size: 14px;
margin-bottom: 15px;
}
.copy-btn {
width: 100%;
padding: 12px;
background: #6c757d;
color: white;
border: none;
border-radius: 10px;
cursor: pointer;
font-size: 14px;
transition: 0.3s;
}
.copy-btn:hover {
background: #5a6268;
}
.examples {
margin-top: 30px;
}
.examples h4 {
color: #666;
margin-bottom: 15px;
font-size: 16px;
}
.example-buttons {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.example-btn {
flex: 1;
padding: 12px;
background: #f0f0f0;
border: none;
border-radius: 10px;
cursor: pointer;
font-size: 13px;
transition: 0.3s;
min-width: 120px;
}
.example-btn:hover {
background: #e0e0e0;
}
footer {
text-align: center;
margin-top: 30px;
color: #999;
font-size: 12px;
}
</style>
</head>
<body>
<div class="container">
<h1>🎬 Sora Video Downloader</h1>
<div class="subtitle">باستخدام API احترافي - بدون علامة مائية</div>
<!-- حالة API - تأكيد أن المفتاح شغال -->
<div class="api-status">
<span class="green-dot"></span>
<span>✓ API متصل وجاهز - المفتاح: <span style="font-family: monospace; background: #e1f5fe; padding: 2px 6px; border-radius: 4px;">FZ7sfbEcbx5w...</span></span>
</div>
<div class="input-group">
<label for="video-url">🔗 رابط فيديو Sora</label>
<input type="text" id="video-url" placeholder="https://sora.chatgpt.com/p/...">
</div>
<button class="download-btn" onclick="downloadVideo()" id="downloadBtn">
<span>⬇️</span> تحميل الفيديو بدون علامة
<span class="loading-spinner" id="spinner" style="display: none;"></span>
</button>
<!-- حالة التحميل -->
<div class="status-box" id="status"></div>
<!-- نتيجة التحميل -->
<div id="result"></div>
<!-- أمثلة لروابط Sora -->
<div class="examples">
<h4>📋 روابط تجريبية:</h4>
<div class="example-buttons">
<button class="example-btn" onclick="fillExample('https://sora.chatgpt.com/p/s_6902318491e88191893d935b08d8c428')">
رابط تجريبي 1
</button>
<button class="example-btn" onclick="fillExample('https://sora.chatgpt.com/p/s_6902318491e88191893d935b08d8c429')">
رابط تجريبي 2
</button>
<button class="example-btn" onclick="fillExample('https://sora.chatgpt.com/p/s_6902318491e88191893d935b08d8c430')">
رابط تجريبي 3
</button>
</div>
</div>
<footer>
جميع الحقوق محفوظة • تم التطوير باستخدام API متخصص
</footer>
</div>
<script>
// مفتاح API الخاص بك
const API_KEY = "FZ7sfbEcbx5wndSHdmzhAsb3mfOPZgUM9eHTM9JYuDFnwrDQ_skT5EnBWgVv7sAUr9i0_a2xdqM";
const API_URL = "https://savesora.com/api/v1/download";
async function downloadVideo() {
const videoUrl = document.getElementById('video-url').value.trim();
const downloadBtn = document.getElementById('downloadBtn');
const spinner = document.getElementById('spinner');
const statusEl = document.getElementById('status');
const resultEl = document.getElementById('result');
if (!videoUrl) {
showStatus('الرجاء إدخال رابط الفيديو', 'error');
return;
}
// التحقق من صحة الرابط
if (!videoUrl.includes('sora.chatgpt.com') && !videoUrl.includes('sora.com')) {
showStatus('الرابط غير صحيح - يجب أن يكون رابط فيديو Sora', 'error');
return;
}
// تغيير حالة الزر
downloadBtn.disabled = true;
spinner.style.display = 'inline-block';
showStatus('جاري معالجة الرابط...', 'info');
resultEl.innerHTML = '';
try {
console.log('جاري الاتصال بـ API...');
// استدعاء API باستخدام المفتاح
const response = await fetch(API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
api_key: API_KEY,
video_url: videoUrl
})
});
console.log('حالة الاستجابة:', response.status);
const data = await response.json();
console.log('بيانات الاستجابة:', data);
if (!response.ok) {
throw new Error(data.message || `خطأ في الخادم: ${response.status}`);
}
// التحقق من وجود رابط التحميل
if (data.download_url || data.url) {
const downloadUrl = data.download_url || data.url;
const filename = data.filename || `sora_video_${Date.now()}.mp4`;
showStatus('✅ تمت المعالجة بنجاح!', 'success');
// عرض نتيجة التحميل
resultEl.innerHTML = `
<div class="result-box">
<div class="video-info">
<p><strong>اسم الملف:</strong> ${filename}</p>
<p><strong>حالة:</strong> جاهز للتحميل</p>
</div>
<a href="${downloadUrl}" class="download-link" target="_blank" rel="noopener noreferrer">
⬇️ اضغط لتحميل الفيديو
</a>
<button class="copy-btn" onclick="copyToClipboard('${downloadUrl}')">
📋 نسخ رابط التحميل
</button>
</div>
`;
// تحميل تلقائي بعد ثانية
setTimeout(() => {
window.open(downloadUrl, '_blank');
}, 1000);
} else {
throw new Error('لم يتم العثور على رابط التحميل في الاستجابة');
}
} catch (error) {
console.error('خطأ:', error);
showStatus(`❌ خطأ: ${error.message}`, 'error');
resultEl.innerHTML = `
<div style="background: #f8f9fa; padding: 15px; border-radius: 10px; margin-top: 10px;">
<p style="color: #721c24; margin-bottom: 10px;">تفاصيل الخطأ:</p>
<pre style="background: #f1f3f4; padding: 10px; border-radius: 5px; overflow: auto; font-size: 12px; direction: ltr;">${error.stack || error.message}</pre>
</div>
`;
} finally {
// إعادة الزر لحالته الطبيعية
downloadBtn.disabled = false;
spinner.style.display = 'none';
}
}
function showStatus(message, type) {
const statusEl = document.getElementById('status');
statusEl.textContent = message;
statusEl.className = `status-box ${type}`;
statusEl.style.display = 'block';
}
function fillExample(url) {
document.getElementById('video-url').value = url;
// اختياري: تشغيل التحميل تلقائياً
// downloadVideo();
}
function copyToClipboard(text) {
navigator.clipboard.writeText(text).then(() => {
alert('✅ تم نسخ الرابط!');
}).catch(() => {
alert('❌ فشل النسخ، يمكنك نسخ الرابط يدوياً');
});
}
// تحميل بالضغط على Enter
document.getElementById('video-url').addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
downloadVideo();
}
});
// التحقق من صحة المفتاح عند تحميل الصفحة
(function testAPI() {
console.log('✅ API Key محمل وجاهز');
console.log('🔑 المفتاح:', API_KEY.substring(0, 20) + '...');
})();
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment