Typecho 文档:在博客里显示彗星观测数据

10月03日

适用程序:Typecho
程序版本:1.2.1
文档作者:Lopwon
作者博客:Lopwon.com
发布页面:Lopwon.com/attachment/3799/
许可方式:CC BY-NC-SA

注意:此文档源于作者在博客改造中的一些经验总结,转载还请署名。

敬告:此文档操作涉及程序核心文件的修改,作者不对你在使用中产生的任何问题造成的不良后果,承担责任。

文档说明

作为曾经的天文爱好者,虽然日常里也会偶尔打开天文类网站了解可能出现的高亮彗星,但是大多数情况下还是会错过,比如近期的 C/2023 A3 (Tsuchinshan-ATLAS) 彗星,也是在彗星抵达近日点的几天前才知晓。

查看数据后,意外地发现,这颗彗星应该是继1997年的 C/1995 O1 (Hale-Bop) 世纪彗星后,最亮的一颗北半球可观测彗星了。

为了在之后能及时了解到彗星的信息,制作了这篇文档。

另有插件 Lopwon Comet


使用方法

A 涉及文件

usr/themes/***/functions.php

B 改造文件

作用:在博客里显示彗星观测数据。

1. 打开文件  usr/themes/***/functions.php 添加以下代码(留意注释,以及按需修改):

function getCometData() {
    $api = 'https://cobs.si/api/comet_list.api?cur-mag=10'; // 获取彗星列表数据,其中 cur-mag 为获取亮度值内的彗星数据,如获取肉眼可视亮度的彗星则 cur-mag=6

    $ch = curl_init($api); // 初始化 cURL 会话    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置返回内容为字符串而非直接输出    
    $response = curl_exec($ch); // 执行 cURL 请求

    if ($response === FALSE) {
        die('Error occurred: ' . curl_error($ch)); // 检查请求是否成功
    }    

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

    $data = json_decode($response, true); // 将 JSON 响应解码为 PHP 数组

    if (isset($data['objects'])) { // 检查数据中是否包含彗星对象        
        usort($data['objects'], function($a, $b) { // 按当前亮度排序,值越小越靠前
            return $a['current_mag'] <=> $b['current_mag'];
        });
        
        $item = ''; // 初始化存储彗星信息的字符串
        
        foreach ($data['objects'] as $object) { // 遍历每个彗星对象并输出相关信息
            $name = htmlspecialchars($object['name']); // 彗星简称
            $fullname = htmlspecialchars($object['fullname']); // 彗星全称
            $type = htmlspecialchars($object['type']); // 彗星类型
            $currentMag = htmlspecialchars($object['current_mag']); // 当前亮度
            $perihelionDate = htmlspecialchars($object['perihelion_date']); // 近日时间
            $perihelionMag = htmlspecialchars($object['perihelion_mag']); // 近日亮度
            $toCobs = 'https://cobs.si/obs_list?des=' . $name; // 观测数据链接
            $toHeavensAbove = 'https://www.heavens-above.com/comet.aspx?cid=' . $name; // 位置数据链接

            $item .= '
                <div class="comet-item">
                    <span>彗星简称:' . $name . '</span>
                    <span>彗星全称:' . $fullname . '</span>
                    <span>彗星类型:' . $type . '</span>
                    <span>当前亮度:' . $currentMag . '</span>
                    <span>近日时间:' . $perihelionDate . '</span>
                    <span>近日亮度:' . $perihelionMag . '</span>
                    <span>观测数据:<a href="' . $toCobs . '" rel="noopener noreferrer" target="_blank">' . $toCobs . '</a></span>
                    <span>位置数据:<a href="' . $toHeavensAbove . '" rel="noopener noreferrer" target="_blank">' . $toHeavensAbove . '</a></span>
                </div>
            ';
        }
    } else { // 如果没有找到彗星数据,输出提示信息        
        $item = '没有找到彗星数据。';
    }

    // 输出 HTML 和 CSS
    echo '
        <style>
        .comet-list {
            display: flex;
            flex-direction: column;
            gap: 2em;
            margin: 0 auto;
            padding: 1em;
            width: calc(100% - 2em);
            max-width: 768px;
        }

        .comet-item {
            display: flex;
            flex-direction: column;
            gap: 0.25em;
        }    

        .comet-list .comet-item:first-child {
            margin-top: 2em;
        }

        .comet-list .comet-item:last-child {
            margin-bottom: 2em;
        }

        .comet-powered {
            display: flex;
            gap: 2em;
            margin: 0 auto;
            padding: 1em;
            width: calc(100% - 2em);
            max-width: 768px;
        }        
        </style>
        
        <div class="comet-wrap">
            <div class="comet-list">' . $item . '</div>    
            <div class="comet-powered">
                <span>彗星数据由 <a href="https://cobs.si/" rel="noopener noreferrer" target="_blank">COBS</a> 提供</span>
                <span>页面功能由 <a href="http://www.lopwon.com/" rel="noopener noreferrer" target="_blank">Lopwon</a> 制作</span>
            </div>    
        </div>
    '; 
}

至此,通过调用 getCometData(); 即可显示自定义亮度内的彗星数据。

或者可以简化为以下:即当出现了预期亮度的彗星时,则为 true 结果,可以输出自定义的信息,比如图标之类的,用以提示有彗星出现了。


function getCometData($mag) {
    $api = 'https://cobs.si/api/comet_list.api?cur-mag=' . $mag; // 获取预期亮度的彗星列表数据
    $ch = curl_init($api); // 初始化 cURL 会话
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置返回内容为字符串而非直接输出
    $response = curl_exec($ch); // 执行 cURL 请求

    if ($response === FALSE) {
        die('Error occurred: ' . curl_error($ch)); // 检查请求是否成功
    }

    curl_close($ch); // 关闭 cURL 会话
    $data = json_decode($response, true); // 将 JSON 响应解码为 PHP 数组

    return !empty($data['objects']); // 如果有数据则返回 true,否则返回 false
}

调用 getCometData($mag); 如 getCometData(6); 则表示:如果有亮度亮于 6 等的彗星时,则输出 true 结果。
store