利用飞书和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.点击完成就算部署完成了。
结语
天灾无法预料,希望各位保护好自己和家人,平安度过。
提示:本文最后更新于2024年 10月 2日,如有错误或者已经失效,请留言告知。
THE END