// ==UserScript== // @name Z-Image Free AI Image Generator - No Login Required // @name:zh-CN Z-Image 免费AI图片生成器 - 无需登录 // @namespace https://zimage.run/ // @version 1.0.0 // @description Generate AI images on any webpage! Powered by Alibaba's Z-Image Turbo model. No login required, no registration needed, completely free to use. Supports bilingual Chinese-English prompts, 8-step ultra-fast inference, photorealistic output. // @description:zh-CN 在任何网页中快速生成AI图片!基于阿里巴巴Z-Image Turbo模型,无需登录,无需注册,完全免费使用。支持中英文双语提示词,8步极速推理,照片级真实输出。 // @author Z-Image Team // @match *://*/* // @grant GM_xmlhttpRequest // @grant GM_addStyle // @grant GM_registerMenuCommand // @grant GM_setClipboard // @connect zimage.run // @license MIT // @homepage https://zimage.run // @supportURL https://github.com/Tongyi-MAI/Z-Image/issues // @icon https://zimage.run/logo.png // @run-at document-end // @downloadURL none // ==/UserScript== (function() { 'use strict'; // ==================== Configuration ==================== const CONFIG = { API_BASE: 'https://zimage.run/api/z-image', POLLING_INTERVAL: 3000, // Polling interval in milliseconds MAX_POLLING_ATTEMPTS: 200, // Maximum polling attempts (10 minutes) DEFAULT_WIDTH: 512, DEFAULT_HEIGHT: 512, }; // ==================== Styles ==================== GM_addStyle(` /* Float button styles */ #z-image-float-btn { position: fixed; bottom: 20px; right: 20px; width: 60px; height: 60px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 50%; box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); cursor: pointer; z-index: 999999; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; border: none; } #z-image-float-btn:hover { transform: scale(1.1); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.6); } #z-image-float-btn svg { width: 30px; height: 30px; fill: white; } /* Modal styles */ #z-image-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: 1000000; display: none; align-items: center; justify-content: center; backdrop-filter: blur(5px); } #z-image-modal.show { display: flex; } #z-image-modal-content { background: white; border-radius: 16px; width: 90%; max-width: 800px; max-height: 90vh; overflow-y: auto; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); animation: slideIn 0.3s ease; } @keyframes slideIn { from { opacity: 0; transform: translateY(-50px); } to { opacity: 1; transform: translateY(0); } } /* Modal header */ .z-image-modal-header { padding: 24px; border-bottom: 1px solid #e5e7eb; display: flex; justify-content: space-between; align-items: center; } .z-image-modal-title { font-size: 24px; font-weight: 700; color: #1f2937; margin: 0; } .z-image-modal-subtitle { font-size: 14px; color: #6b7280; margin-top: 4px; } .z-image-close-btn { background: none; border: none; font-size: 28px; color: #9ca3af; cursor: pointer; padding: 0; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; border-radius: 8px; transition: all 0.2s; } .z-image-close-btn:hover { background: #f3f4f6; color: #1f2937; } /* Modal body */ .z-image-modal-body { padding: 24px; } /* Form styles */ .z-image-form-group { margin-bottom: 20px; } .z-image-label { display: block; font-size: 14px; font-weight: 600; color: #374151; margin-bottom: 8px; } .z-image-textarea { width: 100%; min-height: 120px; padding: 12px; border: 2px solid #e5e7eb; border-radius: 8px; font-size: 14px; font-family: inherit; resize: vertical; transition: border-color 0.2s; box-sizing: border-box; } .z-image-textarea:focus { outline: none; border-color: #667eea; } .z-image-size-group { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .z-image-input { width: 100%; padding: 10px 12px; border: 2px solid #e5e7eb; border-radius: 8px; font-size: 14px; transition: border-color 0.2s; box-sizing: border-box; } .z-image-input:focus { outline: none; border-color: #667eea; } /* Button styles */ .z-image-btn { padding: 12px 24px; border: none; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; transition: all 0.2s; display: inline-flex; align-items: center; justify-content: center; gap: 8px; } .z-image-btn-primary { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; width: 100%; } .z-image-btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4); } .z-image-btn-primary:disabled { opacity: 0.6; cursor: not-allowed; } /* Result display */ .z-image-result { margin-top: 24px; padding: 20px; background: #f9fafb; border-radius: 12px; display: none; } .z-image-result.show { display: block; } .z-image-status { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; } .z-image-spinner { width: 24px; height: 24px; border: 3px solid #e5e7eb; border-top-color: #667eea; border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .z-image-status-text { font-size: 14px; color: #6b7280; } .z-image-preview { width: 100%; border-radius: 8px; margin-top: 16px; } .z-image-actions { display: flex; gap: 12px; margin-top: 16px; } .z-image-btn-secondary { background: white; color: #667eea; border: 2px solid #667eea; flex: 1; } .z-image-btn-secondary:hover { background: #667eea; color: white; } /* Hint text */ .z-image-hint { font-size: 12px; color: #9ca3af; margin-top: 8px; } .z-image-badge { display: inline-block; padding: 4px 12px; background: #dbeafe; color: #1e40af; border-radius: 12px; font-size: 12px; font-weight: 600; margin-bottom: 12px; } /* Context menu styles */ .z-image-context-menu { position: fixed; background: white; border-radius: 8px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); padding: 8px 0; z-index: 1000001; display: none; min-width: 200px; } .z-image-context-menu.show { display: block; } .z-image-context-item { padding: 10px 16px; cursor: pointer; font-size: 14px; color: #374151; transition: background 0.2s; } .z-image-context-item:hover { background: #f3f4f6; } /* Error message */ .z-image-error { padding: 12px; background: #fee2e2; color: #991b1b; border-radius: 8px; margin-top: 12px; font-size: 14px; } `); // ==================== Utility Functions ==================== /** * Create API request */ function apiRequest(url, options = {}) { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: options.method || 'GET', url: url, headers: { 'Content-Type': 'application/json', ...options.headers }, data: options.body ? JSON.stringify(options.body) : undefined, onload: (response) => { try { const data = JSON.parse(response.responseText); resolve(data); } catch (e) { reject(new Error('Failed to parse response')); } }, onerror: (error) => { reject(new Error('Network error')); }, ontimeout: () => { reject(new Error('Request timeout')); } }); }); } /** * Generate image */ async function generateImage(prompt, width, height, seed) { const response = await apiRequest(`${CONFIG.API_BASE}/generate`, { method: 'POST', body: { prompt: prompt, width: parseInt(width), height: parseInt(height), seed: seed || undefined } }); if (!response.success) { throw new Error(response.error || 'Generation failed'); } return response.data; } /** * Check task status */ async function checkStatus(uuid) { const response = await apiRequest(`${CONFIG.API_BASE}/status/${uuid}`); if (!response.success) { throw new Error(response.error || 'Failed to check status'); } return response.data; } /** * Poll task status until complete */ async function pollUntilComplete(uuid, onProgress) { let attempts = 0; while (attempts < CONFIG.MAX_POLLING_ATTEMPTS) { const status = await checkStatus(uuid); if (onProgress) { onProgress(status); } if (status.status === 'completed') { return status; } if (status.status === 'failed') { throw new Error(status.errorMessage || 'Generation failed'); } await new Promise(resolve => setTimeout(resolve, CONFIG.POLLING_INTERVAL)); attempts++; } throw new Error('Generation timeout'); } // ==================== UI Components ==================== /** * Create float button */ function createFloatButton() { const btn = document.createElement('button'); btn.id = 'z-image-float-btn'; btn.innerHTML = ` `; btn.title = 'Z-Image AI Image Generator - No Login Required, Free to Use'; btn.onclick = () => openModal(); document.body.appendChild(btn); } /** * Create main modal */ function createModal() { const modal = document.createElement('div'); modal.id = 'z-image-modal'; modal.innerHTML = `

