[Pywikipedia-l] How can we block IPs via PWB?
Pedro Sanchez
pdsanchez at gmail.com
Sat Nov 12 19:02:20 UTC 2011
Sorry for starting a new thread, I just suscribed.
I ran into the same problem today and I think I know how to fix it.
On userlib.py there are several checks before attempting to raise a block
def block(self, expiry=None, reason=None, anon=True, noCreate=False,
onAutoblock=False, banMail=False, watchUser=False, allowUsertalk=True,
reBlock=False, hidename=False):
if self._isAutoblock:
#This user is probably being queried for purpose of lifting
#an autoblock, so can't be blocked.
raise AutoblockUser
if self.isBlocked() and not reBlock:
raise AlreadyBlocked()
if not self.site().isAllowed('block', sysop=True):
raise UserActionRefuse('You don\'t have permission to block')
if not expiry:
expiry = pywikibot.input(u'Please enter the expiry time
for the block:')
if not reason:
reason = pywikibot.input(u'Please enter a reason for the block:')
if (not self.site().has_api()) or self.site().versionnumber() < 12:
return self._blockOld(expiry, reason, anon, noCreate,
onAutoblock, banMail, watchUser,
allowUsertalk, reBlock)
params = {
'action': 'block',
'user': self.name(),
'token': self.site().getToken(self, sysop = True),
'reason': reason,
}
Notice last check: If the site doesn't have an API or version number
is too old, then use a deprecated function to raise the block.
We could add a check there as in
if self.isAnonymous() or (not self.site().has_api()) or
self.site().versionnumber() < 12:
so if user is an IP, goes to the old method. However the error would
persist. This because the checks above also need a user
(user.isBlocked() fails for IP).
quick hack would be moving this check at the top:
def block(self, expiry=None, reason=None, anon=True, noCreate=False,
onAutoblock=False, banMail=False, watchUser=False, allowUsertalk=True,
reBlock=False, hidename=False):
if self.isAnonymous() or (not self.site().has_api()) or
self.site().versionnumber() < 12:
return self._blockOld(expiry, reason, anon, noCreate,
onAutoblock, banMail, watchUser,
allowUsertalk, reBlock)
if self._isAutoblock:
#This user is probably being queried for purpose of lifting
#an autoblock, so can't be blocked.
raise AutoblockUser
if self.isBlocked() and not reBlock:
raise AlreadyBlocked()
This way, if user = IP, goes directly into the depprecated ol method
and doesn't execute the API-useronly functions.
Now running gives
:!python bloqueador.py
Bloqueando 128.163.142.21
Traceback (most recent call last):
File "bloqueador.py", line 86, in <module>
main()
File "bloqueador.py", line 79, in main
bot.run()
File "bloqueador.py", line 48, in run
self.treat(user)
File "bloqueador.py", line 62, in treat
user.block(expiry="1 year", reason="Proxy", anon=True)
File "/home/drini/pywiki/userlib.py", line 381, in block
allowUsertalk, reBlock)
TypeError: _blockOld() takes exactly 9 arguments (10 given)
It seems code had another bug: _Blockold() doesn't accept a "reBlock"
parameter:
def _blockOld(self, expiry, reason, anonOnly, noSignup,
enableAutoblock, emailBan,
watchUser, allowUsertalk):
So we fix again the call as
if self.isAnonymous() or (not self.site().has_api()) or
self.site().versionnumber() < 12:
return self._blockOld(expiry, reason, anon, noCreate,
onAutoblock, banMail, watchUser,
allowUsertalk)
It SHOULD work now... except I get a cryptic error:
:!python bloqueador.py
Bloqueando 128.163.142.21
Getting a token.
Note: Your sysop account on wikipedia:es does not have a bot flag. Its
edits will be visible in the recent changes.
Blocking [[User:128.163.142.21]]...
Traceback (most recent call last):
File "bloqueador.py", line 86, in <module>
main()
File "bloqueador.py", line 79, in main
bot.run()
File "bloqueador.py", line 48, in run
self.treat(user)
File "bloqueador.py", line 62, in treat
user.block(expiry="1 year", reason="Proxy", anon=True)
File "/home/drini/pywiki/userlib.py", line 381, in block
allowUsertalk)
File "/home/drini/pywiki/userlib.py", line 471, in _blockOld
raise BlockError
userlib.BlockError
shell returned 1
Hope it helps Amir, and if you find a solution, please tell since I'm
stuck with the same problem
Pedro Sánchez
http://drini.mx
@combinatorica
More information about the Pywikipedia-l
mailing list