当前位置: 首页 > news >正文

【加密社】如何创建自己的币圈工具站

需要准备的工作

1.域名

2.服务器

周末的时候主要弄了快讯这方面的代码

我这里用的是星球日报的api,也可以订阅他们的rss,这部分在github上是开源的

https://github.com/ODAILY

我这里用的是WordPress+onenav主题,然后用小工具在主页展示,

具体代码如下,小工具里自定义代码输入短代码[qklnews]

// 定义短代码以展示快讯消息
function qklnews_shortcode() {
    // 调用fetch_qklnews_data函数获取快讯消息
    $data = fetch_qklnews_data();

    if (!$data || !isset($data['newslist']) || empty($data['newslist'])) {
        return '<div style="font-family: Arial, sans-serif; color: red;">无法加载快讯,请稍后重试。</div>';
    }

    // 准备HTML结构
    ob_start(); // 开启输出缓冲
    ?>
    <div id="qklnews-container" class="qklnews-container">
        <!-- 内联CSS -->
        <style>
            .qklnews-container {
                font-family: Arial, sans-serif;
                margin-bottom: 20px;
                padding-left: 10px; /* 整体内容向右偏移 */
                position: relative;
                text-align: center; /* 居中对齐容器内容 */
            }
            .timeline {
                position: absolute;
                left: 9px; /* 时间轴向左移动 10px */
                top: 20px; /* 时间线起点与第一条数据的圆点对齐 */
                width: 2px;
                background-color: #ddd;
                height: calc(100% - 40px); /* 时间线高度为新闻项总高度减去上下间距 */
            }
            .timeline-dot {
                position: absolute;
                left: -5px; /* 圆点向左移动 10px */
                top: 10px; /* 每个圆点的位置基于新闻项 */
                width: 10px;
                height: 10px;
                background-color: #999;
                border-radius: 50%;
            }
            .news-list {
                list-style-type: none;
                padding: 0;
                margin-top: 20px; /* 第一条数据与时间轴顶部的距离 */
                text-align: left; /* 新闻项内容左对齐 */
            }
            .news-item {
                margin-bottom: 20px;
                position: relative;
                padding-left: 20px;
                margin-right: 20px; /* 每条数据右侧留出距离 */
            }
            .title {
                font-size: 14px; /* 主内容字号 */
                color: #333;
                text-decoration: none;
                display: block;
                margin-bottom: 5px;
            }
            .details {
                display: flex;
                justify-content: space-between;
                align-items: center;
                font-size: 14px; /* 快讯和日期字号 */
                color: #999;
            }
            .subtitle {
                background-color: #f5f5f5;
                padding: 2px 5px;
                border-radius: 3px;
                margin-right: 10px;
            }
            .date {
                margin-left: auto;
            }
            .view-more-btn {
                display: inline-block;
                margin-top: 20px;
                padding: 8px 16px; /* 按钮更小 */
                font-size: 14px; /* 字体更小 */
                color: #fff;
                background-color: #a98622;
                text-decoration: none;
                border-radius: 5px;
                text-align: center;
                transition: background-color 0.3s ease;
            }
            .view-more-btn:hover {
                background-color: #005177;
            }
        </style>

        <!-- 时间轴 -->
        <div class="timeline"></div>

        <ul class="news-list">
            <?php 
            // 限制只显示前 6 条新闻
            $limited_news = array_slice($data['newslist'], 0, 6);
            foreach ($limited_news as $item): ?>
                <li class="news-item">
                    <!-- 时间轴圆点 -->
                    <div class="timeline-dot"></div>
                    <a href="<?php echo esc_url($item['news_url']); ?>" 
                       target="_blank" 
                       class="title"><?php echo esc_html($item['title']); ?></a>
                    <div class="details">
                        <span class="subtitle">快讯</span>
                       <span class="date"><?php 
                            // 显示日期和时间(年-月-日 时:分)
                            echo esc_html(date('Y年m月d日 H:i', strtotime($item['published_at'])));
                        ?></span>
                    </div>
                </li>
            <?php endforeach; ?>
        </ul>

        <!-- 查看更多按钮 -->
        <a href="https://bqbot.cn/7x24%e5%bf%ab%e8%ae%af" 
           target="_blank" 
           class="view-more-btn">查看更多</a>
    </div>
    <?php
    return ob_get_clean(); // 返回生成的HTML
}
add_shortcode('qklnews', 'qklnews_shortcode'); // 注册短代码 [qklnews]

