一.摘要
Censys提供了search、view、report、query、export以及data六種API接口。
search接口的請求地址是https://www.censys.io/api/v1/search/?,其中?的地方可以是ipv4、websites或者certificates,分別代表搜索ipv4主機、網站和證書。我們的POST請求應該是一組包含query、page、fields的json數據,其中query指的是相應的搜索語句;page代表返回的頁碼,Censys總是返回一頁的數據;fields指的是你希望返回值中包含哪些字段,具體包含哪些字段你可以自己去看一下。
JSON有兩種結構:
對象在js中表示為“{}”括起來的內容,數據結構為 {key:value,key:value,...}的鍵值對的結構
數組在js中是中括號“[]”括起來的內容,數據結構為 ["java","javascript","vb",...]
二.利用代碼
# -*- coding: UTF-8 -*- #https://www.censys.io/api/v1/search/ipv4 #post:{"query": "keyword", "page": 1, "fields": ["ip", "protocols", "location.country"]} #query指的是相應的搜索語句;page代表返回的頁碼;fields指的是你希望返回值中包含哪些字段 import sys import json import requests import time API_URL = "https://www.censys.io/api/v1" UID = "85e64536-7534-4177-8c72-9a383bf01f12" SECRET = "9hCyul4KXJKXieyXeGIFT0lr04rbN9yQ" page=1 PAGES=2 def getIp(page): iplist=[] data = { "query":"keyword", "page":page, "fields":["ip","protocols","location.country"] } try: res = requests.post(API_URL + "/search/ipv4", data=json.dumps(data), auth=(UID, SECRET)) except: pass try: results = res.json() except: pass if res.status_code != 200: print "error occurred: %s" % results["error"] sys.exit(1) #print "Total_count:%s" % (results["metadata"]["count"]) iplist.append("Total_count:%s" % (results["metadata"]["count"])) for result in results["results"]: #print "%s in %s" % (result["ip"],result["location.country"][0]) #iplist.append((result["ip"]+':'+i+' in '+result["location.country"][0])) for i in result["protocols"]: iplist.append(result["ip"]+':'+i+' in '+result["location.country"][0]) return iplist if __name__ == '__main__': print "start..." with open('censys.txt','a') as f: while page <= PAGES: iplist=(getIp(page)) print 'page is:'+str(page) page += 1 time.sleep(1) for i in iplist: f.write(i+'\n')
首先request請求,post提交data和auth信息,返回json數據包,利用json數據結構找的所需信息,保存並返回一個列表。
主函數判斷page大小,不夠就調用getIp函數,最后循環寫入結果。