דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. בניית מחלקת תקשורת עם ימות המשיח API ב nodejs

בניית מחלקת תקשורת עם ימות המשיח API ב nodejs

מתוזמן נעוץ נעול הועבר תכנות
18 פוסטים 6 כותבים 743 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • ח מנותק
    ח מנותק
    חוקר
    כתב ב נערך לאחרונה על ידי חוקר
    #1

    ישנה מחלקה של תקשורת עם ימות המשיח ב API, בשפת PHP, שבנה אותה "מאזין נלהב" בפורום ימות.
    להלן קישור לפרסום בפורום ימות
    http://www.call2all.co.il/f2/viewtopic.php?f=12&t=2780
    ולהלן הקוד עצמו.

    ברצוני לבנות את זה בNODE רק שאני רוצה כיון איך ניתן לבנות אותו שיהיה בצורה אסינכרונית.
    שאוכל להדפיס תשובה למערכת שההקלטה הסתיימה בהצלחה, ובמקביל להתחבר לימות המשיח ע"י API ולהוריד את ההקלטה, ולשלוח אותה לדוא"ל.
    (המודולים של ימות להלקטה ושליחה למייל לא רלוונטים, אני מדבר על הקלטה שמבוצעות בשלוחת API בתהליך שיחה, שאני רוצה בסיום לשלוח מייל עם פרטי השיחה, ובנוסף את ההקלטה.)
    בPHP למשל היה עלי לבצע הכל תוך כדי שהמאזין ממתין, מוריד מימות מעלה למייל, ואז מדפיס למסך פקודה לימות שההקלטה הסתיימה. כאן אני רוצה את הגמישות של אסינכרוני.

    אם יש למישהו כיון או דוגמה של מחלקה דומה בנוד, אשמח מאוד.
    תודה

    @magicode אולי תוכל בשתי מילים לעזור.
    אני חייב לך הכרת הטוב מרובה (חוץ מזה שאני משתמש נטפרי) על עזרתך בתחילת הדרך בנוד.

    המחלקה ב PHP:

    /*================יצירת אובייקט(מופע) חדש====================*/
    
    $con = new connecting_to_yemot_api('0773137770', '0000');
    
    /*===============================================================*/
    
    
    /*================קבלת מספר היחידות====================*/
    
    $a = $con -> connecting('GetSession');
    
    print_r($a);
    
    /*===============================================================*/
    
    
    
    /*================הפעלת קמפיין====================*/
    
    $body = array
    (
    // מספר הקמפיין
    'templateId' => '203584',
    );
    
    $a = $con -> connecting('RunCampaign', $body);
    
    print_r($a);
    
    /*===============================================================*/
    
    
    /*================הורדת קובץ====================*/
    
    $body = array
    (
    // נתיב הקובץ
    'path' => 'ivr/ext.ini',
    );
    
    $a = $con -> connecting('DownloadFile', $body);
    
    print_r($a);
    
    /*===============================================================*/
    
    
    
    /*================העלאת קובץ====================*/
    
    // יצירת הקובץ
    $File = new oFile('ext.ini', 'text/plain', 'type=menu');
    
    $body = array
    (
    'path' => 'ivr/ext.ini',
    'convertAudio' => 0,
    'fileUpload' => $File
    );
    
    $a = $con -> connecting('UploadFile', $body);
    
    print_r($a);
    
    /*===============================================================*/
    class BodyPost
    {
    // part "multipart/form-data"
        public static function PartPost($name, $val)
         {
             $body = 'Content-Disposition: form-data; name="' . $name . '"';
    // check instance of oFile
             if($val instanceof oFile)
              {
                  $file = $val->Name();
                  $mime = $val->Mime();
                  $cont = $val->Content();
    
                  $body .= '; filename="' . $file . '"' . "\r\n";
                  $body .= 'Content-Type: ' . $mime ."\r\n\r\n";
                  $body .= $cont."\r\n";
              } else $body .= "\r\n\r\n".$val."\r\n";
             return $body;
         }
    
        public static function Get(array $post, $delimiter = '-------------0123456789')
         {
             if(is_array($post) && !empty($post))
              {
                  $bool = true;
                  //foreach($post as $val) if($val instanceof oFile) {$bool = true; break; };
                  if($bool)
                   {
                       $ret = '';
                       foreach($post as $name=>$val)
                           $ret .= '--' . $delimiter. "\r\n". self::PartPost($name, $val);
                       $ret .= "--" . $delimiter . "--\r\n";
                   } else $ret = http_build_query($post);
              } else throw new \Exception('Error input param!');
             return $ret;
         }
    }
    
    class oFile
    {
         private $name;
         private $mime;
         private $content;
    
         public function __construct($name, $mime=null, $content=null)
          {
              if(is_null($content))
               {
                   $info = pathinfo($name);
    // check is exist and readable file
                   if(!empty($info['basename']) && is_readable($name))
                    {
                        $this->name = $info['basename'];
    // get MIME
                        $this->mime = mime_content_type($name);
    // load file
                        $content = file_get_contents($name);
                        if($content!==false)
                        {
                            $this->content = $content;
                        }
                        else
                        {
                            throw new Exception('Don`t get content - "'.$name.'"');
                        }
                    }
                    else
                    {
                        throw new Exception('Error param');
                    }
               }
               else
               {
                       $this->name = $name;
                       if(is_null($mime)) $mime = mime_content_type($name);
                       $this->mime = $mime;
                       $this->content = $content;
                };
          }
    
        public function Name() { return $this->name; }
    
        public function Mime() { return $this->mime; }
    
        public function Content() { return $this->content; }
    
    }
    
    class connecting_to_yemot_api
    {
        public $token;
    
        const URL = 'https://www.call2all.co.il/ym/api/';
    
        public function __construct($user_name, $password)
        {
            $body = array('username' => $user_name, 'password' => $password);
    
            $body = http_build_query($body);
    
            $opts = array('http' => array(
    
                'method'  => 'POST',
    
                'header'  => "Content-Type: application/x-www-form-urlencoded",
    
                'content' => $body,
    
                'follow_location' => false) );
    
             $context  = stream_context_create($opts);
    
             $url = self::URL.'Login';
    
                $result = file_get_contents($url, FALSE, $context);
    
                $result = json_decode($result);
    
                if($result -> responseStatus == 'OK')
                {
                    $this -> token = $result -> token;
    
                    return TRUE;
                }
                else
                {
                    throw new Exception('שם המשתמש או הסיסמא של המערכת שגויים');
                }
        }
    
        public function __destruct()
        {
            $this -> connecting('Logout');
        }
    
        public function connecting($action, $body = array())
        {
            $delimiter = '----'.uniqid();
    
            $body['token'] = $this -> token;
    
            $body = BodyPost::Get($body, $delimiter);
    
            $opts = array('http' =>
                    array(
                        'method'  => 'POST',
                        'header'  => 'Content-Type: multipart/form-data; boundary='.$delimiter,
                        'content' => $body,
                        'follow_location' => false
                        )
                      );
            $context  = stream_context_create($opts);
    
            $url = self::URL.$action;
    
            $result = file_get_contents($url, FALSE, $context);
    
            $headers = $this -> parseHeaders($http_response_header);
    
            if($headers['Content-Type'][0] == 'application/json')
            {
                return json_decode($result);
            }
            else
            {
                return $result;
            }
        }
    
        private function parseHeaders($headers)
        {
            // פונקציה שמקבלת מערך של שורות הכותרות
            // הפונקציה מפרקת את קבצי הקוקי לתת-מערך נפרד
    
    
            // מערך הכותרות
            $head = array();
    
            foreach( $headers as $k=>$v )
            {
                $t = explode( ':', $v, 2 );
    
                if( isset( $t[1] ) )
                {
                    if($t[0] == 'Set-Cookie')
                    {
                        $CookiesArr = array();
    
                        $cookies = explode( ';', $t[1]);
    
                        foreach($cookies as $cookie)
                        {
                            $c = explode( '=', $cookie);
    
                            if( isset( $c[1] ) )
                            {
                                $CookiesArr[ trim($c[0]) ] = trim( $c[1] );
                            }
                            else
                            {
                                $CookiesArr[] = trim( $c[0] );
                            }
                        }
    
                        $head[ trim($t[0]) ] = $CookiesArr;
                    }
                    elseif($t[0] == 'Content-Type')
                    {
                        $arr = array();
    
                        $children = explode( ';', $t[1]);
    
                        foreach($children as $child)
                        {
                            $c = explode( '=', $child);
    
                            if( isset( $c[1] ) )
                            {
                                $arr[ trim($c[0]) ] = trim( $c[1] );
                            }
                            else
                            {
                                $arr[] = trim( $c[0] );
                            }
                        }
    
                        $head[ trim($t[0]) ] = $arr;
                    }
                    else
                    {
                        $head[ trim($t[0]) ] = trim( $t[1] );
                    }
                }
                else
                {
                    $head[] = $v;
                    if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$v, $out ) )
                    {
                        $head['reponse_code'] = intval($out[1]);
                    }
                }
            }
            return $head;
        }
    }
    
    תגובה 1 תגובה אחרונה
    0
    • M מנותק
      M מנותק
      magicode
      כתב ב נערך לאחרונה על ידי magicode
      #2

      תשתמש רק בפרומיס.

      אתה עושה מחלקה שיש בה פונקציה פנימית connect שהיא פרומיס והיא רצה פעם אחת בפעם השניה היא מחזירה את אותו פרומיס עיין במה ש @dovid עשה בדוגמא האחרונה שלו בנושא
      יש עוד פונקציה חיצונית action שהיא מקבלת שני פרטרים פעולה ואובייקט. והיא מפעילה את ה connect הפנימי לפני כל פעולה לוודא שיש טוקן.

      אני לא מכיר את fetch אני מכיר את request הוא יותר וותיק ולכן אני מכיר אותו. יש בו הכל. אפשר לבצע איתו הכל.

      תגובה 1 תגובה אחרונה
      4
      • M מנותק
        M מנותק
        magicode
        כתב ב נערך לאחרונה על ידי
        #3

        עכשיו ראיתי את fetch
        לדעתי תשקיע בו.
        תראה את זה
        https://github.com/bitinn/node-fetch#post-with-form-data-detect-multipart

        לדעתי אפשר לעשות ככה.

        form.append('file', require('fs').createReadStream('input.txt'));
        

        כלומר לדעתי הפונקציה action
        תקבל אובייקט או אובייקט from

        ח תגובה 1 תגובה אחרונה
        4
        • ח מנותק
          ח מנותק
          חוקר
          השיב לmagicode ב נערך לאחרונה על ידי
          #4

          @magicode תודה רבה.
          בעזה"י אנסה להתקדם עם מה שכתבת

          תגובה 1 תגובה אחרונה
          1
          • ח מנותק
            ח מנותק
            חוקר
            כתב ב נערך לאחרונה על ידי חוקר
            #5

            ב"ה לאחר שהתקדמתי קצת בNODEJS.
            ניסיתי לבנות את המחלקה ונתקלתי בקשיים, וחזרתי לחפש את הנושא שכבר העליתי כאן, ועדיין צריך עזרה.
            הקוד שהתחלתי לבנות

            const fetch = require('node-fetch');
            const { URLSearchParams } = require('url');
            module.exports = class YmApiV1 {
                 constructor(username, password) {
                    this.username = username;
                    this.password = password;
                    this.token = '';
                    this.URL = 'https://www.call2all.co.il/ym/api/';
                }
                Login(action, body){
                    let url = this.URL + 'Login?' + 'username=' + this.username + '&password=' + encodeURIComponent(this.password);
                    this.l = fetch(url, { method: 'get' }).then(res => res.json()).then(json => {
                        console.log(json);
                        if (json.token){
                            this.token = json.token;
                            return this.connecting(action, body);
                        }else{
                            throw 'שם משתמש או סיסמא שגויים.';
                        }
                    }).catch(error => console.error(error));
                    return this.l;
                }
                connecting( action, body = []) {
                    if (this.token === ''){
                        return this.Login(action, body);
                    }else{
                        let params = new URLSearchParams();
                        params.append('token', this.token);
                        if (body){
                            for (let i in body){
                                params.append(i, body[i]);
                            }
                        }
                        let url = this.URL + action;
                        return fetch(url, { method: 'POST', body: params }).then(res => res.json()).then(json => {return json;}).catch(error => console.error(error));
                    }
                }
                Logout(){
                    return this.connecting('Logout');
                }
                RunCampaign(templateId, phones, callerId = false){
                    let body = {
                        templateId : templateId,
                        phones : phones,
                    };
                    if (callerId){
                        body['callerId'] = callerId;
                    }
                    return this.connecting('RunCampaign', body);
                }
                GetTemplates(){
                    return this.connecting('GetTemplates');
                }
            };
            
            

            והשימוש באמצעות:

            const YmApiV1 = require('../my_models/YmApiV1.js');
            let YmApi1 = new  YmApiV1('0773137770', '1234');
            YmApi1.connecting('GetSession').then(res => {
                console.log(res);
            // סתם בדיקה שהניתוק בוצע ואין יותר הרשאות
                YmApi1.Logout().then(() => {
                    YmApi1.connecting('GetSession').then(res => {
                        console.log(res);
                    });
                });
            });
            YmApi1.GetTemplates().then(function (t) {
                console.log('GetTemplates');
                console.log(t);
            });
            

            המורכבות במחלקה היא כך:
            למי שלא מכיר את הAPI של ימות המשיח אכתוב בפשטות: מתחברים עם מספר המערכת והסיסמא לקבלת טוקן, ובאמצעות הטוקן ניתן לקרוא לשאר הפונקציות, ובסיום מומלץ לסיים את הטוקן ע"י פונקציית Logout.
            לבנות סתם את קבלת הטוקן בתוך הבנאי, יש בעיה כי הרי JS לא מחכה וממשיך להמשך הקוד, ואז הוא ניגש לפונקציה לפני שהטוקן זמין, וזה ייכשל.
            לעשות שהקריאה לפונקציות תיהיה מתוך פרומיז של קבלת הטוקן זה בעיה במידה ואני רוצה לבצע מספר פעולות על אותו מערכת באותו חיבור והפעולות לא קשורות אחת לשניה, יותר קל ליצור אובייקט של המחלקה ולגשת מכל מקום בקוד.
            לעשות שבכל התחברות זה יוצר טוקן, זה בזבוז משאבים וקריאה נוספת, ומה גם שהמתכנת של ימות אמר לי שלמעט ביצירת טוקנים עדיף.
            אז מה שעשיתי שלפני הפעלת פונקציה זה בודק האם קיים טוקן, ואחרת זה יוצר את הטוקן.
            על פניו, מאוד נחמד..
            הבעיה היא שבמידה ואני קורא לפונקציה נוספת בשורה אחרת בקוד ולא מתוך הפרומיז של הקריאה הקודמת, כיון ועדיין השרת בתהליך קבלת הטוקן ועדיין לא נוצר הטוקן, אז קורא שוב ליצירת טוקן, ואז נוצרים לי שני טוקנים.
            אשמח למי שיכול לעzור לסיים את בניית המחלקה לטובת הכלל.
            תודה
            @magicode @dovid @יוסף-בן-שמעון

            תגובה 1 תגובה אחרונה
            0
            • yossizY מנותק
              yossizY מנותק
              yossiz
              כתב ב נערך לאחרונה על ידי yossiz
              #6

              @חוקר, אל תסתכל אפילו במה שאני כותב. אבל מכיון שאני הדיוט קופץ בראש אני כותב מה שעולה על דעתי. נראה אח"כ איך זה שונה ממה שהמומחים יגידו.
              לכאורה הפתרון מונח בתוך מילותיו הקצרים של @magicode למעלה:

              אתה עושה מחלקה שיש בה פונקציה פנימית connect שהיא פרומיס והיא רצה פעם אחת בפעם השניה היא מחזירה את אותו פרומיס

              ובתרגום למחלקה שלך, במקום ש-this.token יהיה מחרוזת, תעשה אותו פרומיס.

              const fetch = require('node-fetch');
              const { URLSearchParams } = require('url');
              module.exports = class YmApiV1 {
                  constructor(username, password) {
                      this.username = username;
                      this.password = password;
                      this.URL = 'https://www.call2all.co.il/ym/api/';
                  }
              
                  get token() {
                      if (!this.tokenPromise) {
                          this.tokenPromise = new Promise((resolve, reject) => {
                              let url = this.URL + 'Login?' + 'username=' + this.username + '&password=' + encodeURIComponent(this.password);
                              fetch(url, { method: 'get' }).then(res => res.json()).then(json => {
                                  console.log(json);
                                  if (json.token) {
                                      resolve(json.token);
                                  } else {
                                      reject('שם משתמש או סיסמא שגויים.');
                                  }
                              });
                          })
                      }
                      return this.tokenPromise;
                  }
                  
                  connecting(action, body) {
                      return this.token.then( token => {
                          let params = new URLSearchParams();
                          params.append('token', token);
                          if (body) {
                              for (let i in body) {
                                  params.append(i, body[i]);
                              }
                          }
                          let url = this.URL + action;
                          return fetch(url, {
                              method: 'POST',
                              body: params
                          }).then(res => res.json()).catch(console.error);
                      });
                  }
              };
              

              📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

              ח תגובה 1 תגובה אחרונה
              3
              • ח מנותק
                ח מנותק
                חוקר
                השיב לyossiz ב נערך לאחרונה על ידי
                #7

                @yossiz
                זה בדיוק מה שהייתי צריך, מישהו שיישם לי את מה ש @magicode כתב, אבל לא ידעתי איך ליישם אותו.
                תודה רבה.
                רק אשמח לקצת הסבר אודות המילה get ששמת לפני הפונקציה token.

                yossizY תגובה 1 תגובה אחרונה
                1
                • yossizY מנותק
                  yossizY מנותק
                  yossiz
                  השיב לחוקר ב נערך לאחרונה על ידי
                  #8

                  @חוקר אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                  רק אשמח לקצת הסבר אודות המילה get ששמת לפני הפונקציה token.

                  זה היה סתם "סוכר תחבירי", זה דרך לייצר פונקציה שניגשים אליו כאילו הוא מאפיין.
                  כתוצאה מכך כתבתי this.token.then במקום this.token().then.
                  לפי מה שאני מבין, זה נועד למצבים שיש לך משהו שבעקרון הוא מאפיין אלא שאתה רוצה לעשות קצת חישובים לפני שאתה מחזיר אותו.

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  תגובה 1 תגובה אחרונה
                  2
                  • zvizviZ מנותק
                    zvizviZ מנותק
                    zvizvi
                    כתב ב נערך לאחרונה על ידי
                    #9

                    מציע לשים את הקוד בGithub כדי שיהיה אפשר לתרום ולשפר אותו.

                    https://zvizvi.xyz

                    ח תגובה 1 תגובה אחרונה
                    2
                    • ח מנותק
                      ח מנותק
                      חוקר
                      השיב לzvizvi ב נערך לאחרונה על ידי
                      #10

                      @zvizvi אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                      מציע לשים את הקוד בGithub כדי שיהיה אפשר לתרום ולשפר אותו.

                      אשאל את ימות המשיח אם יש להם בעיה בזה.
                      אם אין בעיה, בהחלט שזה יכול להיות לעניין, כי ימות המשיח הוסיפו כל מיני פונקציות מעניינות בAPI, שעדיין אינן מופיעות בתיעוד הרשמי, והן יכולות מאוד לעזור.

                      MusiCodeM תגובה 1 תגובה אחרונה
                      0
                      • MusiCodeM מנותק
                        MusiCodeM מנותק
                        MusiCode
                        השיב לחוקר ב נערך לאחרונה על ידי
                        #11

                        @חוקר אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                        @zvizvi אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                        מציע לשים את הקוד בGithub כדי שיהיה אפשר לתרום ולשפר אותו.

                        אשאל את ימות המשיח אם יש להם בעיה בזה.
                        אם אין בעיה, בהחלט שזה יכול להיות לעניין, כי ימות המשיח הוסיפו כל מיני פונקציות מעניינות בAPI, שעדיין אינן מופיעות בתיעוד הרשמי, והן יכולות מאוד לעזור.

                        ספר לנו על זה,
                        ומאיפה אתה יודע.

                        ח תגובה 1 תגובה אחרונה
                        0
                        • ח מנותק
                          ח מנותק
                          חוקר
                          השיב לMusiCode ב נערך לאחרונה על ידי
                          #12

                          @MusiCode אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                          @חוקר אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                          @zvizvi אמר בבניית מחלקת תקשורת עם ימות המשיח API ב nodejs:

                          מציע לשים את הקוד בGithub כדי שיהיה אפשר לתרום ולשפר אותו.

                          אשאל את ימות המשיח אם יש להם בעיה בזה.
                          אם אין בעיה, בהחלט שזה יכול להיות לעניין, כי ימות המשיח הוסיפו כל מיני פונקציות מעניינות בAPI, שעדיין אינן מופיעות בתיעוד הרשמי, והן יכולות מאוד לעזור.

                          ספר לנו על זה,
                          ומאיפה אתה יודע.

                          המתכנת הראשי בימות המשיח שהוא גם המפתח של הAPI אישר את זה מבחינתם.
                          לגבי הפונקציות החדשות, פשוט מאוד ראיתי שיש לימות אתר חדש בפיתוח https://www.call2all.co.il/yemot-admin-g1/#/login ובדקתי ברכיב הדף איך זה עובד, ופשוט מאוד כל האתר החדש מבוסס על הAPI, ולכן הם הוסיפו את כל האפשרויות הנדרשות.
                          ביניהם:
                          קבלת פירוט דקות נכנסות
                          קבלת רשימת קבצים בתיקיה
                          שכפול/מחיקה/העברה של קובץ/ים
                          בקבצי טקסט ניתן העלאת טקסט כטקסט במקום כקובץ.
                          הורדת טקסט של קובץ טקסט/ini
                          וכנראה עוד כמה שעדיין לא שמתי לב.

                          המתכנת של ימות אישר שזה בסדר לשימוש, והוא יוסיף את זה בתיעוד בימים הבאים.
                          מי שמצא פונקציות נוספות, שיכתוב כאן.
                          בינתיים זה המחלקה לפי מה שכבר הוספתי (אני מקוה בסופו של דבר להכניס את כל הפונקציות בימות כפונקציות במחלקה, זה מאוד יעיל לפי שמשתמש ב IDE.)

                          const fetch = require('node-fetch');
                          const { URLSearchParams } = require('url');
                          module.exports = class YmApi {
                              constructor(username, password, ymLink = 'ym') {
                                  this.username = username;
                                  this.password = password;
                                  this.URL = 'https://www.call2all.co.il/' + ymLink + '/api/';
                              }
                          
                              get token() {
                                  if (!this.tokenPromise) {
                                      this.tokenPromise = new Promise((resolve, reject) => {
                                          let url = this.URL + 'Login?' + 'username=' + this.username + '&password=' + encodeURIComponent(this.password);
                                          fetch(url, { method: 'get' }).then(res => res.json()).then(json => {
                                              console.log(json);
                                              if (json.token) {
                                                  resolve(json.token);
                                              } else {
                                                  reject('שם משתמש או סיסמא שגויים.');
                                              }
                                          });
                                      })
                                  }
                                  return this.tokenPromise;
                              }
                          
                              connecting(action, body) {
                                  console.log('action ' + action);
                                  return this.token.then( token => {
                                      let params = new URLSearchParams();
                                      params.append('token', token);
                                      if (body) {
                                          for (let i in body) {
                                              params.append(i, body[i]);
                                          }
                                      }
                                      let url = this.URL + action;
                                      return fetch(url, {
                                          method: 'POST',
                                          body: params
                                      }).then(res => res.json()).catch(console.error);
                                  });
                              }
                          
                              Logout(){
                                  return this.connecting('Logout');
                              }
                              RunCampaign(templateId, phones, callerId = false){
                                  let body = {
                                      templateId : templateId,
                                      phones : phones,
                                  };
                                  if (callerId){
                                      body['callerId'] = callerId;
                                  }
                                  return this.connecting('RunCampaign', body);
                              }
                              GetTemplates(){
                                  return this.connecting('GetTemplates');
                              }
                          
                              GetTemplates2(){
                                  return this.connecting2('GetTemplates');
                              }
                          
                              GetIvrTree(path){
                                  return this.connecting('GetIvrTree', {path : 'ivr2:' + path});
                              }
                          
                              GetIncomingCalls(){
                                  return this.connecting('GetIncomingCalls');
                              }
                          
                              GetTextFile(what){
                                  return this.connecting('GetTextFile', {'what' : 'ivr2:' + what});
                              }
                          
                              UploadTextFile(what, contents){
                                  return this.connecting('UploadTextFile', {'what' : 'ivr2:' + what, contents : contents});
                              }
                          
                              FileAction(action, what, target){ //action = [move, copy, delete]
                                  let body = {action : action, 'target' : 'ivr2:' + target};
                                  if (typeof what === 'object'){
                                      for (let i = 0; i < what.length;i++) {
                                          body['what' + i] = 'ivr2:' + what[i];
                                      }
                                  }else{
                                      body['what'] =  'ivr2:' + what;
                                  }
                                  return this.connecting('FileAction', body);
                              }
                          
                          };
                          

                          דוגמת שימוש בהמשך להנ"ל

                          YmApi.FileAction('copy', '/025.wav', '/7').then(function (t) {
                              console.log('FileAction');
                              console.log(t);
                          });
                          
                          תגובה 1 תגובה אחרונה
                          2
                          • MusiCodeM מנותק
                            MusiCodeM מנותק
                            MusiCode
                            כתב ב נערך לאחרונה על ידי MusiCode
                            #13

                            @חוקר הנה המחלקה שלי (מעט יותר קצר, מבוסס פרומיס):

                            דוגמא:

                            const yemot_api = require("yemot-api");
                            
                            (async () => {
                            
                            	const y = new yemot_api();
                            
                            	await y.connect("0773137770", "1234");
                            
                            	let r;
                            
                            	/** קבלת מספר יחידות */
                            	r = await y.exec("GetSession");
                            
                            	console.log(r);
                            
                            	/** העלאת קובץ */
                            	let o = {
                            
                            		file: {
                            			value: "12345",
                            			options: {
                            				filename: "123.txt",
                            				contentType: "text/txt"
                            			}
                            		},
                            		path: "ivr/123.txt"
                            	};
                            
                            	r = await y.exec("UploadFile", o);
                            
                            	console.log(r);
                            
                            	/** הורדת קובץ */
                            	o = {
                            		path: "ivr/123.txt"
                            	};
                            
                            	r = await y.exec("DownloadFile", o);
                            
                            	console.log(r);
                            
                            })();
                            

                            צריך פונקציה אנונימית, כי רק פונקציות מאפשרות תחביר של א-סינכרוניות.


                            המחלקה:
                            https://github.com/MusiCode1/yemot-api

                            תגובה 1 תגובה אחרונה
                            1
                            • ח מנותק
                              ח מנותק
                              חוקר
                              כתב ב נערך לאחרונה על ידי
                              #14

                              שימו לב:
                              חדש! מהיום ישנה דרך נוספת להתחבר. אין צורך ליצור טוקן ולבצע פעולות באמצעות הטוקן, אלא ניתן בקריאה עצמה לשדר במקום טוקן את פרטי הכניסה.
                              לדוגמא

                              token=091234567:1234
                              

                              ניתן לראות כאן דוגמת שימוש
                              http://www.call2all.co.il/f2/viewtopic.php?f=8&t=5022
                              מבדיקה מול המכנת הראשי בימות המשיח, האפשרות הזו עובדת בכל המקומות במקום טוקן!
                              שימו לב שזה יכול להיות פחות מאובטח שבכל בקשה שולחים את הפרטים המלאים, אבל מצד שני במקום שצריך לעשות רק קריאה אחת, אז זה ודאי לא אחרת מהקריאה ליצירת הטוקן..

                              nigunN תגובה 1 תגובה אחרונה
                              2
                              • nigunN מנותק
                                nigunN מנותק
                                nigun
                                השיב לחוקר ב נערך לאחרונה על ידי
                                #15

                                @חוקר
                                בדקת האם זה מאריך את הקריאה?
                                (במילים אחרות האם יש סיבה להשתמש בטוקן חוץ מאבטחה?)

                                מייל: nigun@duck.com

                                תגובה 1 תגובה אחרונה
                                0
                                • MusiCodeM מנותק
                                  MusiCodeM מנותק
                                  MusiCode
                                  כתב ב נערך לאחרונה על ידי
                                  #16

                                  מניח שלא אמור מאוד להאריך.

                                  ולמעשה, גם אבטחה לא כ"כ, כי זה HTTPS, והכל מוצפן.

                                  תגובה 1 תגובה אחרונה
                                  1
                                  • ח מנותק
                                    ח מנותק
                                    חוקר
                                    כתב ב נערך לאחרונה על ידי חוקר
                                    #17

                                    עדיין לא בדקתי כלום.
                                    אני רוצה בהמשך ליישם את זה במחלקה בעזה"י.

                                    nigunN תגובה 1 תגובה אחרונה
                                    0
                                    • nigunN מנותק
                                      nigunN מנותק
                                      nigun
                                      השיב לחוקר ב נערך לאחרונה על ידי nigun
                                      #18

                                      @חוקר
                                      עשיתי עכשיו כמה בדיקות עם wrk ולא מצאתי הבדל

                                      מייל: nigun@duck.com

                                      תגובה 1 תגובה אחרונה
                                      0

                                      בא תתחבר לדף היומי!
                                      • התחברות

                                      • אין לך חשבון עדיין? הרשמה

                                      • התחברו או הירשמו כדי לחפש.
                                      • פוסט ראשון
                                        פוסט אחרון
                                      0
                                      • דף הבית
                                      • קטגוריות
                                      • פוסטים אחרונים
                                      • משתמשים
                                      • חיפוש
                                      • חוקי הפורום