You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将GitHub Pages项目的贡献计数器数据同步到其他项目

解决方案:同步GitHub Pages项目的计数器数值到作品集网站

我懂你的困扰——直接引入原项目的JS文件根本没用,因为它依赖目标页面的.cards DOM元素对吧?别担心,咱们不用搞复杂的后端API,几个简单的方法就能搞定,而且完全符合你“加载时获取最新数值”的需求:

方案1:生成静态数值文件(最推荐,稳定且易实现)

核心思路是在你的计数器项目里,每次PR合并时自动生成一个只存数值的静态文件(比如count.txtcount.json),然后你的作品集网站直接请求这个文件就行。

步骤1:用GitHub Actions自动更新数值文件

在计数器项目的根目录下创建.github/workflows/update-count.yml文件,配置一个自动触发的工作流:

name: 更新贡献次数
on:
  pull_request:
    types: [closed]
    branches: [main] # 替换成你的主分支名称

jobs:
  update-count:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 安装Node.js依赖
        run: npm install node-fetch cheerio --save-dev

      - name: 统计卡片数量并写入文件
        run: node count-cards.js

      - name: 提交并推送更改
        run: |
          git config --global user.name "GitHub Actions"
          git config --global user.email "actions@github.com"
          git add count.txt
          git commit -m "自动更新贡献次数"
          git push

步骤2:编写统计卡片的脚本

在项目根目录创建count-cards.js,用来爬取自己的GitHub Pages页面并统计.cards数量:

const fetch = require('node-fetch');
const cheerio = require('cheerio');
const fs = require('fs');

async function updateCount() {
  // 替换成你的计数器项目GitHub Pages域名
  const pageUrl = 'https://你的用户名.github.io/计数器项目名/';
  const response = await fetch(pageUrl);
  const html = await response.text();
  
  // 用cheerio解析DOM,统计.cards元素数量
  const $ = cheerio.load(html);
  const cardCount = $('.cards').length;
  
  // 写入静态文件
  fs.writeFileSync('count.txt', cardCount.toString());
}

updateCount();

步骤3:作品集网站获取数值

在你的作品集页面添加这段JS,加载时拉取静态文件并显示数值:

// 替换成你的计数器项目的count.txt地址
fetch('https://你的用户名.github.io/计数器项目名/count.txt')
  .then(res => res.text())
  .then(count => {
    // 把数值插入到你想显示的元素中,比如id为contribution-count的元素
    document.getElementById('contribution-count').textContent = count;
  })
  .catch(err => {
    console.error('获取贡献次数失败:', err);
    // 失败时显示默认值
    document.getElementById('contribution-count').textContent = 'N/A';
  });

方案2:直接调用GitHub API(适合PR数量=贡献次数的场景)

如果你的贡献次数和合并的PR数量完全对应,可以跳过静态文件,直接用GitHub API拉取合并的PR数量:

// 替换成你的用户名和计数器仓库名
fetch('https://api.github.com/repos/你的用户名/计数器仓库名/pulls?state=closed')
  .then(res => res.json())
  .then(pulls => {
    // 过滤出已合并的PR
    const mergedCount = pulls.filter(pull => pull.merged_at !== null).length;
    document.getElementById('contribution-count').textContent = mergedCount;
  })
  .catch(err => {
    console.error('获取PR数据失败:', err);
    document.getElementById('contribution-count').textContent = 'N/A';
  });

⚠️ 注意:GitHub API未认证请求每小时限制60次,如果你作品集访问量不大完全够用;如果访问量高,可以考虑加个简单的后端代理(或者用Netlify/Vercel的函数转发请求)。

方案3:解析计数器页面的HTML(无需额外配置,适合快速测试)

如果不想搞自动化脚本,也可以直接拉取计数器页面的HTML,解析出数值(比如你原来的页面已经显示了计数器数值,可以直接提取):

fetch('https://你的用户名.github.io/计数器项目名/')
  .then(res => res.text())
  .then(html => {
    const tempDiv = document.createElement('div');
    tempDiv.innerHTML = html;
    // 假设你的计数器数值放在id为counter的元素里
    const count = tempDiv.getElementById('counter').textContent;
    document.getElementById('contribution-count').textContent = count;
  })
  .catch(err => {
    console.error('获取页面失败:', err);
    document.getElementById('contribution-count').textContent = 'N/A';
  });

总结

优先选方案1,因为它完全匹配你原来的计数器逻辑,而且静态文件的请求速度最快、最稳定,也不需要担心API限流问题。整个过程不需要复杂的后端知识,跟着步骤配置GitHub Actions就行,完全能搞定!

内容的提问来源于stack exchange,提问作者Syknapse

火山引擎 最新活动