Readme.ge Blog

FB image FB image

ქართული ვალუტის კურსი ჩვენს ვებ გვერდზე (GERL)

ავტორი: ალექსანდრე თარიღი: Sunday, November 23rd, 2008

ბევრი თხოვნების მერე გადავწყვიტე ეს პოსტი დამეწერა. მავან ხალხს აინტერესებს თუ როგორ ჩასვას თავის ვებ გვერდზე ქართული სავალუტო კურსი, ამისთვის არსებობს რამოდენიმე მზა სერვისი, იგი მარტივად გაძლევს კოდს რომელსაც ჩასვამ შენს გვერდზე და მორჩა, მაგრამ მაშინ როცა გვინდა ჩვენი ვალუტის კურსის ბაზა გვქონდეს ან უბრალოდ ლაივში იღებდე ეროვნული ბანკის საიტიდან მონაცემებს ბევრი კითხულობს თუ როგორ მოახდინოს 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 ფუნქციის გამოყენებას სერვერზე პროცესორის საკმაოზე მეტად დიდი დატვირთვა მოსდევს, ამიტომ და არა მარტო ამიტომ, სასურველია ვალუტის მოტანა არ ხდებოდეს ონლაინ რეჯიმში, ანუ ყოველ წამს. სასურველია იყოს მისი კეშირება, რომელიც საკმაოდ შეამცირებს სერვერზე პროცესორის დატვირთვას და საიტის ჩატვირთვის დროს(!)

კატეგორიებში: PHP, უბრალოდ მარტივი. |

10 გამოხმაურება “ქართული ვალუტის კურსი ჩვენს ვებ გვერდზე (GERL)”-ზე

  1. სოსო:

    მაგ კოდს დავუმატოთ ბარემ ესეც
    $img_restore = array_inverse($protect);
    და სურათის მიღების დროს
    strtr($$tableTR->getElementsByTagName(‘td’)->item(3)->nodeValue,$img_restore);

    ეს იმიტო რო აღვადგინოთ სურათი და სურათად გამოვიტანოთ ნუ თუ გამოგვაქ 😀
    დიდი გამოცდილება არ მაქ პარსვებში და თუ რამე ნიტოა იზვინით 😀

  2. ალექსანდრე:

    @სოსო
    ეგ კარგია მაგრამ ეს კოდი გათვალისწინებულია იმისთვის რომ ეროვნული ბანკის სერვერზე მიმართვა მოხდებს მხოლოდ ვალუტის მოტანის დროს. ანუ მე სურათის ადგილას მაქვს მისი მნიშვნელობა და როგორც მინდა გამოვიყენებ მას და თუკი ისევ იგივე სურათის გამოყენებას ვაპირებ რაღა აზრი ჰქონდა მისი ტეგის up და down მნიშვნელობებით ჩანაცვლებას.
    ნიტო არაფერია უბრალოდ ჩემის აზრით ჯობია ეს ყველაფერი 1-ჯერ ლოკალურად მოიტანო და მერე შენ თითონ ამოიღო შენი ბაზიდან ან კეშიდან და აღარ გამოიყენო სხვა სერვერზე განთავსებული თუნდაც img ფაილი.
    🙂

  3. ��ნდრ��:

    gadmovwere tkveni versia v 0.0.1 magram rogor chavsva chem saitze ar vici, tu damexmarebit viqnebi madloveli

  4. ალექსანდრე:

    თუ php არ იცი ვერ ჩასვამ 🙂 და თუ იცი მაშინ კონკრეტულად ახსენი რა პრობლემაა და განვიხილოთ 🙂

  5. ლულა:

    გამარჯობათ, დიდი თხოვნა მაქვს ამიხსნათ თუ როგორ შეიძლება მოცემული სკრიპტის გამოყენება Joomla 1.5.15_ში! მადლობთ!!!

  6. looler:

    ჯუმლაში როგორ გამოვიყენო ეს სკრიპტი??? მადლობთ!!!

  7. დეველოპერი:

    კარგი რამეა მაგრამ ისიც რომ დაამატოთ თუ როგორ მოვახდინოთ რეალიზება ანუ როგორ ჩავსვათ პჰპ ში რომ გვერდზე გამოვიტანოთ კარგი იქნებოდა

  8. ალექსანდრე:

    დავდებ v 0.0.2-ს სადაც იქნება მონაცემების კეშირება და საიტზე ინტეგრაციის მაგალითიც.

  9. დათო:

    ვერაფრით ვერ დავაყენე სულ ერორზე გადის.

    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
    (
    )

  10. ალექსანდრე:

    @დათო
    როგორც შეცდომიდან ჩანს შენი ჰოსტინგის სერვერს წვდომა არ ააქვს http://www.nbg.ge/rss.php -სთან და ვერ იღებს xml-ს რომ შემდგომ დაამუშაოს იგი.
    შესაძლოა სერვერზე გათიშული გაქვს ექსტერნალ ფაილზე წვდომა php-დან

დატოვე კომენტარი

...