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

我使用 Python 2.7 我得到 AttributeError: 'str' object has no attribute '_request' traceback 错误在 Shodan API 的 client.py 中显示第 79 行,是我自己还是他们的代码有问题?

这是回溯

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

3 回答 3

3

我是 Shodan 的创始人,也是您正在使用的相关库的作者。上面的 John Gordon 提供了正确答案:

您不需要实例化 Exploits 类,它会在您创建 Shodan() 实例时自动为您完成。这意味着您可以直接搜索内容而无需任何额外工作:

    api = shodan.Shodan(YOUR_API_KEY)
    results = api.exploits.search('apache')
于 2015-10-31T00:52:16.707 回答
0

parent变量应该是类型Shodan。您正在使用变量初始化Exploits类。string这是您导致问题的行https://github.com/achillean/shodan-python/blob/master/shodan/client.py#L79

于 2015-10-30T17:05:59.497 回答
0

Exploits是超类的子Shodan类。这个类有一个方法叫做_request. 当您初始化一个实例Exploits并执行该search方法时,代码会在内部调用 super (read: Shodan) 方法,_request. 由于您将字符串类型传递给类构造函数,因此它试图在字符串对象上调用此方法,并且(正确地)抱怨该方法不是str.

这是git repo。在第 79 行,您可以看到此调用发生的位置:

return self.parent._request('/api/search', query_args, service='exploits')

因此,您可以看到您的parent变量应该是 Shodan 的一个实例,或者您的api变量。

于 2015-10-30T17:06:34.887 回答