// 让文本小工具支持短代码
add_filter('widget_text', 'do_shortcode');

这里需要注意的是,快讯中带图片的部分,是cdn服务器上的静态资源,他会限制别的网站直接去访问,比如你如果是直接把接口返回的imgurl嵌入到你的img标签中,他会报403

这里需要使用图片代理

function custom_image_proxy() {
    if (isset($_GET['custom_proxy']) && isset($_GET['url'])) {
        $image_url = urldecode($_GET['url']); // 解码URL

        // 确保只转发到允许的域名
        $allowed_domains = ['https://piccdn.0daily.com'];
        $parsed_url = parse_url($image_url);
        $scheme_and_host = $parsed_url['scheme'] . '://' . $parsed_url['host'];
        if (!in_array($scheme_and_host, $allowed_domains)) {
            status_header(403);
            echo "Forbidden";
            exit;
        }

        // 模拟浏览器请求头
        $response = wp_remote_get($image_url, [
            'headers' => [
                'User-Agent'      => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
                'Referer'         => 'https://www.odaily.news/', // 设置正确的 Referer
                'Accept'          => 'image/webp,image/apng,image/*,*/*;q=0.8',
                'Accept-Encoding' => 'gzip, deflate, br',
                'Accept-Language' => 'en-US,en;q=0.9',
            ],
            'decompress' => true, // 自动解压缩 Gzip 数据
        ]);

        // 检查请求是否成功
        if (is_wp_error($response)) {
            error_log('WP HTTP Error: ' . $response->get_error_message());
            status_header(500);
            echo "Internal Server Error";
            exit;
        }

        $status_code = wp_remote_retrieve_response_code($response);
        if ($status_code != 200) {
            error_log("Response Status Code: $status_code");
            status_header($status_code);
            echo "Error fetching image";
            exit;
        }

        // 获取并输出图片内容
        ob_clean(); // 清除之前的输出缓冲区
        flush();    // 刷新系统输出缓冲

        // 设置正确的 Content-Type
        $content_type = wp_remote_retrieve_header($response, 'content-type');
        header("Content-Type: $content_type");

        // 输出图片数据
        echo wp_remote_retrieve_body($response);
        exit;
    }
}
add_action('template_redirect', 'custom_image_proxy');

具体演示数据可以看到 币圈工具站 | 币圈导航

 

相关文章:

  • 如何使用 AppML
  • uniapp中APP上传文件
  • 版本控制GIT的使用
  • 【2025】基于python+flask的篮球交流社区平台设计与实现(源码、万字文档、图文修改、调试答疑)
  • SpringBoot分布式定时任务实战:告别重复执行的烦恼
  • 使用 FastAPI 快速开发 AI 服务的接口
  • 【2025】基于springboot+vue的校园心理健康服务平台(源码、万字文档、图文修改、调试答疑)
  • 【Matlab】串口通信(serialport对象,读写、回调、删除等)
  • 2023 年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷 B 私有云服务搭建解析笔记
  • Linux常用命令指南
  • 什么是 Ansible Playbook?
  • 如何根据目标网站调整Python爬虫的延迟时间?
  • 2025年渗透测试面试题总结-某 B站-攻防实验室(题目+回答)
  • 循环查询指定服务器开放端口(Python)
  • mysql如何给字段添加默认值?
  • MySQL数据库宕机快速恢复
  • 蓝光三维扫描技术:汽车零部件检测的精准高效之选
  • STL性能优化方法
  • 数据结构栈和队列
  • 开放生态,无限可能:耘想WinNAS 重新定义您的数字生活
  • 为小龙虾洗清这些“黑锅”,这份科学吃虾指南请收好
  • 锚定建设“中国樱桃第一县”目标,第六届澄城樱桃营销季启动
  • 财政部:今年将和住建部选拔第二批20个城市,高质量推进城市更新行动
  • 张永宁任福建宁德市委书记
  • 人民日报任平:从“地瓜经济”理论到民营经济促进法,读懂中国经济的成长壮大之道
  • 王毅同丹麦外交大臣拉斯穆森会谈