시간을 알려주는 비서를 원해.

20128 단어 WebhookPHP

개요



언제나 자주 빚진 음성으로
사무적인 차가운 시선으로 사장에게 "사장, XX시에--의 예정이 들어 있습니다"
「사장,--의 예정까지, 앞으로 XX분입니다」
라고 사장 기분을 얽히면서 저것이나 이것이나 쥬루쥬루야라를 실시해 준다.

"그런 기분을 조금이라도 맛보고 싶다"

그래서 이번에는 일정을 등록한 후,
등록 시간이되면 알려주세요.
체계를 PHP 연습이 만들어냈다.

처리 흐름



일정을 웹에서 등록

Webhook을 사용하여 Teams에 알림

정보를 웹 서버에 저장

10분에 한번 CRON에 등록한 프로그램을 기동

Webhook을 사용하여 Teams에 알림

Teams Webhook 설정 흐름



1. Teams에서 나만의 채널을 만들고
설정에서 「커넥터」를 선택


2. "incoming Webhook"에서 "추가"를 클릭
※한 번 추가했기 때문에 「구성」이 되어 있다



3. 적당한 이름을 붙이고 「만들기」를 클릭
그 후 표시되는 URL이 필요하기 때문에 어딘가에 저장


약속 페이지



일정을 등록하는 페이지는 다음과 같습니다.



아주 질소,,,

이 페이지는 일정과 그 시간을 등록합니다.
등록된 일정은 등록 버튼 아래에 스택되어 간다

또한 등록 정보는 웹 서버에 JSON 형식으로 저장되며,
그 데이터를 표시하고 있다.

코드는 다음과 같습니다.

todo.php
<?php
function h($v){
    return htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
}

$FILE = 'todo.txt';
$id = uniqid(); 

$DATA = []; 
$BOARD = []; //全ての投稿の情報を入れる

if(file_exists($FILE)) {
    $BOARD = json_decode(file_get_contents($FILE));
}

if($_SERVER['REQUEST_METHOD'] === 'POST'){
    //$_POSTはHTTPリクエストで渡された値を取得する
    //リクエストパラメーターが空でなければ
    if(!empty($_POST['txt'])){
        //投稿ボタンが押された場合
        //$textに送信されたテキストを代入
        $text = $_POST['txt'];
        $tim = $_POST['tim'];
        //新規データ
        $DATA = [$id, $text, $tim];
        $BOARD[] = $DATA;
        $webhook_url = 'XXXX';
        $options = [
            'http' => [
            'method' => 'POST',
            'header' => 'Content-Type: application/json',
            'content' => json_encode([
            'text' => '社長、'.$DATA[2].'時に'.$DATA[1].'の予定が入っています'
            ]),
            ]
        ];
        file_get_contents($webhook_url, false, stream_context_create($options));
        file_put_contents($FILE, json_encode($BOARD));

    }else if(isset($_POST['del'])){
        //削除ボタンが押された場合
        //新しい全体配列を作る
        $NEWBOARD = [];

        foreach($BOARD as $DATA){
            if($DATA[0] !== $_POST['del']){
                $NEWBOARD[] = $DATA;
            }
        }
        //全体配列をファイルに保存する
        file_put_contents($FILE, json_encode($NEWBOARD));
    }
    //Webページを更新)
    header('Location: '.$_SERVER['SCRIPT_NAME']);
    //プログラム終了
    exit;
}
?>

<!DOCTYPE html>
<html lang= "ja">
<head>
    <meta name= "viewport" content= "width=device-width, initial-scale= 1.0">
    <meta http-equiv= "content-type" charset= "utf-8">
    <link rel="stylesheet" type="text/css" href="./todo.css" media="all">
    <title>予定登録</title>
</head>
<body>
    <h1>予定登録</h1>

    <section class= "main">
        <!--投稿-->
        <form method= "post">
            <input type= "text" name= "txt">
            <input type= "time" name= "tim">
            <input type= "submit" value= "投稿">
        </form>    
        <table style= "border-collapse: collapse">
        <!--tableの中でtr部分をループ-->
        <?php foreach((array)$BOARD as $DATA): ?>
        <tr>
        <form method= "post">
            <td>
                <!--テキスト-->
                <?php 
                echo h($DATA[1]." ".$DATA[2]); 
                ?>
            </td>
            <td>
                <!--削除-->
                <input type= "hidden" name= "del" value= "<?php echo $DATA[0]; ?>">
                <input type= "submit" value= "削除">
            </td>
        </form>
        </tr>
        <?php endforeach; ?>
        </table>
    </section>

알림 기능



일정 시간마다 통지를 하는 기능으로서 PHP의 CRON을 사용했다.

단, 개인으로 대여하는 서버의 현재 계획에서는
10분마다 밖에 실행할 수 없기 때문에, 그것을 근거로 현시점으로부터 15분 후까지의 예정을 통지하도록 했다.

코드는 다음과 같습니다

아래 코드를 서버 측 CRON으로 설정

cron.php
<?php

$FILE = "XXXXXX/todo.txt";
$test = json_decode(file_get_contents($FILE));
$today = date("H:i");

$dateTime1 = date("H:i");
$objDatetime1 = new DateTime($dateTime1);

for ($i = 0; $i < count($test); $i++) {
    echo $test[$i][2]."<br>";
    //echo isset($test[$i][2])."<br>";
    if($test[$i][2]){
        $dateTime2 = $test[$i][2];
        $objDatetime2 = new DateTime($dateTime2);
        $objInterval = $objDatetime1->diff($objDatetime2);
        $sa = $objInterval->format('%H%I');
        $plus = $objInterval->format('%R');
        if ($plus="+"){
            if($sa<=15){
                Teams(sprintf('社長'.$test[$i][1]."の予定まで、あと%02d分です", $sa));
            }
        }
    }else{
        echo "false";
    }
}

function Teams($messege){
    $webhook_url = 'XXXXXXX';
    $options = [
        'http' => [
        'method' => 'POST',
        'header' => 'Content-Type: application/json',
        'content' => json_encode([
        'text' => $messege
        ]),
        ]
    ];
    file_get_contents($webhook_url, false, stream_context_create($options));
}

?>

결과



이런 경우


이렇게



마지막으로



비서에 차가운 시선을 돌리면서
사무적으로 그거야.

참고



htps : // 코 m / 와타 sh / ms / 72b49509c3964294d67
htps : // m / 정확도 _ mf3qt / ms / 948 a0f4d2857c6739 ac5

좋은 웹페이지 즐겨찾기