| 
<?php
 $composerLoadPath = __DIR__ . '/vendor/autoload.php';
 $configPath = __DIR__ . '/config.php';
 
 $timezone = 'Asia/Taipei';
 
 if (false === file_exists($composerLoadPath)) {
 echo 'Composer Autoload Path is not existed.' . PHP_EOL;
 exit(1);
 }
 
 if (false === file($configPath)) {
 echo 'Config path is not existed.' . PHP_EOL;
 exit(1);
 }
 
 require_once $composerLoadPath;
 require_once $configPath;
 
 use Carbon\Carbon;
 use GuzzleHttp\Client;
 use Vonage\SMS\Message\SMS;
 use Vonage\Client as VonageClient;
 use Vonage\Client\Credentials\Basic;
 use Vonage\SMS\Exception\Request;
 use Mailjet\Resources;
 use Mailjet\Client as MailjetClient;
 use Symfony\Component\DomCrawler\Crawler;
 
 function sendEmail($message): void {
 $mj = new MailjetClient(MJ_APIKEY_PUBLIC, MJ_APIKEY_PRIVATE, true, ['version' => 'v3.1']);
 $body = [
 'Messages' => [
 [
 'From' => [
 'Email' => SENDER_EMAIL,
 'Name' => "Emask Notifier"
 ],
 'To' => [
 [
 'Email' => RECIPIENT_EMAIL,
 'Name' => "You"
 ]
 ],
 'Subject' => "Emask Notifier Status",
 'TextPart' => $message,
 'HTMLPart' => "<h3>$message</h3>",
 ]
 ]
 ];
 
 $response = $mj->post(Resources::$Email, ['body' => $body]);
 }
 
 function sendSMS($notificationMessage): bool {
 $welcomeMessageFormat = "Hi %s,\n";
 $phoneFilePath = __DIR__ . '/phone.csv';
 
 if (false === file_exists($phoneFilePath)) {
 echo 'Cannot find phone.csv file!' . PHP_EOL;
 exit(1);
 }
 $handler = fopen($phoneFilePath, 'r');
 while (false === feof($handler)) {
 $str = (string)fgets($handler, 4096);
 if ('' === $str) {
 break;
 }
 $row = str_getcsv($str);
 $userName = $row[0];
 $userPhoneNumber = $row[1];
 $message = sprintf($welcomeMessageFormat, $userName) . $notificationMessage;
 
 if (false === defined('VONAGE_API_KEY')) {
 echo 'VONAGE_API_KEY is not defined!' . PHP_EOL;
 exit(1);
 }
 
 if (false === defined('VONAGE_API_SECRET')) {
 echo 'VONAGE_API_KEY is not defined!' . PHP_EOL;
 exit(1);
 }
 
 $basic  = new Basic(VONAGE_API_KEY, VONAGE_API_SECRET);
 $client = new VonageClient($basic);
 $response = $client->sms()->send(
 new SMS($userPhoneNumber, $userName, $message)
 );
 $current = $response->current();
 
 echo sprintf('[%s] Message has been sent to %s. Message ID: %s', (string)Carbon::now($timezone), $userName, $current->getMessageId()) . PHP_EOL;
 }
 
 fclose($handler);
 
 return true;
 }
 
 if ('10:00' !== Carbon::now($timezone)->format('H:i')) {
 echo 'Sorry! This worker only works at 10:00 every day' . PHP_EOL;
 exit(0);
 }
 
 $client = new Client();
 $response = $client->request('GET', 'https://emask.taiwan.gov.tw/msk/index.jsp');
 $body = (string)$response->getBody();
 
 $crawler = new Crawler($body);
 $notificationMsgLists = [];
 $notificationElements = 'p[style="margin-top: 10px; margin-bottom: 10px; font-size: 14px; font-weight: 400;"]';
 $crawler->filter($notificationElements)->reduce(function(Crawler $node, $index) use (&$notificationMsgLists) {
 $notificationMsgLists[$index] = $node->text();
 });
 
 if (5 !== count($notificationMsgLists)) {
 echo 'Notification Message fetching Error!' . PHP_EOL;
 exit(1);
 }
 array_pop($notificationMsgLists);
 
 $notificationMessage = implode("\n", $notificationMsgLists);
 
 $dateCount = preg_match_all('/(\d+\/\d+ \d+:\d+ - \d+\/\d+ \d+:\d+)/', $notificationMsgLists[2], $matched);
 if (1 !== $dateCount) {
 echo 'Cannot filter date range!' . PHP_EOL;
 exit(1);
 }
 
 $now = Carbon::now($timezone);
 $dateRange = explode(' - ', $matched[0][0]);
 $startDate = $dateRange[0];
 $endDate = $dateRange[1];
 
 if (0 === $now->diff(Carbon::parse($startDate))->days) {
 echo 'Sending Message!' . PHP_EOL;
 
 try {
 $result = sendSMS($notificationMessage);
 } catch (Request $e) {
 $message = sprintf('[%s]Send SMS Message is failed: %s', (string)$now, $e->getMessage());
 echo $message . PHP_EOL;
 sendEmail($message);
 exit(1);
 }
 
 if (false === $result) {
 echo sprintf('[%s]Sending Notification Message has been failed!', (string)$now) . PHP_EOL;
 exit(1);
 }
 
 echo sprintf('[%s]Sending Notification Message has been done!', (string)$now) . PHP_EOL;
 exit(0);
 }
 
 $now->addDay(-1);
 if (0 === $now->diff(Carbon::parse($startDate))->days) {
 echo 'Sending Message!' . PHP_EOL;
 $result = sendSMS($notificationMessage);
 
 if (false === $result) {
 echo sprintf('[%s]Sending Notification Message has been failed!', (string)$now) . PHP_EOL;
 exit(1);
 }
 
 echo sprintf('[%s]Sending Notification Message has been done!', (string)$now) . PHP_EOL;
 exit(0);
 }
 
 echo sprintf('[%s] Do Nothing!', (string)$now) . PHP_EOL;
 
 |