CrawlerPulse
CrawlerPulse / Asia / Sri Lanka / colombotelegraph.com

Colombo Telegraph

colombotelegraph.com · Sri Lanka · measured 8 Oct 2026

Google Search
Allowed
Google-Extended
Allowed
OpenAI
Allowed
Anthropic
Allowed
Perplexity
Allowed
Meta
Allowed
Common Crawl
Allowed
ByteDance
Allowed
Apple
Allowed
Amazon
Allowed

robots.txt

As read on 8 Oct 2026, 12,392 bytes. No rule names an AI crawler.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Just a moment...</title>
<style>
  @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap');
  *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
  :root {
    --page-bg: #e5e7eb;
    --card-bg: #ffffff;
    --card-border: #d1d5db;
    --card-shadow: 0 1px 3px rgba(0,0,0,.08), 0 4px 16px rgba(0,0,0,.06);
    --widget-bg: #f9fafb;
    --widget-border: #e5e7eb;
    --text-primary: #111827;
    --text-secondary: #6b7280;
    --text-tertiary: #9ca3af;
    --accent: #2563eb;
    --accent-hover: #1d4ed8;
    --error: #dc2626;
    --error-bg: #fef2f2;
    --error-border: #fecaca;
    --input-bg: #ffffff;
    --input-border: #d1d5db;
    --input-focus-ring: rgba(37,99,235,.2);
    --radius: 10px;
    --radius-sm: 6px;
  }
  html, body { height: 100%; }
  body {
    font-family: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, sans-serif;
    background: var(--page-bg);
    color: var(--text-primary);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
    min-height: 100dvh;
  }
  .challenge-card {
    width: 100%;
    max-width: 390px;
    background: var(--card-bg);
    border: 1px solid var(--card-border);
    border-radius: 12px;
    box-shadow: var(--card-shadow);
    overflow: hidden;
  }
  .card-body { padding: 1.5rem 1.5rem 1.25rem; }
  .site-domain {
    font-size: .8rem;
    font-weight: 500;
    color: var(--text-secondary);
    letter-spacing: .01em;
    margin-bottom: 1rem;
    display: flex;
    align-items: center;
    gap: .45rem;
  }
  .site-domain .dot {
    width: 6px; height: 6px;
    border-radius: 50%;
    background: var(--text-tertiary);
    flex-shrink: 0;
  }
  .title {
    font-size: 1.05rem;
    font-weight: 600;
    margin-bottom: .3rem;
  }
  .desc {
    font-size: .82rem;
    color: var(--text-secondary);
    line-height: 1.45;
    margin-bottom: 1.15rem;
  }
  .error-msg {
    display: none;
    font-size: .78rem;
    font-weight: 500;
    color: var(--error);
    background: var(--error-bg);
    border: 1px solid var(--error-border);
    border-radius: var(--radius-sm);
    padding: .45rem .65rem;
    margin-bottom: .85rem;
    align-items: center;
    gap: .4rem;
  }
  .error-msg.show { display: flex; }
  .error-msg svg { width: 14px; height: 14px; flex-shrink: 0; }
  .widget {
    background: var(--widget-bg);
    border: 1px solid var(--widget-border);
    border-radius: var(--radius);
    padding: .75rem;
  }
  .captcha-image-row {
    display: flex;
    align-items: center;
    gap: .6rem;
    margin-bottom: .65rem;
  }
  .img-frame {
    position: relative;
    flex-shrink: 0;
    background: #fff;
    border: 1px solid var(--input-border);
    border-radius: var(--radius-sm);
    overflow: hidden;
    height: 56px;
    display: flex;
    align-items: center;
  }
  .img-frame img {
    display: block;
    height: 100%;
    width: auto;
    min-width: 100px;
  }
  .img-frame .refresh-overlay {
    position: absolute;
    inset: 0;
    background: rgba(0,0,0,.45);
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    cursor: pointer;
    transition: opacity .15s;
    border: none;
  }
  .img-frame:hover .refresh-overlay { opacity: 1; }
  .img-frame .refresh-overlay svg { width: 20px; height: 20px; stroke: #fff; fill: none; stroke-width: 2; }
  .img-side { flex: 1; min-width: 0; }
  .img-side .hint {
    font-size: .72rem;
    color: var(--text-tertiary);
    margin-bottom: .35rem;
  }
  .img-side .new-code-btn {
    appearance: none;
    background: none;
    border: none;
    padding: 0;
    font-family: inherit;
    font-size: .75rem;
    font-weight: 500;
    color: var(--accent);
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    transition: color .12s;
  }
  .img-side .new-code-btn:hover { color: var(--accent-hover); }
  .img-side .new-code-btn svg { width: 13px; height: 13px; }
  .input-row {
    display: flex;
    gap: .5rem;
  }
  .input-row input {
    flex: 1;
    min-width: 0;
    padding: .5rem .65rem;
    font-size: .95rem;
    font-family: 'IBM Plex Mono', monospace;
    font-weight: 500;
    letter-spacing: .15em;
    color: var(--text-primary);
    background: var(--input-bg);
    border: 1px solid var(--input-border);
    border-radius: var(--radius-sm);
    outline: none;
    transition: border-color .12s, box-shadow .12s;
  }
  .input-row input:focus {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px var(--input-focus-ring);
  }
  .input-row input::placeholder {
    font-family: 'IBM Plex Sans', sans-serif;
    font-weight: 400;
    letter-spacing: normal;
    color: #c5c8ce;
  }
  .input-row button {
    flex-shrink: 0;
    padding: 0 1rem;
    font-family: inherit;
    font-size: .82rem;
    font-weight: 600;
    color: #fff;
    background: var(--accent);
    border: none;
    border-radius: var(--radius-sm);
    cursor: pointer;
    transition: background .12s;
    display: flex;
    align-items: center;
    gap: .35rem;
  }
  .input-row button:hover { background: var(--accent-hover); }
  .input-row button svg {
    width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2.5;
  }
  .card-footer {
    padding: .6rem 1.5rem;
    background: var(--widget-bg);
    border-top: 1px solid var(--widget-border);
    display: flex;
    align-items: center;
  }
  .card-footer .brand {
    font-size: .68rem;
    color: var(--text-tertiary);
    display: flex;
    align-items: center;
    gap: .35rem;
  }
  .card-footer .brand svg { width: 14px; height: 14px; opacity: .5; }
  /* ── spinner (while image loads) ─────────────────────────────────── */
  .img-frame .spinner {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: #fff;
    transition: opacity .2s;
  }
  .img-frame .spinner.hidden { opacity: 0; pointer-events: none; }
  @keyframes spin { to { transform: rotate(360deg); } }
  .img-frame .spinner::after {
    content: '';
    width: 18px; height: 18px;
    border: 2px solid var(--widget-border);
    border-top-color: var(--accent);
    border-radius: 50%;
    animation: spin .6s linear infinite;
  }
  /* ── responsive ──────────────────────────────────────────────────── */
  @media (max-width: 420px) {
    .card-body { padding: 1.25rem 1rem 1rem; }
    .captcha-image-row { flex-direction: column; align-items: stretch; }
    .img-frame { width: 100%; height: 56px; justify-content: center; }
    .img-frame .refresh-overlay { opacity: .7; }
    .card-footer { padding: .6rem 1rem; }
  }
</style>
<link rel="stylesheet" type="text/css" href="/qcssads.css"></head>
<body>
<div class="challenge-card">
  <div class="card-body">
    <div class="site-domain">
      <span class="dot"></span>
      <span id="domainDisplay"></span>
    </div>
    <h1 class="title">Verify you are human</h1>
    <p class="desc">Please enter the code shown below to continue.</p>
    <div class="error-msg" id="errorMsg">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
        <circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/>
      </svg>
      <span>Verification failed. Try again with a new code.</span>
    </div>
    <form method="POST" action="/captcha-verify" id="challengeForm" autocomplete="off">
      <input type="hidden" name="_token" id="csrfToken" />
      <input type="hidden" name="redirect" id="redirectField" />
      <div class="widget">
        <div class="captcha-image-row">
          <div class="img-frame" id="imgFrame">
            <img id="captchaImg" alt="" />
            <div class="spinner" id="spinner"></div>
            <button type="button" class="refresh-overlay" onclick="reloadCaptcha()" aria-label="New code">
              <svg viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
                <path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
              </svg>
            </button>
          </div>
          <div class="img-side">
            <div class="hint">Can't read it?</div>
            <button type="button" class="new-code-btn" onclick="reloadCaptcha()">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
                <path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
              </svg>
              Generate new code
            </button>
          </div>
        </div>
        <div class="input-row">
          <input type="text" name="captcha" id="captchaInput"
                 placeholder="Enter code"
                 required maxlength="10" />
          <button type="submit">
            <svg viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
              <polyline points="9 18 15 12 9 6"/>
            </svg>
            Verify
          </button>
        </div>
      </div>
    </form>
  </div>
  <div class="card-footer">
    <div class="brand">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
        <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
      </svg>
      Security check
    </div>
  </div>
</div>
<script>
(function () {
  'use strict';
  var csrfInput     = document.getElementById('csrfToken');
  var redirectInput = document.getElementById('redirectField');
  var captchaImg    = document.getElementById('captchaImg');
  var captchaInput  = document.getElementById('captchaInput');
  var errorMsg      = document.getElementById('errorMsg');
  var spinner       = document.getElementById('spinner');
  var domainDisplay = document.getElementById('domainDisplay');
  // ── Show current domain ──
  domainDisplay.textContent = location.hostname;
  // ── CSRF ──
  function generateCsrf() {
    var arr = new Uint8Array(16);
    crypto.getRandomValues(arr);
    return Array.from(arr, function (b) {
      return b.toString(16).padStart(2, '0');
    }).join('');
  }
  // ── Query params ──
  function getParam(name) {
    var params = new URLSearchParams(location.search);
    return params.get(name) || '';
  }
  // ── Sanitize redirect (defense in depth — server also validates) ──
  function sanitizeRedirect(raw) {
    if (!raw || raw.length === 0) return '/';
    if (raw === '/') return '/';
    if (raw.charAt(0) !== '/' || raw.charAt(1) === '/') return '/';
    if (/[\r\n\0]/.test(raw)) return '/';
    if (raw.length > 2048) return '/';
    return raw;
  }
  redirectInput.value = sanitizeRedirect(getParam('redirect'));
  // ── Captcha load / reload ──
  var csrf;
  window.reloadCaptcha = function () {
    spinner.classList.remove('hidden');
    csrf = generateCsrf();
    csrfInput.value = csrf;
    captchaImg.onload = function () { spinner.classList.add('hidden'); };
    captchaImg.onerror = function () { spinner.classList.add('hidden'); };
    captchaImg.src = '/captcha?csrf=' + encodeURIComponent(csrf) + '&t=' + Date.now();
    captchaInput.value = '';
    captchaInput.focus();
  };
  // ── Init ──
  reloadCaptcha();
  if (getParam('error')) {
    errorMsg.classList.add('show');
  }
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) reloadCaptcha();
  });
  captchaInput.focus();
})();
</script>
</body>
</html>

History

Changes recorded since June 2026.

No change recorded.

In context

Sri Lanka
4.3% block at least one AI crawler
Behind Cloudflare
No