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'
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')