Z-Image AI Generator

No Login · No Registration · Completely Free

🌐 Visit zimage.run →
🚀 Powered by Alibaba Z-Image Turbo · Visit zimage.run for more
💡 Tip: Detailed descriptions generate better images. Supports bilingual Chinese-English input.
📐 Recommended: 512×512 (square), 768×512 (landscape), 512×768 (portrait)

💡 Want more features? Visit zimage.run for the full experience!

Generating...

🎉 Success! Visit our website for more features

🌐 Visit zimage.run Now
`; document.body.appendChild(modal); // Click background to close modal.onclick = (e) => { if (e.target === modal) { modal.classList.remove('show'); } }; // Bind generate button document.getElementById('z-image-generate-btn').onclick = handleGenerate; } /** * Open modal */ function openModal(selectedText = '') { const modal = document.getElementById('z-image-modal'); modal.classList.add('show'); if (selectedText) { document.getElementById('z-image-prompt').value = selectedText; } // Reset result area document.getElementById('z-image-result').classList.remove('show'); document.getElementById('z-image-preview').style.display = 'none'; document.getElementById('z-image-actions').style.display = 'none'; document.getElementById('z-image-error').style.display = 'none'; } /** * Handle generate request */ async function handleGenerate() { const promptEl = document.getElementById('z-image-prompt'); const widthEl = document.getElementById('z-image-width'); const heightEl = document.getElementById('z-image-height'); const generateBtn = document.getElementById('z-image-generate-btn'); const resultEl = document.getElementById('z-image-result'); const statusTextEl = document.getElementById('z-image-status-text'); const errorEl = document.getElementById('z-image-error'); const previewEl = document.getElementById('z-image-preview'); const actionsEl = document.getElementById('z-image-actions'); const prompt = promptEl.value.trim(); const width = parseInt(widthEl.value); const height = parseInt(heightEl.value); // Validate input if (!prompt) { alert('Please enter a prompt'); return; } if (width < 64 || width > 2048 || height < 64 || height > 2048) { alert('Image size must be between 64 and 2048'); return; } // Show loading state generateBtn.disabled = true; generateBtn.textContent = '⏳ Generating...'; resultEl.classList.add('show'); document.getElementById('z-image-status-container').style.display = 'flex'; errorEl.style.display = 'none'; previewEl.style.display = 'none'; actionsEl.style.display = 'none'; try { // 1. Create task statusTextEl.textContent = 'Creating generation task...'; const { uuid } = await generateImage(prompt, width, height); // 2. Poll status const result = await pollUntilComplete(uuid, (status) => { if (status.status === 'pending') { statusTextEl.textContent = `In queue, ${status.queuePosition} tasks ahead...`; } else if (status.status === 'processing') { statusTextEl.textContent = `Generating... ${status.progress}%`; } }); // 3. Show result document.getElementById('z-image-status-container').style.display = 'none'; previewEl.src = result.resultUrl; previewEl.style.display = 'block'; actionsEl.style.display = 'flex'; // Bind action buttons document.getElementById('z-image-download-btn').onclick = () => { window.open(result.resultUrl, '_blank'); }; document.getElementById('z-image-copy-btn').onclick = () => { GM_setClipboard(result.resultUrl); alert('Image link copied to clipboard!'); }; document.getElementById('z-image-new-btn').onclick = () => { resultEl.classList.remove('show'); previewEl.style.display = 'none'; actionsEl.style.display = 'none'; }; } catch (error) { console.error('Generation error:', error); document.getElementById('z-image-status-container').style.display = 'none'; errorEl.textContent = `❌ Generation failed: ${error.message}`; errorEl.style.display = 'block'; } finally { generateBtn.disabled = false; generateBtn.textContent = '✨ Generate Image for Free'; } } /** * Create context menu */ function createContextMenu() { const menu = document.createElement('div'); menu.id = 'z-image-context-menu'; menu.className = 'z-image-context-menu'; menu.innerHTML = `
🎨 Generate with Z-Image
`; document.body.appendChild(menu); // Bind click event menu.querySelector('[data-action="generate"]').onclick = () => { const selectedText = window.getSelection().toString().trim(); openModal(selectedText); menu.classList.remove('show'); }; // Click elsewhere to close menu document.addEventListener('click', () => { menu.classList.remove('show'); }); } /** * Show context menu */ function showContextMenu(e) { const selectedText = window.getSelection().toString().trim(); if (!selectedText) return; e.preventDefault(); const menu = document.getElementById('z-image-context-menu'); menu.style.left = e.pageX + 'px'; menu.style.top = e.pageY + 'px'; menu.classList.add('show'); } // ==================== Initialization ==================== function init() { // Create UI components createFloatButton(); createModal(); createContextMenu(); // Bind context menu document.addEventListener('contextmenu', showContextMenu); // Register userscript menu commands GM_registerMenuCommand('🎨 Open Z-Image Generator', () => openModal()); GM_registerMenuCommand('🌐 Visit Z-Image Website', () => { window.open('https://zimage.run', '_blank'); }); console.log('✅ Z-Image userscript loaded - No login required, free to use!'); } // Wait for DOM to load if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();