阅读视图

发现新文章,点击刷新页面。

子比主题文章归档页面美化版

前言

因为自己喜欢倒腾,所以从Corenext换成了子比,但不代表Corenext不好,Corenext主题绝对是做博客的首选。

我换成子比是为了倒腾一些小玩意,今天就给大家带来自己弄的一个美化版的文章归档页面

展示

图片[1]-新锐博客
图片[2]-新锐博客

教程

在子比主题的pages目录下创建一个新的php,名字随便命名,然后将如下代码放入进去

<?php
/**
 * Template name: 新锐-文章归档
 * Description: 文章归档页面,包含统计数据和文章列表
 */

// 获取分类统计信息并缓存
function get_category_statistics() {
    return get_cached_data('category_stats', function() {
        $categories = get_categories(['hide_empty' => false]);
        $data = [];
        foreach ($categories as $category) {
            $data[] = ['value' => $category->count, 'name' => $category->name];
        }
        return json_encode($data);
    });
}

// 获取最近一年每月的文章数量并缓存
function get_monthly_post_data() {
    return get_cached_data('monthly_post_data', function() {
        global $wpdb;
        $query = "
            SELECT DATE_FORMAT(post_date, '%Y-%m') AS month, COUNT(*) AS count
            FROM {$wpdb->posts}
            WHERE post_type = 'post' AND post_status = 'publish'
              AND post_date >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
            GROUP BY month
            ORDER BY month ASC
        ";
        $results = $wpdb->get_results($query, ARRAY_A);

        $monthly_data = [];
        foreach ($results as $result) {
            $monthly_data[] = [
                'month' => $result['month'],
                'count' => $result['count']
            ];
        }
        return json_encode($monthly_data);
    });
}

// 缓存处理函数
function get_cached_data($transient_key, $callback) {
    if (false === ($data = get_transient($transient_key))) {
        $data = call_user_func($callback);
        set_transient($transient_key, $data, 12 * HOUR_IN_SECONDS);
    }
    return $data;
}

// 统计小工具
function render_archives_widgets($type = 'day') {
    $icons = [
        'day' => ['icon' => 'fa fa-calendar', 'color' => 'c-blue', 'title' => '运营时间'],
        'post' => ['icon' => 'fa fa-file-text', 'color' => 'c-green', 'title' => '文章总数'],
        'comment' => ['icon' => 'fa fa-comments', 'color' => 'c-purple', 'title' => '评论总数'],
        'user' => ['icon' => 'fa fa-users', 'color' => 'c-orange', 'title' => '注册用户']
    ];

    switch ($type) {
        case 'day':
            $first_post = get_posts(['numberposts' => 1, 'order' => 'ASC']);
            $start_time = !empty($first_post) ? strtotime($first_post[0]->post_date) : time();
            $statistic = round((time() - $start_time) / DAY_IN_SECONDS) . ' 天';
            break;
        case 'post':
            $statistic = wp_count_posts()->publish;
            break;
        case 'comment':
            $statistic = get_comment_count()['total_comments'];
            break;
        case 'user':
            $statistic = count_users()['total_users'];
            break;
        default: return;
    }

    echo '<div class="stats-widget">';
    echo '<div class="stats-header">'.$icons[$type]['title'].'</div>';
    echo '<div class="stats-content">';
    echo '<div class="stats-icon"><i class="'.$icons[$type]['icon'].' '.$icons[$type]['color'].'"></i></div>';
    echo '<div class="stats-value">'.$statistic.'</div>';
    echo '</div></div>';
}

// 注册脚本
function grace_archives_scripts() {
  
    wp_enqueue_script('echarts', 'https://cdn.jsdmirror.com/npm/echarts@5.4.0/dist/echarts.min.js', [], null, true);
     wp_enqueue_script('archives-script', get_template_directory_uri().'/js/archives.js', ['echarts', 'jquery'], null, true);
    
    // 将数据传递给 JavaScript
    wp_localize_script('archives-script', 'graceData', [
        'postData' => json_decode(get_category_statistics()),
        'monthlyPostData' => json_decode(get_monthly_post_data()),
        'ajaxUrl' => admin_url('admin-ajax.php')
    ]);
}
add_action('wp_enqueue_scripts', 'grace_archives_scripts');

// AJAX 处理翻页请求
function load_more_posts() {
    $paged = isset($_POST['page']) ? intval($_POST['page']) : 1;
    $posts_per_page = 20;

    $query = new WP_Query([
        'posts_per_page' => $posts_per_page,
        'paged' => $paged,
        'orderby' => 'post_date',
        'order' => 'DESC',
        'post_status' => 'publish'
    ]);

    if ($query->have_posts()) :
        $organized = [];
        while ($query->have_posts()) : $query->the_post();
            $year = get_the_time('Y');
            $month = get_the_time('m');
            $organized[$year][$month][] = $post;
        endwhile;

        ob_start();
        foreach ($organized as $year => $months) : ?>
            <div class="archive-year">
                <h2 class="year-title"><?php echo $year; ?></h2>
                <?php foreach ($months as $month => $posts) : ?>
                    <div class="archive-month">
                        <h3 class="month-title"><?php echo date('n月', mktime(0, 0, 0, $month, 1)); ?></h3>
                        <ul class="post-list">
                            <?php foreach ($posts as $post) : setup_postdata($post); ?>
                                <li>
                                    <time><?php the_time('m-d'); ?></time>
                                    <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
                                        <?php the_title(); ?>
                                        <?php if (get_comments_number()) : ?>
                                            <span class="comment-count">(<?php echo get_comments_number(); ?>)</span>
                                        <?php endif; ?>
                                    </a>
                                </li>
                            <?php endforeach; ?>
                        </ul>
                    </div>
                <?php endforeach; ?>
            </div>
        <?php endforeach;

        // 生成新的分页链接
        $pagination = paginate_links([
            'total' => $query->max_num_pages,
            'current' => $paged,
            'prev_next' => true,
            'prev_text' => __('« 上一页'),
            'next_text' => __('下一页 »'),
            'echo' => false
        ]);

        $output = ob_get_clean();
        wp_send_json_success([
            'data' => $output,
            'pagination' => $pagination
        ]);
    else :
        wp_send_json_error('No more posts');
    endif;
    wp_reset_postdata();
    wp_die();
}
add_action('wp_ajax_load_more_posts', 'load_more_posts');
add_action('wp_ajax_nopriv_load_more_posts', 'load_more_posts');

get_header();
?>

<main class="grace-archives">
    <div class="archive-container">
        <div class="archive-main">
            <article class="archive-article">
                <header class="archive-header">
                    <h1><?php the_title(); ?></h1>
                    <!-- 统计小工具 -->
                    <div class="stats-grid">
                        <?php 
                        render_archives_widgets('day');
                        render_archives_widgets('post');
                        render_archives_widgets('comment');
                        render_archives_widgets('user');
                        ?>
                    </div>
                </header>
                
                <!-- 图表区域 -->
                <div class="charts-container">
                    <div class="chart-box" id="postChart"></div>
                    <div class="chart-box" id="monthlyPostChart"></div>
                </div>

                <!-- 文章列表 -->
                <div class="archives-list">
                    <?php
                    // 获取当前页码
                    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
                    $posts_per_page = 20;
                    
                    $query = new WP_Query([
                        'posts_per_page' => $posts_per_page,
                        'paged' => $paged,
                        'orderby' => 'post_date',
                        'order' => 'DESC',
                        'post_status' => 'publish'
                    ]);

                    if ($query->have_posts()) :
                        $organized = [];
                        while ($query->have_posts()) : $query->the_post();
                            $year = get_the_time('Y');
                            $month = get_the_time('m');
                            $organized[$year][$month][] = $post;
                        endwhile;

                        foreach ($organized as $year => $months) : ?>
                            <div class="archive-year">
                                <h2 class="year-title"><?php echo $year; ?></h2>
                                <?php foreach ($months as $month => $posts) : ?>
                                    <div class="archive-month">
                                        <h3 class="month-title"><?php echo date('n月', mktime(0, 0, 0, $month, 1)); ?></h3>
                                        <ul class="post-list">
                                            <?php foreach ($posts as $post) : setup_postdata($post); ?>
                                                <li>
                                                    <time><?php the_time('m-d'); ?></time>
                                                    <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">
                                                        <?php the_title(); ?>
                                                        <?php if (get_comments_number()) : ?>
                                                            <span class="comment-count">(<?php echo get_comments_number(); ?>)</span>
                                                        <?php endif; ?>
                                                    </a>
                                                </li>
                                            <?php endforeach; ?>
                                        </ul>
                                    </div>
                                <?php endforeach; ?>
                            </div>
                        <?php endforeach; 
                    else :
                        echo '<p>暂无文章</p>';
                    endif;
                    wp_reset_postdata();
                    ?>
                </div>

                <!-- 传统分页 -->
