DashX-API / plugins /sora2.js
HerzaJ's picture
Update plugins/sora2.js
e93361f verified
const axios = require('axios');
const dns = require('dns').promises;
const PROXY_URL = 'https://proxy-sigma-roan.vercel.app/api/proxy';
dns.setServers([
'1.1.1.1',
'8.8.8.8',
'8.8.4.4'
]);
function generateUniqueId() {
return Array.from({ length: 32 }, () =>
Math.floor(Math.random() * 16).toString(16)
).join('');
}
function generatePassword() {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let password = '';
for (let i = 0; i < 12; i++) {
password += chars.charAt(Math.floor(Math.random() * chars.length));
}
return password;
}
function randomDelay(min = 1000, max = 3000) {
const delay = Math.floor(Math.random() * (max - min + 1)) + min;
return new Promise(resolve => setTimeout(resolve, delay));
}
function generateRandomIP() {
return `${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}`;
}
async function proxyRequest(url, options = {}) {
const targetPath = url.startsWith('http') ? url : url;
const fakeIP = generateRandomIP();
const headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'application/json, text/plain, */*',
'X-Forwarded-For': fakeIP,
'X-Real-IP': fakeIP,
'X-Client-IP': fakeIP,
...(options.headers || {})
};
await randomDelay(500, 1500);
const axiosConfig = {
method: options.method || 'GET',
headers: headers,
timeout: 30000,
params: {
url: targetPath
},
validateStatus: function (status) {
return status >= 200 && status < 600;
}
};
if (options.data && (options.method === 'POST' || options.method === 'PUT')) {
axiosConfig.data = options.data;
}
let lastError = null;
for (let attempt = 1; attempt <= 3; attempt++) {
try {
axiosConfig.url = PROXY_URL;
console.log(`Attempt ${attempt}: ${PROXY_URL}?url=${targetPath}`);
const response = await axios(axiosConfig);
console.log(`Attempt ${attempt} got status ${response.status}`);
console.log(`Response data:`, JSON.stringify(response.data).substring(0, 200));
if (response.status === 403) {
console.log('Got 403, waiting longer before retry...');
await randomDelay(3000, 5000);
throw new Error('API Bylo returned 403 Forbidden - possible rate limit or IP block');
}
if (response.status === 429) {
console.log('Got 429 Too Many Requests, waiting...');
await randomDelay(5000, 10000);
if (attempt < 3) continue;
throw new Error('Rate limit exceeded');
}
if (response.status >= 200 && response.status < 300) {
if (!response.data) {
throw new Error('Empty response from proxy');
}
return response;
}
if (response.status >= 400) {
const errorMsg = response.data?.msg || response.data?.message || response.data?.error || 'Unknown error';
throw new Error(`API error (${response.status}): ${errorMsg}`);
}
if (attempt < 3) {
await randomDelay(2000, 4000);
}
} catch (error) {
lastError = error;
console.error(`Attempt ${attempt} failed:`, error.message);
if (error.response) {
console.error(`Response status: ${error.response.status}`);
console.error(`Response data:`, error.response.data);
}
if (attempt < 3) {
const waitTime = 3000 * attempt;
console.log(`Retrying in ${waitTime/1000} seconds...`);
await randomDelay(waitTime, waitTime + 2000);
}
}
}
throw new Error(`Proxy request failed after 3 attempts: ${lastError?.message || 'Unknown error'}`);
}
async function createTempEmail() {
console.log('Creating temporary email...');
const { data } = await axios.post('https://api.internal.temp-mail.io/api/v3/email/new', {
min_name_length: 10,
max_name_length: 10
}, {
headers: {
'Content-Type': 'application/json',
'Application-Name': 'web',
'Application-Version': '4.0.0',
'X-CORS-Header': 'iaWg3pchvFx48fY'
},
timeout: 15000
});
console.log(`Email created: ${data.email}`);
return data;
}
async function getHcaptchaToken() {
console.log('Getting hCaptcha token...');
const { data } = await axios.get(
'https://anabot.my.id/api/tools/bypass?url=https%3A%2F%2Fapi.hcaptcha.com&siteKey=6f70c0f2-3ef6-4972-9fb6-c0b4bade3af8&type=hcaptcha-invisible&apikey=freeApikey',
{
timeout: 15000
}
);
if (!data.success) {
throw new Error('Failed to get hCaptcha token');
}
console.log('hCaptcha token obtained');
return data.data.result.token;
}
async function sendVerificationEmail(email) {
console.log(`Sending verification email to ${email}...`);
await randomDelay(1000, 2000);
const hcaptchaToken = await getHcaptchaToken();
const encodedEmail = encodeURIComponent(email);
await randomDelay(500, 1000);
const { data } = await proxyRequest(
`/api/auth/send-captcha?email=${encodedEmail}&type=register`,
{
method: 'GET',
headers: {
'Accept': 'application/json, text/plain, */*',
'hcaptcha-token': hcaptchaToken,
'uniqueId': generateUniqueId()
}
}
);
if (data.code !== 200) {
throw new Error(`Failed to send verification email: ${data.msg || 'Unknown error'}`);
}
console.log('Verification email sent successfully');
await randomDelay(3000, 5000);
return true;
}
async function getVerificationCode(email) {
console.log('Waiting for verification code...');
let attempts = 0;
const maxAttempts = 30;
while (attempts < maxAttempts) {
try {
await new Promise(resolve => setTimeout(resolve, 5000));
const { data } = await axios.get(
`https://api.internal.temp-mail.io/api/v3/email/${email}/messages`,
{
headers: {
'Content-Type': 'application/json',
'Application-Name': 'web',
'Application-Version': '4.0.0',
'X-CORS-Header': 'iaWg3pchvFx48fY'
},
timeout: 10000
}
);
if (data.length > 0) {
const bodyText = data[0].body_text;
const codeMatch = bodyText.match(/Verification Code:\s*(\d{6})/);
if (codeMatch) {
console.log(`Verification code received: ${codeMatch[1]}`);
return codeMatch[1];
}
}
attempts++;
console.log(`Checking for verification code... attempt ${attempts}/${maxAttempts}`);
} catch (error) {
console.log(`Email check attempt ${attempts} failed:`, error.message);
attempts++;
}
}
throw new Error('Verification code not received after 30 attempts');
}
async function registerAccount(email, password, verificationCode) {
console.log('Registering account...');
const { data } = await proxyRequest('/api/auth/register', {
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json',
'uniqueId': generateUniqueId()
},
data: {
email: email,
password: password,
confirmPassword: password,
verificationCode: verificationCode,
referDomain: ''
}
});
if (data.code !== 200) {
throw new Error(`Registration failed: ${data.msg || 'Unknown error'}`);
}
console.log('Account registered successfully');
return data.data.token;
}
async function createVideo(prompt, ratio, authToken, email) {
console.log('Creating video task...');
await randomDelay(2000, 3000);
const { data } = await proxyRequest('/aimodels/api/v1/ai/video/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'uniqueid': generateUniqueId(),
'verify': '',
'authorization': authToken
},
data: {
prompt: prompt,
channel: 'SORA2',
pageId: 536,
source: 'bylo.ai',
watermarkFlag: false,
privateFlag: false,
isTemp: true,
model: 'sora_video2',
videoType: 'text-to-video',
duration: '10',
aspectRatio: ratio,
email: email
}
});
if (data.code !== 200) {
throw new Error(`Failed to create video: ${data.message || 'Unknown error'}`);
}
console.log(`Video task created with ID: ${data.data}`);
return data.data;
}
async function getTaskStatus(taskId, authToken) {
try {
const { data } = await proxyRequest(
`/aimodels/api/v1/ai/${taskId}?channel=SORA2`,
{
method: 'GET',
headers: {
'Content-Type': 'application/json',
'authorization': authToken
}
}
);
if (!data || !data.data) {
throw new Error('Invalid response from task status API');
}
return data.data;
} catch (error) {
console.error('Error getting task status:', error.message);
throw error;
}
}
async function waitForVideoCompletion(taskId, authToken) {
console.log('Waiting for video generation...');
let attempts = 0;
const maxAttempts = 120;
while (attempts < maxAttempts) {
await randomDelay(5000, 7000);
const taskData = await getTaskStatus(taskId, authToken);
console.log(`Video status check ${attempts + 1}/${maxAttempts} - State: ${taskData.state}`);
if (taskData.state === 1 && taskData.completeData) {
const completeData = JSON.parse(taskData.completeData);
console.log('Video generation completed!');
return completeData.data.result_urls[0];
}
if (taskData.failMsg) {
throw new Error(`Video generation failed: ${taskData.failMsg}`);
}
attempts++;
}
throw new Error('Video generation timeout after 10 minutes');
}
async function sora2(prompt, ratio = 'portrait') {
console.log('=== Starting Sora2 Video Generation ===');
console.log(`Prompt: ${prompt}`);
console.log(`Ratio: ${ratio}`);
const tempMail = await createTempEmail();
const email = tempMail.email;
const password = generatePassword();
await sendVerificationEmail(email);
const verificationCode = await getVerificationCode(email);
const authToken = await registerAccount(email, password, verificationCode);
const taskId = await createVideo(prompt, ratio, authToken, email);
const videoUrl = await waitForVideoCompletion(taskId, authToken);
console.log('=== Video Generation Completed ===');
console.log(`Video URL: ${videoUrl}`);
return {
success: true,
email: email,
password: password,
videoUrl: videoUrl,
taskId: taskId
};
}
const handler = async (req, res) => {
const startTime = Date.now();
try {
const { prompt, key, ratio = 'portrait' } = req.query;
if (!prompt) {
return res.status(400).json({
author: 'Herza',
success: false,
msg: 'Missing required parameter: prompt',
usage: '/api/AI/sora2?prompt=your_prompt&ratio=portrait&key=your_key'
});
}
if (!key) {
return res.status(400).json({
author: 'Herza',
success: false,
msg: 'Missing required parameter: key'
});
}
if (!['portrait', 'landscape', 'square'].includes(ratio)) {
return res.status(400).json({
author: 'Herza',
success: false,
msg: 'Invalid ratio. Use: portrait, landscape, or square'
});
}
console.log(`\n${'='.repeat(60)}`);
console.log('NEW REQUEST RECEIVED');
console.log(`Prompt: ${prompt}`);
console.log(`Ratio: ${ratio}`);
console.log(`${'='.repeat(60)}\n`);
const result = await sora2(prompt, ratio);
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
console.log(`\n${'='.repeat(60)}`);
console.log('REQUEST COMPLETED');
console.log(`Duration: ${duration}s`);
console.log(`${'='.repeat(60)}\n`);
res.json({
author: 'Herza',
success: true,
data: {
model: 'sora-video2',
prompt: prompt,
ratio: ratio,
videoUrl: result.videoUrl,
taskId: result.taskId,
account: {
email: result.email,
password: result.password
},
processingTime: `${duration}s`
}
});
} catch (error) {
console.error('\n❌ ERROR:', error.message);
console.error('Stack:', error.stack);
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
res.status(500).json({
author: 'Herza',
success: false,
msg: error.message || 'Terjadi kesalahan saat generate video.',
processingTime: `${duration}s`,
error: {
code: error.code || 'UNKNOWN',
details: error.response?.data || null
}
});
}
}
module.exports = {
name: 'Sora2 Video Generator',
description: 'Generate videos using Sora2 AI model from Bylo.ai via Vercel Proxy',
type: 'GET',
routes: ['api/AI/sora2'],
tags: ['AI', 'Sora', 'OpenAI', 'Video'],
parameters: ['prompt', 'ratio', 'key'],
enabled: true,
main: ['AI'],
limit: 10,
handler
};