現在許多產業全球化、交通運輸的科技日益發達,每個人都會遇到匯率的問題,可能一覺醒來因為匯率的變動某些公司的老闆就因此多賺了幾台車或是少賺了幾棟房子,小資族可以利用匯率的波動在低點時買進外匯這樣去日本時就能多出幾碗一蘭拉麵,所以掌握匯率就能掌握錢錢絕不是說說而已。
想要知道匯率最簡單的方法當然就是在Google打上想要的國家加上匯率兩字就可以得到即時答案,但如果想要進行長期的分析及觀察的話就會有點力不從心,身為一個工程師當然是要想辦法把這種麻煩的事情自動化,這種資料的取得會有許多方法,例如:爬蟲爬取網頁資料、串接第三方的API等。
爬蟲能獲取資料,但有可能網頁改版時或是資料方有做爬蟲的防治的話事情就會變得麻煩許多,而且爬蟲在效能上也會有許多耗損,此時如果有第三方API能直接串接的話事情就會變得容易,那就來找找是否有服務是提供開放API吧,當我在Google打上匯率 API
時就可以看到有此服務。
點開後可以發現只要使用https://tw.rter.info/capi.php
這個url即可獲得世界各國對美金的匯率,而且直接提供JSON格式資料,不必載入不需要的資料還需要後續處理,非常好。
這次想做的功能是每天早上八點取得一次全球的匯率,所以選擇Day21的排程做法,首先先建立一個Command:php artisan make:command getExchangeRate
,並先填寫signature及description屬性,因為是串接第三方API的方法所以signature前方加上api前綴。
protected $signature = 'api:exchangeRate';
protected $description = 'Get exchange rate by third party api';
上方引入套件 use Illuminate\Support\Facades\Http;
,接著開始寫handle,Http套件可擷取response的各種資料,此API回傳的格式已經是JSON格式所以直接使用JSON function,詳細使用方式可至官方網站閱讀,先試著將資料讀取回來,dd()這個function可以將資料顯示在terminal並將服務中斷。
$data = Http::get('https://tw.rter.info/capi.php')->json();
dd($data);
接著下指令php artisan api:exchangeRate
來獲得資料並在terminal觀察規律,可以觀察到大部分的匯率都是以USD開頭並搭配他國貨幣名稱作為key,value則會提供匯率及時間。
此時就可以製作匯率的Migration及Model了
php artisan make:model ExchangeRate -m
Model的地方要編寫fillable屬性之後才能寫入DB
protected $fillable = [
'currency',
'exchange_rate',
];
Migration的地方添加貨幣名稱及匯率,匯率是浮點數,所以使用decimal,並將總位數設定為12位,小數點後記錄兩位就好,也就是說小數點前最多可達10位。
$table->id();
$table->string('currency');
$table->decimal('exchange_rate', 12, 2);
$table->timestamps();
接著下指令將table建立起來php artisan migrate
將Models引入到Command裡
use App\Models\ExchangeRate;
開始使用迴圈將資料寫入table,比較特別的是為了之後尋找貨幣方便,我不希望存的貨幣名稱有美金,所以使用explode字串切割將USD的部分移除掉,explode的用法是如果該字串有出現指定的字串會將原本的字串切割成Array,如果出現越多次則會切割成越多個元素,也就是說如果是美金對上他國貨幣的話會得到一個擁有兩個元素的Array,這次先不存特殊金屬的匯率,所以利用這個規則將這些資料過濾掉寫入DB。
public function handle()
{
$data = Http::get('https://tw.rter.info/capi.php')->json();
foreach($data as $key => $value)
{
$currency = explode('USD', $key);
if (count($currency) == 2 && $currency[1] != null) {
ExchangeRate::create([
'currency' => $currency[1],
'exchange_rate' => $value['Exrate'],
]);
}
}
}
此時就可以下指令php artisan api:exchangeRate
取得資料了,並將此Command加入到Kernal裡即可每天早上八點紀錄即時匯率
$schedule->command('api:exchangeRate')->dailyAt('08:00');
並到Navicate觀察一下成果吧
今天的介紹就到這邊結束了,謝謝觀看的各位,請記得按讚分享開啟小鈴鐺,你的支持會讓按讚數+1。