Search code examples
pythonapishodan

AttributeError: 'str' object has no attribute '_request' for shodan api


import shodan
import sys
from ConfigParser import ConfigParser

#grab the api key from auth.ini
config = ConfigParser()
config.read('auth.ini')
SHODAN_API_KEY = config.get('auth','API_KEY')

#initialize the api object
api = shodan.Shodan(SHODAN_API_KEY)\

# Input validation
if len(sys.argv) == 1:
        print 'Usage: %s <search query>' % sys.argv[0]
        sys.exit(1)

try:

        query = ' '.join(sys.argv[1:])
        parent = query
        exploit = api.Exploits(parent)
        #WHY DOESNT THIS WORK 
        #AttributeError: 'str' object has no attribute '_request'
        print exploit.search(query)

except Exception, e:
        print 'Error: %s' % e
        sys.exit(1)

I a using Python 2.7 I get the AttributeError: 'str' object has no attribute '_request' traceback error shows line 79 in client.py in the Shodan API, is it just me or is their code wonky?

here is the Traceback

Traceback (most recent call last):
  File "exploitsearch.py", line 26, in <module>
    print exploit.search('query')
  File "/usr/local/lib/python2.7/dist-packages/shodan/client.py", line 79, in search
    return self.parent._request('/api/search', query_args, service='exploits')
AttributeError: 'str' object has no attribute '_request'

Solution

  • I'm the founder of Shodan and author of the relevant library you're using. The correct answer is provided by John Gordon above:

    You don't need to instantiate the Exploits class, it is done for you automatically when you create the Shodan() instance. This means that you can directly search for things without any extra work:

        api = shodan.Shodan(YOUR_API_KEY)
        results = api.exploits.search('apache')