@אA על מה מדובר?
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
עודכן בהודעה הראשונה קובץ שמכין את כל ה"מערכת" הזאת קומפלט עם כל הקבצים השקטים - לא לשים / אני לא יודע מה הוא יעשה עם זה!.
call2all_setup.zipאו
<!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Call2All – יצירת שלוחה</title> <style> @import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=Heebo:wght@300;400;600;700&display=swap'); :root { --bg:#0b0e13;--surface:#131720;--surface2:#1a1f2e;--border:#252c3f; --accent:#3b82f6;--accent-glow:rgba(59,130,246,0.18); --green:#22c55e;--red:#ef4444;--yellow:#f59e0b; --text:#dde3f0;--muted:#4a5478;--label:#8892b0; } *{box-sizing:border-box;margin:0;padding:0;} body{background:var(--bg);color:var(--text);font-family:'Heebo',sans-serif;min-height:100vh;display:flex;flex-direction:column;align-items:center;padding:2.5rem 1rem 4rem;background-image:radial-gradient(ellipse at 60% 0%,rgba(59,130,246,0.07) 0%,transparent 60%);} header{text-align:center;margin-bottom:2.5rem;} header h1{font-size:1.5rem;font-weight:700;color:#fff;} header p{font-size:0.82rem;color:var(--muted);margin-top:0.4rem;font-family:'IBM Plex Mono',monospace;} .card{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:1.75rem;width:100%;max-width:580px;margin-bottom:1rem;} .card-title{font-size:0.7rem;font-family:'IBM Plex Mono',monospace;letter-spacing:0.12em;text-transform:uppercase;color:var(--muted);margin-bottom:1.25rem;display:flex;align-items:center;gap:0.5rem;} .card-title::before{content:'';display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 6px var(--accent);} .field-group{margin-bottom:1.1rem;} label{display:block;font-size:0.78rem;color:var(--label);margin-bottom:0.35rem;} input[type="text"],input[type="password"]{width:100%;background:var(--bg);border:1px solid var(--border);color:var(--text);font-family:'IBM Plex Mono',monospace;font-size:0.88rem;padding:0.6rem 0.85rem;border-radius:7px;outline:none;transition:border-color 0.2s,box-shadow 0.2s;direction:ltr;} input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-glow);} .hint{font-size:0.72rem;color:var(--muted);margin-top:0.3rem;font-family:'IBM Plex Mono',monospace;} .run-btn{width:100%;padding:0.8rem;background:var(--accent);color:#fff;border:none;border-radius:8px;font-family:'Heebo',sans-serif;font-size:0.95rem;font-weight:600;cursor:pointer;transition:all 0.2s;margin-top:0.5rem;} .run-btn:hover{filter:brightness(1.12);transform:translateY(-1px);} .run-btn:disabled{opacity:0.4;cursor:default;transform:none;} .steps{width:100%;max-width:580px;display:flex;flex-direction:column;gap:0.5rem;} .step{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:0.85rem 1rem;display:flex;align-items:center;gap:0.75rem;font-size:0.82rem;transition:border-color 0.3s;} .step.running{border-color:var(--accent);} .step.done{border-color:rgba(34,197,94,0.4);} .step.error{border-color:rgba(239,68,68,0.4);} .step-icon{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:0.75rem;font-family:'IBM Plex Mono',monospace;flex-shrink:0;background:var(--surface2);border:1px solid var(--border);color:var(--muted);transition:all 0.3s;} .step.running .step-icon{border-color:var(--accent);color:var(--accent);animation:spin 1s linear infinite;} .step.done .step-icon{background:rgba(34,197,94,0.1);border-color:var(--green);color:var(--green);} .step.error .step-icon{background:rgba(239,68,68,0.1);border-color:var(--red);color:var(--red);} .step-label{flex:1;color:var(--label);} .step.running .step-label,.step.done .step-label{color:var(--text);} .step.error .step-label{color:var(--red);} .step-status{font-family:'IBM Plex Mono',monospace;font-size:0.7rem;color:var(--muted);} .log-wrap{width:100%;max-width:580px;margin-top:0.5rem;} #log{background:#070a0f;border:1px solid var(--border);border-radius:8px;padding:0.9rem 1rem;height:220px;overflow-y:auto;font-family:'IBM Plex Mono',monospace;font-size:0.75rem;line-height:1.8;direction:ltr;} #log::-webkit-scrollbar{width:3px;} #log::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px;} .log-line{display:flex;gap:0.5rem;} .log-ts{color:var(--muted);flex-shrink:0;} .log-ok{color:var(--green);} .log-err{color:var(--red);} .log-info{color:var(--accent);} .log-warn{color:var(--yellow);} @keyframes spin{to{transform:rotate(360deg);}} </style> </head> <body> <header> <h1>⚙ Call2All — יצירת שלוחה</h1> <p>// automated extension setup</p> </header> <div class="card"> <div class="card-title">פרטי חיבור</div> <div class="field-group"> <label>מספר שלוחה </label> <input type="text" id="ext" /> </div> <div class="field-group"> <label>טוקן</label> <input type="password" id="token" placeholder="הכנס טוקן..." /> </div> <button class="run-btn" id="runBtn" onclick="startAll()">▶ הפעל תהליך</button> </div> <div class="steps" id="stepsWrap" style="display:none"></div> <div class="log-wrap" id="logWrap" style="display:none"> <div id="log"></div> </div> <script> const WAV_B64="UklGRtQBAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YbABAAAAAAAAAAAAAAEA/v8CAP7/AQAAAAEA/f8DAP7/AQAAAP//AQAAAAAAAAAAAP//AgD+/wMA/f8CAP7/AgD+/wIA/////wMA/P8DAP//AAAAAAEA/v8CAP7/AgD//wAAAAD//wIA/v8CAP7/AQABAP7/AgD+/wIA/v8DAPz/BAD9/wEAAQD+/wIA//8AAAAAAQD+/wMA/f8CAP//AQD//wAAAQD//wEA//8AAAEA//8BAP//AQD+/wIAAAD+/wMA/P8EAP3/AgD//wAAAQD+/wMA/f8CAP//AQD//wAAAQD//wEA//8AAAEA//8BAP//AQD//wEA/v8DAP3/AgAAAP7/AwD9/wMA/f8DAP3/AgAAAP//AAAAAAEA//8BAP7/AQABAAAA//8BAP3/BQD8/wMA/v8AAAEAAAD//wEAAAD//wIA/f8DAP7/AgD+/wEAAAAAAAAAAAAAAP//AgD+/wIA///+/wQA+/8GAPr/BQD9/wEAAQD9/wMA/////wIA/v8AAAIA/f8EAPz/AwD+/wEAAQD9/wQA/P8EAPz/AwD9/wQA/P8EAPz/AwD9/wQA/P8="; function ts(){return new Date().toLocaleTimeString('he-IL',{hour12:false});} let logEl; function log(msg,cls='log-info'){ const line=document.createElement('div'); line.className='log-line'; line.innerHTML=`<span class="log-ts">[${ts()}]</span><span class="${cls}">${msg}</span>`; logEl.appendChild(line); logEl.scrollTop=logEl.scrollHeight; } function b64toBlob(b64,mime){ const bin=atob(b64),buf=new Uint8Array(bin.length); for(let i=0;i<bin.length;i++)buf[i]=bin.charCodeAt(i); return new Blob([buf],{type:mime}); } const STEP_DEFS=[ {id:'ext1', label:'יצירת שלוחה – שלב 1 (הקשת מספר)'}, {id:'ext2', label:'יצירת שלוחה – שלב 2 (API link)'}, {id:'ext3', label:'יצירת שלוחה – שלב 3 (routing queue)'}, {id:'wav_root', label:'העלאת קובץ שמע → M3411.wav'}, {id:'wav_sub', label:'העלאת קובץ שמע → 1/M1607.wav'}, ]; const stepEls={}; function buildSteps(exts){ const wrap=document.getElementById('stepsWrap'); wrap.innerHTML=''; exts.forEach(ext=>{ STEP_DEFS.forEach(def=>{ const id=`${ext}_${def.id}`; const div=document.createElement('div'); div.className='step';div.id=id; div.innerHTML=`<div class="step-icon">○</div><div class="step-label">[${ext}] ${def.label}</div><div class="step-status"></div>`; wrap.appendChild(div);stepEls[id]=div; }); }); } function setStep(id,state,statusText=''){ const el=stepEls[id];if(!el)return; el.className=`step ${state}`; el.querySelector('.step-icon').textContent=state==='running'?'↻':state==='done'?'✓':'✗'; el.querySelector('.step-status').textContent=statusText; } const BASE='https://www.call2all.co.il/ym/api/'; async function callUpdate(token,params){ const url=BASE+'UpdateExtension?'+new URLSearchParams({token,...params}); log(`→ UpdateExtension path=${params.path}`); const res=await fetch(url); const json=await res.json().catch(()=>({responseStatus:'ERROR',message:'parse error'})); if(json.responseStatus==='OK'){log('← OK','log-ok');} else{log(`← ERROR: ${json.message||JSON.stringify(json)}`,'log-err');throw new Error(json.message||'API error');} } async function uploadWav(token,path){ log(`→ UploadFile path=${path}`); const blob=b64toBlob(WAV_B64,'audio/wav'); const fd=new FormData(); fd.append('token',token);fd.append('path',path); fd.append('file',blob,path.split('/').pop()); const res=await fetch(BASE+'UploadFile',{method:'POST',body:fd}); const json=await res.json().catch(()=>({responseStatus:'ERROR',message:'parse error'})); if(json.responseStatus==='OK'){log(`← OK (${json.size} bytes)`,'log-ok');} else{log(`← ERROR: ${json.message||JSON.stringify(json)}`,'log-err');throw new Error(json.message||'Upload error');} } async function processExt(ext,token){ const e=ext.trim(); setStep(`${e}_ext1`,'running'); try{ await callUpdate(token,{path:`ivr2:${e}`,type:'add_id_to_list',title:'הקשת מספר לחיוג', add_id_to_list_location_list:`/${e}/1/ext`,add_id_to_list_key:'api_add_2', add_id_to_list_value_first:'contents=announce-position=no%0Aannounce-frequency=0%0Aperiodic-announce-frequency=0%0Aringuse=yes%0Amusicclass=ztomao%0A', add_id_to_list_value_type:'digits',add_id_to_list_value_change:'yes',add_id_to_list_end_goto:'1'}); setStep(`${e}_ext1`,'done','200 OK'); }catch(err){setStep(`${e}_ext1`,'error',err.message);throw err;} setStep(`${e}_ext2`,'running'); try{ await callUpdate(token,{path:`ivr2:${e}/1`,type:'api',title:'שינוי המספר לחיוג בפועל', api_link:'https://www.call2all.co.il/ym/api/UploadTextFile', api_add_0:`token=${token}`,api_add_1:`what=ivr2:/${e}/2/queue.ini`, api_hangup_send:'no',api_end_goto:'../2'}); setStep(`${e}_ext2`,'done','200 OK'); }catch(err){setStep(`${e}_ext2`,'error',err.message);throw err;} setStep(`${e}_ext3`,'running'); try{ await callUpdate(token,{path:`ivr2:${e}/2`,type:'routing_queue',title:'שיחות יוצאות', queue_caller_id:'customer_did',queue_end_continue_goto:'hangup'}); setStep(`${e}_ext3`,'done','200 OK'); }catch(err){setStep(`${e}_ext3`,'error',err.message);throw err;} setStep(`${e}_wav_root`,'running'); try{await uploadWav(token,`ivr2:${e}/M3411.wav`);setStep(`${e}_wav_root`,'done','uploaded');} catch(err){setStep(`${e}_wav_root`,'error',err.message);throw err;} setStep(`${e}_wav_sub`,'running'); try{await uploadWav(token,`ivr2:${e}/1/M1607.wav`);setStep(`${e}_wav_sub`,'done','uploaded');} catch(err){setStep(`${e}_wav_sub`,'error',err.message);throw err;} } async function startAll(){ const extVal=document.getElementById('ext').value.trim(); const tokenVal=document.getElementById('token').value.trim(); if(!extVal||!tokenVal){alert('נא למלא מספר שלוחה וטוקן');return;} if(!/^[\d/]+$/.test(extVal)){alert('מספר שלוחה יכול להכיל רק ספרות ו-/');return;} const exts=extVal.split('/').map(s=>s.trim()).filter(Boolean); document.getElementById('stepsWrap').style.display='flex'; document.getElementById('logWrap').style.display='block'; logEl=document.getElementById('log');logEl.innerHTML=''; buildSteps(exts); const btn=document.getElementById('runBtn');btn.disabled=true; log(`מתחיל עבור ${exts.length} שלוח${exts.length>1?'ות':'ה'}: ${exts.join(', ')}`,'log-info'); let ok=true; for(const ext of exts){ log(`── שלוחה ${ext} ──`,'log-warn'); try{await processExt(ext,tokenVal);log(`✓ שלוחה ${ext} הושלמה`,'log-ok');} catch(e){log(`✗ שלוחה ${ext} נכשלה: ${e.message}`,'log-err');ok=false;} } log(ok?'✓ הכל הושלם בהצלחה!':'⚠ חלק מהשלוחות נכשלו — בדוק את הלוג',ok?'log-ok':'log-err'); btn.disabled=false; } </script> </body> </html>ולשמור כHTML
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@1668 מבנה השלוחות אצלך הוא ככה:
1
1/1
1/2
?אם לא אז יש אצלך בעיה...
בכל מבנה אחר צריך לשנות את הערכים בקוד.
צריך כמובן להעלות קבצים לפי מה שכתוב שם. -
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@cubase אין עליך, לא סתם תייגתי אותך (במקור)!
בלי לזלזל בכל העונים כמובן -
RE: עקיפת מגבלת הניקוד. יש כזה דבר ? לקוחות שמצליחים לצבור ניקוד פעמיים בניגוד להגדרה שמונעת את זה..
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@sh0548534047 כתב בקומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה:
@עידו
מה הבעיה במודל החדש שם אפשר לעשות בחינם זיהוי יוצא של המערכתבדיוק על זה דיברנו!
רק שמה ששלחת הוא איזה מספר הנציג יראה, אנחנו רוצים שהלקוח או מי שמחייגים אליו יראה.
אז הופכים את הלקוח לנציג ואז הוא רואה את המספר מערכת כמו שאמרת!
-
RE: מידע על מספר נייח כמספר משנה למערכת.
@y6714453 אם תגיד שאתה רוצה לנייד סביר להניח שלא יתנו לך קו
-
RE: רישום
@עימוד לאיפה יגיע הרישום? מה יהיה ברישום?
אם רק מספר הטלפון ולא משנה לך באיזה קובץ אפשר משהו כזה
שלוחה 0 ->type=add_id_to_list add_id_to_list_location_list=/Subscribers_phone_numberאתה יכול להוסיף הודעה מספר M3411 עם ההודעה שתרצה שישמעו, כרגע זה הרישום בוצע בהצלחה שלום ותודה
ואז בשלוחה הראשית להכניס הודעה לרישום הקישו 0
כל מספרי הטלפון שנרשמו יהיו בשלוח ההראשית בקובץ שנקרא Subscribers_phone_number.ini
-
RE: חדש! מודול ניתוב שיחות לפי תור ללא עלות יחידות - שרשור מתעדכן
@eliyahu מה לגבי רישום לחזרה? זה היום חובה במערכות
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@963 לא, רק התוכן של הcontents נכנס
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@BEN-ZION חחחח שכחתי... פרט שולי....
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
type=api title= api_link=https://call2all.co.il/ym/api/UploadTextFile api_add_0=token=WU1BUElL.apik_****** api_add_1=what=ivr2:3/1/1/queue.ini api_000=contents,no,10,9,Phone, api_end_goto=/3/1/1 api_hangup_send=no api_call_id_send=no api_phone_send=no api_did_send=no api_extension_send=no api_enter_id_send=no api_enter_id_name_send=no api_time_send=noאומר מיד אין מענה משרת API אפילו לא מבקש הקשות
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@BEN-ZION מעניין, כי ידוע שבפקודה הזו קצת לוקח זמן עד שהכל מתעדכן
-
RE: קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
@BEN-ZION כתב בקומבינה לשיחה יוצאת עם זיהוי מערכת - הוספת ערך ל2 מקומות:
@אA אני עשיתי אצלי אם הוספת ערך וזה עבד לי מיד
איך הוספת ערך?
