<div id="sr-quiz" class="srq">
<form id="srq-form" novalidate>
<div class="srq-step srq-step--active" data-step="1">
<h3>Ваш уровень китайского</h3>
<label class="srq-opt"><input type="radio" name="level" value="Никогда не изучал" required> Никогда не изучал</label>
<label class="srq-opt"><input type="radio" name="level" value="Знаю несколько слов"> Знаю несколько слов</label>
<label class="srq-opt"><input type="radio" name="level" value="Читаю пиньинь"> Могу читать пиньинь</label>
<label class="srq-opt"><input type="radio" name="level" value="Готовлюсь к HSK 1–3"> Готовлюсь к HSK 1–3</label>
<div class="srq-nav">
<button type="button" class="srq-next">Далее</button>
</div>
</div>
<div class="srq-step" data-step="2">
<h3>Удобный формат</h3>
<label class="srq-opt"><input type="radio" name="format" value="Онлайн с преподавателем" required> Онлайн с преподавателем</label>
<label class="srq-opt"><input type="radio" name="format" value="Самостоятельно по PDF и аудио"> Самостоятельно по PDF и аудио</label>
<label class="srq-opt"><input type="radio" name="format" value="Мини-группа"> В мини-группе</label>
<div class="srq-nav">
<button type="button" class="srq-prev">Назад</button>
<button type="button" class="srq-next">Далее</button>
</div>
</div>
<div class="srq-step" data-step="3">
<h3>Цель обучения</h3>
<label class="srq-opt"><input type="radio" name="goal" value="Учёба в Китае" required> Учёба в Китае</label>
<label class="srq-opt"><input type="radio" name="goal" value="Работа с китайскими партнёрами"> Работа с китайскими партнёрами</label>
<label class="srq-opt"><input type="radio" name="goal" value="Путешествия"> Путешествия</label>
<label class="srq-opt"><input type="radio" name="goal" value="Для ребёнка"> Для ребёнка</label>
<div class="srq-nav">
<button type="button" class="srq-prev">Назад</button>
<button type="button" class="srq-next">Далее</button>
</div>
</div>
<div class="srq-step" data-step="4">
<h3>Контакты для рекомендаций</h3>
<div class="srq-grid">
<label>Имя
<input type="text" name="name" required minlength="2" placeholder="Как к вам обращаться?">
</label>
<label>Телефон (формат: +7XXXXXXXXXX)
<input type="tel" name="phone" required placeholder="+7XXXXXXXXXX" pattern="^\+7\d{10}$" inputmode="numeric">
</label>
<label>Email
<input type="email" name="email" required placeholder="you@example.com">
</label>
<label class="srq-consent">
<input type="checkbox" name="consent" required>
Согласен(а) на обработку персональных данных
</label>
</div>
<div class="srq-nav">
<button type="button" class="srq-prev">Назад</button>
<button type="submit" class="srq-submit">Получить мой курс</button>
</div>
<div class="srq-note">После отправки преподаватель Университета Ланьчжоу свяжется с вами и подберёт программу.</div>
</div>
<input type="hidden" name="utm_source">
<input type="hidden" name="utm_medium">
<input type="hidden" name="utm_campaign">
<input type="hidden" name="utm_content">
<input type="hidden" name="utm_term">
<input type="hidden" name="page_url">
<input type="hidden" name="page_title">
</form>
<div class="srq-success" style="display:none;">
<h3>Заявка отправлена</h3>
<p>Спасибо! Мы уже получили ваши ответы. Преподаватель свяжется в ближайшее время.</p>
</div>
</div>
<style>
.srq { max-width: 760px; margin: 0 auto; font-family: Inter, Arial, sans-serif; }
.srq h3 { margin: 0 0 16px; line-height: 1.3; }
.srq-step { display: none; }
.srq-step--active { display: block; }
.srq-opt { display: block; padding: 12px 14px; border: 1px solid #ddd; border-radius: 8px; margin-bottom: 10px; cursor: pointer; }
.srq-opt input { margin-right: 8px; }
.srq-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.srq-grid label { display: block; }
.srq-grid input { width: 100%; padding: 10px 12px; border: 1px solid #ddd; border-radius: 8px; }
.srq-consent { grid-column: 1 / -1; display: flex; align-items: center; gap: 8px; }
.srq-nav { display: flex; gap: 12px; margin-top: 12px; }
.srq button { padding: 10px 14px; border: 0; border-radius: 8px; cursor: pointer; }
.srq-next { background: #111; color: #fff; }
.srq-prev { background: #f2f2f2; }
.srq-submit { background: #c60000; color: #fff; }
.srq-note { margin-top: 10px; color: #666; font-size: 14px; }
@media (max-width:640px){ .srq-grid{ grid-template-columns: 1fr; } }
</style>
<script>
(function(){
// ✅ твои данные TG
const BOT_TOKEN = '8487023032:AAHAEqq5xsRZRs4zRNs6LpD53QU3oO0mluI'; // токен бота от BotFather
const CHAT_ID = '-1003162164207'; // id канала/чата
const form = document.getElementById('srq-form');
const steps = Array.from(document.querySelectorAll('.srq-step'));
const success = document.querySelector('.srq-success');
const nextBtns = document.querySelectorAll('.srq-next');
const prevBtns = document.querySelectorAll('.srq-prev');
// UTM + meta
const p = new URLSearchParams(location.search);
form.elements['utm_source'].value = p.get('utm_source') || '';
form.elements['utm_medium'].value = p.get('utm_medium') || '';
form.elements['utm_campaign'].value = p.get('utm_campaign') || '';
form.elements['utm_content'].value = p.get('utm_content') || '';
form.elements['utm_term'].value = p.get('utm_term') || '';
form.elements['page_url'].value = location.href;
form.elements['page_title'].value = document.title;
const activeIdx = () => steps.findIndex(s=>s.classList.contains('srq-step--active'));
const showStep = i => { steps.forEach(s=>s.classList.remove('srq-step--active')); steps[i].classList.add('srq-step--active'); window.scrollTo({ top: document.getElementById('sr-quiz').offsetTop-10, behavior:'smooth' }); };
const validate = i => {
const step = steps[i], req = step.querySelectorAll('[required]');
for (const el of req){
if (el.type==='radio'){ const g=step.querySelectorAll('input[name="'+el.name+'"]'); if (![...g].some(r=>r.checked)) return false; }
else if (el.type==='checkbox'){ if (!el.checked) return false; }
else if (!el.value.trim()) return false;
}
if (i===steps.length-1){
const phone = form.elements['phone'].value.trim();
const email = form.elements['email'].value.trim();
if (!/^\+7\d{10}$/.test(phone)) return false;
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) return false;
}
return true;
};
nextBtns.forEach(b=>b.addEventListener('click', ()=>{ const i=activeIdx(); if(!validate(i)) return; showStep(Math.min(i+1, steps.length-1)); }));
prevBtns.forEach(b=>b.addEventListener('click', ()=>{ const i=activeIdx(); showStep(Math.max(i-1,0)); }));
function esc(t){ return String(t||'').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); }
async function sendToTG(payload){
const url = 'https://api.telegram.org/bot'+BOT_TOKEN+'/sendMessage';
const text =
'📝 <b>Новая заявка — Квиз (Skills Road)</b>\n' +
'👤 Имя: ' + esc(payload.name) + '\n' +
'📞 Телефон: ' + esc(payload.phone) + '\n' +
'✉️ Email: ' + esc(payload.email) + '\n' +
'🎯 Уровень: ' + esc(payload.level || '-') + '\n' +
'🧩 Формат: ' + esc(payload.format || '-') + '\n' +
'🎯 Цель: ' + esc(payload.goal || '-') + '\n' +
'🌐 Страница: ' + esc(payload.page.title || '-') + '\n' +
'🔗 ' + esc(payload.page.url || '-') + '\n' +
'📌 UTM: ' + [
'source='+ (payload.utm.source || '-'),
'medium='+ (payload.utm.medium || '-'),
'campaign='+ (payload.utm.campaign || '-'),
'content='+ (payload.utm.content || '-'),
'term='+ (payload.utm.term || '-')
].join(' | ');
try{
const res = await fetch(url, {
method:'POST', headers:{'Content-Type':'application/json'},
body: JSON.stringify({ chat_id: CHAT_ID, text, parse_mode:'HTML', disable_web_page_preview:true })
});
// не ломаем UX даже если ответ не ok
return true;
}catch(_){ return true; }
}
form.addEventListener('submit', async (e)=>{
e.preventDefault();
if (!validate(steps.length-1)) return;
const payload = {
level: document.querySelector('input[name="level"]:checked')?.value || '',
format: document.querySelector('input[name="format"]:checked')?.value || '',
goal: document.querySelector('input[name="goal"]:checked')?.value || '',
name: form.elements['name'].value.trim(),
phone: form.elements['phone'].value.trim(),
email: form.elements['email'].value.trim(),
utm: {
source: form.elements['utm_source'].value,
medium: form.elements['utm_medium'].value,
campaign: form.elements['utm_campaign'].value,
content: form.elements['utm_content'].value,
term: form.elements['utm_term'].value
},
page: { url: form.elements['page_url'].value, title: form.elements['page_title'].value }
};
await sendToTG(payload);
form.style.display = 'none';
success.style.display = 'block';
});
})();
</script>