# Programa que busca els articles sense categoria manual que no són ni desambiguacions ni redireccions
import re
import pywikibot
import time
from pywikibot import pagegenerators


def miracatfiltre(cat, catprevies=[], filtre=""):
    articles = list(cat.articles(recurse=False))
    categories = list(cat.subcategories(recurse=False))
    for scat in categories:
        pywikibot.output(scat)
        if scat not in catprevies:
            catprevies.append(scat)
            if filtre == "":
                nopassa = False
                print("Filtre desactivat")
            else:
                nopassa = re.search(filtre, scat.title)
            if not nopassa:
                pywikibot.output("Sí que es llegeix %s" % scat)
                noucats, nouarts = miracatfiltre(scat, catprevies + categories, filtre)
                categories += noucats
                articles += nouarts
            else:
                pywikibot.output("No es llegeix %s" % scat)
        else:
            pywikibot.output("Aquesta ja la tinc vista")
    articles = list(set(articles))
    return categories, articles


def principal():
    timestamp = time.strftime('%d-%m-%Y')
    catbuscar = "Articles sense categoria"
    noarticles = "20000"
    gen = site.recentchanges(total=int(noarticles), namespaces=[0])
    processed_titles = set()  # set to keep track of processed titles
    comptaarticles = comptanoprincipal = comptador = 0
    resum = ""
    for rc in gen:
        pag = pywikibot.Page(site, rc['title'])
        if pag.namespace() == 0 and pag.title() not in processed_titles:
            processed_titles.add(pag.title())  # add title to set of processed titles
            comptador += 1
            print(comptador, pag)
            if pag.exists() and not pag.isRedirectPage() and not pag.isDisambig():
                text = pag.text
                if not re.search(r"\[\[ ?[Cc]ategoria ?:", text):
                    comptaarticles += 1
                    pywikibot.output("{} no té categories".format(pag.title()))
                    resum += "#{}\n".format(pag.title(as_link=True))
        else:
            print("No és a l'espai principal o ja està processada")
            comptanoprincipal += 1
    if resum == "":
        resum = "Totes les pàgines tenen categories\n\n"
    paginforme = pywikibot.Page(site, "Usuari:Rebot/Articles sense categories") #Pàgina on voleu l'informe. Ha d'existir.
    informe="\n=={}==\n\n".format(catbuscar)
    informe+="{}".format(resum)
    informe+="Revisats {} articles\n\n".format(comptador)
    informe+="Trobats {} articles sense categoria\n\n".format(comptaarticles)
    informe+="Hi ha {} pàgines que no són a l'espai principal o ja estan processades\n\n".format(comptanoprincipal)
    informe+="\n--~~~~"
    pywikibot.output(informe)
    paginforme.text = informe  # Set the text of the page to the new content
    paginforme.save(summary=catbuscar, force=True)  # Overwrite the existing content with the new content

if __name__ == "__main__":
    site = pywikibot.Site("ca")
    principal()
    pywikibot.stopme()

Adaptat de Usuari:PereBot/robot articles sense categoria. Traduït de python2 a python3. Pau Cabot · Discussió 19:47, 8 abr 2023 (CEST)