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

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

需要准备的工作

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');

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

 


http://www.kler.cn/a/611390.html

相关文章:

  • 解决用户同时登录轮询获取用户信息错乱,使用WebSocket和Server-Sent Events (SSE)
  • 数据可视化TensorboardX和tensorBoard安装及使用
  • MySQL - 数据库基础操作
  • 【每日算法】Day 8-1:广度优先搜索(BFS)算法精讲——层序遍历与最短路径实战(C++实现)
  • 二十五、实战开发 uni-app x 项目(仿京东)- 前后端轮播图
  • 2025最新Chatbox全攻略:一键配置Claude/GPT/DeepSeek等主流模型(亲测可用)
  • # WebSocket 与 Socket.IO 对比与优化
  • RustDesk部署到linux(自建服务器)
  • How to use pgbench to test performance for PostgreSQL?
  • 完全背包模板
  • 突破反爬困境:SDK架构设计,为什么选择独立服务模式(四)
  • 本地部署 LangManus
  • K8S学习之基础五十一:k8s部署jenkins
  • 面试常问系列(二)-神经网络参数初始化之自注意力机制
  • 【hot100】刷题记录(52)-合并K个升序链表
  • How to share files with Linux mint 22 via samba in Windows
  • 【深度破解】爬虫反反爬核心技术实践:验证码识别与指纹伪装
  • 单表、多表查询练习
  • 一种电子发票数据的模糊查询方法
  • HTTP Header 中的 cookie 和 set-cookie