star-history源码阅读笔记(01)-项目介绍,Github的stargazers接口与分页机制,获取star历史的思路

Git的使用--如何将本地项目上传到Github 很早之前就注册了Github,但对其使用一直懵懵懂懂,很不熟练。直到昨天做完百度前端技术学院的task,想把代码托管到Github上的时候发现自己对于Git的操作是如此之愚钝,所以今天决定把Git好好学习一遍,好让自己以后能更好地使用Github,主要还是通过Git教程 - 廖雪峰的官方网站来学习。简要步骤可以直接看最后的总结。        Git的安装就不说了。        第一步: 阅读详情

本文首发于我的Github博客
本文是star-history项目源码阅读的第一篇文章,会包含:

  • 作者对项目的介绍,这个系列博文的目的
  • Github的stargazers接口
  • Github接口的分页策略
  • 获取star历史的思路

本次对代码的分析基于Commit - first commit deecd92 timqian

项目的介绍与系列博文的目的

项目介绍

首先说明,本文作者并非项目作者,各种介绍和分析,如有不当,还请谅解。

star-history项目(体验地址)是一个用于统计github项目获得star历史的组件,包括web app网页版本和chrome extension版本

产生这个项目的原因,是Github官方并没有提供查看项目star历史的功能

博文目的

  • 留作知识沉淀
    • 从体验界面来看,前端效果和功能都很不错,希望学习一下
  • 将我三次元的时间,尽!情!挥!霍!

Github的stargazers接口

Github官方提供了一系列REST API(现在有向graphql上迁移的趋势),通过REST API,可以获得许多Github上的信息,以此为基础,我们可以构建各式各样的APP,star-history这个项目也是这样建立起来的

Github虽然没有提供直接查看项目star历史的功能,但是却提供了stargazers接口,这个接口有两种形式

  1. 查看star了一个项目的所有用户
  2. 同上,并且加入该用户star该项目的时间

这二者共用同一个rest url,不同的是:

方法2需要在HTTP请求头中加入Accept: application/vnd.github.v3.star+json

其rest url和返回的json格式分别是

GET /repos/:owner/:repo/stargazers
# 没有时间
[
  {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  }
]

GET /repos/:owner/:repo/stargazers
Header:
Accept: application/vnd.github.v3.star+json
# 有star时间
[
  {
    "starred_at": "2011-01-16T19:06:43Z",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    }
  }
]

Github接口的分页策略

对于stargazers接口,一个仓库很可能有数万甚至数十万个用户star过,如果我们在一次请求
GET /repos/:owner/:repo/stargazers
中,就将所有的信息全部都拿出来,会导致:

  • 网络IO和内存IO负荷过大
  • 不灵活,也许有些接口调用方并不想要全部的数据,只想要部分的,这样的请求IO就全部浪费了

为此,Github的很多API都引入了分页机制

分页机制中,比较重要的有几点:

  • 如何知道一个url的资源被分成了多少页?
  • 如何知道目前是哪一页?
  • 如何知道一个url的资源在一页上有多少个?
  • 如何获取一个url任意一页的资源?

我们先来看看Github的REST API是如何接受和提供分页信息的

接受分页信息

对于每一个url,我们可以在后面加上page和per_page参数:

  • per_page参数指定了一页上有多少个资源
    • 这个参数可以没有,不同的url接口会有不同的默认值,有的是30,有的是100,具体靠阅读文档
    • 并不是所有的url接口都接受这个参数,有些url接口不接受,具体靠阅读文档
  • page参数指定了需要拿哪一页的资源

提供分页信息

在HTTP响应中,Github接口加入一个响应头Link,这个响应头的样式大概是

# 注意这个请求没有加上page参数,也能获得Link响应头
GET https://api.github.com/search/code?q=addClass+user%3Amozilla

# HTTP响应的响应头
Link: <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=15>; rel="next",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=1>; rel="first",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=13>; rel="prev"

其中rel表示的是url和当前url的关系:

  • prev,前一页的url
  • next,下一页的url
  • last,最后一页的url,也就是总页数
  • first,第一页的url

