Как получить с Mediawiki API все изображения в категории, которых нет в другой?

Я совершенно новичок в API, так что извините, если вопрос глупый.

Я хотел бы получить все изображения в категории в Commons, скажем, X, но исключить те, которые также находятся в другой (Y). Я не понимаю, смогу ли я на самом деле сделать это.

https://commons.wikimedia.org/w/api.php?action=query&list=categorymembers&cmtype=file&cmtitle=Category:X

достанет их всех, как их исключить?

Более того, я хотел бы, чтобы в результате было описание изображений, а не только имя файла, это возможно?

2 ответа

MediaWiki по умолчанию не имеет встроенной поддержки для построения категорий и запроса пересечений. Для выполнения этой задачи требуются расширения или внешние инструменты или несколько запросов API и обработка результатов.

CirrusSearch API

В Wikimedia Commons, как и во всей ферме Wikimedia Wiki, CirrusSearch обеспечивает фильтрованный поиск, включая поиск пересечений категорий, а также доступен через API (action=query&list=search&srsearch=incategory:A+-incategory:B, это Category:A минус Category:B).

FastCCI

Одним из инструментов, который я могу порекомендовать (потому что это выделенное высокопроизводительное решение и фактически работает), является fastcci, разработанный Дэниелом Швеном; Специально для Wikimedia Commons уже поддерживается база данных и запущен веб-сервис, но его можно настроить для любой вики, при условии, что в наборе инструментов есть узел для запуска и доступ к базе данных.

FastCCI в действии

запрос

Рассмотрим следующий URL-адрес запроса:

https://fastcci.wmflabs.org/?c1=3302993&c2=15516712&d1=0&d2=0&s=200&a=not&t=js

  • https://fastcci.wmflabs.org/ - Хост Викимедиа Commons fastcci работает на
  • c1 - ID категории 1
  • c2 - ID категории 2
  • d1 - глубина категории 1 для поиска (fastcci по умолчанию учитывает подкатегории)
  • d2 - глубина категории 2 для поиска (fastcci по умолчанию учитывает подкатегории)
  • s - число или результаты для возврата
  • o - смещение
  • а - соединение
  • t - тип соединения (t=js для ответа JSONP; в противном случае предполагается использование в качестве веб-сокета)

отклик

fastcciCallback( [ 'RESULT 27572680,0,0|1675043,0,0|27577015,0,0|27577043,0,0|27577106,0,0|27576896,0,0|27576790,0,0|23481936,0,0|17560964,0,0|11009066,0,0', 'OUTOF 10', 'DBAGE 378310', 'DONE'] );

RESULT с последующим | разделенный список до 50 целочисленных триплетов вида pageId,depth,tag, Каждый триплет обозначает одно изображение или категорию

Ресурсы

Примечание о идентификаторах страниц

  • идентификаторы страниц → заголовки страниц: GET/w/api.php?action=query&pageids=page_IDs_separated_by_pipe
  • заголовки страниц → идентификаторы страниц: GET/w/api.php?action=query&titles=Titles_separated_by_pipe

AFAIK, нет способа получить это напрямую с помощью API. Но, если предположить, что обе категории достаточно малы, вы можете получить все изображения от них обоих и затем вычислить дополнение в вашем коде.

Чтобы получить описание, вы можете использовать prop=imageinfo&iiprop=extmetadata&iiextmetadatafilter=ImageDescription,

В контексте вашего примера запроса это будет выглядеть так:

https://commons.wikimedia.org/w/api.php?action=query&generator=categorymembers&gcmtype=file&gcmtitle=Category:X&prop=imageinfo&iiprop=extmetadata&iiextmetadatafilter=ImageDescription

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