טוב, אז בהמשך למדריך הראשון שעסק בעיקר בהבנת המונחים הבסיסיים והכנת סביבת העבודה, במדריך זה נלמד איך לכתוב את הקוד לביצוע פעולות בשרת של ימות משיח.
לא נסביר את כל משמעות הקוד, אחרת המדריך יגמור לימות את הזיכרון בשרת
הידע בשפת 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
.
אם אין שגיאות כנסו למערכת הניהול שלכם ובידקו האם הקובץ אכן עלה לשלוחה, אם כן - ברכות- אם לא חזרו שוב על הקוד ובידקו את הטעות לפי הודעת השגיאה...
למדנו המון, במדריך הבא נבצע בל"נ יחד פרוייקט קטן בכדי לבדוק האם העיקרון הובן לנו היטב.
יהי רצון שיהיה לתועלת להרבות תורה בישראל.
למעבר למדריך הבא לחצו כאן.