<div class="archive-pagination">
    <?php
    echo paginate_links([
        'total'     => $query->max_num_pages,
        'current'   => $paged,
        'prev_next' => true,
        'prev_text' => __('« 上一页'),
        'next_text' => __('下一页 »'),
        'type'      => 'plain', // 修改这里
        'mid_size'  => 2 // 控制显示页码数量
    ]);
    ?>
</div>
            </article>
        </div>
    </div>
</main>


<script>
// 仅保留图表初始化代码
jQuery(document).ready(function($) {
    // 初始化 ECharts 图表
    const postChart = echarts.init(document.getElementById('postChart'));
    const monthlyPostChart = echarts.init(document.getElementById('monthlyPostChart'));

    postChart.setOption({
        title: { text: '文章分类分布' },
        tooltip: { trigger: 'item' },
        series: [{
            type: 'pie',
            data: graceData.postData
        }]
    });

    monthlyPostChart.setOption({
        title: { text: '每月发文数量' },
        tooltip: { trigger: 'axis' },
        xAxis: {
            type: 'category',
            data: graceData.monthlyPostData.map(item => item.month)
        },
        yAxis: { type: 'value' },
        series: [{
            type: 'line',
            data: graceData.monthlyPostData.map(item => item.count)
        }]
    });
});
</script>

<style>
.grace-archives {
    padding: 2rem 20px;
    background: #f8f9fa;
    min-height: 100vh;
}
/* 分页容器 */
.archive-pagination {
    margin-top: 3rem;
    text-align: center;
}

/* 分页链接基础样式 */
.archive-pagination a, 
.archive-pagination span {
    display: inline-block;
    padding: 8px 16px;
    margin: 0 4px;
    border: 1px solid #e0e0e0;
    border-radius: 4px;
    color: #3498db;
    text-decoration: none;
    transition: all 0.3s;
}

/* 当前页样式 */
.archive-pagination span.current {
    background: #3498db;
    color: white;
    border-color: #3498db;
}

/* 悬停效果 */
.archive-pagination a:hover {
    background: #f8f9fa;
    border-color: #3498db;
}

/* 移动端适配 */
@media (max-width: 480px) {
    .archive-pagination a, 
    .archive-pagination span {
        padding: 6px 12px;
        margin: 2px;
        font-size: 14px;
    }
}
.archive-container {
    max-width: 1400px;
    margin: 0 auto;
}

.archive-main {
    background: #fff;
    border-radius: 12px;
    padding: 2rem;
    box-shadow: 0 4px 12px rgba(0,0,0,0.08);
}

.archive-header {
    margin-bottom: 2rem;
    border-bottom: 2px solid #f0f0f0;
    padding-bottom: 1.5rem;
}

.archive-header h1 {
    font-size: 2.2rem;
    color: #2c3e50;
    margin: 0 0 1.5rem;
}

/* 统计小工具 */
.stats-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 1.5rem;
    margin: 2rem 0;
}

.stats-widget {
    background: #ffffff;
    border: 1px solid #eaeaea;
    padding: 1.5rem;
    border-radius: 10px;
    transition: transform 0.3s ease;
}

.stats-widget:hover {
    transform: translateY(-3px);
    box-shadow: 0 6px 16px rgba(0,0,0,0.1);
}

.stats-header {
    color: #7f8c8d;
    font-size: 0.95rem;
    margin-bottom: 0.8rem;
    font-weight: 500;
}

.stats-content {
    display: flex;
    align-items: center;
    gap: 1.2rem;
}

.stats-icon i {
    font-size: 2rem;
    width: 50px;
    height: 50px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
}

.stats-value {
    font-size: 1.8rem;
    font-weight: 600;
    color: #2c3e50;
}

