Участник:Бот-заполнитель Товарища Аарона

Материал из Циклопедии
Перейти к навигации Перейти к поиску
Аварийное выключение бота

Смотрителям: Нажмите на кнопку, если бот делает что-то не то.

Это бот Товарища Аарона который облегчает создание статей.

Как работает[править]

Бот проходится по категории в Википедии, Рисованные мультфильмы СССР и если нет статьи в ЦП, но есть статья в категории на Википедии, то создаёт подстраницу, и заполняет параметры шаблона Мультфильм беря информацию из Викиданных. Потом владелец проверяет и публикует эти статьи.

Исходный код[править]

import pywikibot
from pywikibot import pagegenerators

wiki_site = pywikibot.Site("ru", "wikipedia")
cp_site = pywikibot.Site("ru", "cyclowiki")
repo = wiki_site.data_repository()

category = pywikibot.Category(
    wiki_site,
    "Категория:Рисованные мультфильмы СССР"
)

pages = pagegenerators.CategorizedPageGenerator(category)

limit = 1
count = 0


def get_labels(item, property_id):
    if property_id not in item.claims:
        return ""
    values = []
    for claim in item.claims[property_id]:
        target = claim.getTarget()
        if isinstance(target, pywikibot.ItemPage):
            target.get()
            label = target.labels.get('ru') or target.labels.get('en')
            if label:
                values.append(label)
        else:
            values.append(str(target))
    return ", ".join(values)


for page in pages:
    if count >= limit:
        break

    title = page.title()
    cp_page = pywikibot.Page(cp_site, title)

    if cp_page.exists():
        continue

    try:
        item = pywikibot.ItemPage.fromPage(page)
        item.get()
    except:
        continue

    director = get_labels(item, "P57")
    writer = get_labels(item, "P58")
    composer = get_labels(item, "P86")
    country = get_labels(item, "P495")
    studio = get_labels(item, "P272")

    year = ""
    if "P577" in item.claims:
        date = item.claims["P577"][0].getTarget()
        year = str(date.year)

    wikidata_link = f"https://www.wikidata.org/wiki/{item.id}"

    # -------- Краткое описание --------
    intro = f"'''{title}''' — советский рисованный мультипликационный фильм"
    if year:
        intro += f" {year} года"
    intro += " производства."

    if director:
        intro += f" Режиссёр: {director}."
    if writer:
        intro += f" Сценарист: {writer}."
    if composer:
        intro += f" Композитор: {composer}."

    # -------- Шаблон --------
    fields = []

    if year:
        fields.append(f"| Год = {year}<ref name='wd' />")
    if director:
        fields.append(f"| Режиссёр = {director}<ref name='wd' />")
    if writer:
        fields.append(f"| Сценарист = {writer}<ref name='wd' />")
    if composer:
        fields.append(f"| Композитор = {composer}<ref name='wd' />")
    if country:
        fields.append(f"| Страна = {country}<ref name='wd' />")
    if studio:
        fields.append(f"| Студия = {studio}<ref name='wd' />")

    template = "{{Мультфильм\n| Название = " + title + "\n" + "\n".join(fields) + "\n}}"

    text = template + "\n\n" + intro + f"""

== Источники ==
<ref name="wd">[{wikidata_link} Информация о мультфильме на Викиданных]</ref>
"""

    subpage_title = f"Участник:Товарищ_Аарон/Для_бота/{title}"
    subpage = pywikibot.Page(cp_site, subpage_title)

    if subpage.exists():
        continue

    subpage.text = text
    subpage.save(summary="Создание черновика с полной карточкой из Wikidata")

    print("Создано:", subpage_title)
    count += 1

print("Готово.")