Results 1 to 10 of 17

Thread: [Python] NeoAccount Class (include AMF requests)

Threaded View

  1. #1

    Joined
    Jun 2012
    Posts
    131
    Userbars
    1
    Thanks
    21
    Thanked
    50/22
    DL/UL
    37/0
    Mentioned
    22 times
    Time Online
    4d 17h 8m
    Avg. Time Online
    1m

    [Python] NeoAccount Class (includes AMF requests)

    Written in Python 2.7

    Code:
    import urllib2, urllib, cookielib
    import StringIO, gzip
    
    
    class NeoAccount:
    
        d = 'http://www.neopets.com'
        headers = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1'),
                    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
                    ('Accept-Language', 'en-us,en;q=0.5'),
                    ('Accept-Encoding', 'gzip, deflate')]
        
        def __init__(self, user, pw, proxy = None):
            self.user = user
            self.pw = pw
            self.proxy = proxy
            self.referer = ''
            
            cj = cookielib.LWPCookieJar()
            cookie_handler = urllib2.HTTPCookieProcessor(cj)
            
            if proxy != None:
                proxy_handler = urllib2.ProxyHandler({'http': 'http://' + proxy + '/'})
                self.opener = urllib2.build_opener(proxy_handler, cookie_handler)
            else:
                self.opener = urllib2.build_opener(cookie_handler)
    
        def __str__(self):
            return '%s:%s' % (self.user, self.pw)
    
        def get(self, url, referer = '', readable = True):
            if url[0] == '/':
                url = self.d + url
            if referer == '':
                referer = self.referer
            self.opener.addheaders = [('Referer', referer)]  + self.headers
            res = self.opener.open(url)
            self.referer = res.geturl()
            if readable:
                return self.readable(res)
            else:
                return res
    
        def post(self, url, data, referer = '', readable = True):
            if url[0] == '/':
                url = self.d + url
            if referer == '':
                referer = self.referer
            self.opener.addheaders = [('Content-Type', 'application/x-www-form-urlencoded'),
                                      ('Referer', referer)] + self.headers
            res = self.opener.open(url, urllib.urlencode(data))
            self.referer = res.geturl()
            if readable:
                return self.readable(res)
            else:
                return res
    
        def amf(self, packet, gateway = 'http://services.neopets.com/amfphp/gateway.php', referer = ''):
            if referer == '':
                referer = self.referer
            self.opener.addheaders = [('Content-Type', 'application/x-amf'),
                                      ('Referer', referer)] + self.headers
            res = self.opener.open(gateway, packet)
            return res.read()
    
        def login(self):
            res = self.get('/index.phtml')
            res = self.post('/login.phtml', {'username': self.user,
                                             'password': self.pw,
                                             'destination': "/index.phtml"}, readable = False)
            if 'badpassword' in res.geturl():
                return False, 'Bad password'
            elif 'hello' in res.geturl():
                return False, 'Birthday locked'
            elif 'login' in res.geturl():
                return False, 'Frozen'
            elif 'index' in res.geturl():
                return True, 'Logged in'
    
        def readable(self, data):
            if 'gzip' in str(data.info()):
                return gzip.GzipFile(fileobj=StringIO.StringIO(data.read())).read()
            else:
                return data.read()
    Code:
    >>> acc = NeoAccount('username', 'password')
    >>> acc .login()
    (True, 'Logged in')
    >>> html = acc.get('/objects.phtml?type=inventory')
    In post, data should be a dictionary. In amf, packet is a string representing the packet.

    This was my first time writing anything to actually navigate neopets so let me know if I missed a crucial feature or if I could add anything to make it more secure/easier to use. I was just writing something to make use of rare's pin crack idea but it seems the idea is patched up. I figured I might as well share some of the code so that the time doesn't go to waste '
    Last edited by ikakk; 09-11-2012 at 08:40 PM.

  2. The Following 8 Users Say Thank You to ikakk For This Useful Post:

    Auroz (08-12-2015),DarkByte (10-01-2013),Ghosts (12-10-2014),Graff (09-11-2012),james087 (09-11-2012),mt5o5bd (02-05-2014),Reemer (09-11-2012),Water (10-16-2014)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •