Line指定時間傳訊息(LineBot&Synology)

這個是續上一篇做的,用Notify還是比較不方便,一定要將Notify加入群組,對使用者讓說很麻煩,所以弄了個Push的

可以讓非Line Developer,其他使用者對LineBot下指令設定排程,讓LineBot指定時間回答指定訊息

用LineBot指定時間Line通知訊息(LineBot&LineNotify&Synology NAS)

透過LineBot跟Synology Nas的Mariadb 10實現

下面LineBot的reply.php的部份內容

下面是在Synology每分鐘要呼叫的php,當然資料庫跟token是您的Synology NAS連線跟您LineBot的Token

<?php

// 執行查詢
$sql = "SELECT sendId, sendtime, memo FROM pushme WHERE send = 'N'";
$result = $conn->query($sql);

// 檢查是否有結果
if ($result->num_rows > 0) {
    // 取得資料
    while ($row = $result->fetch_assoc()) {
        notifyAndMarkAsSent($conn, $row, $AccessToken);
    }
} else {
    echo "NO data";
}

// 關閉資料庫連接
$conn->close();

function notifyAndMarkAsSent($conn, $row, $AccessToken) {
    // 將datetime轉換為UNIX時間戳
    $notificationTime = strtotime($row['sendtime']);
    // 取得當前時間
    $currentTimestamp = time();

    // 判斷是否大於或等於通知時間
    if ($currentTimestamp >= $notificationTime) {
        // LINE 使用者 ID
        $token = $AccessToken;

        $payload = [
            'to' => $row['sendId'],
            'messages' => [
                [
                    'type' => 'text',
                    'text' => $row['memo']
                ]
            ]
        ];

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/v2/bot/message/push');
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $token
        ]);

        $result = curl_exec($ch);
        $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        // 檢查 LINE 推送的結果,根據需要進行錯誤處理
        if ($http_status != 200) {
            echo "LINE Push failed with HTTP status code: " . $http_status;
            // 可以根據實際情況進行錯誤處理
        }

        // LINE Push Memo 通知結束
        $updateSql = "UPDATE pushme SET send = 'Y' WHERE sendtime = ? AND send = 'N' AND memo = ? AND sendId = ?";
        $stmt = $conn->prepare($updateSql);
        $stmt->bind_param("sss", $row['sendtime'], $row['memo'], $row['sendId']);
        $stmt->execute();
        $stmt->close();
    } else {
        echo "尚未到達通知時間";
    }
}
?>

下面是在Synology的任務排程器設定每分鐘執行。

下面是實際結果

目前LineBot免費Push訊息僅能使用200則,經過實際測試,若用在群組很不划算,若一個群組包含LineBot有7人的話,則發一次訊息會計算6次(扣除LineBot自已)

所以建議在個人對LineBot才能下這個指令比較划算。

另外實測,若群組有LineNotify,他也要算一次的訊息費用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *