Запрос реестра npmjs через API
Я нахожу, что я часто недоволен порядком и выразительностью поисков на https://www.npmjs.com/. Я предполагаю, что должен быть способ программно запрашивать сервер, используя https://api.npmjs.org/ или http://registry.npmjs.org/. Но как? Где находится документация?
(Или есть пакеты узлов для этого? Я знаю, что SO не касается рекомендаций по инструментам или пакетам, поэтому, возможно, мне не следует спрашивать об этом, но если бы был какой-то инструмент, я мог бы, вероятно, прочитать API из этого также.)
7 ответов
https://skimdb.npmjs.com/registry/_all_docs
Это текущий метод для извлечения всех имен пакетов.
Поиск по URL http://registry.npmjs.com/-/v1/search?text=<searchstring>&size=20
Недавно нашел действительно хороший сайт с запросами npm https://npms.io/about. У них также есть системы оценки качества для каждого пакета на основе различных данных.
У них также будет система оценки для каждого пакета, используя собранную информацию о проекте. Окончательная оценка рассчитывается на основе четырех различных аспектов качества, обслуживания, популярности и личностей.
Документация по 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
Я обнаружил, что отсчет загрузки может быть получен оттуда. Все остальные документы, которые я нашел, используют это единственное средство.
В поисках альтернатив я также наткнулся на http://npmsearch.com/, который предлагает более универсальные средства поиска и имеет несколько документированный API.
Вы всегда можете использовать клиент реестра NPM: https://github.com/npm/npm-registry-client.
Если вы посмотрите через это, вы можете получить конечные точки для API. например, чтобы получить dist-теги для пакета, вы можете перейти в /-/package/packageName/dist-tags'
Таким образом, чтобы получить основные теги dist, перейдите по http://registry.npmjs.org/-/package/babel-core/dist-tags
Если вы не можете найти пакет или просто взламываете сценарий оболочки, Документы API реестра в репозитории git реестра содержат информацию об API поиска и специальных квалификаторах поиска.
Если вы ищете самый популярный небезопасный пакет в публичном реестре, запустите:
wget -qO - "http://registry.npmjs.com/-/v1/search?text=is:insecure&popularity=1.0&size=1"
Выше используется is:insecure
классификатор поиска без каких-либо дополнительных критериев текста и захватов size=1
результаты где popularity=1.0
(самый популярный).
Проверьте в docs
каталог в репо для ряда других полезных вещей, таких как:
- Подробный список ответов Пакет Метаданных.
- Реплицирующий API для пакетов с ограниченным объемом и с незаданной областью.
- И информация о получении загрузки имеет значение.
- Полное руководство о том, как создать подписчик реестра.
Документы уже здесь: https://github.com/npm/registry/blob/master/docs/download-counts.md
Конечная точка загрузок
Получает общее количество загрузок за указанный период для всех пакетов или определенного пакета.
GET https://api.npmjs.org/downloads/point/{period}[/{package}]
Примеры
- Все пакеты, последний день:
- / загрузки / точка / последний день
- Все пакеты, конкретная дата:
- / загрузки / точка / 2014-02-01
- Пакет "Экспресс", на прошлой неделе:
- / загрузки / точка / последняя неделя / экспресс
- Пакет "Экспресс", предоставляется 7-дневный срок:
- / загрузки / точка / 2014-02-01: 2014-02-08 / экспресс
- Пакет "@slack/client", последние 30 дней:
- / загрузки / точка / последний месяц / @ слабина / клиент
- Пакет "jquery", конкретный месяц:
- / загрузки / точка / 2014-01-01: 2014-01-31 / JQuery
Посмотрите на интерфейс реестра sinopia: https://github.com/rlidwka/sinopia/blob/master/lib/index-api.js. Реестр по умолчанию для клиента npm - https://registry.npmjs.org/ (попробуйте на консоли: npm config ls -l). Таким образом, вы можете попробовать следующее (ссылаясь на API sinopia), чтобы получить данные о реакции 15.0.2.
Вы можете найти документацию для официального публичного API реестра NPM в следующем репозитории GitHub: https://github.com/npm/registry
Документацию для конечной точки поиска можно найти здесь: https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md
Допустимы следующие параметры запроса: текст, размер, качество, популярность, обслуживание.
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)"
}
Я знаю, что этот ответ старый, но некоторые все еще могут найти его актуальным, поэтому:
После долгих поисков я наконец-то нашел что-то. Решение не использует API-интерфейс NPM из-за плохой документации и множества других недостатков.
(Это будет полезно для других случаев, кроме поиска, например, получения списка популярных пакетов (что мне было нужно))
Решение состоит в том, чтобы использовать https://libraries.io/
Libraries.io индексирует данные из 4 273 741 пакета от 36 менеджеров пакетов. (Включая NPM) со страницы Libraries.io
Он имеет отличный API и хорошую документацию, а также имеет оболочку API на нескольких языках
Вы можете использовать модуль узла api-npm, он напрямую запрашивает реестр NPM, и вы можете получить все атрибуты модуля и загрузить статистику любого модуля любого временного диапазона https://www.npmjs.com/package/api-npm