User:Magister Mathematicae/mblock.py

From Meta, a Wikimedia project coordination wiki

Created by es:Orgullomoore

Usage:

python mblock.py -archivo:wikis.txt -usuario:user-or-ip -plazo:"2 months" -motivo:"rationale"
  • -archivo: a file with a list of wikis in the format:
aa.wikipedia
af.wikibooks
nah.wikipedia
  • -usuario: user to be blocked
  • -plazo: block duration
  • -motivo: block summary

multiblock.py[edit]

# -*- coding: utf-8 -*-
import wikipedia, httplib, sys, codecs, urllib
def urlencode(query):
    """This can encode a query so that it can be sent as a query using
       a http POST request"""
    l=[]
    for k, v in query:
        k = urllib.quote(k)
        v = urllib.quote(v)
        l.append(k + '=' + v)
    return '&'.join(l)
def block(usuario, sitio, plazo, motivo):
    if usuario == None:
        usuario = input(u'Usuario que quieres bloquear')
    usuario = usuario.encode(sitio.encoding())
    answer = 'y'
    if answer in ['y', 'Y', 's', 'S']:
        host = sitio.hostname()
        address = 'http://'+host+'/w/index.php?title=Special:Blockip&action=submit&uselang=en'
        print "\n************************************"
        print "BLOCKING" , usuario , "IN", host
        print "(",address,")"
        print "************************************\n"

        sitio.forceLogin(sysop = True)

        token = sitio.getToken(sysop = True)
        print token
        predata = [
            ('wpBlockAddress', usuario),
            ('wpBlockExpiry', 'other'),
            ('wpBlockOther', plazo),
            ('wpBlockReasonList', 'other'),
            ('wpBlockReason', motivo),
            ('wpCreateAccount', '1'),
            ('wpEnableAutoblock', '1'),
            ('wpBlock', 'Block this user')
            ]
        if token:
            predata.append(('wpEditToken', token))
        data = urlencode(tuple(predata)).replace('%20', '+')
        print data
        conn = httplib.HTTPConnection(host)
        conn.putrequest("POST", address)
        conn.putheader('Content-Length', str(len(data)))
        print str(len(data))

        conn.putheader("Content-type", "application/x-www-form-urlencoded")
        conn.putheader("User-agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0")
        if sitio.cookies(sysop = True):
            conn.putheader('Cookie', sitio.cookies(sysop = True))
        conn.endheaders()
        conn.send(data)
    
        response = conn.getresponse()
        data = response.read()
        conn.close()
    
        if data != '':
            data = data.decode(sitio.encoding())
            try:
                ibegin = data.index('<!-- start content -->') + 22
                iend = data.index('<!-- end content -->')
            except ValueError:
                # if begin/end markers weren't found, show entire HTML file
                wikipedia.output(data)
            else:
                # otherwise, remove the irrelevant sections
                data = data[ibegin:iend]
            wikipedia.output(data)
            return False
def blockall(archivo, usuario, plazo, motivo):
    f=codecs.open(archivo, 'r', 'utf-8')
    lista=f.read().split('\n')
    if "" in lista: lista.remove("")
    f.close()
    for li in lista:
        if 'commons' in li:
            sitio=wikipedia.Site('commons', 'commons')
        elif 'meta' in li:
            sitio=wikipedia.Site('meta', 'meta')
        else:
            chuleta=li.split('.')
            chuleta[1]=chuleta[1].replace("\r","")
            sitio=wikipedia.Site(chuleta[0], chuleta[1]) #('wikipedia','es')
        block(usuario, sitio, plazo, motivo)
argumentos=sys.argv[1:]
argumentos=' '.join(argumentos)
argumentos=argumentos.split(' -')
print argumentos
        
    
    
for argumento in argumentos:
    if argumento.lower().startswith('-archivo:'):
        archivo=argumento.split('-archivo:')[1]
    elif argumento.lower().startswith('usuario:'):
        usuario=argumento.split('usuario:')[1]
    elif argumento.startswith('plazo:'):
        plazo=argumento.split('plazo:')[1]
    elif argumento.startswith('motivo:'):
        motivo=argumento.split('motivo:')[1]

blockall(archivo, usuario, plazo, motivo)