qyc0 发表于 2024-11-13 11:42

修改【自用挪车二维码..... 】,支持Server酱消息,需要服务器部署

本帖最后由 qyc0 于 2024-11-13 16:57 编辑

原帖地址:自用挪车二维码,免服务器,可微信通知,可拨打电话   https://www.52pojie.cn/thread-1979717-1-1.html
已经在原帖第550楼po过修改后的代码了
因我个人需要做Server酱的整合通知,同时也有服务器,目前适配了方糖的SCT微信通知整合以及用PHP规避了前端js泄露,同时加入了时间戳,一分钟只能通知一次,避免消息轰炸。

第二次更新在6楼,6楼代码已更新支持PushDeer。
2024/11/13测试过可在宝塔环境下部署。nginx:1.25.5;php8.0
index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>通知车主挪车</title>
<style>
    * { box-sizing: border-box; margin: 0; padding: 0; }
    body { font-family: Arial, sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; background: #f0f2f5; color: #333; }
    .container { text-align: center; padding: 20px; width: 100%; max-width: 400px; border-radius: 8px; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); background: #fff; }
    h1 { font-size: 24px; margin-bottom: 20px; color: #007bff; }
    p { margin-bottom: 20px; font-size: 16px; color: #555; }
    button {
      width: 100%;
      padding: 15px;
      margin: 10px 0;
      font-size: 18px;
      font-weight: bold;
      color: #fff;
      border: none;
      border-radius: 6px;
      cursor: pointer;
      transition: background 0.3s;
    }
    .notify-btn { background: #28a745; }
    .notify-btn:hover { background: #218838; }
    .call-btn { background: #17a2b8; }
    .call-btn:hover { background: #138496; }
    .disabled {
      background: #6c757d !important;
      cursor: not-allowed;
    }
</style>
</head>
<body>
<div class="container">
    <h1>通知车主挪车</h1>
    <p>如需通知车主,请点击以下按钮</p>
    <button id="notifyButton" class="notify-btn">通知车主挪车</button>
    <button class="call-btn">拨打车主电话</button>
</div>
<script>
function startCooldown(duration) {
    const button = document.getElementById('notifyButton');
    button.disabled = true;
    button.classList.add('disabled');

    // 使用后端提供的冷却时间
    let cooldown = duration;
    button.textContent = `冷却中 (${cooldown}s)`;

    const interval = setInterval(() => {
      cooldown -= 1;
      if (cooldown > 0) {
            button.textContent = `冷却中 (${cooldown}s)`;
      } else {
            clearInterval(interval);
            button.disabled = false;
            button.classList.remove('disabled');
            button.textContent = "通知车主挪车";
      }
    }, 1000);
}

function notifyOwner() {
    fetch("/fetch.php")
      .then(response => response.json())
      .then(data => {
            if (data.code === 0) {
                alert("通知已发送!");
                // 这里启动60秒的冷却
                startCooldown(60);
            } else if (data.code === 1 && data.cooldown) {
                // 如果有冷却时间,则开始冷却计时
                startCooldown(data.cooldown);
                alert(data.message);
            } else {
                alert("通知发送失败,请稍后重试。");
            }
      })
      .catch(error => {
            console.error("Error sending notification:", error);
            alert("通知发送出错,请检查网络连接。");
      });
}

function callOwner() {
    window.location.href = "tel:13188888888";
}
</script>
</body>
</html>

网站同目录下创建fetch.php
<?php
// fetch.php

// 定义用于保存时间戳的文件路径
$timestampFile = '/tmp/api_call_timestamp.txt';
$cooldownTime = 60; // 冷却时间(秒)

// 当前时间戳
$currentTime = time();

// 检查文件是否存在以及是否在冷却中
if (file_exists($timestampFile)) {
    $lastCalled = file_get_contents($timestampFile);
    $timeElapsed = $currentTime - (int)$lastCalled;
   
    if ($timeElapsed < $cooldownTime) {
      $remainingTime = $cooldownTime - $timeElapsed;
      exit(json_encode(['code' => 1, 'message' => '请求过于频繁,请稍后再试', 'cooldown' => $remainingTime]));
    }
}

// 执行外部 API 调用
$apiUrl = 'https://sctapi.ftqq.com/<sendkey>.send?title=挪车通知&desp=有人扫码通知你挪车啦';//<sendkey>请自行为自己的SCT开头的密钥
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

if ($response === false) {
    echo json_encode(['code' => 1, 'message' => '请求失败: ' . curl_error($ch)]);
} else {
    // 保存当前时间戳到文件中
    file_put_contents($timestampFile, $currentTime);
    echo $response;
}

curl_close($ch);
?>

qyc0 发表于 2024-11-21 11:21

本帖最后由 qyc0 于 2024-11-21 11:28 编辑

kover 发表于 2024-11-21 10:36
我让gpt写了一个,直接访问这个php文件可以推送到微信,但是那个html按钮点击无反应,翻找了不少帖子才发 ...
OKK。点击无反应可以看下原帖二楼。
https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1979717&pid=51669503

“注意:因论坛的html代码插入有BUG,会自动过滤掉35、36行按钮代码,复制以下替换下即可
      <button class="notify-btn" onclick="notifyOwner()">通知车主挪车</button>
      <button class="call-btn" onclick="callOwner()">拨打车主电话</button>”

qyc0 发表于 2024-11-13 16:19

a1067709136 发表于 2024-11-13 16:14
还有个问题,如果别人把二维码保存下来,使用机器人自动点击通知按钮,虽然是限制每分钟只能通知一次,但是 ...

你在用server酱3?

dogpile 发表于 2024-11-13 15:51

沙发,纯支持。

dsman 发表于 2024-11-13 15:55

好,拿走,谢谢

a1067709136 发表于 2024-11-13 16:14

还有个问题,如果别人把二维码保存下来,使用机器人自动点击通知按钮,虽然是限制每分钟只能通知一次,但是24小时不停发送也挺烦的,server酱免费版有字数限制,大佬能否加个webhook接口,我想用pushdeer来接收通知

qyc0 发表于 2024-11-13 16:43

本帖最后由 qyc0 于 2024-11-13 16:50 编辑

a1067709136 发表于 2024-11-13 16:14
还有个问题,如果别人把二维码保存下来,使用机器人自动点击通知按钮,虽然是限制每分钟只能通知一次,但是 ...
根据pushdeer的开发文档,如果你只要用pushdeer的文本功能的话,
https://api2.pushdeer.com/message/push?pushkey=key&text=要发送的内容
代替23行中的链接,自行填入pushkey和text文本


完整的版本刚刚测试完了;
fetch.php替换如下代码:

<?php
// fetch.php

// 定义用于保存时间戳的文件路径
$timestampFile = '/tmp/api_call_timestamp.txt';
$cooldownTime = 60; // 冷却时间(秒)

// 当前时间戳
$currentTime = time();

// 检查文件是否存在以及是否在冷却中
if (file_exists($timestampFile)) {
    $lastCalled = file_get_contents($timestampFile);
    $timeElapsed = $currentTime - (int)$lastCalled;
   
    if ($timeElapsed < $cooldownTime) {
      $remainingTime = $cooldownTime - $timeElapsed;
      exit(json_encode(['code' => 1, 'message' => '请求过于频繁,请稍后再试', 'cooldown' => $remainingTime]));
    }
}

// 推送函数
function pushdeer_send($text, $desp = '', $type='text', $key = '')
{
    $postdata = http_build_query(array('text' => $text, 'desp' => $desp, 'type' => $type, 'pushkey' => $key));
    $opts = array('http' =>
    array(
      'method'=> 'POST',
      'header'=> 'Content-type: application/x-www-form-urlencoded',
      'content' => $postdata
    ));
   
    $context= stream_context_create($opts);
    return $result = file_get_contents('https://api2.pushdeer.com/message/push', false, $context);
}

// 使用 PushDeer 推送
$pushDeerKey = 'your_pushdeer_key'; // 替换为实际的 PushDeer 密钥
$text = '挪车通知';
$desp = '有人扫码通知你挪车啦';

$response = pushdeer_send($text, $desp, 'text', $pushDeerKey);

// 检查推送结果
if ($response) {
    // 保存当前时间戳到文件中
    file_put_contents($timestampFile, $currentTime);
    // 输出推送结果
    echo $response;
} else {
    echo json_encode(['code' => 1, 'message' => '推送失败']);
}
?>


xinxiu 发表于 2024-11-13 16:52

这个拿走了,我刚好也有服务器:lol

qyc0 发表于 2024-11-13 17:20

测试成功了@a1067709136

wolfishpepper26 发表于 2024-11-14 10:35

好用ദ്ദി(˵ •̀ ᴗ - ˵ ) ✧

peng792439529 发表于 2024-11-14 13:35

感谢正好需要,网上买的经常失效,还是自己做的放心
页: [1] 2 3 4
查看完整版本: 修改【自用挪车二维码..... 】,支持Server酱消息,需要服务器部署