מדריך התחלת עבודה עם API של ימות משיח (חלק ג').
-
אז בהמשך למדריכים הקודמים שעסקו בהבנת הבסיס, חשוב מאוד להבין את העיקרון של הדברים - בתיכנות כמו בתיכנות צריך להבין מה עושים - לא כל כך יעזור לנו רק להעתיק קוד.
לשם כך נכתב חלק ג' של המדריך: נבצע יחד משימה נחמדה שתיתן לנו אינדקציה האם הבנו את הדברים כמו שצריך.מוכנים? קדימה!
ממשיכים...
אז פתחנו את תוכנת כתיבת הקוד שלנו, יתכן שזאת תוכנת ויזואל סטודיו או תוכנה אחרת, תלוי מה יש לכם, ופתחנו גם את קובץ ה "maim.php" שמכיל את כל הקוד מהמדריך הקודם .
בקיצור - נמשיך ממש מאותה הנקודה שעצרנו:אחרי שהעלנו קובץ לשלוחה שלנו, בדקנו שהוא עלה במערכת הניהול הרגילה, מה יקרה אם נרצה לבדוק בקובץ ה PHP שלנו האם הקובץ אכן עלה? זה אפשרי?!
זה הפרוייקט הקטן שלנו , להוסיף פקודה שתראה לנו את הקבצים הקיימים בשלוחה.
אם הבנו את העיקרון של הדברים אפשר לנסות לעשות לבד ע"פ מה שלמדנו במדריכים הקודמים.בכל אופן נעשה את זה יחד, ונוסיף מעט נופך...
פקודת קבלת רשימת קבצים.
בכדי לדעת האם הקובץ עלה יש להשתמש בפקודה לקבלת רשימת הקבצים שבשלוחה.
אם נעיין בתיעוד נראה ששם הפקודה לקבלת רשימת הקבצים שבשלוחה הוא:GetIvrTree
.
גם את הפקודה הזו נכתוב כמו שלמדנו במדריך הקודם:
נציב את הפקודה בתוך משתנה:File_list$
.
נכתוב את קוד הפקודה:$File_list = $con -> connecting('***',
נוסיף במקום ה *** את הפקודה:
GetIvrTree
.$File_list = $con -> connecting('GetIvrTree',
פרמטרים:
נעצור שניה! איזה פרמטרים צריך? האם אותם הפרמטרים של הפקודה הקודמת (פקודת העלאת קבצים)?אז אם הבנו את העיקרון, התשובה היא: צריך רק את הפרמטר - נתיב :
path
.
כלומר להגדיר באיזה שלוחה אנחנו רוצים שהשרת יבדוק את איזה קבצים יש בו.בפרמטר נתיב נכניס את המשתנה
path$
זהו המשתנה שהוגדר ממש בחלק הראשון של חלק ב'.
הקוד נראה כך:[ 'path' =>$path, ] );
הערה:
במקום לשים את המשתנהpath$
אפשר לכתוב את הנתיב המלא לשלוחה, לדוגמא:[ 'path' =>"ivr2:4/1", ] );
בדוגמא לעייל: השרת יתן לנו את רשימת הקבצים שבשלוחה 1 שבתוך שלוחה 4.
הדפסת תשובת השרת.
אם נשמור ונרענן או נכנס שוב ל
http://localhost/my_php/main.php
, לא נראה כלום.
כלומר: השרת החזיר תשובה אבל אנחנו צריכים להוציא אותה.
איך עושים את זה?פונקציית print_r().
פונקציית
print_r()
עוזרת לנו להדפיס את תגובת השרת, ניתן לקרוא עוד על פונקציה זו פה ופה.
הפונקציה נכתבת כך:print_r(***);
במקום *** נכניס את המשתנה של פקודת קבלת רשימת קבצים:
File_list$
.print_r($File_list);
כך נראה הקוד בשלמותו:
$File_list= $con -> connecting('GetIvrTree', [ 'path' =>$path, ] ); print_r($File_list);
עכשיו נשמור ונרענן או נכנס שוב ל
http://localhost/my_php/main.php
ונקבל..... באלגן אחד שלם!!!אז מה עושים?
עמדו על הדפדפן ולחצו קליק ימני, ייפתח תפריט, בשורה אחת לפני הסוף לחצו על "הצג מקור הדף", והנה הפלא ופלא, מוצג לפנינו מערך עם כל הקבצים שיש בשלוחה, עם כל הפרמטרים שלהם.
נסתכל בסוף על החלק האחרון שבמערך זהו הקובץ האחרון שיש לנו בשלוחה.שימו לב:
כדאי מאוד להוסיף את הטיפ למטה בדיוק בשלב הזה.איך עובד PHP?
קוד PHP מתחיל מלמעלה למטה, כלומר הקוד ירוץ לפי הסדר, שורה 1 ואז שורה 2 וכן על זה הדרך.
הנתון הזה חשוב מאוד להמשך...מכינים את הקוד.
עכשיו נשאר רק להעתיק...
העתיקו את כל הקוד שיצרנו בחלק ג' של המדריך,כלומר הקוד הזה:
(לא לגזור! להעתיק...),$File_list= $con -> connecting('GetIvrTree', [ 'path' =>$path, ] ); print_r($File_list);
והדביקו אותו מעל פקודת העלאת קבצים של חלק ב' של המדריך.
ובעצם אנחנו עושים "כורך" בהתחלה קוד של קבלת רשימת קבצים בשלוחה, אח"כ קוד העלאת קבצים ולבסוף שוב קוד של קבלת רשימת קבצים בשלוחה.מה עשינו פה?
מה שבעצם עשינו הוא בקשה מהשרת של ימות לקבל את רשימת הקבצים לפני העלאה של הקובץ החדש, ואז בקשת העלאת קבצים, ואז שוב בקשה מהשרת של ימות לקבל את רשימת הקבצים אחרי העלאה של הקובץ החדש, ואז הקובץ החדש מופיע ברשימה השניה.
הקוד שיצא הוא בעצם ככה:
// קבלת רשימת קבצים בשלוחה $File_list= $con -> connecting('GetIvrTree', [ 'path' =>$path, ] ); print_r($File_list); // העלאת קבצים $File = new oFile('ext.ini', 'text/plain', file_get_contents("C:\Users\PC\Downloads/Lesson_Number_55.mp3")); $Upload_order = $con -> connecting('UploadFile', [ 'path' =>$path_name, 'convertAudio' => 1, 'fileUpload' => $File ] ); // קבלת רשימת קבצים בשלוחה $File_list= $con -> connecting('GetIvrTree', [ 'path' =>$path, ] ); print_r($File_list);
כעת נשמור ונרענן או נכנס שוב ל
http://localhost/my_php/main.php
ושוב נלחץ על "הצג מקור הדף", והנה... המערך הראשון שהתקבל מכיל בסופו את הקובץ האחרון שבשלוחה, והמערך השני מכיל בסופו את הקובץ החדש שעלה ממש עכשיו.
במידה והוא לא מופיע, כנראה שיש בעיה... ככה זה בתיכנות! מה נעשה...הטיפ למטה יעזור לכם לקבל משהו הרבה יותר נחמד למראה, מוזמנים להשתמש בו.
-
@ass
טיפ!
ככה הקוד שלי נראה???תוצאות הקוד כמו שהוא נראה עכשיו באמת לא מרנין לב, אז הנה קוד שבניתי שהולך להציג את הכל הרבה יותר טוב.
העתיקו את הקוד מתחת לקוד הראשון של קבלת רשימת קבצים בשלוחה , וגם מתחת לקוד השני://אינדקס $i = 0; //הכנת מערך $noarray_tst=array(); $obj = $File_list; //פונקציה להמרה למערך foreach ($obj->items as $value){ { $mynewvalue = $value->name; //הורדת סיומת קובץ $path_parts = pathinfo($mynewvalue); $path_parts = $path_parts['filename']; $noarray_tst[$i] = $path_parts; $i ++; } }; // חישוב לקבלת מספר קובץ הגדול ביותר $e = $i -2; echo "מספר קובץ: <b> $noarray_tst[$e] </b> <br/> ";
לסיכום: כל הקוד של מדריך חלק ג' יחד עם הקוד הזה, נראה כך:
$File_list = $con -> connecting('GetIvrTree',[ 'path' =>$path, ] ); //אינדקס $i = 0; //הכנת מערך $noarray_tst=array(); $obj = $File_list; //פונקציה להמרה למערך foreach ($obj->items as $value){ { $mynewvalue = $value->name; //הורדת סיומת קובץ $path_parts = pathinfo($mynewvalue); $path_parts = $path_parts['filename']; $noarray_tst[$i] = $path_parts; $i ++; } }; // חישוב לקבלת מספר קובץ הגדול ביותר $e = $i -2; echo "מספר קובץ: <b> $noarray_tst[$e] </b> <br/> "; $File = new oFile('ext.ini', 'text/plain', file_get_contents("C:\Users\PC\Downloads/Lesson_Number_55.mp3")); $Upload_order = $con -> connecting('UploadFile', [ 'path' =>$path_name, 'convertAudio' => 1, 'fileUpload' => $File ] ); $File_list = $con -> connecting('GetIvrTree',[ 'path' =>$path, ] ); //אינדקס $i = 0; //הכנת מערך $noarray_tst=array(); $obj = $File_list; //פונקציה להמרה למערך foreach ($obj->items as $value){ { $mynewvalue = $value->name; //הורדת סיומת קובץ $path_parts = pathinfo($mynewvalue); $path_parts = $path_parts['filename']; $noarray_tst[$i] = $path_parts; $i ++; } }; // חישוב לקבלת מספר קובץ הגדול ביותר $e = $i -2; echo "מספר קובץ: <b> $noarray_tst[$e] </b> <br/> ";
-
@ass
להלן כל הקוד של כל חלקי המדריך יחד, ניתן לעיין בו ולהבין את סדר הדברים:define("URL", "https://***.call2all.co.il/ym/api/"); $server = "***"; 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 = URL; 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; } } $con = new connecting_to_yemot_api('0790000000','1234'); $token = "0790000000:1234"; $path = "ivr2:***"; // פונקציה למספרי קבצים עוקבים function FileNameToUpload($server, $token, $path){ $array = json_decode(file_get_contents("https://$server.call2all.co.il/ym/api//GetIVR2Dir?token=$token&path=$path"),true); if($array["responseStatus"] == "OK"){ foreach($array["files"] as $key => $value){ if($value["fileType"] == "AUDIO" || $value["fileType"] == "TTS"){ $split = explode(".",$value["name"]); if (is_numeric($split[0])){ break; } } } if($split[0] == null){ $NewFileName = 0; }else{ $NewFileName = $split[0]+1; } //הפוך למינימום 3 ספרות/ return str_pad($NewFileName,3,"0",STR_PAD_LEFT); }else{ //במקרה של שגיאה echo "שגיאה"; } } // קריאה לפונקציה. $NewFileName = FileNameToUpload($server,$token,$path); if($NewFileName != null){ //מכריז על שם של נתיב הקובץ להעלאה $path_name = "$path/$NewFileName.wav"; } $File_list = $con -> connecting('GetIvrTree',[ 'path' =>$path, ] ); //אינדקס $i = 0; //הכנת מערך $noarray_tst=array(); $obj = $File_list; //פונקציה להמרה למערך foreach ($obj->items as $value){ { $mynewvalue = $value->name; //הורדת סיומת קובץ $path_parts = pathinfo($mynewvalue); $path_parts = $path_parts['filename']; $noarray_tst[$i] = $path_parts; $i ++; } }; // חישוב לקבלת מספר קובץ הגדול ביותר $e = $i -2; echo "מספר קובץ: <b> $noarray_tst[$e] </b> <br/> "; $File = new oFile('ext.ini', 'text/plain', file_get_contents("C:\Users\PC\Downloads/Lesson_Number_55.mp3")); $Upload_order = $con -> connecting('UploadFile', [ 'path' =>$path_name, 'convertAudio' => 1, 'fileUpload' => $File ] ); $File_list = $con -> connecting('GetIvrTree',[ 'path' =>$path, ] ); //אינדקס $i = 0; //הכנת מערך $noarray_tst=array(); $obj = $File_list; //פונקציה להמרה למערך foreach ($obj->items as $value){ { $mynewvalue = $value->name; //הורדת סיומת קובץ $path_parts = pathinfo($mynewvalue); $path_parts = $path_parts['filename']; $noarray_tst[$i] = $path_parts; $i ++; } }; // חישוב לקבלת מספר קובץ הגדול ביותר $e = $i -2; echo "מספר קובץ: <b> $noarray_tst[$e] </b> <br/> ";
-
אולי כדאי להוסיף הסבר פשוט איך נראה הבקשה של קבלת כל הקבצים דרך הדפדפן
ואז להראות איך אנחנו כותבים קוד מסורבל לקבל את אותו דבר דרך PHP.
ואז להסביר למה זה טוב -
@sbb0799
לא כל כך הבנתי.
אתה מתכוון להוסיף הסבר איך רואים את הקבצים דרך המערכת ניהול הרגילה ואיך מבצעים פקודה כזו ב PHP? -
@ass
לא
איך מבצעים את הבקשה לAPI ישירות מתוך הדפדפן ומקבלים חזרה את הכל בJSON -
@ass
אני לא מבין למה אתה מתעקש להשתמש עם המחלקה למה לא לכתוב קוד פשוט של 10 שורות?! -
@אהרן-שובקס
כתבתי מה שאני יודע, ומה שעובד לי.
אדרבה... אולי תעתיק לפה את הקוד הקצר לטובת כולם. -
@ASS תודה על המדריכים הנפלאים והמועילים.
איך מוצאים את כתובת המחשב שלי לצורך שלוחת API שהשרת של ימות יפנה אליי ולא רק "לשאוב" נתונים מתוך השרת של ימות? -
@הלוי-הלוי
אתה צריך שרת חיצוני.
תוכל למצוא שרתים בזול, נסה את contabo לדוגמא.