【ZoomEye】API利用腳本-12-21更新

腳本利用強(qiáng)大ZoomEye API批量查詢,但是對于一般開發(fā)者的查詢有限制葱蝗,
限制條件
為了防止惡意使用 ZoomEye 平臺的資源喳资,構(gòu)建良好網(wǎng)絡(luò)研究生態(tài)鲁猩。 我們對資源設(shè)置了一定限制條件,保障整個(gè)社區(qū)的健康使用岖沛。
對外開放的開發(fā)者版本暑始,只能獲取總結(jié)果的 30%,同時(shí)涵蓋 100,000 結(jié)果條數(shù)上限婴削。
希望小伙伴們能夠合理利用該腳本廊镜。

#!/usr/bin/env python
# coding:utf-8
import json
import sys
import urllib
from time import sleep

import requests as req

reload(sys)
sys.setdefaultencoding('utf-8')


class ZoomEye(object):
    """利用ZoomEye的API進(jìn)行批量搜索,并將結(jié)果保存到本地
    """

    def __init__(self, host="api.zoomeye.org"):
        self._base_uri = "http://%s" % host
        self._headers = {"Authorization" : "JWT %s" % self.get_token(),
                        "Content-Type": "application/json"}

    def get_token(self):
        """
        獲取ZoomEye的授權(quán)token
        """
        # payload = {"username": "你的ZoomEye賬號", "password": "你的ZoomEye密碼"}
        try:
            res = req.post('https://api.zoomeye.org/user/login',
                           data=json.dumps(payload))
        except Exception as e:
            print e
            sys.exit()
        return json.loads(res.text)['access_token']

    def resource_info(self):
        """
        查看當(dāng)月還有多少剩余查詢結(jié)果
        """
        return req.get("https://api.zoomeye.org/resources-info", headers=self._headers).content

    def get_content(self, searchtype, keyword, startpage, endpage):
        '''
        獲取查詢內(nèi)容
        '''
        for i in xrange(startpage, endpage + 1):
            print "Get page " + str(i) + " info ..."
            uri = 'https://api.zoomeye.org/%s/search?query=%s&page=%s&fact=app,os' % (
                searchtype, urllib.quote(keyword), i)
            try:
                result_page = req.get(uri, headers=self._headers)
                page_content = json.loads(result_page.content)
            except Exception as e:
                print e
            print type(page_content)
            if result_page.status_code == 200:
                # 搜索有兩種類型唉俗,一種是host嗤朴,另一種是web服務(wù)
                if searchtype == 'host':
                    for match in page_content['matches']:
                        # print match
                        # 整理host搜索結(jié)果配椭,這里可以自己看返回包自定義
                        res_line = match['ip'] + ':' + str(match['portinfo']['port']) + '\t' + match[
                            'portinfo']['banner'].strip() + '\t' + match['geoinfo']['isp']
                        print res_line
                        self.save_result(res_line)
                elif searchtype == 'web':
                    for match in page_content['matches']:
                        # 整理web搜索結(jié)果,這里可以自己看返回包自定義
                        res_line = match['ip'][
                            0] + '\t' + match['title'] + '\t' + 'http://' + match['site']
                        print match['ip'][0] + '\t' + 'http://' + match['site']
                        self.save_result(str(res_line).encode('utf-8'))
            else:
                print "Error Code: %s" % result_page.status_code, result_page.content
            sleep(0.2)

    def search(self, keyword, page=1, searchtype="web"):
        '''執(zhí)行查詢操作'''
        uri = 'https://api.zoomeye.org/%s/search?query=%s&page=%s&fact=app,os' % (
            searchtype, urllib.quote(keyword), page)
        pages = self.get_pages(uri)
        # 執(zhí)行查詢操作
        self.get_content(searchtype=searchtype, keyword=keyword,
                         startpage=page, endpage=pages)

    def save_result(self, res):
        '''將結(jié)果寫入文件'''
        with open('result.txt', 'a') as f:
            f.writelines(res + '\n')

    def get_pages(self, uri):
        '''對搜索結(jié)果進(jìn)行分頁'''
        try:
            response = req.get(uri, headers=self._headers)
            search_res = json.loads(response.content)
            print response.url
        except Exception as e:
            print e
        # 此處判斷有無搜索到結(jié)果雹姊,如果響應(yīng)代碼為200表示請求到結(jié)果并返回頁數(shù)股缸,否則打印錯(cuò)誤提示
        if response.status_code == 200:
            total = int(search_res['total'])
            page = total / 10
            if total % 10 == 0:
                return page
            print page
            return page + 1
        else:
            print "Error Code: ", response.status_code, "Tips: ", search_res
            sys.exit()

if __name__ == "__main__":
    zoomeye = ZoomEye()
    # 查看當(dāng)月還有多少剩余查詢結(jié)果
    print zoomeye.resource_info()
    # 查詢
    print zoomeye.search("city:jinan struts2", searchtype="web", page=1)

腳本使用說明
主機(jī)查詢字段
https://www.zoomeye.org/api/doc#search-filters
web查詢字段
https://www.zoomeye.org/api/doc#web-search
Windows下最好右鍵使用IDLE打開該腳本按F5執(zhí)行
如有報(bào)錯(cuò)歡迎截圖留言,我將不斷完善吱雏。
github下載地址:https://github.com/ucstone/codelib

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敦姻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歧杏,更是在濱河造成了極大的恐慌镰惦,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬绒,死亡現(xiàn)場離奇詭異陨献,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懂更,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門眨业,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沮协,你說我怎么就攤上這事龄捡。” “怎么了慷暂?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵聘殖,是天一觀的道長。 經(jīng)常有香客問我行瑞,道長奸腺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任血久,我火速辦了婚禮突照,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氧吐。我一直安慰自己讹蘑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布筑舅。 她就那樣靜靜地躺著座慰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翠拣。 梳的紋絲不亂的頭發(fā)上版仔,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼蛮粮。 笑死益缎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝉揍。 我是一名探鬼主播链峭,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼又沾!你這毒婦竟也來了弊仪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤杖刷,失蹤者是張志新(化名)和其女友劉穎励饵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑燃,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡役听,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了表窘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片典予。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乐严,靈堂內(nèi)的尸體忽然破棺而出瘤袖,到底是詐尸還是另有隱情,我是刑警寧澤昂验,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布捂敌,位于F島的核電站,受9級特大地震影響既琴,放射性物質(zhì)發(fā)生泄漏占婉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一甫恩、第九天 我趴在偏房一處隱蔽的房頂上張望逆济。 院中可真熱鬧,春花似錦填物、人聲如沸纹腌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莱褒,卻和暖如春击困,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工阅茶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛛枚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓脸哀,卻偏偏與公主長得像蹦浦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子撞蜂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盲镶,服務(wù)發(fā)現(xiàn),斷路器蝌诡,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,448評論 6 428
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,731評論 25 707
  • 公眾號看過很多情情愛愛小暖文 確實(shí)像是小太陽 我也想擁有 而發(fā)生故事的那個(gè)人 是你 但遲遲沒有開始沒有結(jié)...
    mmmmmonkey閱讀 182評論 0 0
  • 青島溉贿,夜晚。 你真正想要的東西是不會多說浦旱,你做的只是在心底默默澆灌它就好宇色。據(jù)說,你真心喜歡一件東西說明你是有慧根的...
    L海與天齊藍(lán)閱讀 273評論 0 1