사용자:티첼/CPList.py

위키백과, 우리 모두의 백과사전.
# -*- coding: utf-8  -*-
# 출처: [[사용자:Klutzy:bot/script]]
import random
import wikipedia, catlib

def list_shuffle(list, N):
    if len(list)<=N: return list
    return random.sample(list, N)

def cat_list_rec(top_cat, ignore_cats=None):
    if ignore_cats==None: ignore_cats = []

    articlelist = [] # assume that top_cat has no article
    cat = catlib.Category(wikipedia.getSite(), top_cat)
    for subcat in cat.subcategories():
        if not subcat.title() in ignore_cats:
            for page in subcat.articles():
                if not ":" in page.title():
                    articlelist.append(page.title())
    return articlelist

def cat_list(top_cat):
    cat = catlib.Category(wikipedia.getSite(), top_cat)
    return [i.title() for i in cat.articles() if not ":" in i.title()]

def main():
    count = 10

    stub_ignore_cats = [
        u'분류:숫자에 관한 토막글',
        #u'분류:대학교에 관한 토막글',
        #u'분류:학교에 관한 토막글',
        u'분류:토막글 분류가 잘못된 문서',
    ]
    
    other_cats = [
        (u'정리 필요', u'분류:정리가 필요한 문서'),
        (u'POV', u'분류:중립적 시각 분쟁'),
        (u'합병', u'분류:합쳐야 할 문서'),
    ]
    
    stub_list = cat_list_rec(u'분류:토막글 분류', stub_ignore_cats)
    
    data = []
    for title, catname in other_cats:
        data.append((title, catname, cat_list(catname)))
    
    result = u""
    result += u"<!-- 이 문서의 목록은 봇을 통해 자동으로 변경됩니다. -->\n"
    result += u"""* '''[[위키백과:토막글|토막글]]''': """
    result += u", ".join([u"[[%s]]"%i for i in list_shuffle(stub_list, count)]) + u"\n"

    for title, catname, lis in data:
        result += u"""* '''[[:%s|%s]]''': """%(catname, title)
        result += u", ".join([u"[[%s]]"%i for i in list_shuffle(lis, count)]) + u"\n"
    
    page = wikipedia.Page(wikipedia.getSite(), u'위키백과:사용자 모임/자동목록')
    page.put(result, u"robot: 자동목록 갱신")
    
    print result
    print
    print "# of stubs:", len(stub_list)
    for i, m, j in data:
        print "# of %s"%i, len(j)
    
if __name__ == "__main__":
    try:
        main()
    finally:
        wikipedia.stopme()