/* 颜色定义 */
.c-blue { background: #e3f2fd; color: #2196f3; }
.c-green { background: #e8f5e9; color: #4caf50; }
.c-purple { background: #f3e5f5; color: #9c27b0; }
.c-orange { background: #fff3e0; color: #ff9800; }

/* 图表容器 */
.charts-container {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
    margin: 3rem 0;
}

.chart-box {
    height: 400px;
    background: #fff;
    border: 1px solid #eee;
    border-radius: 10px;
    padding: 1rem;
}

/* 文章列表 */
.archives-list {
    margin-top: 2rem;
}

.archive-year {
    margin-bottom: 3rem;
    background: #fafafa;
    border-radius: 8px;
    padding: 1.5rem;
}

.year-title {
    font-size: 1.8rem;
    color: #2c3e50;
    margin: 0 0 1.5rem;
    padding-bottom: 0.8rem;
    border-bottom: 2px solid #eee;
}

.archive-month {
    margin-bottom: 2rem;
    background: #fff;
    border-radius: 6px;
    padding: 1rem;
    box-shadow: 0 2px 6px rgba(0,0,0,0.05);
}

.month-title {
    font-size: 1.4rem;
    color: #34495e;
    margin: 0 0 1rem;
    padding-left: 0.5rem;
}

.post-list {
    list-style: none;
    padding: 0;
    margin: 0;
}

.post-list li {
    padding: 1rem 1.2rem;
    border-bottom: 1px solid #f5f5f5;
    display: flex;
    align-items: center;
    gap: 1.5rem;
    transition: background 0.3s;
}

.post-list li:hover {
    background: #f8f9fa;
}

.post-list time {
    color: #7f8c8d;
    min-width: 70px;
    font-family: monospace;
    font-size: 0.95rem;
}

.post-list a {
    color: #2c3e50;
    transition: color 0.3s;
    flex-grow: 1;
    text-decoration: none;
    font-weight: 500;
}

.post-list a:hover {
    color: #3498db;
}

.comment-count {
    color: #95a5a6;
    font-size: 0.85em;
    margin-left: 0.8rem;
    font-weight: normal;
}

/* 分页样式 */
.archive-pagination {
    margin-top: 3rem;
    text-align: center;
    padding: 1.5rem 0;
}

.archive-pagination .page-numbers {
    display: inline-block;
    padding: 8px 16px;
    margin: 0 5px;
    border: 1px solid #e0e0e0;
    border-radius: 6px;
    color: #3498db;
    text-decoration: none;
    transition: all 0.3s;
}

.archive-pagination .page-numbers.current {
    background: #3498db;
    color: #fff;
    border-color: #3498db;
}

.archive-pagination .page-numbers:hover:not(.current) {
    background: #f8f9fa;
    border-color: #3498db;
}

/* 加载提示 */
.loading {
    text-align: center;
    padding: 1.5rem;
    color: #7f8c8d;
    font-size: 0.95rem;
}

/* 响应式设计 */
@media (max-width: 1200px) {
    .charts-container {
        grid-template-columns: 1fr;
    }
    .chart-box {
        height: 350px;
    }
}

@media (max-width: 768px) {
    .stats-grid {
        grid-template-columns: repeat(2, 1fr);
        gap: 1rem;
    }
    
    .stats-value {
        font-size: 1.6rem;
    }
    
    .archive-main {
        padding: 1.5rem;
    }
    
    .year-title {
        font-size: 1.6rem;
    }
}

@media (max-width: 480px) {
    .stats-grid {
        grid-template-columns: 1fr;
    }
    
    .stats-content {
        gap: 1rem;
    }
    
    .archive-pagination .page-numbers {
        padding: 6px 12px;
        margin: 3px;
    }
    
    .post-list li {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.5rem;
        padding: 1rem;
    }
    
}
</style>
<?php get_footer(); ?>

再到子比主题根目录里的JS文件夹里创建一个archives.js的文件,然后将如下代码放进去

// archives.js 完整代码

document.addEventListener('DOMContentLoaded', function() {
    
     const chartContainers = [
        'postChart', 
        'monthlyPostChart'
    ];

    chartContainers.forEach(id => {
        const el = document.getElementById(id);
        if (!el) {
            console.warn(`图表容器 #${id} 未找到`);
            return;
        }
        
        try {
            // 初始化图表代码...
        } catch (error) {
            console.error(`初始化图表 ${id} 失败:`, error);
        }
    });
    // 获取图表容器
    const postChartEl = document.getElementById('postChart');
    const monthlyChartEl = document.getElementById('monthlyPostChart');
    
    // 检查元素是否存在
    if (!postChartEl || !monthlyChartEl) {
        console.warn('图表容器未找到,请检查元素ID是否正确');
        return;
    }

    // 初始化图表实例
    const postChart = echarts.init(postChartEl);
    const monthlyPostChart = echarts.init(monthlyChartEl);

    // 配置分类分布饼图
    postChart.setOption({
        title: { text: '文章分类分布', left: 'center' },
        tooltip: { trigger: 'item' },
        series: [{
            type: 'pie',
            radius: '55%',
            data: graceData.postData,
            emphasis: {
                itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }]
    });

    // 配置月度趋势折线图
    monthlyPostChart.setOption({
        title: { text: '月度发文趋势', left: 'center' },
        tooltip: { trigger: 'axis' },
        xAxis: {
            type: 'category',
            data: graceData.monthlyPostData.map(item => item.month),
            axisLabel: { rotate: 45 }
        },
        yAxis: { type: 'value' },
        series: [{
            type: 'line',
            smooth: true,
            data: graceData.monthlyPostData.map(item => item.count),
            areaStyle: { color: 'rgba(52, 152, 219, 0.2)' }
        }],
        grid: { containLabel: true }
    });

    // 窗口大小变化时自适应
    window.addEventListener('resize', function() {
        postChart.resize();
        monthlyPostChart.resize();
    });
});

最后再到页面中选择新锐-文章归档模版即可

记一次function代码无法生效的情况

前言

本人喜欢瞎搞,所以子主题的function.php文件中弄了不少东西,然后也就没太在意某些代码

记录

今天有人在前一篇文章进行了留言,然后我就想要回复他,突然想到之前在function中部署了关于WordPress回复他人邮件通知的功能。

但是一直没有试验有没有部署成功,因为同款主题的其他站长确定部署成功了,我就心血来潮的想要去测试一番。

于是我就在留言板回复了自己的留言,但是一直没有收到邮件,我就知道我没有部署成功。

接着,我就找到了同款主题的其他站长询问,因为安装了wpopt插件,而插件有评论站长收到邮件通知的功能。

所以自然而然就觉得是wpopt的问题了,便有了如下对话。

图片[1]-新锐博客

但是其他人都可以,为啥就我不行呢?有没有办法解决呢?

幸好现在有强大的AI,于是我就去deepseek官网,将之前的回复他人评论邮件通知的代码发给AI,并且提问为何不生效。

AI回复我可能是因为由于其他插件的缘故,导致回复他人邮件通知的功能被屏蔽掉了。于是我就想到了提高此功能的优先级。

我便让AI帮我把功能的优先级提高了。

最终有了新的代码,当然我也让AI美化了一下界面。

传送门

宝塔网站加速插件 - 让WordPress加载更快速

前言

WordPress是一个动态博客框架,所以加载的时候就会很慢,就需要类似wp-super-cache这类插件让网站静态化

我发现wp-super-cache加上宝塔的网站加速插件能让加载变得更加快速

教程

1.宝塔面板的软件商店下载堡塔网站加速插件

图片[1]-新锐博客

2.打开网站加速插件,并且启用想要加速网站的开关

图片[2]-新锐博客

3.专属规则可以选择WordPress

4.在不缓存url地址中添加/wp-admin

图片[3]-新锐博客

5.至此配置完成了,享受网站加速的快感吧

WordPress解决feed文件首行换行

前言

访问各个大佬博客的时候,有个类似开往的项目,名为blogsclub,站点地址:https://www.blogsclub.org/

过程

闲来无事就加入了其中,它有个功能是通过WordPress的feed抓取文章,但是我设置了feed却提示没有抓取成功
随后就收到了他们官方发出的邮件,提示feed文件首行出现了换行,众所周知,feed是由WordPress自行生成的,不像sitemap可以通过插件来生成
所以遇到此类麻烦就很难受,于是只能由最新大热的deepseek来解决,AI告诉我,需要检查各种php文件来确保之前并没有出现换行或空格
但是那样就很麻烦,所以我就让deepseek帮我把feed顶部的空格直接删掉就行了。
于是就有了以下教程

教程

将如下代码放到主题的function.php文件中

function remove_xml_declaration_whitespace() {
    // 检查当前页面是否是 feed 页面
    if (is_feed()) {
        // 清空所有现有的输出缓冲区
        while (ob_get_level() > 0) {
            ob_end_clean();
        }

        // 启动一个新的输出缓冲区,并指定回调函数
        ob_start(function($buffer) {
            // 使用正则表达式删除 XML 声明前的所有空格和换行符
            return preg_replace('/^s*(<?xml)/', '$1', $buffer);
        });
    }
}

// 将函数挂载到 WordPress 的 'wp' 动作上,优先级为 1
add_action('wp', 'remove_xml_declaration_whitespace', 1);

Seelen UI - Windows桌面美化

前言

一直看一种事物都会造成视觉疲劳,所以就需要Windows桌面美化程序来解决这一问题

项目地址

Github:https://github.com/eythaann/Seelen-UI

截图

图片[1]-新锐博客

软件特色

  • Seelen UI 提供多种主题和布局选项,可以自由调整菜单、小部件等元素,打造独特的个性化桌面。无论你喜欢简约风格还是复杂布局,都能找到适合自己的设置。
  • 内置媒体模块,支持主流音乐播放器,无需打开额外窗口就能控制音乐播放。这个功能特别适合在工作时听音乐的用户,方便快捷。
  • 简单的设置,让新手也能轻松上手

教程

1.首先打开项目地址,然后到releases下载最新的安装包

2.打开并且安装程序

3.根据自己的爱好设置软件

WordPress解决用户名枚举漏洞禁用REST API

前言

今天群里有人说会通过某个地址泄露用户名导致有被爆破的风险,并且给出了解决方案

教程

首先检查一下自己的网站有没有这个漏洞,访问如下网站即可

https://博客域名.com/wp-json/wp/v2/users/

如果有就到主题的function.php文件中添加如下代码

add_filter('rest_authentication_errors', function ($access) { return new wp_error('rest_cannot_access', 'REST API不再提供访问', ['status' => 403]); });

此代码禁用了REST API

零成本使用cloudflare和vercel部署AI文章摘要

前言

搭建网站的各位朋友应该都听说过AI摘要,而其中最出名的就是Tianli,但是呢,五万就需要10米,对我来说还是有点多,穷人一个。

所以就想着研究一下有没有免费的AI摘要项目,今天逛博客的时候就遇到了一个

博客地址

Floatsheep:https://blog.hesiy.cn/posts/qwen-summary

项目地址

Github:https://github.com/FloatSheep/Qwen-Post-Summary/

教程

1.首先将项目地址fork到自己的github中

2.登录并且找到cloudflare的workers,选择LLM APP模版创建,一定要选择此模版

3.编辑代码,将workers.js的代码放到里面并且部署

4.记录好cloudflare提供的域名,然后到vercel中部署

5.部署好以后,找到项目的storage,然后新建一个数据库

6.有kv的选择kv没有kv的数据库选择Upstash for Redis

7.重新部署项目

8.然后到 FloatBlog / cfai.html 或者 client 找到相应的js和css代码部署到网站中即可

nginx反向代理github

前言

因为众所周知的缘故,github时常访问不了,于是就想着反代一下,刚好有台华为云的香港服务器,于是火毅盾的负责人就给了我以下代码

此反代除了登录其他基本没啥问题

教程

1.打开宝塔面板,找到网站的反向代理,设置代理地址为https://github.com,发送域名为$host,然后确定之后可以看到有个配置文件,将如下代码放进去

location ^~ / {
    # 将请求代理到 GitHub
    proxy_pass https://github.com;

    # 设置转发到后端服务器的请求头
    proxy_set_header Host github.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;

    # 清空 Accept-Encoding 头,防止后端返回压缩内容
    proxy_set_header Accept-Encoding "";

    # 替换响应内容中的字符串
    sub_filter "github.githubassets.com" "assets-github.xrbk.cn";
    sub_filter "github.com" "github.xrbk.cn";
    sub_filter "api.github.com" "api-github.xrbk.cn";
    sub_filter 'raw.githubusercontent.com' 'raw.github.xrbk.cn';
    sub_filter_once off;
    sub_filter_types *;

    # 处理 302 重定向中的地址替换
    proxy_redirect ~^https://raw.githubusercontent.com(.*)$ https://raw.github.xrbk.cn$1;

    # 隐藏后端服务器返回的 Content-Security-Policy 头
    proxy_hide_header Content-Security-Policy;

    # 添加自定义的 Content-Security-Policy 头
    add_header Content-Security-Policy "default-src 'self'; img-src *; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'";

    # 静态文件缓存设置
    set $static_fileHbPPNEua 0;
    if ($uri ~* ".(gif|png|jpg|css|js|woff|woff2)$") {
        set $static_fileHbPPNEua 1;
        expires 1m;
    }
    if ($static_fileHbPPNEua = 0) {
        add_header Cache-Control no-cache;
    }
}

2.其中为xrbk.cn的后缀都需要更改为你的域名

3.在宝塔的网站里比如github.xrbk.cn中再添加其他例如api-github.xrbk.cn的域名

4.去服务商那解析这几个子域名即可

使用 Docker 部署 tinyMediaManager 刮削工具

杜老师使用 Emby 管理媒体文件,但刮削时经常报错。tinyMediaManager 是款功能强大的开源媒体管理工具,能够帮助轻松整理和管理媒体库。本文将详细介绍 tinyMediaManager 的搭建过程和基本使用方法。

什么是 tinyMediaManager

tinyMediaManager 简称 TMM 是一款用 Java/Swing 编写的媒体管理工具,能够为 Jellyfin、Emby 等媒体服务器提供元数据。

通过 TMM 可以抓取和整理影片详细信息、封面图像、演员列表、导演信息等元数据,让媒体库更加丰富、完整。

搭建准备

准备好想要管理的电影、电视剧等媒体文件,并将其存放在一个固定的目录中,方便 TMM 进行扫描和管理。

我们假设电影文件放入</path/to/movies>目录中,命令可参考 mkdir </path/to/movies>

电视文件放入</path/to/tv_shows/>目录中,命令可参考 mkdir </path/to/tv_shows/>

新建数据文件夹</path/to/local/data/>,命令可参考 mkdir </path/to/local/data/>

部署安装

这里我们使用 Docker 来部署,docker-compose.yml 的参考内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
version: "2.1"
services:
tinymediamanager:
image: tinymediamanager/tinymediamanager:latest
container_name: tinymediamanager
environment:
- USER_ID=1000
- GROUP_ID=100
- ALLOW_DIRECT_VNC=true
- LC_ALL=en_US.UTF-8 # force UTF8
- LANG=en_US.UTF-8 # force UTF8
- PASSWORD=<password>
- TZ=Asia/Shanghai
volumes:
- </path/to/local/data/>:/data
- </path/to/movies>:/media/movies
- </path/to/tv_shows/>:/media/tv_shows
ports:
- 5900:5900 # VNC port
- 4000:4000 # Webinterface
restart: unless-stopped

将上方代码中<password>改为 TMM 访问密码,配置好后执行如下命令即可:

1
docker-compose up -d

基本使用

第一次启动时,会进入 TMM 设置向导。需要选择媒体类型、设置媒体目录路径、选择元数据来源等。按照向导提示逐步完成设置即可:

设置完成后 TMM 会自动扫描指定的媒体目录,识别其中媒体文件,并尝试从在线数据库中获取相应的元数据:

TMM 会根据文件标题到电影资料网站上匹配电影信息,下载电影资料及图片到本地。可以查看和编辑这些元数据,确保信息的准确性和完整性:

TMM 还可按照一定的规则批量重命名和整理媒体文件,使文件名称更加规范和统一,方便管理、查找:

RSSHub 搭建指南打造个性化资讯中心

RSSHub 可以根据我们的需求生成个性化的 RSS 订阅源,让我们轻松地获取到各种平台的最新资讯。本文将详细介绍 RSSHub 搭建过程,快速搭建起属于自己的资讯中心。

RSSHub 的简介

RSSHub 是一个轻量、易于扩展 RSS 生成器,它基于 Node.js 开发,支持多种平台和类型订阅源,包括但不限于微博、知乎、B 站、GitHub 等。

通过简单的配置和路由规则,我们就能生成自己想要的 RSS 订阅链接,随时随地获取最新内容更新。

搭建前的准备

在开始搭建 RSSHub 之前,我们需做一些准备工作。需一台服务器,可以是云主机,也可以是本地的计算机。服务器需要具备公网 IP 地址,以便我们能够从外部访问搭建好的 RSSHub 服务。

RSSHub 基于 Docker 部署,因此需要在服务器上安装 Docker 环境。

RSSHub 支持缓存中间件,如 Redis。

为方便访问和使用,建议注册一个域名,并将其解析到服务器的 IP 地址上。

RSSHub 的搭建步骤

将下面的内容保存为 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
services:
rsshub:
# two ways to enable puppeteer:
# * comment out marked lines, then use this image instead: diygod/rsshub:chromium-bundled
# * (consumes more disk space and memory) leave everything unchanged
image: diygod/rsshub
restart: always
ports:
- "1200:1200"
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: "redis://redis:6379/"
PUPPETEER_WS_ENDPOINT: "ws://browserless:3000" # marked
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:1200/healthz"]
interval: 30s
timeout: 10s
retries: 3
depends_on:
- redis
- browserless # marked

browserless: # marked
image: browserless/chrome # marked
restart: always # marked
ulimits: # marked
core: # marked
hard: 0 # marked
soft: 0 # marked
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/pressure"]
interval: 30s
timeout: 10s
retries: 3

redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
start_period: 5s

volumes:
redis-data:

使用下面命令来启动 RSSHub 服务:

1
docker-compose up -d

如需拉取新版 RSSHub 的镜像,可使用下面的命令:

1
docker-compose pull

如需停止服务,可使用下面的命令:

1
docker-compose down

如果不喜欢使用 Docker Compose 部署,可使用下面的命令运行有 Puppeteer 依赖的 RSSHub 服务:

1
docker run -d --name rsshub -p 1200:1200 diygod/rsshub:chromium-bundled

可使用下面的命令运行无 Puppeteer 依赖的 RSSHub 服务:

1
docker run -d --name rsshub -p 1200:1200 diygod/rsshub

为 Follow 添加实例

如果使用 Follow 调用 RSSHub 示例,需在 docker-compose.yml 中添加一些变量。其中 FOLLOW_OWNER_USER_ID 是指您的关注账户 ID 或用户名;FOLLOW_DESCRIPTION 指实例描述;FOLLOW_PRICE 指实例月费,如设为 0 表示免费;FOLLOW_USER_LIMIT 指实例用户限制,将其设置为 0 或 1 可将实例设为私有,留空则表示无限制;ACCESS_KEY 指访问密钥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
rsshub:
image: diygod/rsshub:chromium-bundled
restart: always
ports:
- "1200:1200"
environment:
NODE_ENV: production
FOLLOW_OWNER_USER_ID=杜老师说
FOLLOW_DESCRIPTION=大带宽境外服务器
FOLLOW_PRICE=1
FOLLOW_USER_LIMIT=1000
ACCESS_KEY=ubzG7H3t9TJaFp
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:1200/healthz"]
interval: 30s
timeout: 10s
retries: 3

登录 Follow 后,点击头像,选择 RSSHub 项。在显示页面中,点添加新实例。依次输入 RSSHub 的地址,访问密钥,最后点击添加即可:

去不图床数据清理通知

近期发现外链流量激增,经分析了解并非是攻击导致,通过 URL 判断其来源是一些匿名及到期用户所上传的图片。因此决定发文公告:清理去不图床所有匿名用户所上传的图片,并周期检查已到期用户。

免费服务的初心与挑战

2019 年,去不图床怀着为各位小伙伴提供免费、便捷图片托管服务赤子之心,正式上线!

那会儿杜老师的目标就是给大伙儿搭个稳定可靠的平台,让大家轻轻松松的分享图片,舒舒服服存储图片。

这服务的确是受到了大家的一致好评,用户数量跟图片上传量,那叫一个节节攀升,直冲云霄!

可是好景不长,随着用户规模像滚雪球一样越滚越大,这流量成本也成了杜老师心头一块大石头。

图片托管需要海量的带宽和存储空间,这费用那是哗哗地往外流啊!

杜老师也是一直在绞尽脑汁优化成本,可那流量费用,像脱缰的野马,一发不可收拾,最终,在 2021 年不得不调整策略,从免费转向了收费,这都是为了咱这平台能继续坚挺地活下去!

流量成本与运营的压力

虽然 2021 年去不图床改成收费模式,但之前游客用户免费上传的图片,一直没有清理。

这些图片,虽然丰富了平台的内容,但是占用的存储空间和流量资源,那也是相当可观啊!

据统计游客上传的图片数量,那简直是天文数字,而且很多图片访问频率低得可怜,却依然霸占着咱宝贵的存储资源!

随着平台业务蒸蒸日上,对流量成本的控制也越来越严格。

现在运营环境,杜老师得精打细算,合理分配资源,保证已兑换容量的小伙伴能享受到更优质、更稳定的服务。

所以,经过一番深思熟虑,杜老师决定对游客用户的图片进行清理啦!

匿名用户上传图片清理

为了降低流量以及存储损耗,优化资源分配,杜老师将于 2025 年 3 月 1 日起,清理所有游客用户上传图片。

这个决定,杜老师也是万般的无奈,但这是目前运营环境下,必须采取的措施啊!

希望各位游客用户能够理解杜老师的苦衷,赶紧备份需要保存的图片吧!如有疑问,欢迎随时在评论区留言!

游客数据保留至本月中「2025 年 3 月 15 日」因为无法进行用户判定,所以杜老师已经整体打包备份了,需要的小伙伴可留言索要图片压缩包。

到期用户上传图片清理

为了进一步降低流量及存储损耗,优化资源分配,杜老师将于 2025 年 3 月 15 日起,清理所有到期用户上传图片。

已到期的用户数据清理规则如下:当月 15 日之前到期用户,数据保留至当月的最后一天;当月 15 日之后到期用户,数据保留至下个月月中。

数据清理之前,杜老师都会邮件通知用户进行再续费,通知七天后未续费则会清理数据「即当月 15 日之前到期的用户,会在当月 23 日发送通知;当月 15 日之后到期用户,会在次月 8 日发送通知」

注意图片清理是多节点同步执行,不会保留备份数据!最终解释权归去不图床所有。

使用 SlimToolkit 打造更小的容器镜像

现在容器技术很火,镜像又肥又大,部署较慢不说,安全风险还蹭蹭往上窜,简直让人头大!SlimToolkit 就像一位经验老道的镜像瘦身大师,能把镜像体积缩小到令人咋舌的程度,最多能瘦 30 倍!

到底是啥

简单来说,SlimToolkit 就是一个开源的镜像减肥专家,它能智能分析镜像,找出那些又大又没用的文件、库和依赖,然后干净利落地咔嚓下,统统删掉!

就像一位技艺精湛的雕塑家,将冗余的部分精雕细琢,留下最精髓的部分。

之前叫 DockerSlim,现在已经是云原生计算基金会沙盒项目了,实力是杠杠的!

它的核心思想就是原封不动优化,通过动态、静态分析,自动识别并移除镜像里垃圾文件。

支持 Docker 以及 Kubernetes,各种类云原生工具,妥妥全能选手!

不只瘦身,还可以提供命令行工具,方便检查、调试、管理镜像,简直贴心到家!

SlimToolkit 的绝活

  1. 镜像瘦身大法:这是它的看家本领!它能像一位经验丰富的裁缝,精准剪裁镜像,去除冗余部分。如一个基于 Ubuntu 的 Python 应用,原本约 438MB,经过它的一通操作,能瘦到 16.8MB,足足瘦了 26 倍!

  2. 安全防护专家:它不仅能瘦身,还可以增强安全性!它可以自动生成 Seccomp 和 AppArmor 安全配置文件,像给容器穿上了一层坚不可摧的盔甲,限制系统调用,防止各种安全漏洞入侵。再也不用担心容器被黑客攻破了!

  3. 动态分析、调试:它就像一位经验丰富的侦探,可以创建一个临时容器模拟运行环境,通过 HTTP 探针等方式收集运行数据,分析应用程序行为,确保瘦身后的镜像依然可以正常工作。而且,它还提供调试工具,在优化后的容器中运行调试命令,排查问题方便!

  4. 无缝集成:它就像一位老练的管家,能无缝集成到开发和部署流程中。不用改动 Dockerfile 或构建工具,只需在构建过程中添加 SlimToolkit 的优化步骤即可。还支持各种 CI/CD 工具,如 Jenkins、GitHub Actions 等,自动化部署 so easy!

上手玩转

先安装 SlimToolkit。SlimToolkit 提供了多种安装方式,含直接下载二进制文件、使用脚本安装或通过 Docker 运行。对于大多数的用户,使用脚本安装是最简单方式:

1
curl -sL https://raw.githubusercontent.com/slimtoolkit/slim/master/scripts/install-slim.sh | sudo -E bash -

优化容器镜像。假设已经有一个 Docker 镜像,如一个基于 Python 的 Web 应用。可使用以下命令对镜像进行优化:

1
slim build my/sample-python-app

SlimToolkit 会自动创建一个临时容器,运行动态分析,并生成优化后镜像。优化后的镜像名称会自动加上.slim 后缀,例如:

1
my/sample-python-app.slim

验证优化效果。优化完成后可以使用以下命令查看优化后镜像大小:

1
docker images

SlimToolkit 的优势

  1. 自动与智能化:它能够自动识别容器中不必要的部分,并且进行优化,无需开发者手动修改 Dockerfile 或者删除文件。这种自动化不仅节省了时间,还减少了人为错误的可能性。

  2. 安全:通过生成 Seccomp 和 AppArmor 的配置文件,SlimToolkit 为容器提供了额外的安全保障。这些配置文件能够限制容器系统调用,防止潜在安全威胁,而无需开发者深入了解安全框架细节。

  3. 无缝集成:SlimToolkit 设计目标是无缝集成到现有的开发和部署流程中。它支持多种容器运行时和 CI/CD 工具,能够轻松集成到自动化构建和部署流程中。开发者无需改变现有的工具链或工作流程,即可享受 SlimToolkit 带来的优化效果。

  4. 开源:完全开源,社区活跃,有问必答!

DPanel 让 Docker 管理变得轻松又高效

Docker 作为容器化领域的佼佼者,其强大的功能和灵活性,赢得众多开发者的青睐。然而,对于许多用户来说,Docker 的命令行操作可能显得有些复杂和繁琐。幸运的是,DPanel 的出现为 Docker 的管理和使用带来了全新的体验。

什么是 DPanel

DPanel 是一款轻量化的 Docker 可视化管理面板,专为简化容器的管理而设计。它提供一套完善的容器管理功能,让用户可通过直观的图形界面轻松管理 Docker 容器,无需深入复杂的命令行操作。

无论是初学者还是经验丰富的开发者,DPanel 都能帮助他们更高效地管理和部署容器。

DPanel 的优势

DPanel 的界面简洁直观,操作简单易懂,即使新手也能轻松上手。

DPanel 提供了丰富功能,涵盖了网站管理的各个方面,能够满足各种用户的需求。

基于容器设计,安装和部署都非常简单。用户无需复杂配置,只需通过简单步骤即可快速启动面板。其简洁直观操作界面让用户能够轻松上手,即使是第一次接触 Docker 的用户也能快速掌握基本操作。

DPanel 与 Docker 官方的兼容性非常好,能够无缝对接 Docker 的各项功能。支持多种操作系统和 Docker 版本,确保用户在不同环境下都能稳定使用。

服务安装

我们可以使用官方提供的集成脚本安装 DPanel。当宿主机没有 Docker 环境时,集成脚本会尝试安装 Docker 环境:

1
curl -sSL https://dpanel.cc/quick.sh -o quick.sh && sudo bash quick.sh

按照提示操作。安装完成后通过浏览器访问面板地址,即可进入管理界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[DPanel Install Log]: 选择你需要安装的版本 
1. 标准版 (需要绑定 80 及 443 端口)
2. Lite版 (不包含域名转发相关功能)
3. 标准版 (Pro)
4. Lite版 (Pro)
5. Beta版 (内测版本)
输入你要安装的版本编号 [默认: 2]: 1
1. Docker Hub
2. ALiYun
选择镜像源 [默认: 1]: 2
[DPanel Install Log]: 你安装使用的镜像为 registry.cn-hangzhou.aliyuncs.com/dpanel/dpanel:latest
[DPanel Install Log]: 设置 DPanel 容器名称,更新面板时请配置为当前面板容器名称
请输入名称 [默认: dpanel]:
[DPanel Install Log]: 你指定的容器名称为 dpanel
设置 DPanel 容器挂载目录 [默认: /home/dpanel]:
[DPanel Install Log]: 您选择的面板容器挂载目录是 /home/dpanel
设置 DPanel 端口 [默认: 25128]:
[DPanel Install Log]: 您设置的端口是: 25128
[DPanel Install Log]: 如果端口已经被占用,请再次执行脚本更换端口后重新安装
Unable to find image 'registry.cn-hangzhou.aliyuncs.com/dpanel/dpanel:latest' locally
latest: Pulling from dpanel/dpanel
1f3e46996e29: Pull complete
b6dde5f749cd: Pull complete
459b8d93d51a: Pull complete
7d52a0c67d85: Pull complete
4b97f8a613e7: Pull complete
1d46bacd0854: Pull complete
3eac9a9b4fcb: Pull complete
2c5c0b90bb2b: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:9daa4f411b2bd7845cfd71e747ba2827797ea5fe9e754b8db475541c3700ba01
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/dpanel/dpanel:latest
d492b83d8c546297836a8735d73f0b3f8943f134065dea4ef5ffff834f028715
[DPanel Install Log]:
[DPanel Install Log]: =================感谢您的耐心等待,安装、升级已完成==================
[DPanel Install Log]:
[DPanel Install Log]: 请使用您的浏览器访问面板,并初始化管理员帐号:
[DPanel Install Log]: 外部地址: http://123.116.127.26:25128
[DPanel Install Log]: 内部地址: http://192.168.31.187:25128
[DPanel Install Log]: 如果您使用的是云服务器,请在安全组中打开端口 25128
[DPanel Install Log]:
[DPanel Install Log]: 官方网站及文档: https://dpanel.cc
[DPanel Install Log]: 代码仓库: https://github.com/donknap/dpanel
[DPanel Install Log]:
[DPanel Install Log]: ================================================================

面板效果

首页概览:

容器管理:

文件管理:

镜像管理:

创建镜像:

系统管理:

新版本去不图床免费公测开始啦

有不少的小伙伴为去不图床提供建议,包括但不限于增加支持格式、图片处理、水印功能等等。杜老师也收集了这些建议转交给程序的设计者,经过了几个月更新迭代,V2 版本已推出。由于使用了新框架,无论是操作逻辑和功能支持,都有较大改变,所以在正式上线前,杜老师决定免费公测下!

新版界面

新版主页相较老版而言更加简洁,仅包含站点名称及描述信息,还有图片托管数据。最下方是两个功能入口,一个是图片上传的窗口,一个是用户登录的界面:

在上传界面中,可以选择从本地计算机上传图片文件,也可接入到摄影头,拍摄照片后再上传。目前支持访客上传,所有图片会经过审核后存放在服务器:

用户可以通过邮箱、用户名两种方式来登录。目前程序强制要求注册用户进行邮件验证,不能关闭验证。但因 bug 收不到验证信息,所以杜老师提供了一些体验账号用需要的小伙伴们使用:

在用户的仪表盘中可看到当前拥有的存储容量,可以查看图片、相册、分享,可以购买订阅、查看订单,提交工单或申请 API Tokens:

体验账号

体验账号密码统一为 7bu.top,默认容量为 1G。如选择了账号,请在评论区中留下编号,杜老师会根据使用备注信息,避免有小伙伴重复选择账号:

编号账号邮箱备注
1dusays1dusays1@dusays.com已用
2dusays2dusays2@dusays.com暂无
3dusays3dusays3@dusays.com暂无
4dusays4dusays4@dusays.com暂无
5dusays5dusays5@dusays.com暂无
6dusays6dusays6@dusays.com暂无
7dusays7dusays7@dusays.com暂无
8dusays8dusays8@dusays.com暂无
9dusays9dusays9@dusays.com暂无
10dusays10dusays10@dusays.com暂无
11dusays11dusays11@dusays.com暂无
12dusays12dusays12@dusays.com暂无
13dusays13dusays13@dusays.com暂无
14dusays14dusays14@dusays.com暂无
15dusays15dusays15@dusays.com暂无
16dusays16dusays16@dusays.com暂无
17dusays17dusays17@dusays.com暂无
18dusays18dusays18@dusays.com暂无
19dusays19dusays19@dusays.com暂无
20dusays20dusays20@dusays.com暂无
21dusays21dusays21@dusays.com暂无
22dusays22dusays22@dusays.com暂无
23dusays23dusays23@dusays.com暂无
24dusays24dusays24@dusays.com暂无
25dusays25dusays25@dusays.com暂无
26dusays26dusays26@dusays.com已用
27dusays27dusays27@dusays.com暂无
28dusays28dusays28@dusays.com暂无
29dusays29dusays29@dusays.com暂无
30dusays30dusays30@dusays.com暂无
31dusays31dusays31@dusays.com暂无
32dusays32dusays32@dusays.com暂无
33dusays33dusays33@dusays.com暂无
34dusays34dusays34@dusays.com暂无
35dusays35dusays35@dusays.com暂无
36dusays36dusays36@dusays.com暂无
37dusays37dusays37@dusays.com暂无
38dusays38dusays38@dusays.com暂无
39dusays39dusays39@dusays.com暂无
40dusays40dusays40@dusays.com暂无
41dusays41dusays41@dusays.com暂无
42dusays42dusays42@dusays.com暂无
43dusays43dusays43@dusays.com暂无
44dusays44dusays44@dusays.com暂无
45dusays45dusays45@dusays.com暂无
46dusays46dusays46@dusays.com暂无
47dusays47dusays47@dusays.com暂无
48dusays48dusays48@dusays.com暂无
49dusays49dusays49@dusays.com暂无
50dusays50dusays50@dusays.com暂无
51dusays51dusays51@dusays.com暂无
52dusays52dusays52@dusays.com暂无
53dusays53dusays53@dusays.com暂无
54dusays54dusays54@dusays.com暂无
55dusays55dusays55@dusays.com暂无
56dusays56dusays56@dusays.com暂无
57dusays57dusays57@dusays.com暂无
58dusays58dusays58@dusays.com暂无
59dusays59dusays59@dusays.com暂无
60dusays60dusays60@dusays.com暂无
61dusays61dusays61@dusays.com暂无
62dusays62dusays62@dusays.com暂无
63dusays63dusays63@dusays.com暂无
64dusays64dusays64@dusays.com暂无
65dusays65dusays65@dusays.com暂无
66dusays66dusays66@dusays.com已用
67dusays67dusays67@dusays.com暂无
68dusays68dusays68@dusays.com暂无
69dusays69dusays69@dusays.com暂无
70dusays70dusays70@dusays.com暂无
71dusays71dusays71@dusays.com暂无
72dusays72dusays72@dusays.com暂无
73dusays73dusays73@dusays.com暂无
74dusays74dusays74@dusays.com暂无
75dusays75dusays75@dusays.com暂无
76dusays76dusays76@dusays.com暂无
77dusays77dusays77@dusays.com暂无
78dusays78dusays78@dusays.com暂无
79dusays79dusays79@dusays.com暂无
80dusays80dusays80@dusays.com暂无
81dusays81dusays81@dusays.com暂无
82dusays82dusays82@dusays.com暂无
83dusays83dusays83@dusays.com暂无
84dusays84dusays84@dusays.com暂无
85dusays85dusays85@dusays.com暂无
86dusays86dusays86@dusays.com暂无
87dusays87dusays87@dusays.com暂无
88dusays88dusays88@dusays.com已用
89dusays89dusays89@dusays.com暂无
90dusays90dusays90@dusays.com暂无
91dusays91dusays91@dusays.com暂无
92dusays92dusays92@dusays.com暂无
93dusays93dusays93@dusays.com暂无
94dusays94dusays94@dusays.com暂无
95dusays95dusays95@dusays.com暂无
96dusays96dusays96@dusays.com已用
97dusays97dusays97@dusays.com暂无
98dusays98dusays98@dusays.com暂无
99dusays99dusays99@dusays.com已用
100dusays100dusays100@dusays.com已用

站点地址

公测站点地址如下,点击访问即可。因为公测站点是单线路,与图片外链同线路,所以访问速度较慢,请访问慢的小伙伴耐心等待页面加载:

公测规则

  1. 本站仅供测试使用,请勿用于非法用途;

  2. 原去不图床的账号无法在测试平台中使用,请使用提供的体验账号;

  3. 如选择好体验账号,请将编号留言至评论区,杜老师会备注信息,方便其它的小伙伴选择;

  4. 公测平台预计运营至三月底,届时所有数据将被释放,请勿保存重要数据;

  5. 在使用的过程中如发现有任何 bug,欢迎在评论区留言,杜老师会第一时间提交给程序开发者,尽量完善新版图床程序;

  6. 最终解释权归杜老师说所有。

2 月 5 日图床故障说明

这是篇补更文,所以发布时间不符。本文对 2 月 5 日的图床故障进行详细说明,并为了避免再次出现类似的问题,所做的一系列措施。如小伙伴们有任何问题,欢迎在评论区留言。

问题描述

根据监控服务平台数据显示,于 2 月 5 日上午十点左右发生了图床故障,导致所有图床服务「包括去不官网、图片外链、容量兑换」无法访问。

问题出现后很多小伙伴前往本站的评论区留言,反馈图床问题。杜老师收到反馈后,第一时间进行了问题的排查,并尝试了多种修复作业,但因为不在服务器附近,很多操作无法进行,最终只能暂时安抚小伙伴们。

问题原因

杜老师于当日 17 点返京,18 点到达服务器所在地,第一时间确认问题,开始进行修复工作,在短时间内恢复了图床相关服务的正常访问与使用,以减少对小伙伴们影响。

经排查是短期内产生大量的流量,达到家庭版光猫的性能瓶颈,产出较大热量,又因为光猫放置的地点问题,最终导致光猫宕机,影响了数据的正常传输。

解决方案

使用去不图床的小伙伴都很清楚,图床运营成本较大,为了减少成本,杜老师将服务器放置在家里的机柜中,通过家庭网络穿透公网,通过 CDN 反向代理来加速访问。

在重启光猫后,第一时间修正域名解析,在清理 CDN 域名解析缓存后,图床恢复正常。

后续措施

为了避免再次出现类似问题,杜老师已下单企业级的光猫,并选购了半导体制冷器,放置机柜中实现光猫和服务器的降温工作,保障在高流量下的稳定运行。

同时下单了新带宽安装,在双线路下即可保证图床的高速访问,又可防止单线路的故障问题。最后杜老师会尽可能的保障去不图床服务稳定运营,不会出现数据丢失,更不会出现跑路的问题!

联想拯救者工具箱 | Lenovo Legion Toolkit v2.25.1联想拯救者工具集

联想拯救者工具箱 Lenovo Legion Toolkit (LLT) 是为联想拯救者系列笔记本打造的轻量化工具箱。可实现原来联想软件如 Lenovo Vantage、Legion Zone、联想电脑管家才可实现的功能。

适用于联想拯救者笔记本的朋友们。这个是联想电脑管家、LeginZone、Vantage等联想全家桶软件的平替。不用忍受联想系全家桶启动慢、内存占用高、内存溢出等毛病,该软件实测内存占用70M,启动飞快,功能齐全,像什么独显热切换、电池养护模式、背光控制等等需要的功能一应俱全。软件在GITHUB上开源,国外小哥个人开发,鉴于有些朋友GITHUB下载不方便,放在网盘了,就6M大小。

f14db690ef973f3d4d4b18432ec0d06b

软件特点

改变诸如性能模式、充电模式等只有通过 Lenovo Vantage、联想电脑管家才能更改的设置。
使用并修改自定义模式,包括 2022 款及更新的机型的调节风扇曲线功能。
支持调节 Spectrum RGB 键盘、4 分区 RGB键盘和白色背光的键盘。
强制休眠独立显卡(仅限英伟达显卡)。
查看电池统计数据。
下载、更新驱动。
通过自动化实现插入/拔出充电器的自动操作。
无需卸载即可禁用 Lenovo Vantage、Legion Zone 和 Lenovo Hotkeys 服务。
自定义模式
以下版本的 BIOS 支持自定义模式:
GKCN49WW 和更高
H1CN49WW 和更高
HACN31WW 和更高
HHCN23WW 和更高
K1CN31WW 和更高
K9CN34WW 和更高
KFCN32WW 和更高
KWCN28WW 和更高
J2CN40WW 和更高
JUCN51WW 和更高
JYCN39WW 和更高
M3CN32WW 和更高
M0CN27WW 和更高
并非所有设备都支持自定义模式的所有功能。
强制休眠英伟达显卡
有时独立显卡会一直保持活动状态。例如在你插上外接显示器并断开后,一些进程会继续使用独显上运行,导致续航骤减。
在拯救者工具箱中有两种办法强制休眠显卡。
强制关闭所有在独显上运行的进程。(这种方式貌似更有效),
短暂强制禁用独立显卡,使在独显上运行的进程全部切换到核显。
当独显处于活动状态,并使用混合模式且没有外接显示器到独显上时,强制休眠显卡才会亮起。如果你将鼠标悬停在右侧的问号标志上,将会看到独显的状态与正在使用独显的进程。
注意,强制休眠显卡可能会导致一些应用崩溃。
超频英伟达独立显卡
此超频选项用于简单的超频,类似于 Legion Zone 与 Vantage 中的超频。它并不打算取代微星小飞机(Afterburner)等工具。同时以下有几点你需要注意:
确保在 BIOS 中开启了 GPU 超频选项(如果你的电脑有的话)。
当 Vantage 或 Legion Zone 运行时,超频无法生效。
不建议在使用微星小飞机(Afterburner)等超频工具时使用此选项。
如果你之前修改过控制台,那么你需要点击“自定义”按钮并添加此选项才能看到此选项。
Windows电源计划
当切换性能模式时,拯救者工具箱会在 Lenovo Vantage 禁用的情况下自动切换 Windows 的电源计划。
但在一些笔记本上,Lenovo Vantage 不会切换电源计划。如果你的电脑不会自动切换电源计划,你可以在设置中设置不同性能模式对应的电源计划。这会让拯救者工具箱总是切换Windows电源计划即使 Lenovo Vantage 在后台运行。
CPU 睿频模式
启用了 S0 低功率模式(又名现代待机)的笔记本电脑,在多个电源计划的情况下会导致许多小问题,特别是性能电源计划。

下载

github:https://github.com/BartoszCichecki/LenovoLegionToolkit/releases

蓝奏云下载:https://zyd.lanzouo.com/iAb5T2nnlogf

PDF补丁丁v1.1.0.4627绿色版 一个免费多功能的 PDF 文档处理工具箱

PDF 补丁丁(PDF Patcher) 是一个免费多功能的 PDF 文档处理工具箱,致力于解决各种 PDF 处理和编辑烦恼。它可以编辑 PDF 书签 (可自动生成书签)、裁剪/旋转页面、统一页面尺寸、解除复制打印限制、提取拆分或合并文档、OCR 文字识别、探查文档结构、提取图片、转换成图片等等,功能非常丰富。

ebab7c525baa9e1fdf6ca2ddf7408b2d

更新日志

2025.02.06 v1.1.0.4627

新增功能:

- 可以按首页统一文档页面尺寸。

- 书签编辑器增加将下一个跳转目标的位置赋予上一个空跳转目标的书签功能。

修改功能:

- 新的 MuPDF 库。

- 通过首页的打开 PDF 文档连接可打开书签文件。

- 当右键点击书签编辑器的书签行时,整行均响应鼠标点击。

- 书签编辑器突出显示当前阅读器中的对应书签。

修复问题:

- 使用探查器分析内容流遇到异常内容将导致程序崩溃。

- 提取图片过程中可能会出现堆栈溢出错误。

- 无法提取某些图片。

- 打开未嵌入字体的文档可能会崩溃。

- 某些情况下没有正确设置输出图像的分辨率。

- 注册表字体信息键值为空导致程序崩溃。

- 无法在 Windows 10 上将程序添加到PDF文档的打开方式菜单。

- 相对路径合并错误。

软件功能

  1. PDF 补丁丁功能很多,在软件设置界面可以对原文尺寸设置

  2. 也可以对阅读方式,也可以的对 PDF 进行压缩

  3. 在启动文档的时候可以尝试修复文档错误,也可以删除导航书签

  4. 在对一个 PDF 压缩的时候可以选择清除页面缩略图、清除页面所有表单

  5. 也支持清除页面所有批注、清除页面所有链接批注、清除页面所有文本

  6. 文档属性是可以修改的,重新设置标题、作者、主题

  7. 页码标签也可以添加,帮助你在 PDF 文件设置页码

  8. 修改 PDF 信息:修改文档属性、页码编号、页面链接、页面尺寸;删除自动打开网页等动作,去除复制及打印限制;设置阅读器初始模式。

  9. PDF 书签编辑器:带有阅读界面(具有便于阅读竖排文档的从右到左阅读方式),可批量修改 PDF 书签属性(颜色、样式、目标页码、缩放比例等),在书签中执行查找替换(支持正则表达式及 XPath 匹配、可快速选择篇、章、节书签),自动快速生成文档书签。

  10. 生成 PDF 书签:无需手工输入,自动识别正文标题或目录,为PDF文档生成书签。

  11. 制作 PDF 文件:合并已有 PDF 文件或图片,生成新的 PDF 文件。合并后的PDF文档带有原文档的书签,还可挂上新书签(或根据文件名生成),新书签文本和样式可自定义。

  12. 拆分或合并 PDF 文件,并保留原文件的书签或挂上新的书签。

  13. 高速无损提取导出 PDF 文档的图片。

  14. 提取或删除 PDF 文档中指定的页面,调整 PDF 文档的页面顺序。

  15. 根据 PDF 文档元数据重命名 PDF 文件名。

  16. 调用 微软 Office 的图像识别引擎分析 PDF 文档图片中的文字;将图片 PDF 的目录页转换为 PDF 书签。识别结果可写入 PDF 文件。

  17. 替换字库:替换文档中使用的字体库;嵌入字库到 PDF 文档,消除复制文本时的乱码,使之可在没有字库的设备(如 Kindle 等电子书阅读器)上阅读。

  18. 分析文档结构:以树视图显示 PDF 文档结构,可编辑修改 PDF 文档节点,或将 PDF 文档导出成 XML 文件,供 PDF 爱好者分析、调试之用。

  19. 永久免费,绝不过期,无广告,无弹出废话对话框。

下载地址:https://zyd.lanzouo.com/iKGGb2nkomwj

CPU-Z v2.14.0中文绿色单文件 权威的CPU处理器检测工具

CPU-Z是最权威的CPU处理器检测工具。它支持的CPU种类相当全面,软件的启动速度及检测速度也很快,能够准确的检测出CPU、主板、内存、显卡、SPD等相关信息,包含制造厂及处理器名称,核心构造及封装技术,内部外部频率,最大超频速度侦测,处理器相关可以使用的指令集等。它可以看出哪家厂牌、内频、Cache等玩家常提到的数据,更包括SelfSnoop、CMOVccInstruction这些专家才看得懂的资讯与数据。

ed591562a7b825810b25e2a2664ef889

更新日志

cpuid.com/softwares/cpu-z.html

2025.02.10 v2.14.0

- 支持NVIDIA RTX 5090 & 5080 GPUs.

- 支持AMD Ryzen 9 9955HX3D, 9955HX, 9950HX3D, 9950HX, 9850HX, 9845HX (Fire Range).

- 修复Fixed benchmark graphs scaling.

2024.12.25 v2.13.0

- 支持Intel Arc B580 GPU.

- 支持Intel Arrow Lake-U preliminary support.

- 支持Improved support of Intel Lunar Lake.

- 支持Intel Q870, B860, H810, W880, HM870, WM890, WM880 chipsets.

- 支持CAMM2 memory modules type.

版本特点

- 取消了自动检测升级,32位和64位自适应启动

- 徒手汉化未翻译的英文字符,调整修正繁体中文

- 去工具按钮下拉菜单:更新, 软件推广, 产品链接

下载

https://zyd.lanzouo.com/iGH8b2ngmadc

显卡驱动卸载工具v18.0.9.2绿色版

Display Driver Uninstaller(简称 DDU)是一款显卡驱动程序删除工具,可以帮助您从系统中彻底卸载 AMD/NVIDIA/INTEL 显卡驱动程序、程序包和剩余项(包括注册表项、文件夹和文件、驱动程序存储等)

3e47cd5a1811bb3ab61a378002efd856

wagnardsoft.com/content/display-driver-uninstaller-ddu-v18052-released

软件功能

* 该工具可以在正常模式下使用,但为了绝对的稳定性和有效性,建议您在安全模式下选择“清理显卡驱动并重启”按钮。

* 在使用DDU之前,不需要卸载驱动程序。

* 我们想收集您的反馈信息。并告诉我们它是否成功。做一个备份或系统还原点。(DDU 做了大量的注册表更改)。

* 如果此工具成功解决了您遇到的驱动问题,请向更多人分享您的成果。

系统要求

* Windows XP 到 Windows 10 创作者更新 1703(使用任何更高版本的风险由您自己承担)

* NVIDIA、AMD、英特尔 GPU

* 微软.NET framework 3.0 或更高

下载

https://zyd.lanzouo.com/iuj9n2ngl6sh

kali linux 安装使用 dirmap目录扫描工具

dirmap是一个高级web目录扫描工具,其扫描速度远快于Dirsearch、御剑等;功能字典上比dirsearch强不少,个人觉得,当然,字典这种东西其实看自己收集,默认的都差不多

前往github下载dirmap-master安装包,我这边直接克隆

git clone https://github.com/H4ckForJob/dirmap.git
cd dirmap

1.查看kali中python版本

9100d6ccde86fbf217291829412f0892

2. 进入dirmap-master文件夹下,查看requirement.txt文件中该工具需要的依赖文件

3e49176e109975e7dc754289d9e7c7ec

分别安装上述依赖文件

apt install python3-gevent
apt install python3-requests
apt install python3-progressbar2
apt install python3-lxml

调用dirmap.py文件扫后台文件,结果报错,显示对应的文件中没有名为“progressbar1”的模块

187e631fe44f67b9a627eb3463c34d9a

前往对应的目录下,将bruter.py文件中的21行、56行的“progressbar”全部替换为“progressbar2”

461968760bbcab64efc8117da9ad9acf

再回到dirmap.py目录下,使用对应的参数再次扫描即可

如何获取视频的LUFS(响度单位)?通过视频文件测量视频音量响度水平

这篇文章介绍了视频音量的重要性及其调整方法。文中提到,视频音量过低会影响观看体验,特别是在信息流中与其他大声视频竞争时。为了解决这一问题,文章引入了LUFS(Loudness Units Full Scale)作为衡量音频响度的标准,并解释了其在广播和流媒体中的应用。作者推荐使用ffmpeg工具来测量视频的LUFS值,并提供了具体的操作命令和参数说明。最后,文章还详细解读了测量结果中各项参数的意义,帮助用户更好地调整视频音量以符合不同平台的要求。

Hexo上传服务器建议使用rsync来替代git上传,repo文件夹越来越大解决方法

这篇文章介绍了如何通过rsync工具解决Hexo部署时服务器文件占用过大问题的方法。文章建议使用hexo-deployer-rsync插件,并通过npm安装该插件。在配置时需修改博客根目录下的_config.yml文件,添加rsync的相关参数,包括远程服务器地址、用户信息、目标目录等设置。此外,还可以选择性删除其他不必要的部署方式,并调整运行目录以适应具体环境需求。

如何静态化Docker容器的IP地址?构建网络实现容器固定IP

这篇文章介绍了如何在使用 docker-compose 部署的环境中为容器设置固定的 IP 地址,以解决容器在重启后因 IP 自动变化导致无法上网的问题。文章首先创建了一个名为 heo_global_network 的自定义桥接网络,并将其 IP 地址段设置为 172.168.0.0/16。然后修改 docker-compose 文件,将容器连接到该外部网络并指定静态 IPv4 地址。通过这些步骤,用户可以确保容器在网络重启后保持稳定的 IP 地址,并成功实现上网功能。

iStoreOS如何给硬盘分区扩容?Openwrt已经正在使用的分区如何扩容?

这篇文章介绍了在iStoreOS x86根分区中扩容的具体步骤。通过使用parted工具查看硬盘信息,用户可以确认要扩展的分区为4号分区,当前容量为21.5GB。通过执行resizepart命令,用户可以输入新的终止位置30GB,从而实现分区扩大。此外,还需要使用resize2fs -p命令对文件系统进行调整,最终完成扩容操作,无需重启服务器或卸载挂载点。

HomeAssistant如何设置自动备份,定期自动备份并自动删除旧备份

这篇文章介绍了HomeAssistant的新自动备份功能。用户可以通过进入系统设置并选择备份选项来启用该功能。下载紧急套件后,可以设置每日或每周一次的备份周期,例如每周一进行备份。此外,为了节省存储空间,可以选择关闭历史数据的备份功能,仅保留必要的信息。完成这些设置后,备份文件体积将大幅减少,存储在backups目录中。

如何在mac上隐藏应用程序在dock栏中的图标

这篇文章介绍了如何在macOS上隐藏应用程序图标,不再显示在Dock栏中。方法是通过修改应用的Info.plist文件,将LSUIElement值设置为1,这样图标就不会出现在Dock里,但应用仍然可以在后台运行。如果想恢复,只需将值改回0或删除该行代码。这是一个适合不经常更新的后台菜单栏应用的解决方案。

如何自定义ollama模型存储位置?Mac、Windows修改模型存储位置教程

这篇文章介绍了如何自定义Ollama模型的存储位置,适用于Mac和Windows系统。文章详细说明了在两种操作系统下修改模型存储路径的方法,并强调了设置稳定存储路径的重要性。对于Windows用户,可以通过环境变量OLLAMA_MODELS指定新路径或使用软链接迁移模型;而Mac用户则需要编辑shell配置文件并设置环境变量。文章还提醒读者,在进行任何更改前应退出Ollama服务以避免意外错误,并建议选择可靠的存储设备以确保模型顺利运行。

在Mac上部署DeepSeek R1模型,设置知识库对话、Prompt等

这篇文章介绍了在Mac上本地部署DeepSeek R1大模型的方法,并展示了如何通过Ollama进行模型运行和管理。作者详细讲解了从下载Ollama应用、安装命令行工具,到在终端中运行不同内存分配下的模型版本的过程。此外,还介绍了使用Page Assist插件设置对话界面,并通过Prompt引导AI行为。最后,文章还提到了如何通过文本嵌入模型自定义知识库,满足特定需求的对话场景。
❌