Cara Membuat Short Link / Safelink - Blogspot

Dokumentasi Short Link / Safelink - Blogspot

Dokumentasi lengkap cara menginstal dan mengkonfigurasi sistem short link dengan fitur random redirect page untuk memaksimalkan CPC iklan di Blogspot. Sistem ini menggunakan Google Apps Script sebagai database dan Google Spreadsheet sebagai penyimpan data.

LIVE DEMO

Lihat langsung bagaimana sistem bekerja:

Demo Halaman Pembuat Short Link Demo Blog Safelink

Klik tombol di atas untuk mencoba membuat short link secara langsung

Tampilan Halaman Pembuat Short Link
Tampilan Halaman Pembuat Short Link - User dapat memasukkan URL tujuan dan custom slug (opsional)
INTI SISTEM TIDAK BOLEH DIUBAH
Bagian core yang wajib dipertahankan: mekanisme timer 15 detik, validasi ID dari parameter URL, fetch ke Google Apps Script, dan redirect ke destination URL. Mengubah ketiga komponen ini akan merusak fungsi safelink.

Fitur Utama Sistem

Random Redirect Page

Sistem akan memilih 1 dari 5 halaman artikel secara acak untuk memaksimalkan CPC iklan

Timer 15 Detik

Waktu tunggu untuk memastikan pengunjung melihat konten dan iklan Anda

Database Google Sheets

Semua data short link tersimpan rapi dengan tracking klik

Custom Slug

Buat short link dengan kata kunci custom yang mudah diingat

Komponen Sistem

KomponenFungsi
Halaman Pembuat LinkForm untuk membuat short link baru
Halaman Safelink (5 halaman atau lebih)Halaman dengan timer 15 detik + konten artikel CPC tinggi, Anda bisa mengatur sendiri
Google Apps ScriptBackend API untuk menyimpan & mengambil data link
Google SpreadsheetTempat penyimpanan database link

Source Code 1: Google Apps Script (Backend)

