Day25 串接第三方API

现在许多产业全球化、交通运输的科技日益发达,每个人都会遇到汇率的问题,可能一觉醒来因为汇率的变动某些公司的老板就因此多赚了几台车或是少赚了几栋房子,小资族可以利用汇率的波动在低点时买进外汇这样去日本时就能多出几碗一兰拉面,所以掌握汇率就能掌握钱钱绝不是说说而已。

想要知道汇率最简单的方法当然就是在Google打上想要的国家加上汇率两字就可以得到即时答案,但如果想要进行长期的分析及观察的话就会有点力不从心,身为一个工程师当然是要想办法把这种麻烦的事情自动化,这种资料的取得会有许多方法,例如:爬虫爬取网页资料、串接第三方的API等。

爬虫能获取资料,但有可能网页改版时或是资料方有做爬虫的防治的话事情就会变得麻烦许多,而且爬虫在效能上也会有许多耗损,此时如果有第三方API能直接串接的话事情就会变得容易,那就来找找是否有服务是提供开放API吧,当我在Google打上汇率 API时就可以看到有此服务。

https://ithelp.ithome.com.tw/upload/images/20210925/20115048gShRHnW2fW.png

点开後可以发现只要使用https://tw.rter.info/capi.php这个url即可获得世界各国对美金的汇率,而且直接提供JSON格式资料,不必载入不需要的资料还需要後续处理,非常好。

https://ithelp.ithome.com.tw/upload/images/20210925/20115048XvOkOxl8tZ.png

这次想做的功能是每天早上八点取得一次全球的汇率,所以选择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观察一下成果吧

https://ithelp.ithome.com.tw/upload/images/20210925/20115048NbXcyGDIsY.png

今天的介绍就到这边结束了,谢谢观看的各位,请记得按赞分享开启小铃铛,你的支持会让按赞数+1。


<<:  【D11】再度熟悉厨具:合约

>>:  Day09:Emit Direct Message I(发送个人讯息到 server 端)

简报版-第九章-认识物联网安全~从各式联网设备的风险看起

其实原本最初规画想要做Index方式的纪录,然後多增加一些没写到的面向 不过,总是计画赶不上变化 ...

Alpine Linux Porting (一点十?)

为了更理解Alpine initramfs的眉角,今天持续来看一下Alpine的mkinitfs套件...

网格交易机器人第一天测试纪录

感觉还是有bug,他会一直买停不下来,可能要再找一两天请假来盯着机器人,然後上线前下单的金钱限制要设...

Gulp 使用 includePaths 载入外部 Sass资源 DAY95

若我们要使用外部套件载入的 Sass 那要怎麽载入呢?? 这里我们以 Bootstrap为例子 先使...