קומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה
-
@אA אני עושה הרשמה לצינתוק חינמי אמצעות מודל הכנסת ערך שמשנה את מספר הרשימה לטלפון של הנכנס, הוי אומר תך רבע שניה זה משתנה
-
@isi כתב בקומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה:
@יוסף-חיים-5 מה זה המודול של עזר פון?
-
@איל-משולש
מעניין מאוד.
אבל במודול הזה זה לא כך.
תנסה ותראה. -
@איל-משולש כתב בקומבינה לשיחה יוצאת עם זיהוי מערכת על בסיס שלוחת API ושלוחת תור החדשה:
@אA אני עושה הרשמה לצינתוק חינמי אמצעות מודל הכנסת ערך שמשנה את מספר הרשימה לטלפון של הנכנס, הוי אומר תך רבע שניה זה משתנה
אני חושב שהסיבה היא מה שכתב שם @cubase שאולי זה שונה קובץ queue מקובץ ext, שבזה באמת לוקח זמן. תראה שם בשרשור שהבאתי, שהיו כמה שכתבו שהם ניסו ול3ח להם זמן.
-
@אA אולי לא ממש תוך רגע, אני השתמשתי בזה!, בעקרון זה לא עוזר כלום כי זה לא מוחק את הנציג הקודם ואז זה יחייג גם למי שחייג בפעם הקודמת!!!!
אני השתמשתי בזה ע"י API שהחליף לפני זה את הקובץ הקודם לקובץ חדש (בשביל הגדרות - כמו זיהוי יוצא) -
@איל-משולש
גם אני עשיתי ככה וזה לא החליף מיד. -
@אA לי זה עבד, אולי לקח איזה שניה של התנה, אני כבר לא זוכר מה בדיוק עשיתי
-
ראיתי שקצת הסתבכו כאן, אכתוב את הדרך שבה השתמשתי ועובדת לי מצוין ללא השהיות:
1.
שלוחה1/type=add_id_to_list title=הקשת מספר לחיוג add_id_to_list_location_list=/1/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=447292_musicclass%0A add_id_to_list_value_type=digits add_id_to_list_value_change=yes add_id_to_list_end_goto=1יש להעלות לשלוחה קובץ
M3411שקט,
בשורה 8 אחרי ה-contents=זה ההגדרות בקובץqueue.iniעם%0Aבמקום ירידת שורה, ניתן לשנות/להוסיף הגדרות כרצונכם.ה-musicclass (מוזיקה בהמתנה) בשורה 8 זה צליל חיוג שיצרתי לו מוזיקה בהמתנה - מערכות בשרת
ymtaיעבוד להם, אחרים יצטרכו ליצור בעצמם ולשנות בשורה 8.
2.
שלוחה1/1/type=api title=שינוי המספר לחיוג בפועל api_link=https://www.call2all.co.il/ym/api/UploadTextFile ;מפתח API api_add_0=token=*** api_add_1=what=ivr2:/1/2/queue.ini api_hangup_send=no api_end_goto=../2יש ליצור מפתח API ולשים אותו בשורה 7, ובנוסף להעלות לשלוחה קובץ
M1607שקט.
3.
שלוחה1/2/type=routing_queue title=שיחות יוצאות queue_caller_id=customer_did queue_end_continue_goto=hangupכמובן שבשלוחה זו אפשר להוסיף הגדרות כרצונכם.
זה הכל, מקווה שיעזור למישהו.
-
@cubase אין עליך, לא סתם תייגתי אותך (במקור)!
בלי לזלזל בכל העונים כמובן -
@CUBASE אלוף

שברתי את הראש איך אני יכול להוסיף כמה ערכים בלי להשתמש בשרת חיצוני -
ע עידו סימן נושא זה כנפתר
-
@CUBASE זה אומר לי אין מענה בשרת api
(שמתי מפתח של המערכת אולי צריך לזה מפתח ג'ימיני הוא כתב ליצור מפתח איזה??) -
וכן זה אומר לי השלוחה אליי ביקשתם לעבור אינה ניתנת להפעלה עקב חוסר בהגדרות אנא פנה למנהל המערכת אם מישהו יכול לעזור לי בזה אני מאוד אשמח!!

-
@1668 מבנה השלוחות אצלך הוא ככה:
1
1/1
1/2
?אם לא אז יש אצלך בעיה...
בכל מבנה אחר צריך לשנות את הערכים בקוד.
צריך כמובן להעלות קבצים לפי מה שכתוב שם. -
@עידו לא!
אבל בסוף הסתדרתי תודה


-
אני יכול לעשות את ההקשות יותר לאט?? זה מהירות טיל ואני לא מספיק לרשום שום דבר אני אשמח לתשובה!


תודה -
וגם שלא יבקש אישור על המספר אני מאוד אשמח לתשובה תודה רבה!



-
@1668 אני עשיתי נראה לי הכל נכון, וזה אומר לי שגיאה, מה יכול להיות ?
-
עודכן בהודעה הראשונה קובץ שמכין את כל ה"מערכת" הזאת קומפלט עם כל הקבצים השקטים - לא לשים / אני לא יודע מה הוא יעשה עם זה!.
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
-
פוסט זה נמחק! -
