Участник:BsivkoBot/Подключение к проекту астрономии

Описание

Мотивация

Подключение к проекту астрономии происходит посредством добавления на странице обсуждения (СО) шаблона {{Статья проекта Астрономия}}. Данный шаблон зачастую не проставляют для статей соответствующей тематики. Помимо этого, не указывают уровень или важность. В то же время, данное действие можно в большинстве случаев сделать автоматически, например, распознав в статье астрономический объект. Задачей бота является выполнение этого действия без участия участников.

По обсуждению для случаев, если размер статьи менее 3000 байт и уровень не указан, то проставляется IV уровень.

Реализация

Бот анализирует, есть ли на странице один из шаблонов {{галактика}}, {{звезда}}, {{экзопланета}}, {{малая планета}} или их перенаправления. Если есть, то СО статьи подлежит обработке.

Если страница отсутствует, то она создаётся с содержимым {{Статья проекта Астрономия |уровень= |важность= }}. Если есть, то бот смотрит, есть ли уже на странице шаблон {{Статья проекта Астрономия}}. Если нет, то добавляет этот шаблон в самый верх страницы (такой же, как при создании пустой).

Для параметра «уровень»: если размер статьи менее 3000 байт и уровень не указан, то проставляется IV уровень.

Дополнительно подключение по сканированию категории астрономии с исключением веток 'Мир (Земля)', 'Пифагореизм', 'Солнечная система в культуре и искусстве', 'Солнечная энергия', 'Метафизическая космология', 'Геологическая история Земли', 'Климат', 'Континенты', 'Науки о Земле', 'Оболочки Земли', 'Строение Земли', 'Солнечный загар', 'Солнце в культуре', 'Солнцезащитные очки', 'Религиозная космология', 'Лунно-солнечные календари', 'Солнце в культуре', 'Википедия:Статьи о космических объектах без иллюстраций', 'Луна в культуре и искусстве', 'Загрязнение атмосферы Земли', 'Оболочки астрономических объектов', 'Атмосфера Земли', 'Индийская астрология', 'Производители телескопов', 'Оболочки планет', 'Астрономия в Китае', 'Неакадемические направления исследований в астрономии', 'Карл Фридрих Гаусс', 'Автоматические межпланетные станции', 'Геостационарные спутники Земли', 'Физика плазмы', 'Чёрные дыры в фантастике', 'Вымышленные планеты' .

Исходный код

import json
import random

import pywikibot
# args - https://www.mediawiki.org/wiki/Manual:Pywikibot/Page_Generators
from pywikibot import pagegenerators

from bot_logging.log import log_string
from processing.astro_scan import astro_scan
from processing.loop_jobs_handler import handle_pages
from so_page.astro_files import set_new_astro_titles, load_all_astro_titles, set_all_astro_titles
from so_page.astro_list import astro_list, astro_list2
from wiki_requests.redirects import load_all_cache
from wiki_requests.site import ru_site

NUMBER_TO_PROCESS = -1  # or INFINITE_NUMBER

load_all_cache()

# alternative - https://petscan.wmflabs.org/

load_all_cache()

exclude = ['Мир (Земля)', 'Пифагореизм', 'Астероиды по алфавиту', 'Галактики по алфавиту', 'Звёзды по алфавиту',
           'Объекты «Нового общего каталога»', 'Экзопланеты по алфавиту',
           'Солнечная система в культуре и искусстве', 'Солнечная энергия', 'Метафизическая космология', 'Геологическая история Земли',
           'Климат', 'Континенты', 'Науки о Земле', 'Оболочки Земли', 'Строение Земли', 'Солнечный загар', 'Солнце в культуре', 'Солнцезащитные очки',
           'Религиозная космология', 'Лунно-солнечные календари', 'Солнце в культуре',
           'Википедия:Статьи о космических объектах без иллюстраций', 'Луна в культуре и искусстве',
           'Загрязнение атмосферы Земли', 'Оболочки астрономических объектов', 'Атмосфера Земли', 'Индийская астрология', 'Производители телескопов',
           'Оболочки планет', 'Астрономия в Китае', 'Неакадемические направления исследований в астрономии', 'Карл Фридрих Гаусс',
           'Автоматические межпланетные станции', 'Геостационарные спутники Земли', 'Физика плазмы', 'Чёрные дыры в фантастике',
           'Вымышленные планеты']

def all_in_category_rec(category, titles, scanned, new_titles):
    if category in exclude:
        return titles, scanned, new_titles

    if 'скусственные спутники' in category:
        return titles, scanned, new_titles

    cat = pywikibot.Category(ru_site(), 'Категория:' + category)
    gen = pagegenerators.CategorizedPageGenerator(cat)

    for page in gen:
        title = page._link._text
        if title in titles:
            continue
        if not (title in new_titles):
            new_titles.append(title)
            log_string(str(len(new_titles)) + ":" + title)

    if category in scanned:
        return titles, scanned, new_titles
    scanned.append(category)

    cat = pywikibot.Category(ru_site(), 'Категория:' + category)
    gen = pagegenerators.SubCategoriesPageGenerator(cat)
    for page in gen:
        title = page._link._text
        if title[:10] == "Категория:":
            name = title[10:]
            if name in scanned:
                continue
            if name != category:
                log_string("Категория:" + name + " из " + category)
                titles, scanned, new_titles = all_in_category_rec(name, titles, scanned, new_titles)

    return titles, scanned, new_titles




titles = load_all_astro_titles()

scanned = []
new_titles = []
titles, scanned, new_titles = all_in_category_rec('Астрономия', titles, scanned, new_titles)

log_string("Articles in set: " + str(titles))

random.shuffle(new_titles)

set_new_astro_titles(new_titles)

log_string("New articles in set: " + str(new_titles))

context = {
    'save': True,
    'force': False,
    'rdb': False
}

handle_pages(pywikibot.Site(), new_titles, NUMBER_TO_PROCESS, context=context)

for i in new_titles:
    titles.append(i)

set_all_astro_titles(titles)

with open("all_astro.json", 'w') as outfile:
    json.dump(titles, outfile)
    outfile.close()

Тестирование


Состояние и развитие

  • Первый запуск. Bsivko (обс.) 11:59, 3 мая 2020 (UTC)
  • Обновлен список закрытых для сканирования категорий. Bsivko (обс.) 12:46, 8 августа 2020 (UTC)

Обсуждение