מדריך התחלת עבודה עם API של ימות משיח (חלק ב').
-
טוב, אז בהמשך למדריך הראשון שעסק בעיקר בהבנת המונחים הבסיסיים והכנת סביבת העבודה, במדריך זה נלמד איך לכתוב את הקוד לביצוע פעולות בשרת של ימות משיח.
לא נסביר את כל משמעות הקוד, אחרת המדריך יגמור לימות את הזיכרון בשרתהידע בשפת PHP הכרחי למי שרוצה לעשות פעולות נוספות מעבר למה שמופיע במדריך הזה.
המדריך מבוסס על התיעוד של ימות כמובן!מתחילים:
חיבור לימות משיח.
דבר ראשון שנרצה לעשות הוא להתחבר לשרת של ימות.
האפשרות הקלה ביותר הינה בעזרת המחלקה שבנו מ. מ. פליישער ו מאזין נלהב, תודה להם על הפיתוח.
כיצד עובדים עם המחלקה?שלב א':
במקום המסומן ב *** נגדיר האם המערכת שלנו בימות נמצאת בשרת הפרייוט או הרגיל.define("URL", "https://***.call2all.co.il/ym/api/");
בשרת רגיל נכתוב: www
define("URL", "https://www.call2all.co.il/ym/api/");
ובשרת פרייוט נכתוב: private
define("URL", "https://private.call2all.co.il/ym/api/");
בכדי למנוע בעיות בהעלאת קבצים בהמשך, יש להוסיף את המשתנה הבא:
בשרת רגיל נכתוב: www$server = "www";
ובשרת פרייוט נכתוב: private
$server = "private";
לסיכום:
בשרת רגיל הקוד צריך להראות ככה:define("URL", "https://www.call2all.co.il/ym/api/"); $server = "www";
ובשרת פרייוט הקוד צריך להראות ככה:
define("URL", "https://private.call2all.co.il/ym/api/"); $server = "private";
שלב ב':
הוספת המחלקה.
נעתיק את הקוד הבא: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; } }
ארוך, אבל שווה את זה!
שלב ג':
כעת נגדיר מהם שם המשתמש והסיסמה, נבצע זאת בעזרת הצבת משתנים.
במקום המסומן ב0790000000
נכניס את מספר הטלפון של המערכת, ובמקום המסומן ב1234
נכניס את הסיסמה, כך:$con = new connecting_to_yemot_api('0790000000','1234');
לסיום נציב עוד משתנה עם הפרמטר טוקן, בעזרת משתנה זה לא נדרש לכתוב שם משתמש וסיסמה בכל פעם.
במקום המסומן ב0790000000
נכניס את מספר הטלפון של המערכת, ובמקום המסומן ב1234
נכניס את הסיסמה, כך:$token = "0790000000:1234";
זהו סיימנו את קוד ההתחברות, אחת ולתמיד.
בצעו שמירה
ורעננו את הדפדפן או כנסו שוב לhttp://localhost/my_php/main.php
.אם אין שגיאות הצלחנו להכנס לשרת של ימות!
נכון שלא רואים כלום ככה זה ב PHP אם לא רואים כלום זה סימן טוב .ממשיכים...
פקודות ופרמטרים.
אם נעיף מבט בתיעוד של ימות נראה שבכדי שנצליח לבצע את מבוקשינו בצורה נכונה צריך לציין בקוד גם פקודה וגם פרמטרים.
פקודה: בכדי שהשרת יבין מה אתם רוצים לעשות חשוב לציין את שם הפקודה, הפקודה יכולה להיות בין היתר: העלאת קבצים, מחיקת קבצים, קבלת פרטי המערכת, ועוד פקודות רבות כמופיע בתיעוד .
פרמטרים: הפרמטרים הם בעצם הפרטים של הפקודה, כלומר: אם לדוגמא אנחנו רוצים להעלות קובץ וכתבנו פקודת העלאת קבצים, מעולה! אבל לאן להעלות? לשלוחה הראשית או לשלוחה אחרת? את זה השרת חייב לדעת! בשביל זה נועדו הפרמטרים, לכוון את השרת למה שאנחנו רוצים בדיוק.
בהמשך נראה את הנושא בצורה יותר פרקטית.בשורת הקוד הבאה נציב את פרמטר נתיב בתוך משתנה.
החליפו את *** בנתיב השלוחה אליה אתם רוצים להעלות את הקובץ:$path = "ivr2:***";
לדוגמא:
$path = "ivr2:4/1";
הסבר:
הקובץ יעלה לשלוחה 1 שבתוך שלוחה 4.הנתיב חייב להיות מוגדר, ודאו ששורת הקוד הזו נמצאת אצלכם!
בעיה בהעלאת קבצים
לפני שנמשיך לפרט על פקודת העלאת קבצים נעצור לרגע.
ישנה בעיה בהעלאת קבצים לשלוחה, לדוגמא אם בשלוחה כל שהיא יש לנו קובץ שמע בשם000.wav
נרצה שהקובץ הבא שיעלה יהיה001.wav
, פה יש לנו בעיה: הקוד לא יעשה את זה!
הבעיה הועלתה בנושא הזה ונפתרה ע"י ערוץ הסקרים, כעת נשלב את הפתרון בקוד.
העתיקו את הקוד:// פונקציה למספרי קבצים עוקבים 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
אשר יכיל את כל פרטי הקובץ:
העתיקו את הקוד הבא:$File = new oFile('ext.ini', 'text/plain', file_get_contents("***"));
כעת הכניסו במקום *** את הנתיב שבו מאוחסן הקובץ, לדוגמא:
C:\Users\PC\Downloads
, והוסיפו אחריו סלש כזה:/
ולא כזה:\
, ולאחר מכן את שם הקובץ, לדוגמא:Lesson_Number_55.mp3
.הנתיב צריך להראות כך:
C:\Users\PC\Downloads/Lesson_Number_55.mp3
.לסיכום הקוד צריך להראות כך:
$File = new oFile('ext.ini', 'text/plain', file_get_contents("C:\Users\PC\Downloads/Lesson_Number_55.mp3"));
שלב ב':
לאחר שהשרת יודע היכן הקובץ, נתקדם לפקודה והפרמטרים.
נציב את הפקודה בתוך משתנהUpload_order$
פקודה נכתבת כך:$Upload_order = $con -> connecting('***',
החליפו את *** בשם הפקודה להעלאת קבצים.
שם הפקודה הוא:UploadFile
.
כך:$Upload_order = $con -> connecting('UploadFile',
שלב ג':
כעת נוסיף את הפרמטרים, הפרמטרים הדרושים מופיעים בתיעוד של ימות, אבל בכל אופן נעבור עליהם יחד.
הפרמטרים כפי שמופיע בתיעוד:- טוקן :
token
.
על הפרמטר 'טוקן' אפשר לדלג משום שנכנסנו עם המחלקה. - נתיב :
path
.
בפרמטר נתיב נכניס את המשתנהpath_name$
זהו המשתנה שהוגדר בחלק האחרון של הקוד שהעתקנו למעלה. - המרה :
convertAudio
.
אם המרה מוגדר על1
הקובץ יומר לפורמט:.wav
שהוא פורמט השמע הטוב ביותר עבור מערכת טלפונית, אם מודגר על:0
לא תתבצע המרה.
ניגש לקוד:
פרמטר נתיב - path:נוסיף
]
לאחריו את הפרמטר נתיב :'path'
את הסימן:<=
ואז את המשתנהpath_name$
ולבסוף פסיק:,
.
הקוד נראה כך:[ 'path' =>$path_name,
פרמטר המרה - convertAudio:
נכתב כך:'convertAudio' => 1,
הסבר:
פרמטר המרה מוגדר על1
מה שאומר שהקובץ יומר, אם נגדיר0
לא תתבצע המרה.פרמטר קובץ להעלאה - fileUpload:
נוסיף פרמטר נוסף (שמשום מה לא מופיע בתיעוד של ימות) פרמטר קובץ להעלאה:fileUpload
, ונוסיף לו את משתנה נתיב קובץ להעלאה שהגדרנו למעלה, כך:'fileUpload' => $File
כאן לא מוסיפים פסיק :
,
משום שהוא הפרמטר האחרון.נסגור עם:
] );
לסיכום: קוד הפקודה יחד עם הפרמטרים נראה כך:
$Upload_order = $con -> connecting('UploadFile', [ 'path' =>$path_name, 'convertAudio' => 1, 'fileUpload' => $File ] );
זהו, סיימנו!
בצעו שמירה
ורעננו את הדפדפן או כנסו שוב לhttp://localhost/my_php/main.php
.
אם אין שגיאות כנסו למערכת הניהול שלכם ובידקו האם הקובץ אכן עלה לשלוחה, אם כן - ברכות- אם לא חזרו שוב על הקוד ובידקו את הטעות לפי הודעת השגיאה...למדנו המון, במדריך הבא נבצע בל"נ יחד פרוייקט קטן בכדי לבדוק האם העיקרון הובן לנו היטב.
יהי רצון שיהיה לתועלת להרבות תורה בישראל.למעבר למדריך הבא לחצו כאן.
- טוקן :
-
@ass לא עלה לי הקובץ
היכן אני מכניס את הפקודה הזו?
$path = "ivr2:4/1";
ואיך אני מפנה לשלוחה 1 תחת השלוחה הראשית? -
@לולב-ואתרוג אמר במדריך התחלת עבודה עם API של ימות משיח (חלק ב').:
היכן אני מכניס את הפקודה הזו?
שלום @לולב-ואתרוג,
ראשית זאת לא פקודה אלא משתנה שהערך שלו זה פרמטר הנתיב, כלומר אתה מגדיר לתוכנה מראש להיכן להעלות את הקובץ.את המשתנה הזה אתה יכול לשים במקומות שונים לפי העניין (תלוי אם אתה מציב אותו מחדש - אבל לא נסתבך) פשוט תשים אותו באותו מקום לפי הסדר שמופיע במדריך, תגדיר אותו ותמשיך הלאה עם המדריך.
(כדאי לדעת: ששימוש במשתנה הזה הוא בפונקציה שפותרת את הבעיה בהעלאת קבצים ובהמשך גם בפקודת העלאה עצמה).ואיך אני מפנה לשלוחה 1 תחת השלוחה הראשית?
פשוט ככה:
$path = "ivr2:1";
או:
$path = "ivr2:/1";
ואיך אני מפנה לשלוחה 1 תחת השלוחה הראשית?
טיפ: ע"י ניסוי וטעייה היית יכול לפתור לבד את הבעיה הזו, שווה לנסות ולבדוק מה קורה אם... זה יחסוך לך את הזמן לחכות עד שיענו לך וכו', גם ככה קוד הוא אבן שואבת לשגיאות ובעיות, אז יהיה נחמד להוריד קצת
-
@ass כתבתי ככה
01/
זו הייתה הטעות שלי
תודה -
פוסט זה נמחק! -
@ASS
התחברתי עם המחלקה וכתבתי פקודה, בסוף סגרתי עם?>
והוא מחזיר
( ! ) Parse error: syntax error, unexpected '?>', expecting ')' in C:\wamp64\www\my_php\1.php on line 260
כאילו יש לו בעיה עם הסיומת, הורדתי את הסיומת ומחזיר
( ! ) Parse error: syntax error, unexpected end of file, expecting ')' in C:\wamp64\www\my_php\1.php on line 260
הקוד המלא הוא
<?php define("URL", "https://private.call2all.co.il/ym/api/"); $server = "private"; 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('07*****','****'); $token = "07******:*****"; $File_list = $con -> connecting('GetSession', ?>
-
@yonatan
היה חסר לך בשורה אחת לפני הסוף(
.
בדרך כלל שגיאות מסוג של מצפה לסיום הקובץ וכו' זה בעיה בשורות שלפני כן ולא בשורה של השגיאה.<?php define("URL", "https://private.call2all.co.il/ym/api/"); $server = "private"; 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('07*****','****'); $token = "07******:*****"; $File_list = $con -> connecting('GetSession') ?>
-
אני לא יודע בדיוק מה הבעיה ואין לי כח לבדוק שורה אחרי שורה,אבל גם אני אתמול ניסיתי להעלות קובץ עם המחלקה וזה החזיר שגיאות כל הזמן.
אז העתקתי את המחלקה המקורית [מהפורום הישן] וזה עבד מצויין.
הנה המחלקה
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; } }
והנה החלקים שמצרפים המקוריים
הזדהות [חובה]
/*================יצירת אובייקט(מופע) חדש====================*/ $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); /*===============================================================*/ להלן המחלקה: קוד: בחירת הכל
וקרדיט ענק ל @מאזין-נלהב
-
@ass עכשיו אין שגיאה אבל לא מחזיר נתונים
-
-
@מנסה הוא מחזיר שיש לו בעיה עם השורה הזאת
-
-
@מנסה לא עובד
-
@yonatan
אולי תעלה פה את הקוד המלא (אני מניח שעדכנת אותו מאז הפוסט הקודם ) ואני יבדוק אצלי. -
כתבתי ככה ועושה לי שגיאה מה הבעיה?
<?php
echo "זה קוד PHP";
//בשרת רגיל
define("URL", "https://www.call2all.co.il/ym/api/");
//בשרת פרייבט
//define("URL", "https://private.call2all.co.il/ym/api/");
//בשרת רגיל
//משתנה כדי למנוע בעיות בהעלאת קבצים בהמשך
$server = "www";
//בשרת פרייבט
//$server = "private";
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('077*****','');
$token = "077:****";//נתיב
$path = "ivr2:/2";// פונקציה למספרי קבצים עוקבים
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 = new oFile('ext.ini', 'text/plain', file_get_contents("...."));//להעלאת קבצים פקודה
$Upload_order = $con -> connecting('UploadFile',
[
//טוקן
'path' =>$path_name,
//המרה ל-wav אם מוגדר על 1 הקובץ יומר אם מוגדר על 0 לא
'convertAudio' => 1,
//קובץ להעלאה
'fileUpload' => $File
]
);?>
-
@מנחם-עזריה
איפה הוא נותן לך שגיאה בטלפון או בדפדפן? -
@ASS את כל מה שאתה אומר להעתיק זה לאותו קובץ ראשון שפתחתי?
-
-
@ASS עשיתי את כל מה שרשום וזה לא אומר שגיאה וגם לא מעלה את הקובץ לשלוחה.
-
פוסט זה נמחק!