Copy kode di bawah ini ke Google Apps Script. Ini adalah backend API yang menghubungkan spreadsheet dengan halaman website.
Code.gs
function doGet(e) {
  const action = e.parameter.action;
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  let result = { error: 'Invalid action' };

  try {
    if (action == 'create') {
      result = createShortLink(e, sheet);
    } else if (action == 'get') {
      result = getDestination(e, sheet);
    } else if (action == 'list') {
      result = listShortLinks(sheet);
    } else if (action == 'updateClick') {
      result = updateClickCount(e, sheet);
    }
  } catch (err) {
    result = { error: err.toString() };
  }

  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

function createShortLink(e, sheet) {
  const destination = e.parameter.destination;
  let id = e.parameter.slug || generateRandomId(6);
  
  const data = sheet.getDataRange().getValues();
  for (let i = 1; i < data.length; i++) {
    if (data[i][0] == id) return { error: 'Slug sudah digunakan' };
  }
  
  sheet.appendRow([id, destination, new Date().toISOString(), 0]);
  return { success: true, id: id };
}

function getDestination(e, sheet) {
  const id = e.parameter.id;
  const data = sheet.getDataRange().getValues();
  for (let i = 1; i < data.length; i++) {
    if (data[i][0] == id) return { success: true, destination: data[i][1] };
  }
  return { error: 'Link tidak ditemukan' };
}

function updateClickCount(e, sheet) {
  const id = e.parameter.id;
  const data = sheet.getDataRange().getValues();
  for (let i = 1; i < data.length; i++) {
    if (data[i][0] == id) {
      const currentClicks = parseInt(data[i][3] || 0);
      sheet.getRange(i + 1, 4).setValue(currentClicks + 1);
      return { success: true };
    }
  }
  return { error: 'ID tidak ditemukan' };
}

function listShortLinks(sheet) {
  const data = sheet.getDataRange().getValues();
  const links = data.slice(1).map(row => ({
    id: row[0],
    destination: row[1],
    created_at: row[2],
    clicks: row[3] || 0
  }));
  return { success: true, links: links.reverse() };
}

function generateRandomId(length) {
  const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < length; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

Source Code 2: Halaman Pembuat Short Link

Copy kode di bawah ini ke postingan atau halaman baru di Blogspot. Ini adalah halaman untuk membuat short link.
Halaman Pembuat Short Link
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Buat Short Link - High CPC Tool</title>
<style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: transparent; padding: 20px; }
    .container { max-width: 700px; margin: 0 auto; background: white; border-radius: 15px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); overflow: hidden; border: 1px solid #e0e0e0; }
    .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; }
    .header h1 { font-size: 28px; margin-bottom: 10px; }
    .content { padding: 30px; }
    .form-group { margin-bottom: 20px; }
    label { display: block; margin-bottom: 8px; font-weight: 600; color: #333; }
    input { width: 100%; padding: 12px; border: 2px solid #e0e0e0; border-radius: 8px; font-size: 16px; }
    input:focus { outline: none; border-color: #667eea; }
    .short-url { background: #f5f5f5; padding: 15px; border-radius: 8px; margin: 20px 0; display: none; }
    .short-url.show { display: block; }
    .url-text { font-size: 18px; color: #667eea; word-break: break-all; margin: 10px 0; font-weight: bold; }
    .url-text a { color: #667eea; text-decoration: none; }
    .url-text a:hover { text-decoration: underline; }
    button { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; padding: 14px 30px; border-radius: 8px; font-size: 16px; font-weight: 600; cursor: pointer; width: 100%; }
    button:hover { transform: translateY(-2px); }
    button:disabled { opacity: 0.6; cursor: not-allowed; transform: none; }
    .alert { padding: 12px; border-radius: 8px; margin-bottom: 20px; display: none; text-align: center; font-weight: bold; }
    .alert.error { background: #fee; color: #c33; border: 1px solid #fcc; display: block; }
    .alert.success { background: #efe; color: #3c3; border: 1px solid #cfc; display: block; }
    .info-text { font-size: 12px; color: #888; text-align: center; margin-top: 20px; padding: 10px; background: #f9f9f9; border-radius: 8px; }
</style>
</head>
<body>
<div class="container">
    <div class="header">
        <h1>Short Link Creator</h1>
        <p>Generate high-earning short links randomly</p>
    </div>
    <div class="content">
        <div class="alert" id="alert"></div>
        
        <div class="form-group">
            <label>URL Tujuan</label>
            <input type="url" id="destinationUrl" placeholder="https://example.com/your-article" required>
        </div>
        
        <div class="form-group">
            <label>Custom Slug (Opsional)</label>
            <input type="text" id="customSlug" placeholder="my-custom-link">
        </div>
        
        <button onclick="generateShortLink()" id="generateBtn">Buat Short Link</button>
        
        <div class="short-url" id="shortUrlResult">
            <strong>Link Berhasil Dibuat:</strong>
            <div class="url-text" id="shortUrlText"></div>
            <button onclick="copyToClipboard()" style="background: #607d8b;">Copy Link</button>
        </div>
        
        <div class="info-text">
            Sistem akan memilih 1 dari 5 halaman artikel secara acak untuk memaksimalkan CPC iklan.
        </div>
    </div>
</div>

<script>
// KONFIGURASI - SESUAIKAN DENGAN BLOG ANDA
const BLOG_URL = "https://namablog.blogspot.com/"; // GANTI DENGAN URL BLOG ANDA

const REDIRECT_PAGES = [
    "p/finance.html",      // GANTI dengan URL halaman safelink 1
    "p/health.html",       // GANTI dengan URL halaman safelink 2
    "p/tech.html",         // GANTI dengan URL halaman safelink 3
    "p/law.html",          // GANTI dengan URL halaman safelink 4
    "p/travel.html"        // GANTI dengan URL halaman safelink 5
];

const API_URL = "https://script.google.com/macros/s/xxxxxxxx/exec"; // GANTI DENGAN URL WEB APP ANDA

function getRandomPage() {
    return REDIRECT_PAGES[Math.floor(Math.random() * REDIRECT_PAGES.length)];
}

async function generateShortLink() {
    const destinationUrl = document.getElementById('destinationUrl').value;
    const customSlug = document.getElementById('customSlug').value;
    const generateBtn = document.getElementById('generateBtn');
    
    if (!destinationUrl) {
        showAlert('Masukkan URL tujuan!', 'error');
        return;
    }
    
    try { 
        new URL(destinationUrl); 
    } catch(e) {
        showAlert('URL tidak valid!', 'error');
        return;
    }
    
    generateBtn.disabled = true;
    generateBtn.innerHTML = 'Membuat...';
    
    let url = `${API_URL}?action=create&destination=${encodeURIComponent(destinationUrl)}`;
    if (customSlug) url += `&slug=${encodeURIComponent(customSlug)}`;
    
    try {
        const response = await fetch(url);
        const result = await response.json();
        
        if (result.error) {
            showAlert(result.error, 'error');
        } else if (result.success) {
            const selectedPage = getRandomPage();
            const shortUrl = `${BLOG_URL}${selectedPage}?id=${result.id}`;
            
            document.getElementById('shortUrlText').innerHTML = `<a href="${shortUrl}" target="_blank">${shortUrl}</a>`;
            document.getElementById('shortUrlResult').classList.add('show');
            showAlert('Berhasil!', 'success');
            
            document.getElementById('destinationUrl').value = '';
            document.getElementById('customSlug').value = '';
        }
    } catch (error) {
        console.error("Error:", error);
        showAlert('Gagal terhubung ke database!', 'error');
    } finally {
        generateBtn.disabled = false;
        generateBtn.innerHTML = 'Buat Short Link';
    }
}

function copyToClipboard() {
    const urlText = document.getElementById('shortUrlText').innerText;
    navigator.clipboard.writeText(urlText).then(() => showAlert('Link disalin!', 'success'));
}

function showAlert(message, type) {
    const alertDiv = document.getElementById('alert');
    alertDiv.textContent = message;
    alertDiv.className = 'alert ' + type;
    setTimeout(() => { 
        alertDiv.className = 'alert'; 
    }, 3000);
}
</script>
</body>
</html>

Source Code 3: Halaman Safelink (Timer + Artikel)

Copy kode di bawah ini ke 5 halaman berbeda di Blogspot. Ganti konten artikel dan link afiliasi sesuai niche Anda. Buat 5 halaman dengan konten berbeda.
Halaman Safelink (copy ke finance.html, health.html, tech.html, law.html, travel.html)
<div class="main-wrapper">
    <div class="card">
        <div class="waiting-box">
            <div id="loader"><p>Initialising Security Protocol...</p></div>
            <div id="content" style="display: none;">
                <center>
                    <h3>Case File Verification</h3>
                </center>
                <div class="timer-circle">
                    <svg width="90" height="90" viewBox="0 0 100 100">
                        <circle class="ring-bg" cx="50" cy="50" r="45"/>
                        <circle class="ring-circle" id="circle" cx="50" cy="50" r="45" stroke-dasharray="282.7" stroke-dashoffset="282.7"/>
                    </svg>
                    <div class="timer-num" id="timer">15</div>
                </div>
                <center>
                    <button class="btn btn-step1" id="btn1" onclick="doScroll()">Please wait for review...</button>
                </center>
            </div>
        </div>
    </div>

    <article class="article-body"><br>
        <!-- GANTI KONTEN ARTIKEL DI BAWAH INI SESUAI NICHE ANDA -->
        <h1>Understanding Personal Injury Law and Legal Representation</h1><br>
        <p>Navigating the complex landscape of <strong>Personal Injury Law</strong> can be a daunting task for individuals who have suffered harm due to the negligence of others. Whether it is a <strong>car accident</strong>, workplace injury, or medical malpractice, seeking professional <strong>legal representation</strong> is the first step toward securing the compensation you rightfully deserve. A qualified <strong>attorney</strong> specializes in tort law, ensuring that the victim's rights are protected against powerful insurance companies and corporate entities.</p>
<br>
        <h2>The Importance of an Experienced Trial Lawyer</h2><br>
        <p>In high-stakes litigation, the expertise of a seasoned <strong>trial lawyer</strong> cannot be overstated. From gathering evidence to negotiating settlements, a dedicated <strong>law firm</strong> provides the necessary resources to build a compelling case. Many victims hesitate to seek <strong>legal advice</strong> due to concerns over costs; however, most <strong>personal injury lawyers</strong> operate on a contingency fee basis. This means they only receive payment if they win your case, making justice accessible to everyone regardless of their financial status.</p>
<br>
        <p>Moreover, specialized fields such as <strong>mesothelioma litigation</strong>, product liability, or <strong>commercial truck accidents</strong> require deep technical knowledge. An expert <strong>lawyer</strong> will meticulously analyze medical records, accident reports, and witness testimonies to establish liability. In many instances, having a reputable <strong>legal counsel</strong> can lead to out-of-court settlements that are significantly higher than the initial offers made by insurance adjusters who often aim to minimize payouts.</p>
<br>
        <h2>Strategic Legal Planning and Consultation</h2><br>
        <p>Effective <strong>legal consultation</strong> involves a thorough assessment of the damages incurred, including medical expenses, lost wages, and emotional distress. Beyond immediate compensation, a comprehensive <strong>legal strategy</strong> accounts for future rehabilitation costs and long-term disability. Engaging a <strong>lawyer</strong> early in the process prevents common pitfalls, such as missing statutory deadlines or providing statements that could inadvertently jeopardize your claim. Professional attorneys act as a shield, handling all communications with third parties so that the victim can focus entirely on their recovery and physical well-being.</p>
        <br>
        <p>Furthermore, the legal landscape is constantly shifting with new precedents and regulations. A <strong>litigation expert</strong> stays updated on these changes to provide the most accurate advice. They also understand the psychological toll a legal battle can take. By offering compassionate yet firm guidance, they help clients navigate the emotional hurdles of the courtroom. Whether it's through mediation, arbitration, or a full jury trial, your legal team ensures that your voice is heard and that corporate negligence is held accountable under the full extent of the law.</p>
<br>
        <ul>
            <li><strong>Medical Malpractice:</strong> Holding healthcare providers accountable for errors and negligence.</li>
            <li><strong>Wrongful Death:</strong> Seeking justice for families after a tragic and preventable loss.</li>
            <li><strong>Product Liability:</strong> Suing manufacturers for defective, dangerous, or poorly labelled products.</li>
            <li><strong>Class Action Lawsuits:</strong> Joining forces with other victims to challenge corporate misconduct.</li>
        </ul>
<br>
        <h2>Maximising Settlement Value and Future Security</h2><br>
        <p>The goal of any <strong>personal injury claim</strong> is to restore the victim's life to the state it was in before the accident occurred. While money cannot replace health or a loved one, it provides the financial security needed to manage the aftermath. Experienced <strong>counsel</strong> will work with financial experts to calculate the "present value" of your future losses, ensuring that inflation and medical cost increases are considered. This level of detail is what separates a standard settlement from one that provides true lifelong security. Always remember that insurance companies have teams of lawyers working for them; you deserve a powerful legal team working for you.</p>
        <!-- SAMPAI SINI KONTEN ARTIKEL YANG DIGANTI -->
    </article>

    <div id="finalArea" style="padding: 30px; text-align: center; margin-top: 25px;">
        <h3>Case Verification Complete</h3>
        <p style="margin-bottom:20px;">Authentication successful. You may now proceed to your requested destination.</p>
        
        <!-- GANTI LINK ADS DI BAWAH INI -->
        <div style="margin: 20px auto; padding: 25px; border: 3px solid #e74c3c; border-radius: 16px; max-width: 350px; background: linear-gradient(135deg, #ffffff 0%, #fff5f5 100%); box-shadow: 0 8px 20px rgba(0,0,0,0.15);">
            <a href="https://your-ads-link.com" target="_blank" rel="noopener noreferrer" style="display: inline-block; padding: 14px 28px; background: linear-gradient(135deg, #c0392b 0%, #e74c3c 100%); color: white; text-decoration: none; border-radius: 50px; font-weight: bold; font-size: 20px; box-shadow: 0 4px 12px rgba(0,0,0,0.2);">
                DOWNLOAD HERE
            </a>
            <p style="font-size: 13px; margin-top: 15px; color: #c0392b; font-weight: bold; background: #fed7d7; display: inline-block; padding: 5px 15px; border-radius: 20px;">Secure Legal Gateway • Instant Access</p>
        </div>
        <!-- SAMPAI SINI GANTI LINK ADS -->
        
        <button id="btn2" onclick="go()" style="display: none; padding: 12px 24px; margin-top: 20px; cursor: pointer; background: #2c3e50; color: white; border: none; border-radius: 8px; font-weight: bold;">
            Proceed to Destination
        </button>
        <div id="err" style="display:none; color: red; margin-top: 15px; font-weight: bold;"></div>
    </div>
</div>

<style>
    /* CSS FOR FUNCTION ONLY */
    .timer-circle { width: 90px; height: 90px; margin: 20px auto; position: relative; }
    .timer-num { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 26px; font-weight: bold; color: #e74c3c; }
    svg { transform: rotate(-90deg); }
    .ring-circle { transition: stroke-dashoffset 0.1s; stroke: #e74c3c; stroke-width: 6; fill: none; }
    .ring-bg { stroke: #e2e8f0; stroke-width: 6; fill: none; }
    .btn { border: none; padding: 12px 24px; border-radius: 8px; font-size: 16px; font-weight: bold; cursor: pointer; transition: all 0.3s; display: inline-block; }
    .btn-step1 { background: #cbd5e1; color: #475569; opacity: 0.6; pointer-events: none; border: none; }
    .btn-step1.active { background: #2c3e50; color: white; opacity: 1; pointer-events: auto; }
    .main-wrapper { max-width: 800px; margin: 0 auto; padding: 20px; }
    .waiting-box { padding: 20px; text-align: center; }
    .card, .article-body, #finalArea { background: transparent; }
</style>

<script>
const API = "https://script.google.com/macros/s/xxxxxxxx/exec"; // GANTI DENGAN URL WEB APP ANDA
let t = 15; 
let u = "";
let timerActive = false;

async function init(){
    const p = new URLSearchParams(window.location.search);
    const i = p.get('id');
    if(!i){showErr("Invalid Access ID."); return;}

    document.getElementById('loader').style.display = 'none';
    document.getElementById('content').style.display = 'block';
    start();

    try {
        const r = await fetch(`${API}?action=get&id=${i}`);
        const d = await r.json();
        if(d.success && d.destination){ 
            u = d.destination; 
            fetch(`${API}?action=updateClick&id=${i}`).catch(e=>{}); 
        } else {
            showErr("Link has expired or was not found.");
        }
    } catch(e){
        console.log("Fetch error, but timer continues...");
    }
}

function start(){
    if(timerActive) return;
    timerActive = true;
    const c = document.getElementById('circle'); 
    const step = 282.7;
    const b = document.getElementById('btn1');

    const iv = setInterval(()=>{
        t--; 
        document.getElementById('timer').textContent = t;
        c.style.strokeDashoffset = step - (t/15)*step;
        
        if(t <= 0){ 
            clearInterval(iv); 
            document.getElementById('timer').textContent = "OK";
            b.innerHTML = "Scroll to Bottom"; 
            b.classList.add('active'); 
        }
    }, 1000);
}

function doScroll(){ 
    document.getElementById('finalArea').scrollIntoView({ behavior: 'smooth' }); 
    document.getElementById('btn2').style.display = 'inline-block'; 
}

function go(){ 
    if(u) {
        window.location.replace(u.startsWith('http') ? u : 'https://' + u); 
    } else {
        alert("The secure link is still being fetched. Please wait a moment.");
    }
}

function showErr(m){ 
    document.getElementById('loader').style.display = 'none'; 
    document.getElementById('content').style.display = 'none';
    const e = document.getElementById('err'); 
    e.style.display = 'block'; 
    e.innerHTML = m; 
}

init();
</script>

Langkah 1: Persiapan Google Spreadsheet

1 Buka Google Sheets dan buat spreadsheet baru.
2 Beri nama "ShortLink Database".
3 Buat header kolom di Baris 1 dengan susunan:
|   A   |        B        |        C        |   D   |
|  ID   |   destination   |   created_at    | clicks|
Kolom ID akan berisi slug unik, destination adalah URL tujuan akhir, created_at otomatis terisi timestamp, clicks untuk menghitung jumlah klik.

Langkah 2: Deploy Google Apps Script

1 Di spreadsheet yang sama, klik menu Extensions -> Apps Script.
2 Hapus kode default, copy-paste Source Code 1 (Google Apps Script) di atas.
3 Klik Save dan beri nama project "ShortLink API".
4 Klik Deploy -> New deployment.
5 Pilih type "Web app", isi:
  • Execute as: Me (your email)
  • Who has access: Anyone
6 Klik Deploy dan izinkan akses.
7 Copy URL Web App yang dihasilkan.
JANGAN LUPA! Setiap kali ada perubahan pada kode GAS, Anda harus melakukan New deployment ulang agar perubahan berlaku.

Langkah 3: Membuat Halaman Postingan Safelink (Minimal 5 Halaman)

ANDA HARUS MEMBUAT MINIMAL 5 HALAMAN POSTINGAN dengan struktur kode yang SAMA PERSIS, hanya berbeda konten artikelnya.

Cara membuat di Blogspot:

1 Dashboard Blogger -> Halaman -> Halaman Baru.
2 Buat 5 halaman dengan judul berbeda (Finance, Health, Tech, Legal, Travel).
3 Pada masing-masing halaman, masuk ke mode HTML.
4 Copy-paste Source Code 3 (Halaman Safelink) di atas.
5 GANTI KONTEN ARTIKEL sesuai niche masing-masing.
6 GANTI LINK ADS pada bagian tombol.
7 GANTI API_URL dengan URL Web App Anda.
8 Terbitkan halaman. Catat URL kelima halaman tersebut.

Langkah 4: Membuat Halaman Pembuat Short Link

1 Buat Postingan Baru di Blogspot.
2 Buka mode HTML, copy-paste Source Code 2 (Halaman Pembuat Short Link) di atas.
3 Sesuaikan konfigurasi:
  • BLOG_URL - ganti dengan URL blog Anda
  • REDIRECT_PAGES - ganti dengan URL 5 halaman safelink yang sudah dibuat
  • API_URL - ganti dengan URL Web App dari Google Apps Script
4 Terbitkan halaman.

Flow Sistem (Cara Kerja)

1. Pengunjung mengisi form di Halaman Pembuat Link
   |
   v
2. Data dikirim ke Google Apps Script -> tersimpan di Spreadsheet
   |
   v
3. Sistem memilih 1 dari 5 halaman safelink secara RANDOM
   |
   v
4. Short link dihasilkan: https://blog.com/p/finance.html?id=abc123
   |
   v
5. Pengunjung klik short link -> masuk halaman safelink
   |
   v
6. Timer 15 detik berjalan + konten artikel CPC tinggi
   |
   v
7. Setelah timer habis, tombol scroll muncul
   |
   v
8. Scroll ke bawah -> tombol "Proceed to Destination" muncul
   |
   v
9. Klik tombol -> redirect ke URL tujuan + mencatat klik
FITUR RANDOM PAGE: Setiap short link yang dibuat akan mengarahkan ke SALAH SATU dari halaman safelink secara acak. Ini memaksimalkan exposure konten CPC Anda.

Yang Harus Anda Ganti Sendiri

Berikut adalah bagian-bagian yang WAJIB Anda ganti dengan milik sendiri:
LokasiYang DigantiKeterangan
Source Code 1 (GAS)Tidak perlu ganti apa-apaLangsung copy-paste
Source Code 2BLOG_URLGanti dengan URL blog Anda
Source Code 2REDIRECT_PAGESGanti dengan URL 5 halaman safelink Anda
Source Code 2 & 3API_URLGanti dengan URL Web App dari GAS
Source Code 3Konten artikelSesuaikan dengan niche Anda
Source Code 3Link afiliasi/ADSGanti dengan link Anda sendiri

Troubleshooting & Solusi

MasalahSolusi
Error "Slug sudah digunakan"Custom slug sudah dipakai, biarkan kosong atau gunakan slug lain
Error "Gagal terhubung ke database"Periksa API_URL di semua halaman, pastikan sudah benar dan redeploy GAS
Timer tidak berjalanPastikan kode JavaScript tidak error, cek console browser (F12)
Link tidak redirect setelah klikPeriksa destination URL di spreadsheet, pastikan formatnya valid
Halaman safelink tidak munculPastikan URL di REDIRECT_PAGES sudah benar dan halaman sudah dipublish
Data tidak tersimpanCek izin akses Google Apps Script -> Deploy dengan "Anyone"

KESIMPULAN
Sistem short link ini sudah siap pakai. Ikuti langkah-langkah di atas:
1. Buat Google Spreadsheet + deploy Google Apps Script (Source Code 1)
2. Buat 5 halaman safelink (Source Code 3) - ganti konten artikel dan link ads
3. Buat 1 halaman pembuat link (Source Code 2) - ganti konfigurasi

Dengan randomisasi halaman berbeda, CPC iklan Anda akan lebih maksimal.

Dokumentasi Sistem Short Link / Safelink - Simpan untuk referensi
Core system protected - jangan ubah bagian kritis yang sudah ditandai

Cara Membuat Website Portofolio Profesional Modern - Tutorial Lengkap

Cara Membuat Website Portofolio Profesional Modern (Dark Mode, Animasi, Loading Bar) Tanpa Coding Ribet

Tutorial lengkap untuk pemula | Bisa diedit sendiri | Gratis 100%

PENTING UNTUK DIPERHATIKAN:
• Source code lengkap bisa diambil dari https://xiagame.github.io/demo-portofolio (klik kanan -> save as atau lihat source)
• Website ini sudah memiliki fitur Dark Mode, Loading Bar, Scroll To Top, Animasi AOS, Navbar Glassmorphism.
• Tidak perlu menginstal apapun, cukup copy-paste kode HTML ke file index.html atau postingan blog (mode HTML).
Jangan lupa ganti nama, foto, deskripsi, dan link sosial media dengan data Anda sendiri.

Demo Website Portofolio

Berikut adalah tampilan dari website yang akan Anda buat. Klik tombol di bawah untuk mengunjungi demo langsung.

Screenshot Website Portofolio Modern
Tampilan website portofolio dengan fitur Dark Mode, navbar glassmorphism, dan animasi modern
Kunjungi Demo Langsung →

Dokumentasi Lengkap Website Portofolio

Dokumentasi ini akan membantu Anda memahami struktur, fitur, dan cara mengedit setiap bagian dari website portofolio.

Struktur File

Website ini hanya terdiri dari SATU file HTML (index.html). Semua style CSS dan JavaScript sudah berada di dalam file yang sama. Berikut struktur utamanya:

<!DOCTYPE html> <html> <head> <!-- Meta tags, Bootstrap 5 CSS, Fonts, AOS CSS --> </head> <body> <!-- Loading Bar --> <!-- Navbar Modern --> <!-- Hero Section --> <!-- Tentang Saya --> <!-- Keahlian --> <!-- Pengalaman --> <!-- Proyek --> <!-- Kontak --> <!-- Footer + Credit --> <!-- Scroll To Top Button --> <!-- Scripts (Bootstrap, AOS, custom JS) --> </body> </html>

Fitur dan Cara Kerjanya

  • Dark Mode: Tombol di navbar untuk mengaktifkan mode gelap. Preferensi tersimpan di local storage browser sehingga tidak hilang saat refresh.
  • Loading Bar: Progress bar di bagian atas halaman yang bergerak sesuai posisi scroll.
  • Scroll To Top: Tombol bulat di pojok kanan bawah yang muncul setelah scroll melewati 300px.
  • Animasi AOS: Library Animate on Scroll memberikan efek fade, flip, zoom saat elemen masuk ke viewport.
  • Navbar Glassmorphism: Background transparan dengan efek blur, border tipis, dan menyusut saat scroll.
  • Responsive: Menggunakan Bootstrap 5 grid system, tampilan optimal di semua ukuran layar.

Panduan Mengedit Setiap Bagian

1. Mengganti Nama & Profesi

Cari kode berikut di dalam file HTML:

<h1 class="hero-title">Bima Sakti<br><span class="highlight">Fullstack Creative</span></h1>

Ganti "Bima Sakti" dengan nama Anda, dan "Fullstack Creative" dengan profesi Anda.

2. Mengganti Foto Profil

Cari kode:

<img src="https://randomuser.me/api/portraits/men/68.jpg" alt="Profile" class="profile-img">

Ganti URL dengan link foto Anda sendiri. Bisa upload ke hosting gambar gratis seperti ImgBB, Postimages, atau Google Drive.

3. Mengedit Teks Tentang Saya

Cari section dengan id "tentang":

<h2 class="section-title">Tentang Saya</h2> <p class="lead fs-5 text-secondary mt-3">Penyihir kode dengan 7 tahun pengalaman...</p> <p>Saya memulai karir sebagai back-end developer...</p>

Ubah paragraf sesuai dengan latar belakang dan pengalaman Anda.

4. Mengedit Keahlian (Skills)

Setiap skill berada dalam card dengan class "card-skill":

<div class="card-skill p-4 text-center h-100"> <i class="bi bi-bootstrap-fill skill-icon"></i> <h5 class="mt-3 fw-bold">Bootstrap 5</h5> <p class="small text-secondary">Responsive & Utility</p> </div>

Anda bisa copy-paste block ini untuk menambah skill baru. Ganti icon dengan class Bootstrap Icons (bi-*), judul, dan deskripsi.

5. Mengedit Pengalaman Kerja

Setiap pengalaman menggunakan class "timeline-item":

<div class="timeline-item"> <div class="d-flex justify-content-between flex-wrap"> <h4 class="fw-bold">Lead Frontend Engineer</h4> <span class="badge bg-primary bg-opacity-10 text-primary px-3 py-1">2023-Sekarang</span> </div> <p class="text-muted mt-2"><i class="bi bi-building"></i> Inovasi Digital, Jakarta</p> <p>Memimpin tim 5 developer...</p> </div>
6. Mengedit Proyek

Proyek menggunakan class "card-project":

<div class="card-project p-3 h-100"> <img src="https://placehold.co/600x400/e2e8f0/3b82f6?text=Analytics+Dashboard" class="project-img mb-3"> <h5 class="fw-bold">Smart Dashboard</h5> <p class="small text-secondary">Platform analitik realtime...</p> <span class="badge bg-light text-dark me-1">Bootstrap</span> <span class="badge bg-light text-dark">Chart.js</span> </div>

Ganti gambar, judul, deskripsi, dan teknologi yang digunakan.

7. Mengedit Kontak & Sosial Media

Cari di section "kontak":

<div class="col-md-6 mb-3"> <i class="bi bi-envelope-fill text-primary me-2"></i> <strong>Email</strong><br>bima@creativelab.id </div>

Untuk sosial media, cari:

<a href="#" class="social-icon"><i class="bi bi-github"></i></a>

Ganti "#" dengan link profil GitHub, LinkedIn, Instagram, atau Twitter Anda.

8. Mengganti Warna Tema

Cari kode CSS di bagian :root (sekitar baris 20-35):

:root { --primary: #3b82f6; /* Biru - warna utama */ --primary-dark: #2563eb; --secondary: #8b5cf6; /* Ungu */ --accent: #ec489a; /* Pink */ --success: #10b981; /* Hijau */ --warning: #f59e0b; /* Oranye */ }

Ganti kode hex dengan warna solid favorit Anda. Contoh warna solid populer:

  • Merah: #ef4444
  • Hijau: #22c55e
  • Biru Tua: #1e40af
  • Ungu: #a855f7
  • Oranye: #f97316
9. Footer & Credit

Jangan hapus baris credit pembuat:

<p class="mb-0">Kredit Pembuat: <a href="https://webs3tools.blogspot.com" target="_blank" class="credit-link">webs3tools.blogspot.com</a></p>

Library yang Digunakan

LibraryFungsiCDN
Bootstrap 5Layout responsif, komponen UIhttps://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css
Bootstrap IconsIkon-ikon modernhttps://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css
AOS (Animate on Scroll)Animasi saat scrollhttps://unpkg.com/aos@2.3.1/dist/aos.css
Google Fonts (Inter)Font modernhttps://fonts.googleapis.com/css2?family=Inter:wght@300..800

Semua library diambil dari CDN, sehingga Anda tidak perlu mengunduh apapun. Pastikan koneksi internet aktif.

Struktur Warna per Section

Setiap section memiliki warna aksen berbeda untuk tampilan yang tidak monoton:

  • Tentang Saya → Warna Ungu (secondary)
  • Keahlian → Warna Hijau (success)
  • Pengalaman → Warna Oranye (warning)
  • Proyek → Warna Pink (accent)
  • Kontak → Warna Biru (primary)

Langkah-Langkah Membuat Website Portofolio

1 Ambil Source Code

Buka tautan https://xiagame.github.io/demo-portofolio. Klik kanan pada halaman, pilih View Page Source atau Save As. Salin semua kode HTML ke editor teks (Notepad, VS Code, atau editor online).

<!DOCTYPE html> <html> ... seluruh kode website ... </html>
2 Edit Konten Pribadi

Buka file HTML dengan teks editor. Gunakan panduan dokumentasi di atas untuk mengganti setiap bagian (nama, foto, deskripsi, skill, pengalaman, proyek, kontak).

Tips: Gunakan fitur "Find" (Ctrl+F) untuk mencari teks dengan cepat. Semua bagian sudah diberi komentar HTML <!-- --> untuk memudahkan navigasi.
3 Uji Coba di Lokal

Simpan file sebagai index.html. Buka menggunakan browser (double klik). Pastikan semua fitur berjalan: Dark Mode, tombol scroll, animasi, dan tampilan responsif. Coba buka di HP atau gunakan mode developer browser (F12) untuk simulasi perangkat mobile.

4 Upload ke Hosting

Anda bisa memilih hosting gratis seperti Netlify, Vercel, GitHub Pages, atau menggunakan hosting berbayar untuk domain sendiri.

Rekomendasi Hosting Terbaik untuk Website Portofolio Anda

Hostinger - Hosting Cepat dan Terjangkau

Dapatkan performa tinggi, sertifikat SSL gratis, dan dukungan 24/7 untuk website portofolio Anda.

Kelebihan Hostinger:

  • Kecepatan loading tinggi dengan server di 4 benua
  • Gratis domain dan SSL
  • Panel kontrol hPanel yang mudah dipakai
  • Garansi 99,9% uptime
  • Harga mulai dari Rp19.900/bulan
  • Dukungan customer service 24/7 bahasa Indonesia

Dapatkan Diskon Khusus di Sini →

Gunakan kode referral YCXYADOMIJ0I untuk harga spesial

Panduan Khusus: Memasang di Blogspot (Blogger)

Anda juga bisa menjadikan halaman ini sebagai postingan atau halaman statis di Blogspot. Caranya:

  1. Buka Blogger Dashboard → Halaman → Buat Halaman Baru.
  2. Klik mode HTML (bukan Compose).
  3. Copy seluruh kode HTML dari index.html yang sudah Anda edit.
  4. Tempelkan ke editor HTML, lalu publikasikan.
  5. Pastikan tidak ada konflik CSS dengan template blog (kode di atas sudah aman karena menggunakan class spesifik .tutorial-container dan tidak mengubah elemen global).

Perbandingan Dengan Template Biasa

FiturTemplate IniTemplate Biasa
Dark ModeAda + tersimpanJarang ada
Animasi ScrollYa (AOS)Tidak atau manual
Loading BarYaTidak
Responsif MobileSempurnaBervariasi
Mudah DieditDokumentasi lengkapSulit dipahami

Kesimpulan

Dengan mengikuti tutorial ini, Anda sudah berhasil memiliki website portofolio modern yang siap dibagikan ke klien, recruiter, atau teman-teman. Template ini bisa diedit kapan saja dan gratis selamanya. Jangan lupa untuk selalu mencantumkan sumber atau credit pembuat sesuai lisensi.

Jika ada kendala atau pertanyaan, silakan kunjungi webs3tools.blogspot.com untuk mendapatkan update dan tutorial tambahan.


Tutorial dibuat oleh webs3tools.blogspot.com | Source code original: xiagame.github.io/demo-portofolio | Referral Hostinger: YCXYADOMIJ0I

Next Update Galeri Foto Cloud dengan Google Apps Script

Next Update Galeri Foto Cloud dengan Google Apps Script

Galeri foto berbasis Google Apps Script memang sederhana dan gratis. Tapi biar pengguna betah, kamu perlu tambahan fitur. Berikut 9 fitur yang bisa bikin galeri fotomu makin hidup dan disukai banyak orang.


Daftar Isi



1. Random Foto Button


Tombol yang menampilkan foto secara acak dari seluruh koleksi. Pengguna cukup klik sekali, langsung dapat foto random. Cocok buat yang suka kejutan atau lagi bosen lihat foto-foto yang itu-itu aja.


Kelebihan: Pengguna jadi betah karena penasaran foto apa yang bakal muncul berikutnya. Tombol ini gampang dibuat dan langsung terasa manfaatnya.


2. I'm Feeling Lucky


Mirip tombol keberuntungannya Google. Bedanya, fitur ini langsung membuka foto di tab baru tanpa preview. Pengguna nggak perlu buka modal dulu, langsung diarahkan ke foto aslinya.


Kelebihan: Cepat dan simpel. Cocok untuk pengguna mobile yang malah banyak klik. Satu klik langsung lihat foto full size.



Halaman khusus yang menampilkan foto-foto paling populer. Bedanya dengan sorting biasa, trending page pakai algoritma yang mempertimbangkan waktu. Jadi foto lama yang masih rame dilihat tetap bisa masuk, sementara foto baru yang viral langsung naik ke atas.


Kelebihan: Konten bagus nggak tenggelam. Pengguna juga jadi semangat upload karena ada kesempatan fotonya masuk trending.


4. Report System dengan Auto-Hide


Sistem pelaporan konten tidak pantas. Setiap foto punya tombol "Laporkan". Jika sebuah foto mendapat 3 laporan dari pengguna berbeda, foto otomatis disembunyikan dari galeri. Nggak perlu admin, komunitas yang menjaga.


Kelebihan: Galeri tetap bersih tanpa perlu moderasi manual. Pengguna merasa dilibatkan dalam menjaga kualitas konten.


5. Community Voting


Fitur like dan dislike. Pengguna bisa memberi upvote atau downvote pada setiap foto. Foto dengan banyak upvote akan tampil lebih atas, sementara foto dengan banyak downvote bisa tenggelam otomatis.


Kelebihan: Komunitas yang menentukan konten mana yang bagus. Kurasi berjalan alami tanpa campur tangan admin.


6. Image Compression Preview


Sebelum upload, pengguna bisa melihat perbandingan ukuran file asli vs setelah dikompres ke WebP. Biasanya tampil info seperti: "Original 2.5MB, WebP 0.8MB, hemat 68%".


Kelebihan: Pengguna jadi sadar pentingnya kompresi gambar. Mereka juga nggak kaget kalau fotonya jadi lebih kecil dari aslinya.


7. Download with Custom Size


Fitur download dengan pilihan ukuran. Pengguna bisa memilih mau download versi original, ukuran 800px, atau 400px. Cukup pilih dari dropdown lalu klik download.


Kelebihan: Pengguna mobile bisa hemat kuota dengan download versi kecil. Yang butuh kualitas tinggi tetap bisa ambil versi original.


8. Recent Uploads Badge


Label "NEW" yang muncul di foto yang diupload kurang dari 24 jam. Tampilannya kecil dan warna mencolok (biasanya orange atau hijau) di samping nama file.


Kelebihan: Pengguna langsung tahu ada konten baru. Foto dengan label NEW biasanya 40% lebih sering diklik.


9. Max File Size & Dimension


Batasan ukuran file dan dimensi gambar yang boleh diupload. Contoh: maksimal 3MB per file, dan resolusi maksimal 2048x2048px. Jika pengguna upload file lebih besar, sistem akan menolak dan memberi peringatan.


Kelebihan: Melindungi penyimpanan Google Drive dari pemborosan. Juga memastikan semua foto yang tampil punya ukuran wajar, nggak ada yang super besar bikin loading lama.


Penutup


Itulah 9 fitur yang bisa kamu tambahkan ke galeri foto tanpa login. Nggak harus semuanya dipasang sekaligus. Mulai dari yang paling mudah dulu: Random Foto Button, Recent Uploads Badge, dan Max File Size. Setelah itu baru tambahin fitur lain bertahap.


Pengalaman saya, setelah menambahkan fitur-fitur ini, pengguna jadi lebih sering balik lagi. Mereka nggak cuma upload dan pergi, tapi juga lihat-lihat, vote, lapor, dan download. Galeri jadi lebih hidup meskipun tanpa sistem login.


Selamat mencoba!


Panduan Lengkap Membuat Galeri Foto Cloud dengan Google Apps Script

Pendahuluan

Membangun sebuah web galeri foto cloud sendiri kini menjadi sangat mungkin tanpa perlu mengeluarkan biaya untuk hosting atau server. Dengan memanfaatkan layanan gratis dari Google, yaitu Google Apps Script, Anda dapat membuat sebuah sistem penyimpanan dan tampilan foto yang powerful. Artikel ini akan memandu Anda langkah demi langkah untuk membuat galeri foto cloud dengan Google Apps Script yang dapat diintegrasikan ke dalam blog atau website Anda. Sistem ini memungkinkan pengunjung untuk mengunggah foto dan melihat galeri tanpa perlu login, sangat cocok untuk blog pribadi, portofolio komunitas, atau proyek open source. Pengalaman langsung dalam mengimplementasikan kode ini menunjukkan bahwa solusi ini tidak hanya gratis tetapi juga handal dan mudah disesuaikan.

Demo Langsung: Anda bisa melihat hasil akhir dari tutorial ini di halaman demo galeri foto (klik disini). Source code ini bersifat open source, dapat digunakan di mana saja (Blogspot, WordPress, HTML statis, dll).

Source Code Lengkap - Klik untuk tampilkan/sembunyikan

Mengapa Memilih Google Apps Script untuk Galeri Cloud?


Google Apps Script (GAS) adalah platform pengembangan kode berbasis cloud yang sangat terintegrasi dengan ekosistem Google. Keahlian dalam memanfaatkan GAS dapat menghemat biaya infrastruktur secara signifikan. Berikut adalah beberapa alasan mengapa membuat galeri foto cloud dengan Google Apps Script menjadi pilihan tepat:


  • Gratis Sepenuhnya: Tidak ada biaya untuk hosting, database, atau bandwidth hingga batas tertentu (cocok untuk skala kecil hingga menengah).
  • Tanpa Login: Web app yang dideploy bisa diakses publik, sehingga siapa pun bisa upload dan melihat galeri.
  • Mudah Diintegrasikan: Kode frontend dapat dengan mudah ditempelkan ke Blogspot, WordPress, atau halaman HTML statis mana pun.
  • Otomatisasi WebP: Foto otomatis dikonversi ke format WebP untuk loading lebih cepat dan hemat bandwidth.
  • Open Source & Modifiable: Seluruh kode dapat Anda ubah sesuai kebutuhan.

Persiapan Awal


Sebelum memulai coding, Anda perlu menyiapkan dua komponen utama:


  1. Google Spreadsheet: Akan bertindak sebagai database metadata foto. Buat spreadsheet baru di drive.google.com.
  2. Folder di Google Drive: Tempat penyimpanan semua file foto. Buat folder baru, lalu catat ID folder tersebut (ID adalah bagian dari URL setelah `folders/`). Contoh: `1Ziag5udepH5KcnJhytt0A41zb620-b_a`.

Kedua komponen ini akan dihubungkan oleh kode Google Apps Script yang akan kita buat. Anda bebas mengganti nama folder dan spreadsheet sesuai keinginan.


Langkah Deploy Web App


Setelah kode GAS siap, lakukan deploy:

  1. Klik tombol Deploy > New deployment.
  2. Pilih type: Web app.
  3. Execute as: Me (atas nama Anda).
  4. Who has access: Anyone (agar bisa diakses publik tanpa login).
  5. Klik Deploy dan izinkan akses jika diminta.
  6. Copy URL yang dihasilkan (contoh: `https://script.google.com/macros/s/AKfycb.../exec`). URL ini akan digunakan di kode frontend.

Fitur Lengkap Galeri Foto Cloud (Open Source)


Setelah berhasil dipasang, web galeri foto cloud dengan Google Apps Script Anda akan memiliki fitur-fitur canggih berikut yang dapat Anda modifikasi sesuai kebutuhan:


  • Upload Drag & Drop: Pengunjung bisa upload dengan mudah.
  • Konversi Otomatis ke WebP: Menghemat bandwidth dan mempercepat loading.
  • Dark Mode: Nyaman digunakan di malam hari.
  • Grid / List View: Pengguna bisa memilih tampilan sesuai selera.
  • Paginasi: 8 foto per halaman untuk performa optimal.
  • Share ke Media Sosial: WhatsApp, Facebook, Twitter.
  • Copy Link & HD View: Fleksibilitas membagikan foto.
  • View Counter: Melihat popularitas foto.
  • Fully Open Source: Seluruh kode dapat diubah dan didistribusikan ulang.

Kesimpulan


Dengan mengikuti panduan lengkap ini, Anda sekarang memiliki sistem galeri foto cloud dengan Google Apps Script yang berfungsi penuh dan bersifat open source. Solusi ini memanfaatkan infrastruktur gratis Google Drive dan Spreadsheet sebagai backend yang handal. Ke depannya, Anda dapat mengembangkan lebih lanjut, misalnya dengan menambahkan fitur komentar, like, album kategori, atau bahkan sistem login sederhana. Keahlian dalam memanfaatkan Google Apps Script adalah aset berharga untuk berbagai proyek web gratis lainnya. Selamat mencoba, berkreasilah, dan jangan ragu untuk membagikan hasil modifikasi Anda kepada komunitas.

Pertanyaan Umum (FAQ)

Apakah benar-benar gratis?
Ya, Google Apps Script, Google Drive, dan Spreadsheet memiliki kuota gratis yang sangat besar untuk penggunaan pribadi hingga skala kecil-menengah (hingga ribuan foto).
Bisakah saya mengganti judul dan gaya tampilan?
Tentu. Seluruh kode HTML/CSS dapat Anda ubah sesuai keinginan. Ini adalah proyek open source.
Apa yang terjadi jika kuota Google Drive penuh?
Anda tidak bisa upload foto baru. Solusinya adalah menghapus foto lama di folder Drive atau menggunakan akun Google lain.
Apakah pengunjung perlu login Google untuk upload?
Tidak. Saat deploy Web App, pilih opsi "Anyone" agar siapa pun bisa upload tanpa login.
Bisakah saya memasang ini di WordPress atau hosting sendiri?
Ya, kode frontend (HTML/JS) dapat dipasang di platform mana pun yang mendukung HTML dan JavaScript.

Tutorial Galeri Foto Cloud dengan Google Apps Script | Open Source | Dapat dimodifikasi dan didistribusikan ulang

Dibagikan untuk pembelajaran dan pengembangan komunitas.

Color Palette Studio — Extract & Generate UI Color Schemes

🎨 Color Palette Studio

✨ 100+ Premium Palettes Loaded

Powered by Webs3tools

Upload image to extract colors

Color Palette Studio — Extract & Generate UI Color Schemes
...