文章采集api(今日未采集资产列表:已访问过得加密,明天加上)
优采云 发布时间: 2021-11-26 17:17文章采集api(今日未采集资产列表:已访问过得加密,明天加上)
获取今天不是 采集 的资产列表:
关键点:
1、server表增加了两个字段:latest_date(可以为空);服务器状态信息;
2、什么情况下会获取采集服务器信息?
①latest_date为空时,如未上报的资产的初始创建;
②今天还没到采集,关注latest_date__date__lt
③服务器状态在线
3、设置current_date=datetime.datetime.now(); 当服务器更新资产时
4、get_host_list 函数:
注:内容放在response.text部分(response=request.get(url))
代码区:
###############服务端###############
@csrf_exempt
def server(request):
'''
requests不能发送字典类型数据,纵观我们学的form表单提交数据,
ajax发送数据,均是不支持字典类型数据的发送的。
具体原因百度知晓。
:param request:
:return:
'''
if request.method == 'GET':
# 获取今日未采集主机列表[latest_date为None或者latest_date不为今日且服务器状态为在线]
current_date = date.today()
host_list = models.Server.objects.filter(
Q(Q(latest_date=None) | Q(latest_date__date__lt=current_date)) & Q(server_status_id=2)).values('hostname')
'''
['hostname':'c1.com']
'''
host_list = list(host_list)
print(host_list)
return HttpResponse(json.dumps(host_list))
#############客户端#############
class SshSaltClient(BaseClient):
def get_host_list(self):
response=requests.get(self.api) #
# print(response.text) # [{"hostname": "c1.com"}]注意这种用法
return json.loads(response.text)
接口验证
要点:过三关
第一关:时间限制(超出客户端时间和服务器之间的时间间隔,我们团队要求限制)
第二关:加密规则限制(主要应用MD5加密)
第三遍:我们为已访问过的加密str设置访问列表。普通用户不可能再用这个访问过的数据向服务器请求。如果列表中没有str,则证明是普通用户访问,记得将此数据加入到访问列表中。
这个内容会越来越大,实际会应用到memcache和redis上。
后三个级别基本可以达到防止黑客攻击的效果,但不排除黑客的网速比我们快。我们不妨对要发送的数据进行加密,然后尽快将黑客的网速提交给服务器。这不是一个坏主意吗?
代码区:
##############客户端##############
import requests
import time
import hashlib
def md5(arg):
md5 = hashlib.md5()
md5.update(arg.encode('utf-8'))
return md5.hexdigest()
key = 'asdfghjklmnbvcxz'
ctime = str(time.time())
client_str = '%s|%s' % (key, ctime)
client_md5_str = md5(client_str)
client_header_str = '%s|%s' % (client_md5_str, ctime)
print(client_header_str)
response = requests.get(url='http://127.0.0.1:8000/api/tests.html', headers={'auth-api': 'cae76146bfa06482cfee7e4f899cc414|1506956350.973326'})
print(response.text)
##############服务端##############
def md5(arg):
md5 = hashlib.md5()
md5.update(arg.encode('utf-8'))
return md5.hexdigest()
key = 'asdfghjklmnbvcxz'
vistied_str_dict={}
def tests(request):
client_header_str = request.META.get('HTTP_AUTH_API')
print(client_header_str)
client_md5_str, client_ctime = client_header_str.split('|', maxsplit=1)
client_float_ctime = float(client_ctime)
server_float_ctime = float(time.time())
# 第一关
if (client_float_ctime + 20) < server_float_ctime:
return HttpResponse("太慢了")
# 第二关
server_str = '%s|%s' % (key, client_ctime)
server_md5_str = md5(server_str)
if client_md5_str != server_md5_str:
return HttpResponse('休想')
# 第三关
if vistied_str_dict.get(client_md5_str):
return HttpResponse('放弃吧')
else:
vistied_str_dict[client_md5_str] = client_ctime
return HttpResponse('你得到我了')
最后,没有使用装饰器,明天将添加。