疑问的解答

所以我们之前的数个疑问就可以得到解答

  • 如何知道一个url的资源被分成了多少页?
    • 首先不带page参数进行请求,而后通过响应头,提取出last对应的url中的page参数即可
  • 如何知道目前是哪一页?
    • 当前url的page参数就是当前页数
    • 响应头中的next对应的url中的page参数是下一页
  • 如何知道一个url的资源在一页上有多少个?
    • 查看文档,会有默认值
    • 查看文档,如果url接口接受per_page参数,就可以自行设置(注意可能会有最大值限制)
  • 如何获取一个url任意一页的资源?
    • 加入page参数

获取star历史的思路

了解了Github的stargazers接口及分页策略,我们就可以来分析一下获取star历史的方法:

  1. 调用stargazers接口,要带star日期的
  2. 根据star日期进行排序
  3. 统计出star发生改变的时间(也就是某个用户star了仓库的时间)和当时的star数目(就是排序后的索引值)
  4. 以改变的时间作为横轴,改变当时的star数目作为纵轴,绘制图像

这样来看,基本上是没错的,但是还要考虑一点

如果一个仓库有数千数万数十万star,我们就要绘制数千数万数十万的点吗?

可以当然是可以的,但是这么做,对于高star的项目,内存和网络消耗过大,处理时间过长,项目初期,不利于我们开发和调试

所以我们可以利用分页机制进行取样

比如,我们选定取样点数为20,那么,

  • 对于star数目不足20的项目,
    • 我们获取所有的信息,并绘制出所有的点
  • 对于star数目高于20的项目(假设star数为N),
    • 我们获取0, N/20, 2N/20, 3N/20, …, N时的时间
    • 然后以这二十个时间点和star数,绘制20个点即可

上面描述的是如何取样,那么取样与分页有什么关系呢?

那就是——我们不需要获取总star数目,我们只需要获取总页数

  • 对于一个stargazers接口页数为N的项目
    • 我们获取0, N/20, 2N/20, 3N/20, …, N页上最早的时间
    • 然后以这二十个时间点和star数(页编号 * 每页资源数目),绘制20个点即可

代码分析

事实上,项目代码中也是这么操作的(事实上刚才的思路是我从代码中倒推出来的,尬笑)

generateUrls.js中

const getConfig = {
  headers: {
    Accept: 'application/vnd.github.v3.star+json',
  },
};

export default async function(repo) {
  const initUrl = `https://api.github.com/repos/${repo}/stargazers`;
  const res = await axios.get(initUrl, getConfig).catch(e => {
      //...
  })
  //
}

这表明我们使用的是stargazers的带时间的接口

  const link = res.headers.link;
  if (!link) {
      //...
  } else {
    const pageNumArray = /next.*?page=(\d*).*?last/.exec(link);
    const pageNum = pageNumArray[1];
    let samplePageUrls = [];
    let pageIndexes = [];
    if (pageNum <= sampleNum) {
      for (let i = 2; i <= pageNum; i++) {
        pageIndexes.push(i);
        samplePageUrls.push(initUrl + '?page=' + i);
      }
    } else {
      for (let i = 1; i < sampleNum; i++) {
        let pageIndex = Math.round(i / sampleNum * pageNum);
        pageIndexes.push(pageIndex);
        samplePageUrls.push(initUrl + '?page=' + pageIndex);
      }
    }
    //...
    return {
      samplePageUrls, pageIndexes,
    };
  }

显然这一段代码是通过响应头Link,使用正则表达式提取出总页数,然后取样sampleNum个点

getStarHistory.js中

export default async function(repo) {
  const {
    samplePageUrls, pageIndexes
  } = await generateUrls(repo).catch(e => {
    console.log(e); // throw don't work
  });

  const getArray = samplePageUrls.map(url => axios.get(url, getConfig));

  const resArray = await Promise.all(getArray).catch(e => {
    console.log(e); // throw don't work
  });

  const starHistory = pageIndexes.map((p, i) => {
    return {
      date: resArray[i].data[0].starred_at.slice(0, 10),
      starNum: 30 * (p - 1),
    };
  });
  console.log(starHistory);

  return starHistory;
}

