@יאנג-בוי דווקא לי ענו במייל כך:
ומזה שהשיבו לי "אין צפי לחזרה שלהם כרגע" היה נראה שזה פעולה יזומה, וזה לא באג, וזה לא בטיפול,
אך כמובן שנשמח כולנו אם זה אכן יחזור לפעול!!
(אולי יש לבטל את ה"נפתר" עד שהעניינים יתבהרו)
@יאנג-בוי דווקא לי ענו במייל כך:
ומזה שהשיבו לי "אין צפי לחזרה שלהם כרגע" היה נראה שזה פעולה יזומה, וזה לא באג, וזה לא בטיפול,
אך כמובן שנשמח כולנו אם זה אכן יחזור לפעול!!
(אולי יש לבטל את ה"נפתר" עד שהעניינים יתבהרו)
לתועלת הרבים אני מעלה פה בס"ד קוד משודרג!!
הקוד כמובן מתבסס על הקוד הבסיסי ש @עידו היקר העלה פה!
ויש כאן 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 , וזה סיפור שלם להיכנס לתוך כל הקודים ולהתחיל לנקד שם,
ובנוסף, כיון שהיה מוגדר אצלי מהירות גבוהה בהקראה של הקריין הרגיל שהיה עד עכשיו, - אז זה גרם שבקריין החדש המהירות הכפילה את עצמה ביותר, בצורה כזו שגורמת לי בושות מכל הלקוחות שמבקרים בימים אלו במערכת שלי...
מקווה שזה יסתדר בקרוב, ושלא נצטרך להתחיל לנקד את כל הטקסטים המפוזרים בהרבה מקומות, ולהתחיל לשנות את המהירות של כל מקום בפני עצמו.
@צבי-ד-צ כתב במה קרה לאחרונה בימות:
הפרסומות עכשיו מתחילים ב"פרסומת קצרה" ואז הפרסומת
זה התחיל כבר בפועל??
אשמח לקבל מספר של קו שזה מושמע אצלו,
(אולי אראה שזה נשמע סביר, ויהיה כדאי לי לחתום איתם על הסכם שותפות ברווחים...)
@sbb0799 כתב במה קרה לאחרונה בימות:
זה אומר שיש בעלי קווים שלא עודכנו
ויהיה עוד גל של אנשים זועמים שלא בטוח שיודעים שהפורום הזה קיים....
כדאי שימות המשיח / (או מישהו אחר שיודע), יעדכנו לפחות כאן בפורום, איך נרשמים לרשימת התפוצה לקבלת העידכונים השוטפים,
מבדיקה, זה לא נשלח לי למייל שמוגדר בפרטים של בעל המערכת.
(אולי כי הקו שלי מוגדר אצלם כקו עסקי, והמייל לא נשלח לקווים העסקיים??)
ובנוסף, לא כ"כ יועיל שזה ישלח למייל שמוגדר במערכת, כיון שבמערכות עם פעילות שוטפת, בדר"כ יש אלפי מיילים של דוחות שונים שנשלחים מהמערכת, - ובודאי זה לא המייל השימושי של בעלי המערכות, ולכן א"א להעיר את תשומת הלב של מנהלי המערכות לשינויים צפויים דרך המייל ההוא.
מי שיודע איך מצטרפים לרשי"ת שלהם, נא לעדכן לתועלת הרבים.
@עידו למשל, אחד משלם לך על הרשאת גישה לקו טלפוני לדוגמא,
ואתה רוצה לאפשר לו גישה לכל המשפחה לשמוע את הקורס,
אז הוא מתבקש להקיש בשאלה 050 את הטלפון של אשתו, ובשאלה 051 ואילך את הטלפונים של כל הילדים שלו, ואז אתה צריך שכל התשובות שהוא הקיש שם יכנסו לרשי"ת מסויימת, שזהו בעצם פילטר להיכנס לשלוחות שבתוך הקו למי ששילם,
(כמובן הבאתי רק דוגמא, אבל אינני מתעסק עם קורסים טלפונים וכדו', - ולי זה היה נצרך בשביל צורך אחר לגמרי, אבל ג"כ נתקלתי בבעייה הזו שא"א להוסיף לרשי"ת יותר מתשובה אחת שהתקבלה בקבלת נתונים)
[ועוד נ"ב, לו יצוייר שהסיפור באמת היה כמו שציירתי, אז היה אפשר להתגבר על זה ע"י שהיו מפצלים את הקבלת נתונים, לכמה שלבים, ואחרי שהיה יוצא משלוחה של קבלת נתונים 1, היה מועבר לשלוחה של קבלת נתונים 2,
@עידו כתב בהרשמה ל 2 רשימת תפוצה בקבלת נתונים:
@ש-ב-0 אתה מנסה לחבר את המספר המחייג ל2 רשי"ת?
או שאת המספר שהכניסו בשאלות?
תפרט טיפה שנוכל לנסות לעזור
@ש-ב-0 כתב בהרשמה ל 2 רשימת תפוצה בקבלת נתונים:
השאלה היא (1) אם אפשר להוסיף שתי ערכים דהיינו שאלות 052 ו 054 - (2) וכן שזה יתווסף ל 2 רשימות תפוצה
כמו שכתבתי מקודם, בעבר ניסיתי לפתור את 2 הבעיות שהוא שאל, (ע"י נסיון של הפרדה עם פסיקים - וכן ע"י נסיון של כתיבת הקוד ב-2 שורות נפרדות), ולא הצליח,
(את הבעייה הראשונה אני זוכר במאה אחוז שזה לא עבד, - ולגבי הבעייה השנייה, אם אני זוכר טוב, זה ג"כ לא עבד).
[כמובן אם הבעייה הייתה עם המספר של המחייג בעצמו (ולא של הערכים שהקיש המחייג בתשובות) היה אפשר להתגבר על זה במודול הוספה לרשי"ת שהמחייג היה נכנס לשם מייד בסיום קבלת הנתונים].
@עידו נוכחנו בעבר לראות שאתה זריז מאוד בעניינים האלו, - ואולי יהיה לך פנאי וכח... להעלות קוד שיתגבר על החסר הקיים בהגדרות כנ"ל, - (ניסיתי בעבר לבנות קוד לזה, אבל כנראה הייתה איזו שגיאה וזה לא הצליח, ואם יש לך פנאי לזה אוכל לשלוח לך את הקוד שכאמור עדיין צריך איזה תיקון)
@ש-ב-0 גם אני ניסיתי בעבר כמה וכמה נסיונות בכל האפשרויות הרגילות, להגיע לתוצאה כזו, ולא הצלחתי,
וזה באמת מאוד חבל,
וכמובן נשמח אם אולי בכל זאת ימצא פיתרון לזה,
(הכל אפשרי ע"י שליחת הנתונים לקוד בשרת API אבל צריך פיתוח קוד בשביל זה).
@ivrפון כתב בלקוח פרטנר יקר - בעיות הקשה:
מכיון שהבעיה היא רק ללקוחות פרטנר
אם הבעייה הייתה רק ללקוחות פרטנר שמתקשרים למערכת, ניחא, שבשעת הדחק ניתן היה להסתדר עם זה, - שכאשר רואים שההקשות לא עובדות, מבינים שיש תקלה, ומנתקים ומחייגים שוב עד שמצליחים להיכנס למערכת בצורה תקינה,
אבל הבעייה גדולה יותר, - כיון שישנם משתמשים כמוני, שמשגרים הודעות ללקוחות עם קמפיין פתוח, והלקוח מקבל הודעה ששואלת אותו: במידה שהתשובה X הקש 1 ובמידה שהתשובה Y הקש 2
והלקוח בטוח שאנו מנהלי המערכות קיבלנו את התשובה שלו,
אך למעשה התשובות לא מתקבלות אצלנו במערכת, כיון שהלקוחות בעצם נתקעו בתפריט הראשי...
(היום במיוחד שמתי לב לבאג הזה, בכשלושים אחוזים משיגורי ההודעות שניסיתי בבדיקה שערכתי).
(לפחות קצת ניחום היה לי כשקראתי את הפוסט הזה, כאשר הבנתי ממכם שהבעייה היא רק בפרטנר, בבחינת הרע במיעוטו)
@עידו כתב בפקודה שתעתיק מרשימת תפוצה 1 לרשימת תפוצה 2:
@מושי-גרינוואלד תחפש בשרשורים אחרונים, יש קוד מוכן ומאוד יפה
@עידו הצטנע ולא סיפר כאן שהוא בעצמו יצר לנו בהתנדבות מלאה את הבסיס של הקוד הנפלא שהועיל לנו כל כך...
@מושי-גרינוואלד
להלן הקוד:
אני משתמש בו בקביעות, וזה חוסך לי זמן רב!!
תודה רבה על כל הסיוע,
(למעשה, בינתיים הקריין הישן חזר לקריין כהוגן)
תודה רבה!!
בשורה טובה:
נכון לשעות האחרונות,
הקריין הישן חזר לפעולה!!!!!