בירור | מהירות שרת שמתקשר עם ימות המשיח
-
@יאנג-בוי
המשתמש עובר משלוחה לשלוחה בהקשה על 7.
המטרה שלי היתה שהוא יעבור משלוחה /1/1 בקובץ 030 לדוגמא לשלוחה מיוחדת לקובץ הזה, בקוד הוא מועבר במקביל לשלוחה /999/1/030 במקביל למה שהוא שמע.
הקוד כתוב בג'אווה סקירפט, בהנחה שהבינה לא עבדה עלי
.הקוד בספויילר:
const API_BASE = 'https://www.call2all.co.il/ym/api'; const TOKEN = '07*********:*******'; async function getCallId(phone) { const url = `${API_BASE}/GetIncomingCalls?token=${TOKEN}`; const response = await fetch(url); const data = await response.json(); if (data.responseStatus !== 'OK' || !data.calls || data.callsCount === 0) return null; const call = data.calls.find(c => c.callerIdNum === phone); return call ? call.id : null; } async function transferCall(id, path) { const action = `set:GOasap=/999/${path}`; const url = `${API_BASE}/CallAction?token=${TOKEN}&ids=${id}&action=${encodeURIComponent(action)}`; const response = await fetch(url); return response.json(); } function extractPath(what) { if (!what) return ''; // ניקוי ראשוני של המבנה let clean = what.replace(/^ivr\d+:\/?/, '').replace(/\.wav$/, ''); let parts = clean.split('/').filter(p => p !== ''); // אם יש לפחות 2 איברים, נסיר את האיבר שנמצא במקום השני (index 1) if (parts.length >= 2) { parts.splice(1, 1); } return parts.join('/'); } export default { async fetch(request) { const url = new URL(request.url); const phone = url.searchParams.get('ApiPhone'); const what = url.searchParams.get('what'); if (!phone || !what) { return new Response('פרמטרים חסרים: ApiPhone ו-what נדרשים', { status: 400 }); } const path = extractPath(what); if (!path) { return new Response(JSON.stringify({ success: false, message: `נתיב ריק אחרי חילוץ מ-what="${what}"` }, null, 2), { headers: { 'Content-Type': 'application/json' } }); } const id = await getCallId(phone); if (!id) { return new Response(JSON.stringify({ success: false, message: `לא נמצאה שיחה פעילה עבור ${phone}` }, null, 2), { headers: { 'Content-Type': 'application/json' } }); } const result = await transferCall(id, path); const success = result && result.responseStatus === 'OK'; return new Response(JSON.stringify({ success, message: success ? `הועבר שיחה ${id} לשלוחה 999/${path}` : `שגיאה בהעברת שיחה ${id}`, path, callActionResult: result }, null, 2), { headers: { 'Content-Type': 'application/json' } }); } }; -
@מענין-לשמוע
זאת לא בעיית שרת, סתם מבנה לא נכון של הפעולה.
מה הטריגר שלה? לחיצה של משתמש בקובץ?
למה ההעברה של המשתמש מתבצעת דרך הAPI של ימות ולא בתגובה לבקשה?@יאנג-בוי
למה לא נכון? זה עובד מצויין.
לחיצה על 7 במערכת של ימות מפעילה את הקוד, ואז המשתמש עובר לשלוחה המתאימה על ידי הAPI של ימות.
יש לך רעיון יותר טוב איך לעשות את זה? אני ישמח! -
@מענין-לשמוע
זאת לא בעיית שרת, סתם מבנה לא נכון של הפעולה.
מה הטריגר שלה? לחיצה של משתמש בקובץ?
למה ההעברה של המשתמש מתבצעת דרך הAPI של ימות ולא בתגובה לבקשה?@יאנג-בוי כתב בבירור | מהירות שרת שמתקשר עם ימות המשיח:
ולא בתגובה לבקשה?
יש אפשרות לעבור לשלוחה אחרת לפי הקשה של המשתמש, כשהשלוחה היא לא קבועה? זאת אומרת, שאם הוא מפעיל את הAPI כשהוא מאזין לקובץ 001 הוא יעבור לשלוחה 001, ואם הוא מאזין לקובץ 002 הוא יעבור לשלוחה 002?
-
@יאנג-בוי כתב בבירור | מהירות שרת שמתקשר עם ימות המשיח:
ולא בתגובה לבקשה?
יש אפשרות לעבור לשלוחה אחרת לפי הקשה של המשתמש, כשהשלוחה היא לא קבועה? זאת אומרת, שאם הוא מפעיל את הAPI כשהוא מאזין לקובץ 001 הוא יעבור לשלוחה 001, ואם הוא מאזין לקובץ 002 הוא יעבור לשלוחה 002?
@מענין-לשמוע
ודאי!
אתה קובע את מבנה הנתיב להעברה בשרת, ואז מחזיר למשתמש פקודה להעברתו לנתיב X.
ביקשתי מהAI לעשות לך לפי המבנה של הקוד הקודם, תוכל להחליף את הקוד שם ולוודא שזה אכן עושה את הפעולה הנכונה.function extractPath(what) { if (!what) return ''; // ניקוי ראשוני של המבנה let clean = what.replace(/^ivr\d+:\/?/, '').replace(/\.wav$/, ''); let parts = clean.split('/').filter(p => p !== ''); // אם יש לפחות 2 איברים, נסיר את האיבר שנמצא במקום השני (index 1) if (parts.length >= 2) { parts.splice(1, 1); } return parts.join('/'); } export default { async fetch(request) { const url = new URL(request.url); const what = url.searchParams.get('what'); // בדיקה שהפרמטר what קיים if (!what) { return new Response('Error: Missing "what" parameter', { status: 400, headers: { 'Content-Type': 'text/plain' } }); } const path = extractPath(what); // החזרת התשובה ב-Plain Text עם סטטוס 200 return new Response(`go_to_folder=/${path}`, { status: 200, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); } };אני מניח שהשלוחה קיימת לפנ"כ, בכל מקרה לא מצאתי לזה התייחסות בקוד שלך.
-
@מענין-לשמוע
ודאי!
אתה קובע את מבנה הנתיב להעברה בשרת, ואז מחזיר למשתמש פקודה להעברתו לנתיב X.
ביקשתי מהAI לעשות לך לפי המבנה של הקוד הקודם, תוכל להחליף את הקוד שם ולוודא שזה אכן עושה את הפעולה הנכונה.function extractPath(what) { if (!what) return ''; // ניקוי ראשוני של המבנה let clean = what.replace(/^ivr\d+:\/?/, '').replace(/\.wav$/, ''); let parts = clean.split('/').filter(p => p !== ''); // אם יש לפחות 2 איברים, נסיר את האיבר שנמצא במקום השני (index 1) if (parts.length >= 2) { parts.splice(1, 1); } return parts.join('/'); } export default { async fetch(request) { const url = new URL(request.url); const what = url.searchParams.get('what'); // בדיקה שהפרמטר what קיים if (!what) { return new Response('Error: Missing "what" parameter', { status: 400, headers: { 'Content-Type': 'text/plain' } }); } const path = extractPath(what); // החזרת התשובה ב-Plain Text עם סטטוס 200 return new Response(`go_to_folder=/${path}`, { status: 200, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); } };אני מניח שהשלוחה קיימת לפנ"כ, בכל מקרה לא מצאתי לזה התייחסות בקוד שלך.
@יאנג-בוי
ממש תודה רבה!
עזרת לי לא נורמלי! -
@מענין-לשמוע
ודאי!
אתה קובע את מבנה הנתיב להעברה בשרת, ואז מחזיר למשתמש פקודה להעברתו לנתיב X.
ביקשתי מהAI לעשות לך לפי המבנה של הקוד הקודם, תוכל להחליף את הקוד שם ולוודא שזה אכן עושה את הפעולה הנכונה.function extractPath(what) { if (!what) return ''; // ניקוי ראשוני של המבנה let clean = what.replace(/^ivr\d+:\/?/, '').replace(/\.wav$/, ''); let parts = clean.split('/').filter(p => p !== ''); // אם יש לפחות 2 איברים, נסיר את האיבר שנמצא במקום השני (index 1) if (parts.length >= 2) { parts.splice(1, 1); } return parts.join('/'); } export default { async fetch(request) { const url = new URL(request.url); const what = url.searchParams.get('what'); // בדיקה שהפרמטר what קיים if (!what) { return new Response('Error: Missing "what" parameter', { status: 400, headers: { 'Content-Type': 'text/plain' } }); } const path = extractPath(what); // החזרת התשובה ב-Plain Text עם סטטוס 200 return new Response(`go_to_folder=/${path}`, { status: 200, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); } };אני מניח שהשלוחה קיימת לפנ"כ, בכל מקרה לא מצאתי לזה התייחסות בקוד שלך.
@יאנג-בוי
זה עובד ממש מצוין!
ובאמת הרבה יותר מהר.
תודה! -
@יאנג-בוי
זה עובד ממש מצוין!
ובאמת הרבה יותר מהר.
תודה! -
משהו מוזר, בפעם הראשונה לוקח לזה בערך 3 - 4 שניות, אבל מהפעם השניה (באותו השיחה) זה לוקח חצי שניה.
לשרת יותר קל לשלוח בקשה שניה מאשר את הראשונה? לימות המשיח?
תודה למסייעים! -
משהו מוזר, בפעם הראשונה לוקח לזה בערך 3 - 4 שניות, אבל מהפעם השניה (באותו השיחה) זה לוקח חצי שניה.
לשרת יותר קל לשלוח בקשה שניה מאשר את הראשונה? לימות המשיח?
תודה למסייעים! -
@מענין-לשמוע
זה בCloudflare Worker? הוא סוג של 'נרדם' ואז מתעורר כשיש קריאה למשך כמה דקות, אבל הגיוני שהקריאה הראשונה תיקח יותר זמן. ככה זה בשירותים חינמיים... -
@מענין-לשמוע כתב בבירור | מהירות שרת שמתקשר עם ימות המשיח:
צריך לחשוב איך להעיר אותו יותר מוקדם...
אפשר להשתמש עם שירות כמו cron-job.org שישלח וובהוק לworker כל דקה.
כך הוא ישאר ער. -
@מענין-לשמוע כתב בבירור | מהירות שרת שמתקשר עם ימות המשיח:
צריך לחשוב איך להעיר אותו יותר מוקדם...
אפשר להשתמש עם שירות כמו cron-job.org שישלח וובהוק לworker כל דקה.
כך הוא ישאר ער.@יאנג-בוי
עשיתי את זה, אבל--היום בשעה 19:04:02
נכשל (שגיאת HTTP) ( 810 אלפיות שנייה )
אולי יש איזה חסימה אצל קלאודפלייר נגד זה? -
@יאנג-בוי
עשיתי את זה, אבל--היום בשעה 19:04:02
נכשל (שגיאת HTTP) ( 810 אלפיות שנייה )
אולי יש איזה חסימה אצל קלאודפלייר נגד זה? -
@מענין-לשמוע
לא יודע.
לדעתי אם זה נחסם אז תבטל את זה, ותוסיף בהגדרת השלוחה מוזיקה בהמתנה לתשובה.
אפשר גם לשנות את המוזיקה ל"אנא המתן" או משהו כזה.
ואז פעם ב- יהיה מישהו שיחכה כמה שניות וידע שהוא מחכה - לא נורא.בהצלחה.
@יאנג-בוי
בסוף הסתדרתי, יש אפשרות כזו גם לקלאודפלייר עצמם, וזה מריץ לי את הקוד שלהם...
תודה רבה על העזרה!