Xxx
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TikTok Video Downloader | Save Videos Without Watermark</title>
<meta name="description" content="Download TikTok videos without watermark in HD quality. Fast, free and easy to use TikTok downloader.">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root {
--primary-color: #25F4EE;
--secondary-color: #FE2C55;
--dark-color: #161823;
--light-color: #FFFFFF;
--gray-color: #F1F1F2;
--text-color: #333333;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background-color: var(--gray-color);
color: var(--text-color);
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
header {
text-align: center;
padding: 30px 0;
}
.logo {
font-size: 2.5rem;
font-weight: 700;
background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 10px;
}
.tagline {
color: var(--dark-color);
font-size: 1.1rem;
margin-bottom: 30px;
}
.download-form {
background-color: var(--light-color);
border-radius: 10px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
margin-bottom: 30px;
}
.form-group {
display: flex;
margin-bottom: 20px;
}
.url-input {
flex: 1;
padding: 15px;
border: 2px solid #ddd;
border-radius: 5px 0 0 5px;
font-size: 1rem;
outline: none;
transition: border-color 0.3s;
}
.url-input:focus {
border-color: var(--primary-color);
}
.submit-btn {
background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
color: white;
border: none;
padding: 0 25px;
border-radius: 0 5px 5px 0;
cursor: pointer;
font-size: 1rem;
font-weight: 600;
transition: opacity 0.3s;
}
.submit-btn:hover {
opacity: 0.9;
}
.submit-btn:disabled {
background: #cccccc;
cursor: not-allowed;
}
.result-container {
display: none;
background-color: var(--light-color);
border-radius: 10px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
margin-bottom: 30px;
}
.video-preview {
width: 100%;
max-width: 300px;
border-radius: 8px;
margin: 0 auto 20px;
display: block;
}
.video-info {
margin-bottom: 20px;
}
.video-title {
font-size: 1.2rem;
font-weight: 600;
margin-bottom: 10px;
}
.video-author {
display: flex;
align-items: center;
margin-bottom: 15px;
color: var(--dark-color);
}
.author-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
margin-right: 10px;
}
.download-options {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 15px;
}
.download-btn {
display: flex;
align-items: center;
justify-content: center;
background-color: var(--primary-color);
color: white;
padding: 12px;
border-radius: 5px;
text-decoration: none;
font-weight: 600;
transition: background-color 0.3s;
}
.download-btn:hover {
background-color: #20d8d2;
}
.download-btn i {
margin-right: 8px;
}
.no-watermark {
background-color: var(--secondary-color);
}
.no-watermark:hover {
background-color: #e51c48;
}
.how-to-use {
background-color: var(--light-color);
border-radius: 10px;
padding: 30px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.section-title {
font-size: 1.5rem;
margin-bottom: 20px;
color: var(--dark-color);
}
.steps {
list-style-type: none;
}
.steps li {
margin-bottom: 15px;
padding-left: 30px;
position: relative;
}
.steps li:before {
content: counter(step);
counter-increment: step;
position: absolute;
left: 0;
top: 0;
background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
color: white;
width: 22px;
height: 22px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
font-weight: bold;
}
.features {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
margin-top: 30px;
}
.feature-card {
background-color: var(--light-color);
border-radius: 8px;
padding: 20px;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
text-align: center;
}
.feature-icon {
font-size: 2rem;
margin-bottom: 15px;
background: linear-gradient(to right, var(--primary-color), var(--secondary-color));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.feature-title {
font-size: 1.1rem;
font-weight: 600;
margin-bottom: 10px;
}
footer {
text-align: center;
padding: 30px 0;
color: var(--dark-color);
font-size: 0.9rem;
}
.loading {
display: none;
text-align: center;
padding: 20px;
}
.spinner {
width: 40px;
height: 40px;
border: 4px solid rgba(0, 0, 0, 0.1);
border-radius: 50%;
border-top-color: var(--primary-color);
animation: spin 1s ease-in-out infinite;
margin: 0 auto 15px;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
.error-message {
color: #d32f2f;
background-color: #fde8e8;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
display: none;
}
@media (max-width: 768px) {
.form-group {
flex-direction: column;
}
.url-input {
border-radius: 5px;
margin-bottom: 10px;
}
.submit-btn {
border-radius: 5px;
padding: 15px;
}
.download-options {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="container">
<header>
<div class="logo">TikDownloader</div>
<p class="tagline">Download TikTok videos without watermark in HD quality</p>
</header>
<div class="download-form">
<div class="error-message" id="error-message"></div>
<div class="form-group">
<input type="url" id="tiktok-url" class="url-input" placeholder="Paste TikTok video URL here..." required>
<button type="button" id="download-btn" class="submit-btn">Download</button>
</div>
</div>
<div class="loading" id="loading">
<div class="spinner"></div>
<p>Processing your request...</p>
</div>
<div class="result-container" id="result-container">
<div class="video-info">
<video controls class="video-preview" id="video-preview"></video>
<h3 class="video-title" id="video-title"></h3>
<div class="video-author">
<img src="" alt="Author avatar" class="author-avatar" id="author-avatar">
<span id="author-name"></span>
</div>
</div>
<div class="download-options">
<a href="#" class="download-btn no-watermark" id="download-no-watermark">
<i class="fas fa-download"></i> Download Without Watermark
</a>
<a href="#" class="download-btn" id="download-with-watermark">
<i class="fas fa-download"></i> Download With Watermark
</a>
<a href="#" class="download-btn" id="download-audio">
<i class="fas fa-music"></i> Download Audio Only
</a>
</div>
</div>
<div class="how-to-use">
<h2 class="section-title">How to Download TikTok Videos</h2>
<ol class="steps">
<li>Copy the link of the TikTok video you want to download (from the app or website)</li>
<li>Paste the URL in the input field above</li>
<li>Click the "Download" button</li>
<li>Choose your preferred download option (with/without watermark)</li>
<li>Save the video to your device</li>
</ol>
<div class="features">
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-tachometer-alt"></i>
</div>
<h3 class="feature-title">Fast Processing</h3>
<p>Download videos in seconds with our high-speed servers</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-highlighter"></i>
</div>
<h3 class="feature-title">No Watermark</h3>
<p>Get clean videos without the TikTok logo or username</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-mobile-alt"></i>
</div>
<h3 class="feature-title">Mobile Friendly</h3>
<p>Works perfectly on all devices, including smartphones</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i class="fas fa-lock"></i>
</div>
<h3 class="feature-title">Secure</h3>
<p>We don't store your videos or personal information</p>
</div>
</div>
</div>
</div>
<footer>
<p>© 2023 TikDownloader. All rights reserved. This service is not affiliated with TikTok.</p>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function() {
const downloadBtn = document.getElementById('download-btn');
const tiktokUrl = document.getElementById('tiktok-url');
const resultContainer = document.getElementById('result-container');
const loading = document.getElementById('loading');
const errorMessage = document.getElementById('error-message');
// Video elements
const videoPreview = document.getElementById('video-preview');
const videoTitle = document.getElementById('video-title');
const authorName = document.getElementById('author-name');
const authorAvatar = document.getElementById('author-avatar');
// Download buttons
const downloadNoWatermark = document.getElementById('download-no-watermark');
const downloadWithWatermark = document.getElementById('download-with-watermark');
const downloadAudio = document.getElementById('download-audio');
downloadBtn.addEventListener('click', function() {
const url = tiktokUrl.value.trim();
if (!url) {
showError('Please enter a TikTok video URL');
return;
}
if (!isValidTikTokUrl(url)) {
showError('Please enter a valid TikTok video URL');
return;
}
// Show loading, hide results and error
loading.style.display = 'block';
resultContainer.style.display = 'none';
errorMessage.style.display = 'none';
// Process the URL (using TikWM API)
processTikTokUrl(url);
});
function isValidTikTokUrl(url) {
return /https?:\/\/(www\.|vm\.|vt\.)?tiktok\.com\/.+/i.test(url);
}
function showError(message) {
errorMessage.textContent = message;
errorMessage.style.display = 'block';
}
function processTikTokUrl(url) {
// In a real implementation, you would call your backend or the TikWM API here
// This is a mock implementation for demonstration purposes
// Simulate API delay
setTimeout(function() {
// Mock response - in a real app, this would come from the API
const mockResponse = {
success: true,
data: {
id: '123456789',
title: 'Example TikTok Video #fyp #viral',
author: {
name: 'tiktokuser',
avatar: 'https://example.com/avatar.jpg'
},
video: {
no_watermark: 'https://example.com/video_no_watermark.mp4',
with_watermark: 'https://example.com/video_with_watermark.mp4',
audio: 'https://example.com/audio.mp3'
},
cover: 'https://example.com/cover.jpg'
}
};
// Handle the response
if (mockResponse.success) {
displayVideoInfo(mockResponse.data);
} else {
showError('Failed to process the video. Please check the URL and try again.');
}
loading.style.display = 'none';
}, 1500);
}
function displayVideoInfo(videoData) {
// Set video preview
videoPreview.src = videoData.video.no_watermark;
videoPreview.poster = videoData.cover;
// Set video info
videoTitle.textContent = videoData.title;
authorName.textContent = `@${videoData.author.name}`;
authorAvatar.src = videoData.author.avatar;
authorAvatar.alt = videoData.author.name;
// Set download links
downloadNoWatermark.href = videoData.video.no_watermark;
downloadNoWatermark.setAttribute('download', `tiktok-${videoData.id}-no-watermark.mp4`);
downloadWithWatermark.href = videoData.video.with_watermark;
downloadWithWatermark.setAttribute('download', `tiktok-${videoData.id}-with-watermark.mp4`);
downloadAudio.href = videoData.video.audio;
downloadAudio.setAttribute('download', `tiktok-${videoData.id}-audio.mp3`);
// Show results
resultContainer.style.display = 'block';
}
// In a real implementation, you would need to:
// 1. Create a backend proxy to call the TikWM API (to avoid CORS issues)
// 2. Handle the actual API response
// 3. Implement proper error handling
// 4. Add analytics if needed
// 5. Consider adding rate limiting to prevent abuse
});
</script>
</body>
</html>