Запрос реестра 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 каталог в репо для ряда других полезных вещей, таких как:

Документы уже здесь: 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.

https://registry.npmjs.org/react/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

Другие вопросы по тегам