[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