Как получить с Mediawiki API все изображения в категории, которых нет в другой?
Я совершенно новичок в API, так что извините, если вопрос глупый.
Я хотел бы получить все изображения в категории в Commons, скажем, X, но исключить те, которые также находятся в другой (Y). Я не понимаю, смогу ли я на самом деле сделать это.
достанет их всех, как их исключить?
Более того, я хотел бы, чтобы в результате было описание изображений, а не только имя файла, это возможно?
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 уже поддерживается база данных и запущен веб-сервис, но его можно настроить для любой вики, при условии, что в наборе инструментов есть узел для запуска и доступ к базе данных.
запрос
Рассмотрим следующий 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
, Каждый триплет обозначает одно изображение или категорию
Ресурсы
- Пример реализации на стороне клиента - чтобы увидеть его в действии, просто зайдите в любую категорию и рядом с
Good pictures
кнопка на любой странице категории.- Пример
FilesOf('Category:Saaleck')
-FilesOf('Category:Rapeseed fields in Saxony-Anhalt')
- Пример
- Серверное приложение
- Презентация на YouTube
- Слайды
Примечание о идентификаторах страниц
- идентификаторы страниц → заголовки страниц:
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
,
В контексте вашего примера запроса это будет выглядеть так: