בירור | מהירות שרת שמתקשר עם ימות המשיח
-
בניתי מערכת של ימות המשיח שעובדת עם שליחת נתונים לשרת.
הבעיה היא שלוקח לכל פעולה בערך 6 שניות עד שהיא מתבצעת (זה שתי פקודות שצריך להריץ אחד אחרי השניה עם קבלת נתונים), וזה מאוד לא נח למשתמשים.
השאלה היא האם זה קשור לחברה של השרתים, ואם יש בזה הבדל בין שרת חינמי לשרת בתשלום, או שברמה הזו אין הבדל משמעותי.
עכשיו אני על שרת של קלאודפלייר החינמי (שעובד מצויין עם ימות המשיח).
תודה רבה! -
בניתי מערכת של ימות המשיח שעובדת עם שליחת נתונים לשרת.
הבעיה היא שלוקח לכל פעולה בערך 6 שניות עד שהיא מתבצעת (זה שתי פקודות שצריך להריץ אחד אחרי השניה עם קבלת נתונים), וזה מאוד לא נח למשתמשים.
השאלה היא האם זה קשור לחברה של השרתים, ואם יש בזה הבדל בין שרת חינמי לשרת בתשלום, או שברמה הזו אין הבדל משמעותי.
עכשיו אני על שרת של קלאודפלייר החינמי (שעובד מצויין עם ימות המשיח).
תודה רבה! -
@מענין-לשמוע
מאוד תלוי מה הפעולות שמתבצעות, באיזה שפה הם כתובות ועוד פרמטרים שלא בהכרח קשורים למהירות השרת עצמו.תרצה לפרט קצת יותר מה בדיוק מתבצע?
@יאנג-בוי
המשתמש עובר משלוחה לשלוחה בהקשה על 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' } }); } }; -
@יאנג-בוי
המשתמש עובר משלוחה לשלוחה בהקשה על 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 של ימות.
יש לך רעיון יותר טוב איך לעשות את זה? אני ישמח!