ქართული ვალუტის კურსი ჩვენს ვებ გვერდზე (GERL)
ბევრი თხოვნების მერე გადავწყვიტე ეს პოსტი დამეწერა. მავან ხალხს აინტერესებს თუ როგორ ჩასვას თავის ვებ გვერდზე ქართული სავალუტო კურსი, ამისთვის არსებობს რამოდენიმე მზა სერვისი, იგი მარტივად გაძლევს კოდს რომელსაც ჩასვამ შენს გვერდზე და მორჩა, მაგრამ მაშინ როცა გვინდა ჩვენი ვალუტის კურსის ბაზა გვქონდეს ან უბრალოდ ლაივში იღებდე ეროვნული ბანკის საიტიდან მონაცემებს ბევრი კითხულობს თუ როგორ მოახდინოს RSS-ის გრაბირება და შემდგომ ინტეგრაცია თავის ვებ გვერდზე.
მოკლედ შემოგთავაზებთ მაგალითს, რომელის პირობით GERL (Georgian Exchange Rate of Lari) დავარქვი და ცოტაოდენი დამუშავების შემდეგ აბსოლიტურად მორგებადი უნდა იყოს თქვენი ვებ გვერდისთვის.
მაშ ასე შევქმნათ ახალი DOMDocument ობიექტი DOM კლასის გამოყენებით
1 | $xmldoc = New DOMDocument(); |
შემდეგ შემოვიტანოთ “დასაგრაბირებელი” xml ფალი, ჩვენს შემთხვევაში http://www.nbg.ge/rss.php.
1 | $xmldoc->load('http://www.nbg.ge/rss.php'); |
ჯამში გვინდა მივიღოთ 2 მასივი, 1-ვალუტის კურსის მოწოდების, მომწოდებლისა თარიღის შესახებ (შეგვიძლია სურვილისამებრ ეს არც გამოვიყენოთ) და მეორე მასივი სადაც მოცემული გვექნება მიმდინარე სავალუტო კურსი დეტალურად.
1 2 3 4 5 6 7 8 9 10 11 | foreach ($xmldoc->getElementsByTagName('channel') as $feeditem) { $INFO['link'] = htmlspecialchars($feeditem->getElementsByTagName('link')->item(0)->nodeValue); $INFO['copyright'] = $feeditem->getElementsByTagName('copyright')->item(0)->nodeValue; $INFO['title'] = $feeditem->getElementsByTagName('title')->item(0)->nodeValue; $INFO['pubDate'] = $feeditem->getElementsByTagName('pubDate')->item(0)->nodeValue; } foreach ($xmldoc->getElementsByTagName('item') as $feeditem) { $INFO['courseDate'] = end(explode(' ',$feeditem->getElementsByTagName('title')->item(0)->nodeValue)); $DATA = $feeditem->getElementsByTagName('description')->item(0)->nodeValue; } |
ამითი ჩვენ $INFO მასივში მივიღეთ ზემოთხსენებული პირველი მასივი და პლუს $DATA ცვლადი საიდანაც შემდგომში ვიწყებთ დეტალური კურსის ამოღებას.
იმისათვის რომ მიღებულ შავ კოდში <img ტეგი რომელიც გვიჩვენებს კურსის ქმედებას(აწევა/დაწევა), ამისთვის მთელ <img ტეგს მასივის საშუალებით ვანაცვლებ შესაბამისი მნიშვნელობით
1 2 3 4 5 | $protect = array( '<img src="http://www.nbg.ge/images/red.gif" alt="" />' => 'up', '<img src="http://www.nbg.ge/images/green.gif" alt="" />' => 'down' ); $DATA = strtr($DATA, $protect); |
ესეც ასე,
ეხლა მიღებულ კოდს გადავურბინოთ და ამოვიღოთ საჭირო მნიშვნელობები. იმისათვის რომ DOMDocument -თან მუშაობისას მიუხედდავად ჭიდილისა UTF-8-სთან შემექმნა პრობლემები ამიტომ გვერდი ავუარე ამ პრობლემას იმით რო უნიკოდს ჯერ ვანაცვლებ ლათინურით და შემდეგ ვაბრუნებ ისევ უნიკოდში, ეს ყველაფერი მაქვს მასივში.
1 2 3 4 5 6 7 | $geo2lat = array( 'ა' => 'a', 'ბ' => 'b', 'გ' => 'g', 'დ' => 'd', 'ე' => 'e', 'ვ' => 'v', 'ზ' => 'z', 'თ' => 'T', 'ი' => 'i', 'კ' => 'k', 'ლ' => 'l', 'მ' => 'm', 'ნ' => 'n', 'ო' => 'o', 'პ' => 'p', 'ჟ' => 'J', 'რ' => 'r', 'ს' => 's', 'ტ' => 't', 'უ' => 'u', 'ფ' => 'f', 'ქ' => 'q', 'ღ' => 'R', 'ყ' => 'y', 'შ' => 'S', 'ჩ' => 'C', 'ც' => 'c', 'ძ' => 'Z', 'წ' => 'w', 'ხ' => 'x', 'ჭ' => 'W', 'ყ' => 'y', 'ჯ' => 'j', 'ჰ' => 'h'); |
ვაგრძელებთ ზემოთ დაწყებული კოდის გაპარსვას და მასივშ გადატანას
1 2 3 4 5 6 7 8 9 10 11 12 | $table = new DOMDocument(); $CourseData = array(); $table->loadHTML($DATA); foreach ($table->getElementsByTagName('tr') as $tableTR) { $CourseData[$tableTR->getElementsByTagName('td')->item(0)->nodeValue] = array( 'CNT' => intval($tableTR->getElementsByTagName('td')->item(1)->nodeValue), 'name' => strtr(removeNumber($tableTR->getElementsByTagName('td')->item(1)->nodeValue),$lat2geo), 'course' => $tableTR->getElementsByTagName('td')->item(2)->nodeValue, 'act' => $tableTR->getElementsByTagName('td')->item(3)->nodeValue, 'actnum' => $tableTR->getElementsByTagName('td')->item(4)->nodeValue ); } |
ესეც ასე მიღებულია მეორე მასივიც სადაც დეტალურად გვაქვს გაშლილი სავალუტო კურსი
საბოლოოდ ერთიანმა კონდა მიიღო ასეთი სახე
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | <?php header('content-type: text/html; charset: utf-8'); function array_inverse($array){ $ret = array(); foreach($array as $key => $value){ $ret[$value] = $key; } return $ret; } $geo2lat = array( 'ა' => 'a', 'ბ' => 'b', 'გ' => 'g', 'დ' => 'd', 'ე' => 'e', 'ვ' => 'v', 'ზ' => 'z', 'თ' => 'T', 'ი' => 'i', 'კ' => 'k', 'ლ' => 'l', 'მ' => 'm', 'ნ' => 'n', 'ო' => 'o', 'პ' => 'p', 'ჟ' => 'J', 'რ' => 'r', 'ს' => 's', 'ტ' => 't', 'უ' => 'u', 'ფ' => 'f', 'ქ' => 'q', 'ღ' => 'R', 'ყ' => 'y', 'შ' => 'S', 'ჩ' => 'C', 'ც' => 'c', 'ძ' => 'Z', 'წ' => 'w', 'ხ' => 'x', 'ჭ' => 'W', 'ყ' => 'y', 'ჯ' => 'j', 'ჰ' => 'h'); $protect = array( '<img src="http://www.nbg.ge/images/red.gif"/>' => 'up', '<img src="http://www.nbg.ge/images/green.gif"/>' => 'down' ); function removeNumber($string) { $tmp = explode(' ',$string); $ret = ''; foreach ($tmp as $key => $value){ if (is_numeric(trim($value))) unset($tmp[$key]); } return implode(' ', $tmp); } $xmldoc = New DOMDocument(); $xmldoc->load('http://www.nbg.ge/rss.php'); $Table=''; $lat2geo = array_inverse($geo2lat); $protect = array_merge($protect,$geo2lat); foreach ($xmldoc->getElementsByTagName('channel') as $feeditem) { $INFO['link'] = htmlspecialchars($feeditem->getElementsByTagName('link')->item(0)->nodeValue); $INFO['copyright'] = $feeditem->getElementsByTagName('copyright')->item(0)->nodeValue; $INFO['title'] = $feeditem->getElementsByTagName('title')->item(0)->nodeValue; $INFO['pubDate'] = $feeditem->getElementsByTagName('pubDate')->item(0)->nodeValue; } foreach ($xmldoc->getElementsByTagName('item') as $feeditem) { $INFO['courseDate'] = end(explode(' ',$feeditem->getElementsByTagName('title')->item(0)->nodeValue)); $DATA = $feeditem->getElementsByTagName('description')->item(0)->nodeValue; } $DATA = strtr($DATA, $protect); $table = new DOMDocument(); $CourseData = array(); $table->loadHTML($DATA); foreach ($table->getElementsByTagName('tr') as $tableTR) { $CourseData[$tableTR->getElementsByTagName('td')->item(0)->nodeValue] = array( 'CNT' => intval($tableTR->getElementsByTagName('td')->item(1)->nodeValue), 'name' => strtr(removeNumber($tableTR->getElementsByTagName('td')->item(1)->nodeValue),$lat2geo), 'course' => $tableTR->getElementsByTagName('td')->item(2)->nodeValue, 'act' => $tableTR->getElementsByTagName('td')->item(3)->nodeValue, 'actnum' => $tableTR->getElementsByTagName('td')->item(4)->nodeValue ); } echo "<pre>"; print_r($INFO); print_r($CourseData); echo "</pre>"; ?> |
ეს არის და ეს. ამიშ შემდგომ მიღებული მასივი შეგვიძლია ლაივში ვაჩვენოთ ხოლმე მომხმარებელს, (ცოტა მეტ დროს მოითხოვს rss-ის მოტანა და პარსვა) ან მოვიტანოთ ბაზაში ლოკალზე ჩავწეროთ და მერე ბაზიდან ამოვიღოთ. ჯამში ეს უკვე თქვენი გადასაწყვეტია, ამოცანა რაც იყოს დასახული გადაწყვეტილია და შედეგიც მიღებულია.
სამწუხაროდ დემო მაგალითს აქვე ვერ შემოგთავაზებთ ძვირფასი ჰოსტინგის “უმაღლესი(!)” დაცვის მიზნით გათიშული რიგი ფუნქციების გამო
მუშა მაგალითი შეგიძლიათ გადაწეროთ აქედან v 0.0.1
პრაქტიკულმა ტესტირებამ აჩვენა რომ DOMDocument ფუნქციის გამოყენებას სერვერზე პროცესორის საკმაოზე მეტად დიდი დატვირთვა მოსდევს, ამიტომ და არა მარტო ამიტომ, სასურველია ვალუტის მოტანა არ ხდებოდეს ონლაინ რეჯიმში, ანუ ყოველ წამს. სასურველია იყოს მისი კეშირება, რომელიც საკმაოდ შეამცირებს სერვერზე პროცესორის დატვირთვას და საიტის ჩატვირთვის დროს(!)
April 10th, 2009 at 5:00 pm
მაგ კოდს დავუმატოთ ბარემ ესეც
$img_restore = array_inverse($protect);
და სურათის მიღების დროს
strtr($$tableTR->getElementsByTagName(‘td’)->item(3)->nodeValue,$img_restore);
ეს იმიტო რო აღვადგინოთ სურათი და სურათად გამოვიტანოთ ნუ თუ გამოგვაქ 😀
დიდი გამოცდილება არ მაქ პარსვებში და თუ რამე ნიტოა იზვინით 😀
April 11th, 2009 at 12:49 am
@სოსო
ეგ კარგია მაგრამ ეს კოდი გათვალისწინებულია იმისთვის რომ ეროვნული ბანკის სერვერზე მიმართვა მოხდებს მხოლოდ ვალუტის მოტანის დროს. ანუ მე სურათის ადგილას მაქვს მისი მნიშვნელობა და როგორც მინდა გამოვიყენებ მას და თუკი ისევ იგივე სურათის გამოყენებას ვაპირებ რაღა აზრი ჰქონდა მისი ტეგის up და down მნიშვნელობებით ჩანაცვლებას.
ნიტო არაფერია უბრალოდ ჩემის აზრით ჯობია ეს ყველაფერი 1-ჯერ ლოკალურად მოიტანო და მერე შენ თითონ ამოიღო შენი ბაზიდან ან კეშიდან და აღარ გამოიყენო სხვა სერვერზე განთავსებული თუნდაც img ფაილი.
🙂
May 6th, 2009 at 3:09 pm
gadmovwere tkveni versia v 0.0.1 magram rogor chavsva chem saitze ar vici, tu damexmarebit viqnebi madloveli
May 6th, 2009 at 6:48 pm
თუ php არ იცი ვერ ჩასვამ 🙂 და თუ იცი მაშინ კონკრეტულად ახსენი რა პრობლემაა და განვიხილოთ 🙂
March 5th, 2010 at 10:43 pm
გამარჯობათ, დიდი თხოვნა მაქვს ამიხსნათ თუ როგორ შეიძლება მოცემული სკრიპტის გამოყენება Joomla 1.5.15_ში! მადლობთ!!!
March 6th, 2010 at 1:03 am
ჯუმლაში როგორ გამოვიყენო ეს სკრიპტი??? მადლობთ!!!
September 16th, 2010 at 10:41 pm
კარგი რამეა მაგრამ ისიც რომ დაამატოთ თუ როგორ მოვახდინოთ რეალიზება ანუ როგორ ჩავსვათ პჰპ ში რომ გვერდზე გამოვიტანოთ კარგი იქნებოდა
September 16th, 2010 at 10:49 pm
დავდებ v 0.0.2-ს სადაც იქნება მონაცემების კეშირება და საიტზე ინტეგრაციის მაგალითიც.
December 5th, 2010 at 12:59 am
ვერაფრით ვერ დავაყენე სულ ერორზე გადის.
Warning: DOMDocument::load(http://www.nbg.ge/rss.php) [function.DOMDocument-load]: failed to open stream: Connection refused in /home/www/greenchpc.com/getvaluta.php on line 42
Warning: DOMDocument::load() [function.DOMDocument-load]: I/O warning : failed to load external entity “http://www.nbg.ge/rss.php” in /home/www/greenchpc.com/getvaluta.php on line 42
Warning: DOMDocument::loadHTML() [function.DOMDocument-loadHTML]: Empty string supplied as input in /home/www/greenchpc.com/getvaluta.php on line 64
Array
(
)
December 5th, 2010 at 1:06 am
@დათო
როგორც შეცდომიდან ჩანს შენი ჰოსტინგის სერვერს წვდომა არ ააქვს http://www.nbg.ge/rss.php -სთან და ვერ იღებს xml-ს რომ შემდგომ დაამუშაოს იგი.
შესაძლოა სერვერზე გათიშული გაქვს ექსტერნალ ფაილზე წვდომა php-დან