我发现我经常对https://www.npmjs.com/上搜索的顺序和表现力不满意。我想应该有一种方法可以使用https://api.npmjs.org/或http://registry.npmjs.org/以编程方式查询服务器。但是怎么做?文档在哪里?
(或者是否有节点包来促进这一点?我知道 SO 不是关于工具或包推荐的,所以也许我也不应该问这个问题,但如果有一些工具,我可能会从中读取 API也一样。)
我发现我经常对https://www.npmjs.com/上搜索的顺序和表现力不满意。我想应该有一种方法可以使用https://api.npmjs.org/或http://registry.npmjs.org/以编程方式查询服务器。但是怎么做?文档在哪里?
(或者是否有节点包来促进这一点?我知道 SO 不是关于工具或包推荐的,所以也许我也不应该问这个问题,但如果有一些工具,我可能会从中读取 API也一样。)
有一个非常好的 npm 查询站点https://npms.io,我在我的 web 项目中使用了多年。它是一个开源项目,支持高级搜索,具有更好的关键字结果质量。
他们使用收集到的有关项目的信息为每个包建立一个评分系统。最终分数是根据质量、维护、人气和个性四个不同方面计算得出的。
它还具有非常简洁的 REST API。
API 文档:https ://api-docs.npms.io
当然,至少有一种工具可以与该注册表对话,那就是npm
命令行工具本身。例如,它的搜索首先更新索引的本地缓存副本,然后对其进行过滤。在update-index中,可以读到以结尾的 URL/-/all
显然是特殊的。实际上,将其附加到registry.npmjs.org
(故意不格式化为链接)将获取一个 125M 的文件,这对于您的浏览器来说可能太多了。幸运的是,缓存的版本存储在~/.npm/registry.npmjs.org/-/all/.cache.json
. 从那里可以阅读所有现有软件包的列表。然后可以继续更详细地查询每个这样的包。
显然没有使用更复杂的方案这一事实npm search
表明这里没有太多的服务器端 api。
在网上搜索提到api.npmjs.org
我发现可以从那里检索下载计数的页面。我发现的所有其他文件都使用了该单一工具。
在寻找替代方案时,我还偶然发现了npmsearch.com,它提供了一些更通用的搜索工具,并且有一些文档化的 API。
https://skimdb.npmjs.com/registry/_all_docs
这是当前提取所有包名称的方法。
网址搜索是http://registry.npmjs.com/-/v1/search?text=<searchstring>&size=20
Edit1:3 年后(2021 年 3 月),此端点仍然有效。很高兴它仍然对人们有所帮助:)
您始终可以使用 NPM 注册表客户端:https ://github.com/npm/npm-registry-client 。
如果您仔细查看,您可以获得 API 的端点。例如,要获取包的 dist-tags,那么您可以转到 /-/package/packageName/dist-tags'
因此,要获取 babel-core dist 标签,您可以访问http://registry.npmjs.org/-/package/babel-core/dist-tags
如果您找不到包或只是在编写 shell 脚本,则注册表git 存储库中的注册表 API 文档包含有关搜索 API 和搜索限定符的详细信息。
如果您正在公共注册表中寻找最流行的不安全包,请运行:
wget -qO - "http://registry.npmjs.com/-/v1/search?text=is:insecure&popularity=1.0&size=1"
以上使用is:insecure
搜索限定符,没有任何额外的文本条件,并在哪里(最流行的)抓取size=1
结果。popularity=1.0
检查 repo 中的docs
目录以获取许多其他有用的东西,例如:
文档现在在这里: https ://github.com/npm/registry/blob/master/docs/download-counts.md
获取给定时间段内所有包或特定包的总下载量。
GET https://api.npmjs.org/downloads/point/{period}[/{package}]
您可以在以下 GitHub 存储库中找到官方公共 NPM 注册表 API 的文档:https ://github.com/npm/registry
可以在此处找到搜索端点的文档:https ://github.com/npm/registry/blob/master/docs/REGISTRY-API.md#get-v1search
接受以下查询参数:文本、大小、质量、流行度、维护
curl -sL 'https://registry.npmjs.org/-/v1/search?text=react-native&size=5' | jq
在这里,我们curl
用于发出 API 请求,并jq
格式化 JSON 响应。返回以下输出:
{
"objects": [
{
"package": {
"name": "react-native",
"scope": "unscoped",
"version": "0.62.2",
"description": "A framework for building native apps using React",
"date": "2020-04-08T17:08:19.985Z",
"links": {
"npm": "https://www.npmjs.com/package/react-native",
"homepage": "https://github.com/facebook/react-native#readme",
"repository": "https://github.com/facebook/react-native",
"bugs": "https://github.com/facebook/react-native/issues"
},
"publisher": {
"username": "react-native-bot",
"email": "opensource+react-native-bot@fb.com"
},
"maintainers": [
{
"username": "cpojer",
"email": "christoph.pojer@gmail.com"
},
{
"username": "fb",
"email": "opensource+npm@fb.com"
},
{
"username": "grabbou",
"email": "grabbou@gmail.com"
},
{
"username": "hectorramos",
"email": "hector@hectorramos.com"
},
{
"username": "react-native-bot",
"email": "opensource+react-native-bot@fb.com"
}
]
},
"flags": {
"unstable": true
},
"score": {
"final": 0.4604636166574407,
"detail": {
"quality": 0.5886895871400879,
"popularity": 0.47768592528213616,
"maintenance": 0.3333333333333333
}
},
"searchScore": 100000.47
},
{
"package": {
"name": "react-native-svg",
"scope": "unscoped",
"version": "12.1.0",
"description": "SVG library for react-native",
"keywords": [
"react-component",
"react-native",
"ios",
"android",
"SVG",
"ART",
"VML",
"gradient"
],
"date": "2020-04-09T23:50:28.358Z",
"links": {
"npm": "https://www.npmjs.com/package/react-native-svg",
"homepage": "https://github.com/react-native-community/react-native-svg",
"repository": "https://github.com/react-native-community/react-native-svg",
"bugs": "https://github.com/react-native-community/react-native-svg/issues"
},
"publisher": {
"username": "msand",
"email": "msand@abo.fi"
},
"maintainers": [
{
"username": "brentvatne",
"email": "brentvatne@gmail.com"
},
{
"username": "dustin.savery",
"email": "dustin.savery@gmail.com"
},
{
"username": "magicismight",
"email": "master@horcrux.cn"
},
{
"username": "msand",
"email": "msand@abo.fi"
}
]
},
"score": {
"final": 0.5244501419238121,
"detail": {
"quality": 0.9582364654638059,
"popularity": 0.34375010176572474,
"maintenance": 0.3333333333333333
}
},
"searchScore": 0.031369504
},
{
"package": {
"name": "react-native-device-info",
"scope": "unscoped",
"version": "5.6.1",
"description": "Get device information using react-native",
"keywords": [
"react-component",
"react-native",
"ios",
"android",
"windows",
"device",
"events",
"cocoapod"
],
"date": "2020-05-27T18:33:11.715Z",
"links": {
"npm": "https://www.npmjs.com/package/react-native-device-info",
"homepage": "https://github.com/react-native-community/react-native-device-info#readme",
"repository": "https://github.com/react-native-community/react-native-device-info",
"bugs": "https://github.com/react-native-community/react-native-device-info/issues"
},
"author": {
"name": "Rebecca Hughes",
"email": "rebecca@learnium.net",
"url": "https://github.com/rebeccahughes"
},
"publisher": {
"username": "mikehardy",
"email": "npmjs@mikehardy.net"
},
"maintainers": [
{
"username": "gantman",
"email": "gantman+npm@gmail.com"
},
{
"username": "jeroenbourgois",
"email": "info@jeroenbourgois.be"
},
{
"username": "lilach",
"email": "i.am.red@gmail.com"
},
{
"username": "machour",
"email": "machour@gmail.com"
},
{
"username": "rebeccahughes",
"email": "rebeccahughes1@outlook.com"
}
]
},
"score": {
"final": 0.5102794746987024,
"detail": {
"quality": 0.9614895473985808,
"popularity": 0.3004741251784613,
"maintenance": 0.3333333333333333
}
},
"searchScore": 0.016712856
},
{
"package": {
"name": "css-to-react-native",
"scope": "unscoped",
"version": "3.0.0",
"description": "Convert CSS text to a React Native stylesheet object",
"keywords": [
"styled-components",
"React",
"ReactNative",
"styles",
"CSS"
],
"date": "2019-10-10T17:46:00.297Z",
"links": {
"npm": "https://www.npmjs.com/package/css-to-react-native",
"homepage": "https://github.com/styled-components/css-to-react-native#readme",
"repository": "https://github.com/styled-components/css-to-react-native",
"bugs": "https://github.com/styled-components/css-to-react-native/issues"
},
"author": {
"name": "Jacob Parker"
},
"publisher": {
"username": "jacobp100",
"email": "jacobparker1992@gmail.com"
},
"maintainers": [
{
"username": "jacobp100",
"email": "jacobparker1992@gmail.com"
},
{
"username": "kristerkari",
"email": "krister@sent.at"
},
{
"username": "mxstbr",
"email": "npm@mxstbr.com"
}
]
},
"score": {
"final": 0.4836548888489432,
"detail": {
"quality": 0.8524860977159072,
"popularity": 0.39264581380833835,
"maintenance": 0.25852292771786467
}
},
"searchScore": 0.013077582
},
{
"package": {
"name": "react-native-elements",
"scope": "unscoped",
"version": "2.0.4",
"description": "React Native Elements & UI Toolkit",
"keywords": [
"react-native",
"reactjs",
"reactnative",
"bootstrap"
],
"date": "2020-06-30T02:30:34.882Z",
"links": {
"npm": "https://www.npmjs.com/package/react-native-elements",
"homepage": "https://react-native-elements.github.io/react-native-elements/",
"repository": "https://github.com/react-native-elements/react-native-elements",
"bugs": "https://github.com/react-native-elements/react-native-elements/issues"
},
"author": {
"name": "Nader Dabit & Monte Thakkar"
},
"publisher": {
"username": "flyingcircle",
"email": "jeremyelijah@live.com"
},
"maintainers": [
{
"username": "dabit3",
"email": "dabit3@gmail.com"
},
{
"username": "iroachie",
"email": "kroach.work@gmail.com"
},
{
"username": "monte9",
"email": "mthakkar@mail.sfsu.edu"
}
]
},
"score": {
"final": 0.4921277780507845,
"detail": {
"quality": 0.9218028296308819,
"popularity": 0.28262932141386665,
"maintenance": 0.3333333333333333
}
},
"searchScore": 0.011005878
}
],
"total": 26290,
"time": "Wed Jul 08 2020 05:02:14 GMT+0000 (UTC)"
}
看一下sinopia注册界面:https ://github.com/rlidwka/sinopia/blob/master/lib/index-api.js 。npm 客户端的默认注册表是https://registry.npmjs.org(在控制台上试用:npm config ls -l)。因此,您可以尝试以下方法(参考 sinopia API)来获取有关 react 15.0.2 的数据
我知道这个答案很旧,但有些人仍然可以找到它相关的,所以:
经过大量搜索,我终于找到了一些东西,该解决方案不使用 NPM API,因为它的文档很糟糕,而且它还有很多缺点
(这将有助于其他用途,而不是搜索,例如获取流行包列表(我需要的))
解决方案是使用Libraries.io
Libraries.io 索引来自 36 个包管理器的 4,273,741 个包的数据。(包括 NPM) 来自Libraries.io 页面
它具有出色的 API 和良好的文档,还具有多种语言的 API 包装器
您可以在此处查看使用该库的我的 CLI 程序
您可以使用 api-npm 节点模块,它直接查询 NPM 注册表,您可以获取模块的所有属性并下载任何时间范围内任何模块的统计信息 https://www.npmjs.com/package/api-npm