Làm cách nào để tìm các chuyển hướng bị triệt tiêu quá mức trong MediaWiki?


7

Tôi là biên tập viên wiki và quản trị viên tại wiki được chia sẻ cho người khác. Một số người trong số họ sử dụng triệt tiêu quá mức cho các chuyển hướng có thể vì một lý do mà tôi không biết. Chẳng hạn, nếu có một trang FOO:

#REDIRECT [[BAR]]

họ thường có thể sử dụng:

[[FOO|BAR]]

Tôi thấy nó rất nhiều và thực sự không cần thiết. Kết quả khác duy nhất của phương pháp này, theo như tôi có thể thấy, là loại bỏ thông điệp "Chuyển hướng từ FOO", mà tôi thấy có nhiều thông tin.

Làm thế nào để tôi tìm thấy tất cả các chuyển hướng bị đàn áp như vậy?


Bạn có quyền truy cập cơ sở dữ liệu vào trang web này? Sẽ không khó để thực hiện một truy vấn cơ sở dữ liệu cho những điều này nếu bạn có quyền truy cập.
Stephen Ostermiller

@StephenOstermiller không, tôi chỉ được phép sử dụng MediaWiki và không có quyền truy cập cơ sở dữ liệu.
Lyubomyr Shaydariv

Nó sẽ là một ý tưởng tốt để loại bỏ sự suppressredirectcho phép từ nhóm những người dùng thuộc về.
Nemo

@Nemo tốt, ngay cả khi có sự cho phép như vậy, sẽ không lịch sự nếu loại bỏ sự cho phép từ các thành viên phi hành đoàn khác cũng là quản trị viên. Nhưng cảm ơn bạn đã gợi ý. :)
Lyubomyr Shaydariv

@LyubomyrShaydariv trừ khi wiki của bạn có các quy tắc bắt buộc xóa các chuyển hướng trong một số trường hợp nhất định, không có lý do gì để cho phép ngăn chặn chuyển hướng ở nơi đầu tiên. Đừng phá web!
Nemo

Câu trả lời:


2

Nếu bạn có thể viết một số dòng bằng Python, bạn nên thử khung pywikibot .

Bạn nên xem qua redirect.py. pywikibot đặc biệt mạnh mẽ nếu bạn bắt đầu sử dụng nó một cách tương tác, ví dụ như thông qua ipython. Với wiki.allpages(includeredirects=True))bạn có thể có được một danh sách tất cả các trang và bạn có thể làm ví dụ

    incl_redir = map(lambda p: p.title(), wiki.allpages(includeredirects=True))
    excl_redir = map(lambda p: p.title(), wiki.allpages(includeredirects=False))
    redirects = filter(lambda p: not p in excl_redir, incl_redir)
    # We now have a list of all redirects.

    processed_redirects = ... # Here you need to find the exact strings of the redirects and turn them into a dict

    for p_title in excl_redir:
        page = Page(wiki, p_title)
        txt = page.get()
        for r in processed_redirects:
            if r['from'] in txt:
                # Here you want to process your txt and then
                page.put(txt, "Processed redirect")

Cảm ơn. Không chắc chắn nếu điều này trả lời câu hỏi. Theo tôi hiểu Python, mã này chỉ trích xuất các chuyển hướng từ danh sách phạm vi trang. Tôi cần một cái gì đó như tìm kiếm văn bản cho [[FOO|BAR]]tất cả các trang, nếu có một trang "Foo" với #REDIRECT [[BAR]]. Hoặc ... mã của bạn cũng bao gồm trường hợp này?
Lyubomyr Shaydariv

Trường hợp của bạn đòi hỏi nhiều mã hơn. những dòng này chỉ là một khởi đầu. Tôi có thể xem sau để biết thêm một số cuộc sống hàng đầu giúp bạn bắt đầu.
kqw

Tôi sẽ kiểm tra nó khi tôi có nhiều thời gian rảnh hơn để thử nghiệm tại wiki thử nghiệm của mình. Cảm ơn đã cho một ý tưởng.
Lyubomyr Shaydariv

Cuối cùng, tôi đã có một thời gian để thực hiện các thí nghiệm một tháng sau đó. Cảm ơn bạn đã chỉ ra khung Pywikibot - nó thực sự tuyệt vời. Tôi đã đăng giải pháp của mình trong câu trả lời cho câu hỏi này, nhưng sự giúp đỡ của bạn thực sự giúp ích rất nhiều: snipped của bạn đủ để thực hiện chức năng cơ bản do thiếu tài liệu Pywikibot (không phải là người Python, đọc mã nguồn của khung là Không dễ). Cảm ơn!
Lyubomyr Shaydariv

Tôi nghĩ cái này nên được chấp nhận, không phải của tôi, vì bạn đã cho tôi một ý tưởng rất hay về cách thực hiện những gì tôi cần. Cảm ơn. :)
Lyubomyr Shaydariv

2

Sau một số thử nghiệm, tôi đã kết thúc với tập lệnh Python sau cho Pywikibot. Tôi rất mới với Python, vì vậy đoạn mã sau có thể không tốt. Tôi đã thử nghiệm nó cho một wiki thử nghiệm rất nhỏ, vì vậy tôi không biết lỗ hổng thực sự của kịch bản là gì. Nhân tiện, tôi page.put(...)mất rất nhiều thời gian (~ 15 giây hoặc lâu hơn) - thậm chí không biết lý do có thể là gì. Có lẽ nó cũng giúp người khác.

Lưu ý: Tập lệnh này sửa đổi các trang và được coi là không được kiểm tra tốt.

#!/usr/bin/python
# -*- coding: utf-8  -*-

import pywikibot
import re
import sys

try:
    # Win32
    from msvcrt import getch
except ImportError:
    # UNIX
    def getch():
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            return sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old)

def process_excessive_redirects(modify = False, pause = False):

    wiki = pywikibot.Site()
    alt_link_re = re.compile('\[\[\s*([^\|\]]+)\s*\|\s*([^\]]+)\s*\]\]')

    redirects_index = {}
    print 'Parsing redirects:'
    for redirect in wiki.allpages(filterredir = True):
        print '\t', redirect.title().encode('utf8'), '->',
        redirects_index[redirect.title()] = redirect.getRedirectTarget().title()
        print redirects_index[redirect.title()].encode('utf8')

    print 'Processing:'
    for page in wiki.allpages(filterredir = False):
        print '\t', page.title().encode('utf8'), '-',
        statistics = {'modification_count': 0} # python 3: nonlocal
        def fix_redirect(match_object):
            target = match_object.group(1)
            title = match_object.group(2)
            if title.replace("_", " ") in redirects_index.keys() and redirects_index[title] == target:
                if statistics['modification_count'] == 0:
                    print
                print '\t\texcessive redirect', target, '~~~>', title, '~~~>', target
                statistics['modification_count'] += 1
                return '[[' + title + ']]'
            return match_object.group(0)
        text = alt_link_re.sub(fix_redirect, page.get())
        if statistics['modification_count'] > 0:
            print "\t\t", statistics['modification_count'], 'excessive redirect(s) detected.',
            if modify:
                print 'Fixing redirects...',
                page.put(text, str(statistics['modification_count']) + ' excessive redirect(s) fixed')
                if pause:
                    print 'Press any key . . .'
                    getch()
            else:
                print
        else:
            print 'clean!'

def main(*args):
    modify = False
    pause = False
    for arg in pywikibot.handleArgs(*args):
        if arg == '--modify':
            modify = True
        elif arg == '--pause':
            pause = True
    process_excessive_redirects(modify = modify, pause = pause)

if __name__ == '__main__':
    main()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.