PHP Classes

File: notifier.php

Recommend this page to a friend!
  Classes of Chun-Sheng, Li   Emask Notifier   notifier.php   Download  
File: notifier.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Emask Notifier
Send SMS messages using an API and notify by email
Author: By
Last change:
Date: 12 days ago
Size: 5,098 bytes
 

Contents

Class file image Download
<?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;