@איל-משולש כתב במודל פרסומות:
הוא מקיש משהו ואז אתה מקבל דקות
ולכן זה יצטרך להיות בתשלום, כדי שלא יחלק דקות לכל
השטיבל
@איל-משולש כתב במודל פרסומות:
הוא מקיש משהו ואז אתה מקבל דקות
ולכן זה יצטרך להיות בתשלום, כדי שלא יחלק דקות לכל
השטיבל
נראה לי שאין כזה דבר עדיין, אז אני מתחיל:
ממשק להגדרת "מספר אישי" (Routing Yemot) בקליק אחד
העלאת קבצי שמע פלוס כותרת
ממשק לצפייה בדו"חות
ממשק לאקסס פילטר
מציג לוגים מתקדם
ממשק ליצירת שלוחות API
קובץ להגדרת שלוחת קבלת נתונים
העלאת קובץ tts בAPI
קובץ ליצירת מהירה של תשובת API
פורום ימות המשיח
קריינות VoiceMaster
פאנל ניהול מותאם אישית
העלאת שמע למקום מסויים
אינדקס המודלים
@isi
תודה אם היה לי איך לעשות לך לייק הייתי עושה
ואם אני מעביר למערכת אחרת ואז קונה יחידות למערכת החדשה זה גם יוסיף לו זמן
נוצר ע"י @הדיבל-המעופף (נוסף כעורך)
ההגדרה בשלוחה:
type=api
api_link=https://listener-management.a775529301.workers.dev
api_add_0=token=טוקן
api_url_post=yes
שימו לב שמספר המאזין שיש להקיש כדי לנתב הוא מספר סידורי ולא מספר טלפון
@עידו
רבנו אמר אין ייאוש בעולם כלל
בס"ד נפתחה קבוצה בגוגל צ'אט בנושא ימות המשיח, API ומה שביניהם.
הקבוצה כוללת הדרכות מקצועיות (לא אני כותב) בעיקר בנושאים הבאים: תקשורת של API ויצירת קוד לימות המשיח באמצעות בינה.
להצטרפות ניתן לפנות במייל.
כרגע הקבוצה פתוחה בנטפרי, נקווה שכך יהיה גם בהמשך.
שימו לב שזה מוגדר למחיקת הודעות שהושארו לפני שלושה ימים - כי כתבתי את זה בשביל מה ש @י-ש-ל ביקש כאן, אפשר לשנות את מספר הדקות בשורה 10.
/**
* ==========================================
* הגדרות קבועות
* ==========================================
*/
const YEMOT_TOKEN_FALLBACK = 'טוקן'; // הכנס כאן את הטוקן שלך
const YEMOT_PATH = 'ivr2:נתיב'; // הכנס כאן את הנתיב לשלוחה (למשל: ivr2:1 או ivr2:1/2)
const MINUTES_TO_KEEP = 4320; // מספר הדקות לשמירה (4320 דקות = 3 ימים)
function getYemotToken() {
const fromProps = PropertiesService.getScriptProperties().getProperty('YEMOT_TOKEN');
return fromProps || YEMOT_TOKEN_FALLBACK;
}
/**
* ==========================================
* הפונקציה הראשית - בודקת את השלוחה ומוחקת קבצים ישנים
* ==========================================
*/
function deleteOldFiles() {
const token = getYemotToken();
var urlGet = 'https://www.call2all.co.il/ym/api/GetIVR2Dir?token=' + encodeURIComponent(token) + '&path=' + encodeURIComponent(YEMOT_PATH);
var stats = { checked: 0, deleted: 0, skippedSystem: 0, skippedFolder: 0, failed: 0 };
try {
var response = UrlFetchApp.fetch(urlGet, { muteHttpExceptions: true });
var data = JSON.parse(response.getContentText());
if (data.responseStatus !== 'OK' || !data.files) {
Logger.log('שגיאה בקבלת נתוני השלוחה (בדוק טוקן ונתיב): ' + JSON.stringify(data));
return;
}
var now = new Date();
// חישוב זמן התפוגה לפי MINUTES_TO_KEEP (המרת דקות למילישניות)
var expirationDate = new Date(now.getTime() - (MINUTES_TO_KEEP * 60 * 1000));
for (var i = 0; i < data.files.length; i++) {
var file = data.files[i];
var fileName = file.name;
var fileType = file.fileType;
stats.checked++;
// 0. דילוג על תיקיות
if (fileType === 'FOLDER' || fileType === 'DIR' || file.isFolder === true) {
stats.skippedFolder++;
continue;
}
// 1. דילוג על קבצי INI
if (fileType === 'INI' || fileName.toLowerCase().endsWith('.ini')) {
stats.skippedSystem++;
continue;
}
// 2. דילוג על הודעות מערכת של המשתמש (כגון M1000.wav)
if (/^[Mm]\d{4}\.(wav|mp3|ogg|wma)$/.test(fileName)) {
stats.skippedSystem++;
continue;
}
// 3. בדיקת תאריך הקובץ
if (file.mtime) {
var parts = file.mtime.split(/[- :]/);
if (parts.length === 6) {
var fileDate = new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
if (isNaN(fileDate.getTime())) {
Logger.log('תאריך לא תקין לקובץ ' + fileName + ': "' + file.mtime + '" - מדלג.');
continue;
}
if (fileDate < expirationDate) {
Logger.log('הקובץ ' + fileName + ' הועלה בתאריך ' + file.mtime + ' והתיישן. מתחיל מחיקה...');
var ok = deleteFileFromYemot(token, YEMOT_PATH + '/' + fileName);
if (ok) stats.deleted++; else stats.failed++;
}
}
}
}
Logger.log('סיכום ריצה: נבדקו ' + stats.checked + ', נמחקו ' + stats.deleted +
', דולגו (מערכת) ' + stats.skippedSystem + ', דולגו (תיקיות) ' + stats.skippedFolder +
', כשלונות מחיקה ' + stats.failed);
} catch (e) {
Logger.log('שגיאה כללית בתהליך: ' + e.toString());
}
}
/**
* ==========================================
* פונקציית עזר למחיקת הקובץ בפועל
* ==========================================
*/
function deleteFileFromYemot(token, filePath) {
var urlDelete = 'https://www.call2all.co.il/ym/api/FileAction';
var payload = {
'token': token,
'action': 'delete',
'what': filePath
};
var options = {
'method': 'post',
'payload': payload,
'muteHttpExceptions': true
};
try {
var response = UrlFetchApp.fetch(urlDelete, options);
var text = response.getContentText();
var result;
try {
result = JSON.parse(text);
} catch (parseErr) {
Logger.log('תגובה לא תקינה (לא JSON) למחיקת ' + filePath + ' -> ' + text);
return false;
}
if (result.responseStatus === 'OK') {
Logger.log('נמחק בהצלחה: ' + filePath);
return true;
}
Logger.log('מחיקה נכשלה עבור ' + filePath + ' -> ' + text);
return false;
} catch (e) {
Logger.log('שגיאה במחיקת ' + filePath + ': ' + e.toString());
return false;
}
}
/**
* ==========================================
* הגדרת הטריגר (להרצה פעם אחת בלבד מהעורך)
* ==========================================
*/
function setupTrigger() {
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
if (triggers[i].getHandlerFunction() === 'deleteOldFiles') {
ScriptApp.deleteTrigger(triggers[i]);
}
}
ScriptApp.newTrigger('deleteOldFiles')
.timeBased()
.everyMinutes(1)
.create();
Logger.log('הטריגר הוגדר בהצלחה! הפונקציה deleteOldFiles תרוץ כעת אוטומטית פעם בדקה.');
}
@לימוד-בתורת-מרן הוספתי אפשרות אישור באנטר (במקום דווקא בכפתור "הגדר על שלוחה ראשית"):
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<title>הגדרת מספר אישי</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(45deg, #0f2027, #203a43, #2c5364);
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
margin: 0;
color: #fff;
}
.container {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(15px);
padding: 40px;
border-radius: 25px;
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.3);
width: 380px;
border: 1px solid rgba(255, 255, 255, 0.1);
text-align: center;
}
h2 { margin-bottom: 30px; font-weight: 300; letter-spacing: 1px; }
label {
display: block;
text-align: right;
font-size: 13px;
opacity: 0.8;
margin: 10px 2px 2px;
}
input {
width: 100%;
padding: 14px;
margin: 4px 0;
border: none;
border-radius: 12px;
background: rgba(255, 255, 255, 0.05);
color: #fff;
font-size: 16px;
border: 1px solid rgba(255, 255, 255, 0.2);
transition: 0.3s;
box-sizing: border-box;
}
input:focus {
outline: none;
background: rgba(255, 255, 255, 0.15);
border-color: #00d2ff;
}
button {
width: 100%;
padding: 15px;
margin-top: 25px;
border: none;
border-radius: 12px;
background: linear-gradient(to right, #00d2ff, #3a7bd5);
color: white;
font-size: 18px;
font-weight: bold;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.3s, opacity 0.2s;
}
button:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 10px 20px rgba(0, 210, 255, 0.4);
}
button:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
#status {
margin-top: 25px;
font-size: 14px;
font-weight: bold;
min-height: 20px;
}
.success { color: #00ffcc; }
.error { color: #ff6666; }
</style>
</head>
<body>
<div class="container">
<h2>הגדרת מספר אישי</h2>
<label for="systemNum">מספר מערכת</label>
<input type="text" id="systemNum" placeholder="מספר מערכת" inputmode="numeric" autocomplete="off">
<label for="password">סיסמת ניהול</label>
<input type="password" id="password" placeholder="סיסמת ניהול" autocomplete="current-password">
<button id="submitBtn" onclick="setupRouting()">הגדר על שלוחה ראשית</button>
<div id="status" role="status" aria-live="polite"></div>
</div>
<script>
const numInput = document.getElementById('systemNum');
const passInput = document.getElementById('password');
const submitBtn = document.getElementById('submitBtn');
const statusDiv = document.getElementById('status');
// אפשר גם לשלוח עם Enter מתוך שדה הסיסמה, לא רק בלחיצה על הכפתור
passInput.addEventListener('keydown', (e) => {
if (e.key === 'Enter') setupRouting();
});
async function setupRouting() {
const num = numInput.value.trim();
const pass = passInput.value;
if (!num || !pass) {
statusDiv.className = 'error';
statusDiv.innerText = 'אנא הזן מספר מערכת וסיסמה';
return;
}
submitBtn.disabled = true;
statusDiv.className = '';
statusDiv.innerText = 'מבצע הגדרה, נא להמתין...';
// קידוד תקין של כל פרמטר בנפרד - מונע שבירת הכתובת אם הסיסמה/המספר
// מכילים תווים מיוחדים כמו & # % + : וכד'.
const params = new URLSearchParams({
token: `${num}:${pass}`,
path: 'ivr2:/',
type: 'routing_yemot',
routing_yemot_number: num
});
const url = `https://www.call2all.co.il/ym/api/UpdateExtension?${params.toString()}`;
try {
const response = await fetch(url);
let data;
try {
data = await response.json();
} catch (parseErr) {
statusDiv.className = 'error';
statusDiv.innerText = 'התקבלה תשובה לא תקינה מהשרת';
return;
}
if (response.ok && data.responseStatus === 'OK') {
statusDiv.className = 'success';
statusDiv.innerText = `הוגדר בהצלחה מספר אישי למערכת ומספר המערכת: ${num}`;
} else {
statusDiv.className = 'error';
statusDiv.innerText = `לא ניתן להגדיר מספר אישי למערכת ${num}: סיסמה או מספר שגויים`;
}
} catch (error) {
statusDiv.className = 'error';
statusDiv.innerText = 'שגיאת תקשורת: ודא שיש חיבור אינטרנט תקין';
} finally {
submitBtn.disabled = false;
}
}
</script>
</body>
</html>
אשמח מאוד אם מישהו יוכל לתת לי לינק (API) עובד שאפשר להטמיע ב-api_post
אתה מתכוון למפתח API של יוטיוב??
בלת"ק חלקי
המשחק הזה נגמר בסוף?
אני כבר כשעה בטלפון!
נוצר ע"י @הדיבל-המעופף (נוסף כעורך)
ההגדרה בשלוחה:
type=api
api_link=https://listener-management.a775529301.workers.dev
api_add_0=token=טוקן
api_url_post=yes
שימו לב שמספר המאזין שיש להקיש כדי לנתב הוא מספר סידורי ולא מספר טלפון
@הדיבל-המעופף יצר ופרסם את זה:
type=api
api_link=https://listener-management.a775529301.workers.dev
api_add_0=token=טוקן
api_url_post=yes
@מסובך-מאוד הוא שאל על הודעות שלא מופיעות כאן (או שהן לא קיימות)
@איל-משולש בטוח שמבנה הקובץ נשאר תקין? נראה לי שלזה התכוון @הדיבל-המעופף
@CUBASE כתב בפילטר הפניה API:
במודול הזה א"א לנהל אינטרקציה עם המאזין אבל אם זה המטרה שלך אז פשוט תשתמש במודול API רגיל.
קשור? או שיכול להיות שפרמטרים כן אפשר לשלוח?
> @sh0548534047 כתב:
האור הגנוז התגלה כבר בסוכות
מוקדם מהצפוי
אולי זה האור המקיף של שמחת תורה המתקרב ובא...
בפרט שהורתו ולידתו של השרשור הזה בסוכות הקודם...