利用飞书和php代码推送最新地震

前言

最近安徽合肥几十次小地震,搞得人心惶惶,在地震带的朋友可能都无法第一时间获得消息,于是写了个php来推送消息

教程

此次教程分为两个接口如下

因无法测试,所以不知道是不是实时的,所以不要依赖于此,使用手机自带的地震预警

中国地震网:https://www.ceic.ac.cn/ajax/speedsearch?num=1

不知名地震API:https://api.wolfx.jp/cenc_eqlist.json

在网站目录下新建一个php文件,并且添加如下代码

其中https://www.feishu.cn/flow/api/trigger-webhook/xxxx 改为自己的飞书webhook

<?php

// 提取数据并发送飞书消息的函数
function extractDataAndSendFeishuMessage($jsonUrl, $feishuWebhookUrl) {
    // 初始化cURL会话
    $ch = curl_init($jsonUrl);

    // 设置cURL选项
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 忽略SSL证书验证
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // 设置连接超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 2); // 设置执行超时时间
    // 执行cURL请求
    $jsonData = curl_exec($ch);

    // 关闭cURL会话
    curl_close($ch);

    // 解析JSON数据
    $substr_start = "(";
    $substr_end = ")";
    $start_pos = strpos($jsonData, $substr_start);
    $end_pos = strpos($jsonData, $substr_end);

    if ($start_pos !== false && $end_pos !== false) {
        $start_pos = $start_pos + mb_strlen($substr_start);
        $end_pos = $end_pos;
        $middle_text = mb_substr($jsonData, $start_pos, $end_pos - $start_pos);
        $jsonData1 = $middle_text;
    } else {
        return "无法获取内容"; // 如果没有获取到内容,直接返回
    }
    
    $data = json_decode($jsonData1, true);
    
    // 获取No1
    if (isset($data['shuju'][0])) {
        $no1 = $data['shuju'][0];
        
        // 提取各项数据
        $eventTime = $no1['O_TIME'];
        $location = $no1['LOCATION_C'];
        $magnitude = $no1['M_MS'];
        
        // 将 $eventTime 转换为时间戳
        $eventTimestamp = strtotime($eventTime);
        // 获取当前时间戳
        $currentTimestamp = time();
        
        // 判断事件时间与当前时间的差异(是否在一天内)
        if (($currentTimestamp - $eventTimestamp) <= 86400 && ($currentTimestamp - $eventTimestamp) >= 0) { // 86400秒 = 1天
            // 发送信息到飞书
            $data = json_encode(array(
                'msg_type' => 'text',
                'content' => array(
                    'text' => "$eventTime 在 $location 发生了 $magnitude 震级地震 。"
                )
            ));

            $ch = curl_init($feishuWebhookUrl);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // 设置连接超时时间为1秒
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_TIMEOUT, 1); // 设置执行超时时间为1秒
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json'
            ));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            
            $result = curl_exec($ch);
            
            // 关闭cURL会话
            curl_close($ch);

            echo $result;
        } else {
            echo "短期内无事发生";
        }
    } else {
        echo "jsonData:".$jsonData;
    }
}

// JSON数据URL和飞书Webhook地址
$jsonUrl = 'https://www.ceic.ac.cn/ajax/speedsearch?num=1';
$feishuWebhookUrl = 'https://www.feishu.cn/flow/api/trigger-webhook/xxxx';

// 调用函数提取数据并发送飞书消息
extractDataAndSendFeishuMessage($jsonUrl, $feishuWebhookUrl);

?>

这个接口是中国地震网的,实测访问过多会被拉黑(测试时我是按秒执行的),但是第二个接口是托管于cloudflare的,我的服务器不能很好的访问。

如果你的服务器可以访问第二个接口就使用第二个接口,它的限制是每秒不能超过两次访问,足够使用了。

<?php

// 提取数据并发送飞书消息的函数
function extractDataAndSendFeishuMessage($jsonUrl, $feishuWebhookUrl) {
    // 初始化cURL会话
    $ch = curl_init($jsonUrl);

    // 设置cURL选项
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 忽略SSL证书验证
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // 设置连接超时时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 2); // 设置执行超时时间
    // 执行cURL请求
    $jsonData = curl_exec($ch);

    // 关闭cURL会话
    curl_close($ch);

    $data = json_decode($jsonData, true);
    
    // 获取No1
    if (isset($data['No1'])) {
        $no1 = $data['No1'];
        
        // 提取各项数据
        $eventTime = $no1['time'];
        $location = $no1['location'];
        $magnitude = $no1['magnitude'];
        
        // 将 $eventTime 转换为时间戳
        $eventTimestamp = strtotime($eventTime);
        // 获取当前时间戳
        $currentTimestamp = time();
        
        // 判断事件时间与当前时间的差异(是否在一天内)
        if (($currentTimestamp - $eventTimestamp) <= 86400 && ($currentTimestamp - $eventTimestamp) >= 0) { // 86400秒 = 1天
            // 发送信息到飞书
            $data = json_encode(array(
                'msg_type' => 'text',
                'content' => array(
                    'text' => "$eventTime 在 $location 发生了 $magnitude 震级地震 。"
                )
            ));

            $ch = curl_init($feishuWebhookUrl);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); // 设置连接超时时间为1秒
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_TIMEOUT, 1); // 设置执行超时时间为1秒
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json'
            ));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            
            $result = curl_exec($ch);
            
            // 关闭cURL会话
            curl_close($ch);

            echo $result;
        } else {
            echo "短期内无事发生";
        }
    } else {
        echo "jsonData:".$jsonData;
    }
}

// JSON数据URL和飞书Webhook地址
$jsonUrl = 'https://api.wolfx.jp/cenc_eqlist.json';
$feishuWebhookUrl = 'https://www.feishu.cn/flow/api/trigger-webhook/xxxx';

// 调用函数提取数据并发送飞书消息
extractDataAndSendFeishuMessage($jsonUrl, $feishuWebhookUrl);
?>

飞书教程

1.访问飞书官网

2.找到创建的机器人

3.点击左边的流程设计

4.创建流程

5.选择触发器为触发webhook

6.参数填写{"msg_type":"text","content":{"text":"request example"}}
 并点击完成

7.选择操作为发送飞书消息

8.发送对象看你情况选择,我选择的是群

9.消息标题为地震预警

10.消息内容点击加号然后找到webhook触发选择content.text

11.点击完成就算部署完成了。

结语

天灾无法预料,希望各位保护好自己和家人,平安度过。

 

THE END