@יאנג-בוי דווקא לי ענו במייל כך:
ומזה שהשיבו לי "אין צפי לחזרה שלהם כרגע" היה נראה שזה פעולה יזומה, וזה לא באג, וזה לא בטיפול,
אך כמובן שנשמח כולנו אם זה אכן יחזור לפעול!!
(אולי יש לבטל את ה"נפתר" עד שהעניינים יתבהרו)
@יאנג-בוי דווקא לי ענו במייל כך:
ומזה שהשיבו לי "אין צפי לחזרה שלהם כרגע" היה נראה שזה פעולה יזומה, וזה לא באג, וזה לא בטיפול,
אך כמובן שנשמח כולנו אם זה אכן יחזור לפעול!!
(אולי יש לבטל את ה"נפתר" עד שהעניינים יתבהרו)
לתועלת הרבים אני מעלה פה בס"ד קוד משודרג!!
הקוד כמובן מתבסס על הקוד הבסיסי ש @עידו היקר העלה פה!
ויש כאן 4 שידרוגים חשובים
בשאילתה יש אפשרות לקבוע איזו פעולה לעשות (להוסיף / לחסום /להחליף) - (שימו לב: פונקציית "מחיקה" כרגע לא פעילה, - אולי בהמשך אעלה בעז"ה תיקון לפונקצייה הזו).
בנוסף יש אפשרות בפעולה אחת לבחור כמה רשימות "מקור" (ללא הגבלה) וכן אפשר לבחור כמה רשימות "יעד" (ללא הגבלה), - ולבצע את העתקת כל המספרים שנשלפו מכל המקורות שנבחרו, לכל היעדים שנבחרו,
(שימו לב: אין אפשרות לפצל ביניהם, אלא הפעולה היא מכל המקורות לכל היעדים).
ישנה אפשרות להכניס את הפרמטרים לתוך הגדרות השלוחה, ואז ניתן לבצע את הכל דרך הטלפון...
להלן מה שצריך להכניס לשלוחה
type=api
api_link=http://164XXXXXXXXXXXXXXXXtfuza.php
טוקן
api_add_0=token=0999999999:123456
איזו פעולה לבצע
api_add_1=action=add
4 אפשרויות:
להוסיף add / למחוק remove /לחסום block / להחליף את המספרים הישנים בחדשים replace
רשימת מקור
api_add_2=source1=255510
אפשר להוסיף מקורות ע"י source2 וכן הלאה
רשימת יעד
api_add_3=target1=255739
אפשר להוסיף יעדים ע"י target2 וכן הלאה
(אפשר להשתיק את הודעת "אין מענה משרת API" - הפעולה מתבצעת בלי תשובה מהשרת)
הלינק צריך להיות כך:
.http://164XXXXXXXXXXXXXXXXtfuza.php?token=0799999999:123456&action=add&source1=11122&target1=22233
מצו"ב תמונה של השאילתה המעודכנת:
וכמובן צריך שרת להכניס שם את הקוד, ולהלן הקוד המשודרג:
<?php
// משתנים עיקריים
$success = '';
$error = '';
$resultMsg = '';
$removedCount = 0;
$blockedCount = 0;
$transferredCount = 0;
// קבלת פרמטרים מהמשתמש (GET/POST)
$request = array_merge($_GET, $_POST);
$action = $request['action'] ?? '';
$token = $request['token'] ?? '';
// קבלת מקורות ויעדים כמערכים
$sources = [];
$targets = [];
// תמיכה בפרמטרים בודדים או מערכים
foreach ($request as $key => $value) {
if (preg_match('/^source(\d+)$/', $key) && trim($value) !== '') {
$sources[] = trim($value);
}
}
if (isset($request['sources']) && is_array($request['sources'])) {
foreach ($request['sources'] as $src) {
if (trim($src) !== '') $sources[] = trim($src);
}
}
foreach ($request as $key => $value) {
if (preg_match('/^target(\d+)$/', $key) && trim($value) !== '') {
$targets[] = trim($value);
}
}
if (isset($request['targets']) && is_array($request['targets'])) {
foreach ($request['targets'] as $tgt) {
if (trim($tgt) !== '') $targets[] = trim($tgt);
}
}
// ביצוע פעולה רק אם כל הנתונים קיימים
if ($_SERVER['REQUEST_METHOD'] === 'POST' || !empty($_GET)) {
if ($token && count($sources) > 0 && count($targets) > 0 && in_array($action, ['add','remove','block','replace'])) {
// פונקציית עזר לשליחת בקשה ל-API
function apiRequest($url, $data) {
$curl = curl_init($url);
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data),
]);
$response = curl_exec($curl);
curl_close($curl);
return json_decode($response, true);
}
// שליפת כל המספרים מכל המקורות (ללא כפילויות), כולל rowid
$allNumbers = [];
foreach ($sources as $sourceId) {
$getUrl = 'https://www.call2all.co.il/ym/api/GetTemplateEntries';
$getResponse = apiRequest($getUrl, [
'token' => $token,
'templateId' => $sourceId,
]);
if (isset($getResponse['entries'])) {
foreach ($getResponse['entries'] as $entry) {
$phone = $entry['phone'];
$allNumbers[$phone] = [
'phone' => $phone,
'name' => $entry['name'] ?? '',
'moreinfo' => $entry['moreinfo'] ?? '',
'blocked' => $entry['blocked'] ? 1 : 0,
'rowid' => $entry['rowid'] ?? '', // נוסיף את rowid
];
}
}
}
// ביצוע הפעולה שבחר המשתמש
if ($action === 'replace') {
// אם נבחרה פעולה 'החלפה' - מנקים את כל המספרים מכל היעדים
$clearUrl = 'https://www.call2all.co.il/ym/api/ClearTemplateEntries';
foreach ($targets as $targetId) {
apiRequest($clearUrl, [
'token' => $token,
'templateId' => $targetId,
]);
}
}
if ($action === 'add' || $action === 'replace') {
// אם נבחרה פעולה 'הוספה' או 'החלפה' - מוסיפים את כל המספרים מהמקורות לכל היעדים
$updateUrl = 'https://www.call2all.co.il/ym/api/UpdateTemplateEntry';
foreach ($targets as $targetId) {
foreach ($allNumbers as $entry) {
apiRequest($updateUrl, [
'token' => $token,
'templateId' => $targetId,
'phone' => $entry['phone'],
'name' => $entry['name'],
'moreinfo' => $entry['moreinfo'],
'blocked' => $entry['blocked'],
]);
$transferredCount++;
}
}
$resultMsg = "בוצעה הוספה של $transferredCount מספרים.";
} elseif ($action === 'remove') {
// אם נבחרה פעולה 'מחיקה' - מוחקים את כל המספרים מהיעדים לפי rowid
$deleteUrl = 'https://www.call2all.co.il/ym/api/UpdateTemplateEntries';
foreach ($targets as $targetId) {
$rowids = [];
foreach ($allNumbers as $entry) {
if (!empty($entry['rowid'])) {
$rowids[] = $entry['rowid'];
}
}
if (count($rowids) > 0) {
apiRequest($deleteUrl, [
'token' => $token,
'templateId' => $targetId,
'rowids' => implode('-', $rowids),
'action' => 'delete',
]);
$removedCount += count($rowids);
}
}
$resultMsg = "בוצעה מחיקה של $removedCount מספרים.";
} elseif ($action === 'block') {
// אם נבחרה פעולה 'חסימה' - חוסמים את כל המספרים בכל היעדים
$blockUrl = 'https://www.call2all.co.il/ym/api/UpdateTemplateEntry';
foreach ($targets as $targetId) {
foreach ($allNumbers as $entry) {
apiRequest($blockUrl, [
'token' => $token,
'templateId' => $targetId,
'phone' => $entry['phone'],
'name' => $entry['name'],
'moreinfo' => $entry['moreinfo'],
'blocked' => 1, // חסום
]);
$blockedCount++;
}
}
$resultMsg = "בוצעה חסימה של $blockedCount מספרים.";
}
// שמירת הודעת הצלחה
$success = $resultMsg;
} else {
// אם חסר נתון - הודעת שגיאה מתאימה
$error = "יש למלא טוקן, לפחות מקור אחד ולפחות יעד אחד, ולבחור פעולה";
}
}
?>
<!DOCTYPE html>
<html lang="he">
<head>
<meta charset="UTF-8">
<title>ניהול רשימות תפוצה</title>
<style>
/* עיצוב בסיסי לטופס ולרכיבים */
body { font-family: sans-serif; direction: rtl; padding: 20px; max-width: 600px; margin: auto; }
label { display: block; margin-top: 10px; }
input[type="text"], input[type="number"] { width: 100%; padding: 8px; margin-top: 5px; }
button { margin-top: 20px; padding: 10px 20px; font-size: 16px; }
.msg { margin-top: 20px; font-weight: bold; }
select { width: 100%; padding: 8px; margin-top: 5px; }
.dynamic-list { margin-bottom: 10px; }
.dynamic-list input { width: 90%; display: inline-block; }
.dynamic-list button { width: 8%; display: inline-block; }
</style>
<script>
// פונקציה להוספת שדה מקור/יעד דינמית לטופס
// מוסיפה div עם שדה קלט וכפתור X להסרה
function addField(listId, inputName) {
var list = document.getElementById(listId);
var div = document.createElement('div');
div.className = 'dynamic-list';
div.innerHTML = '<input type="number" name="'+inputName+'[]" placeholder="הכנס מזהה"> <button type="button" onclick="this.parentNode.remove();">X</button>';
list.appendChild(div);
}
</script>
</head>
<body>
<h2>ניהול רשימות תפוצה</h2>
<form method="post">
<!-- שדה טוקן -->
<label>Token:
<input type="text" name="token" required>
</label>
<!-- שדות מקורות -->
<label>מקורות (ללא הגבלה):</label>
<div id="sources-list"></div>
<button type="button" onclick="addField('sources-list','sources')">הוסף מקור</button>
<!-- שדות יעדים -->
<label>יעדים (ללא הגבלה):</label>
<div id="targets-list"></div>
<button type="button" onclick="addField('targets-list','targets')">הוסף יעד</button>
<!-- בחירת פעולה -->
<label>פעולה:
<select name="action" required>
<option value="">בחר פעולה</option>
<option value="add">הוספה (העתקה)</option>
<option value="remove">מחיקה</option>
<option value="block">חסימה</option>
<option value="replace">החלפה (ניקוי ואז הוספה)</option>
</select>
</label>
<button type="submit">בצע פעולה</button>
</form>
<?php if (!empty($error)): ?>
<!-- הודעת שגיאה אם יש -->
<div class="msg" style="color: red;"> <?= htmlspecialchars($error) ?> </div>
<?php elseif (!empty($success)): ?>
<!-- הודעת הצלחה אם יש -->
<div class="msg" style="color: green;"> <?= htmlspecialchars($success) ?> </div>
<?php endif; ?>
<script>
// הוספת שדה ראשון אוטומטית למקורות וליעדים בעת טעינת הדף
addField('sources-list','sources');
addField('targets-list','targets');
</script>
</body>
</html>
בהצלחה גדולה!!
@yankl כתב בקול ההקראה השתנה לפתע:
וכן שיבושים בהקראה כולל טקסט מנוקד, כפי שתיארו זאת היטב קודמיי.
לתועלת הרבים, מנסיון, יש לשים לב, לנקד "רק" את המילים שהוא "לא יודע" לקריין אותם כראוי "בלבד",
כיון שאם מנקדים לו את כל הטקסט, זה גורם ליותר בעיות בקריינות מאשר ללא ניקוד, (כיון שבהרבה מילים, דווקא בגלל הניקוד הוא מקריין אותם בצורה מעוותת),
(ובנוסף, הניקודים נחשבים כ"תוים", וניקוד מיותר יגרום לקיצור אורך הטקסט שהיה אפשר לתת לו לקריין בפעם אחת),
בשורה טובה:
נכון לשעות האחרונות,
הקריין הישן חזר לפעולה!!!!!
@אA אז כנראה המערכת שלי משוכללת יותר מהמערכות של כולם...
בכל אופן תודה רבה!
ושוב בדקתי את הרעיון הראשון של @עץ-השדה , וראיתי שזה אכן רעיון מצויין גם בשבילי,
כיון שראיתי בכמה בדיקות שעשיתי (ותתקנו אותי אם זה לא מדוייק), שיש הבדל אם ההגדרה בשלוחה היא שהלקוח חוסם עצמו ברשי"ת (שאז הלקוח נחסם בכל הרשי"ת הקיימות במערכת, והמנהל לא יכול להתערב אח"כ ולבטל את החסימה בשום צורה שהיא), ובין אם בשלוחה מוגדר שהלקוח מוחק עצמו מהרשי"ת (שאז המנהל יכול להחזיר את הלקוח שוב פעם, אפי' לרשי"ת הספציפית שנמחק משם),
(בתיעוד של ימות המשיח לא הוזכר חילוק בעניין, אבל מכמה נסיונות שעשיתי זה מה שיצא לי בינתיים),
ואם זה נכון, אז הרעיון של @עץ-השדה יסייע לי מאוד מאוד בתפעול המורכב של המון קמפיינים שאני שולח בקביעות זה תקופה ארוכה, ועל כך תודתי הגדולה!!!
@אבו הבעייה מוכרת גם בחברות תוכן אחרות, (שאינם קשורות לימות המשיח)
במקרים רבים, הבעייה נפתרת אחרי שמגדירים בטלפון שיהיה רק על דור 3 (ולא דור 4) בדוק ומנוסה!!
תבדוק אם גם אצלך זה יפתור את הבעייה, ותעדכן את כולם לתועלת הרבים!!
@אA אני אגדיר remove_and_delete=yes
ואבקש מהשרות לקוחות שיגדירו לי את הקמפיין כשיחה חוזרת כפי הרעיון של @עץ-השדה והכל יבוא על מקומו בשלום בס"ד
@יאנג-בוי אצלי זה גם כן כך מהבוקר, - ויש לקריין החדש בעייה גדולה בניקוד, ולמשל "הקש" הוא מנקד עם פתח, "שקלים" הוא אומר "שגיאה בהקראה", "בכל" הוא מנקד עם פתח וכו' וכו', - ויש לי הרבה הקראות של טקסטים שנמצאים בשרת שלי בתוך קודים שמתקשרים ב API , וזה סיפור שלם להיכנס לתוך כל הקודים ולהתחיל לנקד שם,
ובנוסף, כיון שהיה מוגדר אצלי מהירות גבוהה בהקראה של הקריין הרגיל שהיה עד עכשיו, - אז זה גרם שבקריין החדש המהירות הכפילה את עצמה ביותר, בצורה כזו שגורמת לי בושות מכל הלקוחות שמבקרים בימים אלו במערכת שלי...
מקווה שזה יסתדר בקרוב, ושלא נצטרך להתחיל לנקד את כל הטקסטים המפוזרים בהרבה מקומות, ולהתחיל לשנות את המהירות של כל מקום בפני עצמו.
@דוד_מלך_ישראל כתב בקול ההקראה השתנה לפתע:
@פלוס כתב בקול ההקראה השתנה לפתע:
אם זה פעולה יזומה,
אני בקריאה לחברת ימות המשיח
הרובוט כרגע - הוא קול שמאוד מציק - ויהיו שיאמרו מעצבן,
אנא ואנא, החזירו לפעילות את הקולות הקודמים שהיו,
בטוחני שעוד רבים וטובים מפריע להם העניין.
תודה רבה!ואם גם לכם זה מפריע, לייקו ו/או כתבו כאן בשרשור, חשוב שיראו את הכמות!מצטרף...
משמעותי מאד, בפרט לטקסטים ארוכים.
ישנה בעייה אחת שעוד לא מצאתי אפשרות להתגבר עליה כלל וכלל,
אני משתמש בהקראות דרך -API , ואת כל המקומות שהקריין לא הקריא טוב, עוד ניקדתי איכשהו...
אבל יש לי הקראת תאריכים לועזיים אוטומטית דרך API , ובחודש הלועזי "יוני" יש לקריין בעייה רצינית...
הוא מקריא ללקוחות שלי: 14 בִּיוֵנֵי (שימו לב לניקוד...) 2025
מה עושים?? (אין שום אפשרות לנקד עצמאית את כל התאריכים של העשר שנים הקרובות...) (והתאריכים משתנים אוטומטית לפי הביקוש של הלקוחות, ואין לי דרך להתחיל לנקד כל שעה...)
@פישל כמדומני "קול הלשון" 03-6171111
@שמואל-ש ג"א מצטרף לבקשה, שפונקציית הפקס תישאר, - כי מספר הפקס שלי מופיע על גבי עשרות או מאות גליונות שהדפסתי, והגליונות נמצאים באוצר החכמה ובאתרים שונים, כך שאין לי אפשרות לתקן בגליונות האלו את מספר הפקס...
העניין הוא כזה:
כיון שיש פונקצייה "רשמית", של המרת תאריך לועזי, מתבנית של מספרים לקריינות של טקסט,
ובהרבה מערכות משתמשים עם זה,
וכעת התברר שהקריין החדש אינו יודע לקריין כראוי את חודש "יוני", (כפי שהבאתי בהודעות קודמות),
אז לכאורה זה כבר קשור ל"באגים במערכת",
וא"כ אולי יותר נכון מבחינה מקצועית, שמצד ימות המשיח ינסו לסדר את הבאג של "יוני" ??
@אA בלשונית: שיגור הודעות / הגדרות קמפיין
@בוס עזרת לי מאוד! תודה רבה!!!
אסביר בצורה מפורטת יותר, איזו תקלה עומדת להיגרם להמון לקוחות בחודש הבא:
יש לי קובץ בדטה בייס, עם תאריכים לועזיים בצורה של ספרות בלבד,
ויש לי קוד ששואב את הנתונים דרך API ומקריא את התאריכים ללקוחות שלי במערכת הטלפונית,
וכך נראה הקוד:
{ type: "text", data: "בתאריך" },
{ type: "text", data: date.toLocaleDateString("iw-IL", optionsDate) },
וכעת שמתי לב, שאת התאריך 14 ביוני 2025 למשל, הוא מקריא לי בטלפון כך (שימו לב לניקוד):
14 בִּיוֵנֵי 2025
וכעת מאות לקוחות שלי שומעים בטלפון "בִּיוֵנֵי" , ולא מבינים מה הקריין בדיוק אומר,
וכנראה שהבעייה הזו תהיה גם בעוד מערכות רבות בחודש יוני הקרוב למניינם,
@אביי-ורבא הרעיון שנתת למעלה יעזור לי לקוד שלי?? או שההמרה של התאריך לטקסט נמצאת בשרת של ימות, וזה לא יעזור לי?
@אA שאלת למעלה האם המנהל יכול לבטל את החסימה שהלקוח חסם את עצמו, ועל זה השבתי שרשמית זה נראה באתר שכאשר המנהל מבטל את החסימה של הלקוח, הלקוח מקבל צבע ירוק של לקוח פעיל, אבל בפועל זה לא מצליח לשלוח לו הודעות,
תיכנס ללשונית של שיגור הודעות/רשימת התפוצה, ותראה מה הכוונה.
@עידו המשכתי לעבוד עליו באותה צורה שאתה יצרת אותו... (וכמובן בדקתי ותיקנתי את הקוד היכן שמצאתי שהוא טעה).
@המנייעס
קח פקודה לדוגמא, ותחליף את הנתונים שבתוכו למה שאתה צריך (בלי שום רווח בתוכו),
בהתחלה תשנה למס' הטלפון של המערכת שלך, - אח"כ סיסמא - אח"כ מס' מזהה של רשי"ת של הקמפיין - אח"כ תחליף את 5 לאיזו שלוחה שאתה צריך שיכנס אליה מייד בתחילת הקמפיין - אח"כ תחליף את 35 לכמה שניות אורך חיוג שאתה צריך - אח"כ תחליף את המספר לאיזה מספר זיהוי שאתה רוצה שיקבל הלקוח בצג (זיהוי מאושר במערכת כמובן),
שים לב!!
זהו קמפיין פתוח, שיכולים לשרוף לך בשיחה אחת את כל היחידות שלך במערכת!!!!
ולכן אתה חייב לחסום את אורך הקמפיין (בהגדרת שלוחה שנכנס אליה) בכדי שלא יוכלו לשהות יותר מדי זמן בקמפיין שלך!!!
כמובן אפשר גם להגדיר שתוכל להפעיל את הכל דרך הטלפון בהגדרות שלוחה, כפי שציינו לך קודם לעיין בהדרכות על זה,
בהצלחה!!!
שים לב שזהו קמפיין שעובד בצורה שונה, ולכן אין אפשרות של חיוג חוזר באין מענה, - וכן הדוחות שמתקבלים, מוצגים בצורה שונה מאוד מהרגיל.