这一段代码,

  1. 通过generateUrls.js的接口获取所有采样的url接口,而后进行请求
  2. 请求后获得每一页最小的时间,并把最小的时间和当页代表的star数组合起来返回

这样,就得到了一个项目的star历史

【github系列】github定位到历史版本(历史commit点) 关于使用git在本地进行版本管理见linux下的版本管理 想我们在写代码时候,数次修改并提交commit,如果在这个过程中我们后悔了,想回到当初的某一个commit点应该如何实现呢? 如果会用git bash的话,肯定首选命令行模式 git log (branch) git reset --hard (commit id) 版本回滚 git reflog git reset --hard (... 阅读详情

相关推荐

GetQzonehistory-main.zip

GetQzonehistory-main.zip

一款免费的开源神器:一键下载QQ空间说说!

便捷登录扫码登录:通过手机QQ扫描二维码快速登录,无需输入账号密码内容管理全内容导出:支持说说/图片/留言等数据备份分类查看:时间排序:从最早到最新的完整说说时间轴留言记录:好友历史留言存档转发内容:用户所有转发内容集合社交互动好友列表:展示QQ空间好友信息互动榜单:自动统计互动最频繁的好友排行二、软件优势安全可靠:开源代码透明可查(GitHub项目地址)完全免费:无会员体系/隐藏收费操作简易:三步完成数据备份:扫码登录选择内容类型导出文本/图片三、使用场景。

weixin_46004477的博客 2815

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1781

【亲测免费】 探索GitHub星辰之变——星历史(star-history)项目揭秘

探索GitHub星辰之变——星历史(star-history)项目揭秘 在浩瀚的GitHub宇宙中,每一个仓库都是开发者智慧的繁星。你是否好奇过,那些明星项目是如何随着时间的流逝逐步积累起成千上万的星星?今天,我们就来聊聊一个能够可视化这一过程的神器——星历史(star-history)。 项目介绍 星历史是一个基于Rust编写的命令行程序,它致力于绘制任意GitHub用户、组织或仓库获得星数随时...

gitblog_00402的博客 920

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

网络安全 —— 实验(基于华为eNSP模拟器)

8. 实验八 —— 通过路由的远程管理(基于实验七的基础配置)8. 实验八 —— 通过路由的远程管理(基于实验七的基础配置)6. 实验六 —— 交换机的远程控制(直接控制和间接控制)6. 实验六 —— 交换机的远程控制(直接控制和间接控制)5. 实验五 —— 将交换机作为PC端通过交换机相连。5. 实验五 —— 将交换机作为PC端通过交换机相连。4. 实验四 —— 两个PC机通过两台交换机相连。2. 实验二 —— 两个PC机通过交换机相连。2. 实验二 —— 两个PC机通过交换机相连。

这个家伙看起来很懒,只想把你留下来哦 9338

开源项目教程:Repohistory - 深度追踪GitHub仓库流量历史

开源项目教程:Repohistory - 深度追踪GitHub仓库流量历史 项目介绍 Repohistory 是一个基于AGPL-3.0许可的开源平台,它解决了开发者在跟踪GitHub仓库访问数据时面临的14天限制问题。此工具通过提供一个简洁优雅的界面,允许用户长期监控和分析其仓库的克隆与查看数据,从而获得更全面的长期数据洞察。无论是趋势分析还是项目进展的评估,Repohistory都是开发者的...

gitblog_00195的博客 1159

oracle p6 破解版下载,Primavera P6项目管理软件 16~17 图文详细安装教程(附下载)

Primavera P6 Professional项目管理软件结合了Oracle和Microsoft SQL Server关系数据库,是一款非常好用且功能强大的综合的项目管理软件(PPM) 解决方案,主要用于土建等方面的施工计划分析,具有进度时间安排与资源控制功能的多用户、多项目系统,支持多层项目分层结构、角色与技能导向的资源安排、记录实际数据、自定义视图以及自定义数据,本文主要为大家图文详细介绍...

weixin_33978451的博客 4908

Github优质项目推荐(第八期)

本期博客介绍了六个 Github 上高星项目。包括 manim、siyuan 等,涵盖数学动画、知识管理、数据获取、安全评估和计算机学习等领域,为技术爱好者和专业人士提供丰富的资源参考。

qq_43657722的博客 5122

车载测试工程师必备:5分钟搞定CANoe台架搭建(附DBC导入技巧)

本文为车载测试工程师提供快速搭建CANoe测试台架的实用指南,涵盖硬件连接、DBC文件导入及常见报错解决方案。通过详细步骤和高效技巧,帮助工程师在5分钟内完成台架搭建,提升车载测试效率,特别适合紧急功能验证场景。

potato的博客 812

【光子 AI 】应用 LangGraph 的核心模型和算法原理,完整实现一个极简版的 Agent 开发框架源代码,并给出具体的应用测试实际项目案例

下面给出一个“极简版 LangGraph 风格 Agent 框架”的完整可运行实现:用 有向图 + 状态(State) + 节点(Node) + 条件路由(Conditional Edge) + 循环(Loop) + Checkpoint 这一套核心模型/算法,把 Agent 组织成可编排、可测试的状态机工作流(这正是 LangGraph 的核心抽象之一:以 StateGraph 组织节点,节点读写共享状态,边做路由与循环,并支持持久化/回放)。 参考概念来源:LangGraph 官方文档对 “StateG

AI天才研究院 268

Star History下载和使用——查看GitHub项目Star走势/趋势图(star统计信息)

查看GitHub项目Star走势/趋势图(star统计信息)

张小凡 4711

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4563

【亲测免费】 探索代码星图:Star History - 分析GitHub项目的星标历史

是一个由Tim Qian开发的工具,旨在帮助我们更深入地了解GitHub上的开源项目。它提供了一种可视化方式,以图表的形式展示项目被用户"星标"(star)的时间历程,让我们看到项目的受欢迎程度随时间的变化,从而洞察其发展趋势。 ## 技术分析 1. **数据获取**:Star History通过GitHub的公共API抓取项目的数据,包括星标的创建日期和对应的用户信息。这需要对HTTP请求和...

gitblog_00032的博客 893

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Star History 项目使用教程

Star History 是一个开源项目,旨在提供 GitHub 仓库的星标历史图表。通过这个工具,用户可以直观地查看一个 GitHub 仓库随时间增长的星标数量,从而了解项目的受欢迎程度和社区活跃度。 ## 项目快速启动 ### 安装 首先,你需要克隆项目到本地: ```bash git clone https://github.com/timqian/star-history.git ...

gitblog_00596的博客 654

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Qwen3.6-35B-A3B-GGUF与其他35B模型对比:性能、质量、效率全面评测

在当今AI模型快速发展的时代,选择合适的35B参数大语言模型对开发者和研究者至关重要。Qwen3.6-35B-A3B-GGUF作为阿里云通义千问团队推出的最新量化版本,在性能、质量和效率方面展现出了独特优势。本文将为您提供完整的对比评测,帮助您了解这款模型与其他35B级模型的差异。 ## 🔍 核心关键词解析 **核心关键词**:Qwen3.6-35B-A3B-GGUF、35B模型对比、AI模

gitblog_00801的博客 529

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【开源项目推荐】告别手动截图,轻松保存QQ空间全部回忆!

在这个数字化时代,QQ空间承载了我们太多的青春回忆。无论是早期的说说、日志,还是照片、留言,都是我们珍贵的数字资产。然而,随着时间推移,这些内容可能会因各种原因丢失。如何高效地备份和保存这些珍贵的回忆,成为了很多人关心的问题。今天要介绍的这个开源项目,就能很好地解决这个需求。

Albert_Lsk的博客 3725

Star History 开源项目教程

Star History 开源项目教程 项目介绍 Star History 是一个用于追踪 GitHub 仓库星标历史的工具。它可以帮助开发者了解一个项目随时间增长的受欢迎程度,从而评估项目的活跃度和社区参与度。该项目通过可视化星标的历史数据,使得用户可以直观地看到项目的成长轨迹。 项目快速启动 要快速启动 Star History 项目,请按照以下步骤操作: 克隆仓库: git clone ...

gitblog_00103的博客 610

如何拥有漂亮的Github Star History折线图

一个漂亮的 Star上涨趋势图,让你的 README更漂亮~

SoulmateY的博客 3495

探索GitHub星标历史:Star History,你的开源世界新视角

???? 简介 在开源的世界里,GitHub的星标(star)是对一个项目质量的认可和流行度的体现。想象一下,如果有一个工具能帮你清晰地展示这些星标的动态变化,那将多么有价值。这就是我们要向你推荐的项目——Star History。它是一个创新的GitHub星标历史图表工具,不仅美观,而且功能强大。只需简单的一行HTML代码,你就能将实时的星标趋势图嵌入到任何地方,包括你的GitHub Readme...

gitblog_00009的博客 841

github

github使用 1.什么是guthub github是一款软件,用来高效管理数据,文件,项目。linux之父编写,有其自己的网站,分布式系统防止代码丢失,做备份项目的版本管理和控制,可以通过设置节点进行跳转建立各自的开发环境分支,互不影响,方便合并在多终端开发时,方便代码的相互传输。 2.github安装 sudu apt-get install git 3.概念 工作区:自己正常操作的区域...

ambition_star的博客 735

开源项目 `local-history` 使用教程

开源项目 local-history 使用教程 项目介绍 local-history 是一个用于管理本地文件历史版本的工具。它允许用户在本地保存文件的不同版本,以便在需要时可以回溯到之前的版本。这个项目非常适合开发者、内容创作者和任何需要频繁修改文件并希望保留历史记录的用户。 项目快速启动 安装 首先,确保你已经安装了 git。然后,克隆 local-history 项目到本地: git clon...

gitblog_00679的博客 747

探索GitHub星标历史:star-history

探索GitHub星标历史:star-history 一款直观展示GitHub仓库星标趋势的命令行工具 在如今这个开源软件繁荣的时代,GitHub上的星标(Stars)已经成为衡量一个项目受欢迎程度的重要指标。你是否曾好奇过那些备受瞩目的项目,它们的星标是如何随着时间逐渐积累的?现在,有了star-history,你可以轻松地通过图表一探究竟。 项目介绍 star-history是一款由Rust编写...

gitblog_00023的博客 882

QQ空间数据导出神器:GetQzonehistory深度使用指南

你是否曾经想过完整保存自己在QQ空间留下的青春印记?那些年发的每一条说说、每一张照片、每一个点赞和评论,都是珍贵的数字记忆。GetQzonehistory就是这样一个能够帮你一键导出QQ空间所有历史数据的开源工具,让你不再担心数据丢失,轻松备份整个青春。 ## 为什么你需要这个工具 在数字时代,我们的回忆越来越依赖于各种社交平台。QQ空间作为许多人青春记忆的载体,承载了太多珍贵的瞬间。但平台随

gitblog_00712的博客 720

【亲测免费】 探索GitHub星标历史的新视图:Star History

在GitHub的世界里,星星(Stars)是衡量一个项目受欢迎程度的重要指标。而今天,我们向您推荐一款创新的开源项目——**Star History**,它为GitHub仓库提供了缺失的星标历史图表,让您能够一目了然地了解项目受欢迎的过程。 ## 项目简介 Star History是一款独特且功能强大的工具,它的官方网站[star-history.com](https://star-histo...

gitblog_00584的博客 1075
上一篇: goland提取方法与...interface{}类型的注意点
下一篇: webpack教程01-webpack是什么与webpack命令行使用
FitzLeopard
博客等级 码龄9年 6粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值