Back to Repository

testing

0 upvotes
By phamgiangbbx96@gmail.com
Manual (context menu)

Description

a

Match Pattern

https://gdnnanhtuan.huelms.com/learn/course/learn/32716905/24608410-24608410/24608410-24608344-1/phan-3-xu-ly-cac-tinh-huong-giao-thong.html

Script Code

(function() {
  const ANSWERS = {
    "682f2e21bcc22bbfa2063074": 2, "682f2e21bcc22bbfa2063085": 2,
    "682f2e21bcc22bbfa2063077": 4, "682f2e21bcc22bbfa20630a0": 1,
    "682f2e21bcc22bbfa206309b": 1, "682f2e21bcc22bbfa206307b": 2,
    "682f2e21bcc22bbfa2063072": 3, "682f2e21bcc22bbfa2063096": 2,
    "682f2e20bcc22bbfa2063051": 4, "682f2e21bcc22bbfa206306b": 2,
    "682f2e21bcc22bbfa2063063": 2, "682f2e20bcc22bbfa2063033": 3,
    "682f2e20bcc22bbfa206304c": 2, "682f2e20bcc22bbfa2063031": 1,
    "682f2e21bcc22bbfa2063067": 2, "682f2e20bcc22bbfa2063042": 1,
    "682f2e20bcc22bbfa2063046": 3, "682f2e21bcc22bbfa206307e": 2,
    "682f2e20bcc22bbfa2063050": 2, "682f2e21bcc22bbfa206308e": 2,
    "682f2e20bcc22bbfa2063045": 1, "682f2e21bcc22bbfa206307c": 1,
    "682f2e21bcc22bbfa2063090": 3, "682f2e21bcc22bbfa206309d": 2,
    "682f2e21bcc22bbfa206306e": 2, "682f2e20bcc22bbfa2063053": 2,
    "682f2e21bcc22bbfa2063064": 3, "682f2e20bcc22bbfa2063038": 2,
    "682f2e21bcc22bbfa20630a1": 2, "682f2e20bcc22bbfa2063040": 1,
    "682f2e21bcc22bbfa2063070": 3, "682f2e20bcc22bbfa2063043": 2,
    "682f2e21bcc22bbfa2063068": 1, "682f2e21bcc22bbfa2063091": 4,
    "682f2e21bcc22bbfa206308a": 2, "682f2e21bcc22bbfa2063083": 1,
    "682f2e20bcc22bbfa206303b": 2, "682f2e21bcc22bbfa206305a": 3,
    "682f2e21bcc22bbfa2063092": 1, "682f2e21bcc22bbfa206309c": 2,
    "682f2e21bcc22bbfa2063095": 2, "682f2e20bcc22bbfa206304b": 1,
    "682f2e20bcc22bbfa206304d": 1, "682f2e20bcc22bbfa2063058": 3,
    "682f2e21bcc22bbfa206306d": 3, "682f2e21bcc22bbfa2063059": 3,
    "682f2e21bcc22bbfa2063099": 1, "682f2e21bcc22bbfa206307d": 2,
    "682f2e21bcc22bbfa206308b": 4, "682f2e20bcc22bbfa2063052": 1,
    "682f2e21bcc22bbfa2063075": 2, "682f2e21bcc22bbfa2063060": 3,
    "682f2e21bcc22bbfa2063094": 3, "682f2e20bcc22bbfa206303a": 1,
    "682f2e20bcc22bbfa206303d": 2, "682f2e21bcc22bbfa206306f": 1,
    "682f2e21bcc22bbfa2063066": 1, "682f2e21bcc22bbfa206305f": 1,
    "682f2e21bcc22bbfa206309e": 2, "682f2e21bcc22bbfa2063071": 2,
    "682f2e21bcc22bbfa2063069": 1, "682f2e21bcc22bbfa206308c": 3,
    "682f2e21bcc22bbfa206308d": 1, "682f2e20bcc22bbfa206304f": 1,
    "682f2e20bcc22bbfa2063039": 1, "682f2e20bcc22bbfa206304a": 1,
    "682f2e20bcc22bbfa2063034": 1, "682f2e21bcc22bbfa206307f": 3,
    "682f2e21bcc22bbfa2063098": 1, "682f2e21bcc22bbfa2063082": 1,
    "682f2e21bcc22bbfa2063062": 4, "682f2e20bcc22bbfa2063057": 2,
    "682f2e21bcc22bbfa2063097": 3, "682f2e21bcc22bbfa2063081": 2,
    "682f2e21bcc22bbfa2063080": 3, "682f2e21bcc22bbfa2063086": 3,
    "682f2e21bcc22bbfa2063088": 2, "682f2e21bcc22bbfa206305b": 1,
    "682f2e21bcc22bbfa2063078": 4, "682f2e20bcc22bbfa2063035": 2,
    "682f2e21bcc22bbfa2063076": 3, "682f2e21bcc22bbfa2063084": 3,
    "682f2e21bcc22bbfa206309a": 3, "682f2e20bcc22bbfa2063047": 2,
    "682f2e21bcc22bbfa2063065": 2, "682f2e20bcc22bbfa2063041": 3,
    "682f2e21bcc22bbfa206306c": 3, "682f2e20bcc22bbfa2063036": 1,
    "682f2e21bcc22bbfa206307a": 3, "682f2e21bcc22bbfa2063087": 3,
    "682f2e20bcc22bbfa2063056": 1, "682f2e20bcc22bbfa206303e": 2,
    "682f2e20bcc22bbfa2063055": 2, "682f2e20bcc22bbfa206303f": 2,
    "682f2e21bcc22bbfa206308f": 3, "682f2e20bcc22bbfa2063032": 3,
    "682f2e21bcc22bbfa206305c": 3, "682f2e20bcc22bbfa2063037": 2,
    "682f2e20bcc22bbfa206302f": 3, "682f2e21bcc22bbfa2063093": 2,
    "682f2e20bcc22bbfa206303c": 1, "682f2e21bcc22bbfa206305e": 3,
    "682f2e21bcc22bbfa2063089": 2, "682f2e21bcc22bbfa206306a": 2,
    "682f2e21bcc22bbfa206305d": 2, "682f2e21bcc22bbfa2063061": 1,
    "682f2e20bcc22bbfa2063054": 3, "682f2e20bcc22bbfa2063049": 2,
    "682f2e20bcc22bbfa206304e": 2, "682f2e20bcc22bbfa2063048": 2,
    "682f2e21bcc22bbfa2063073": 2, "682f2e21bcc22bbfa2063079": 2,
    "682f2e20bcc22bbfa2063044": 1, "682f2e20bcc22bbfa2063030": 2,
    "682f2e21bcc22bbfa206309f": 2
  };

  // ===== PANEL LOG (góc trái dưới) =====
  const logBox = document.createElement('div');
  logBox.style.cssText = `
    position:fixed;bottom:20px;left:20px;z-index:999998;
    width:420px;max-height:280px;overflow-y:auto;
    background:rgba(0,0,0,0.85);color:#0f0;
    font-family:'Courier New',monospace;font-size:12px;
    padding:10px 12px;border-radius:8px;border:1px solid #0f0;
  `;
  const logHeader = document.createElement('div');
  logHeader.style.cssText = 'display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;border-bottom:1px solid #0f0;padding-bottom:4px;cursor:move;';
  logHeader.innerHTML = `
    <span style="color:#0f0;font-weight:bold;">📋 LOG</span>
    <span>
      <button id="__lclr" style="background:#333;color:#0f0;border:1px solid #0f0;padding:2px 8px;cursor:pointer;font-size:11px;margin-right:4px;">Clear</button>
      <button id="__lcls" style="background:#333;color:#f55;border:1px solid #f55;padding:2px 8px;cursor:pointer;font-size:11px;">X</button>
    </span>
  `;
  logBox.appendChild(logHeader);
  const logContent = document.createElement('div');
  logBox.appendChild(logContent);
  document.body.appendChild(logBox);

  // Kéo log
  let ldrag = false, lox = 0, loy = 0;
  logHeader.addEventListener('mousedown', e => { ldrag = true; lox = e.clientX - logBox.offsetLeft; loy = e.clientY - logBox.offsetTop; });
  document.addEventListener('mousemove', e => {
    if (!ldrag) return;
    logBox.style.left = (e.clientX - lox) + 'px';
    logBox.style.top = (e.clientY - loy) + 'px';
    logBox.style.bottom = 'auto';
  });
  document.addEventListener('mouseup', () => ldrag = false);

  function appendLog(args, color = '#0f0') {
    const line = document.createElement('div');
    line.style.cssText = `color:${color};padding:2px 0;border-bottom:1px dotted #333;word-break:break-all;`;
    const time = new Date().toLocaleTimeString();
    const text = args.map(a => typeof a === 'object' ? JSON.stringify(a) : String(a)).join(' ');
    line.textContent = `[${time}] ${text}`;
    logContent.appendChild(line);
    logContent.scrollTop = logContent.scrollHeight;
    while (logContent.children.length > 100) logContent.removeChild(logContent.firstChild);
  }

  const origLog = console.log, origWarn = console.warn, origError = console.error;
  console.log = function(...args) { appendLog(args, '#0f0'); origLog.apply(console, args); };
  console.warn = function(...args) { appendLog(args, '#ff0'); origWarn.apply(console, args); };
  console.error = function(...args) { appendLog(args, '#f55'); origError.apply(console, args); };

  document.getElementById('__lclr').onclick = (e) => { e.stopPropagation(); logContent.innerHTML = ''; };
  document.getElementById('__lcls').onclick = (e) => {
    e.stopPropagation();
    console.log = origLog; console.warn = origWarn; console.error = origError;
    logBox.remove();
  };

  // ===== BOX ĐÁP ÁN (góc phải trên) =====
  const ansBox = document.createElement('div');
  ansBox.style.cssText = `
    position:fixed;top:80px;right:20px;z-index:999999;
    background:linear-gradient(135deg,#427bc9,#2c5aa0);color:#fff;
    padding:16px 22px;border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,0.3);
    font-family:-apple-system,Arial,sans-serif;font-size:14px;max-width:320px;
    cursor:move;user-select:none;border:2px solid rgba(255,255,255,0.2);
  `;
  ansBox.innerHTML = `
    <div style="font-size:11px;opacity:0.8;margin-bottom:4px;">ĐÁP ÁN</div>
    <div id="__num" style="font-size:42px;font-weight:bold;line-height:1;margin-bottom:6px;">–</div>
    <div id="__text" style="font-size:13px;opacity:0.95;word-break:break-word;">Đang chờ...</div>
    <div id="__qid" style="font-size:10px;opacity:0.5;margin-top:8px;font-family:monospace;"></div>
  `;
  document.body.appendChild(ansBox);

  let adrag = false, aox = 0, aoy = 0;
  ansBox.addEventListener('mousedown', e => { adrag = true; aox = e.clientX - ansBox.offsetLeft; aoy = e.clientY - ansBox.offsetTop; });
  document.addEventListener('mousemove', e => {
    if (!adrag) return;
    ansBox.style.left = (e.clientX - aox) + 'px';
    ansBox.style.top = (e.clientY - aoy) + 'px';
    ansBox.style.right = 'auto';
  });
  document.addEventListener('mouseup', () => adrag = false);

  const numEl = ansBox.querySelector('#__num');
  const textEl = ansBox.querySelector('#__text');
  const qidEl = ansBox.querySelector('#__qid');

  // ===== CLICK RADIO (React handler) =====
  function checkRadio(radio) {
    const key = Object.keys(radio).find(k => k.startsWith('__reactProps'));
    const props = radio[key];
    if (!props) return false;

    const fakeEvent = {
      target: radio, currentTarget: radio, type: '',
      bubbles: true, cancelable: true, defaultPrevented: false,
      nativeEvent: new Event('click'),
      preventDefault: () => {}, stopPropagation: () => {}, persist: () => {}
    };

    if (props.onMouseDown) props.onMouseDown({ ...fakeEvent, type: 'mousedown' });
    if (props.onMouseUp)   props.onMouseUp({ ...fakeEvent, type: 'mouseup' });

    const setter = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked').set;
    setter.call(radio, true);

    if (props.onChange) props.onChange({ ...fakeEvent, type: 'change' });
    return true;
  }

  // ===== MAIN LOGIC =====
  let lastQid = null;

  function update() {
    const anyRadio = document.querySelector('input[type="radio"][id*="-"]');
    if (!anyRadio) return;

    const qid = anyRadio.id.match(/^(.+)-\d+$/)?.[1];
    if (!qid || qid === lastQid) return;
    lastQid = qid;

    const ans = ANSWERS[qid];
    qidEl.textContent = qid;
    console.log('🔍 Question:', qid);

    if (!ans) {
      numEl.textContent = '?';
      textEl.textContent = 'Chưa có đáp án — chọn thủ công';
      ansBox.style.background = 'linear-gradient(135deg,#d97706,#92400e)';
      console.warn('⚠️  Không có đáp án cho câu này');
      return;
    }

    const target = document.getElementById(`${qid}-${ans - 1}`);
    const label = target?.closest('.mc-text-question__radio-answer')
                        ?.querySelector('label .content-display')?.innerText?.trim() || '';

    numEl.textContent = ans;
    textEl.textContent = label || '(không đọc được)';
    ansBox.style.background = 'linear-gradient(135deg,#059669,#065f46)';

    if (target && !target.checked) {
      if (checkRadio(target)) {
        console.log(`✅ ${qid} → ${ans}: ${label}`);
      } else {
        console.error('❌ Không click được');
      }
    } else if (target?.checked) {
      console.log(`✓ Đã chọn sẵn: ${ans}`);
    }
  }

  setTimeout(update, 500);
  const observer = new MutationObserver(() => {
    clearTimeout(window.__t);
    window.__t = setTimeout(update, 350);
  });
  observer.observe(document.body, { childList: true, subtree: true });

  window.stopAll = () => {
    observer.disconnect();
    ansBox.remove();
    logBox.remove();
    console.log = origLog; console.warn = origWarn; console.error = origError;
  };

  console.log(`🚀 Ready — ${Object.keys(ANSWERS).length} đáp án | stopAll() để dừng`);
})();
Install requires the InjectJS Chrome extension. Scripts run only on sites matching the pattern above. Review code before installing any community script.