from flask import Blueprint, jsonify, request, redirect, url_for from flask import render_template from csscompressor import compress import random import json from app import app antispider = Blueprint('antispider', __name__, url_prefix='/as') @antispider.before_request def before_request(): user_agent = request.headers.get("User-Agent") print(user_agent) if "Mozilla" in user_agent: # 允许请求通过 return None else: return "错误请求", 403 @antispider.route('/show') def index(): return render_template("antispider/ua_show.html") @antispider.route('/error403') def error403(): return "缺少关键参数", 403 @antispider.route('/cookie_demo') def cookie_demo(): if 'story' in request.cookies: # 如果存在 'story' cookie,则执行相应操作 return render_template("antispider/cookie_demo.html") else: return "没有权限", 403 # CSS 偏移反爬实现 @antispider.route('/deviation') def deviation(): # 假设原数字是 819 # 随机生成1~3位数字,该值表示替换几个数字 # 如果生成1,代表替换一个数字,然后在随机从三个索引位置取一个值,表示替换该值 # 例如随机索引 0,表示生成的数字要替换数字8,接下来生成一个数字,例如生成了 6 # 传递给前台 619,还有被替换的索引0位置的8 # 三个坐标正常生成,然后索引位置为8的数字进行CSS偏移替换。 json_data = None with open(app.root_path + '/data/travel.json', 'r', encoding='utf-8') as f: json_data = json.loads(f.read()) # 随机三位数和四位数,累计20个 num_list = list() for i in range(20): num_list.append(random.randint(100, 9999)) # 循环读取所有生成的数字 for ii, num in enumerate(num_list): # 将数字转换为字符列表,便于进行切割 num_str = list(str(num)) # 随机获取替换几个数字,最大是数字长度,最小是1 replace_count = random.randint(1, len(num_str)) # 随机抽取要被替换的数字 wait_replace_num = random.sample(num_str, replace_count) # 获取要被替换数字的索引位置 index_num = [num_str.index(wait_num) for wait_num in wait_replace_num] # 随机生成数字,数量参考 replace_count b = [random.choice(range(0, 9)) for _ in range(0, replace_count)] # 生成新数字,然后替换前文生成的字符列表 for i, v in enumerate(index_num): num_str[v] = b[i] # 新数字已经生成 ,前台正常渲染即可 new_num = list(map(int, num_str)) """ 816 9 """ # 原数字的对应关系 number_relation = list(zip(index_num, wait_replace_num)) # 获取数字长度,用于前台渲染DIV宽度 len_num = len(num_str) json_data[ii]["new_num"] = new_num json_data[ii]["len_num"] = len_num json_data[ii]["number_relation"] = number_relation return render_template("antispider/deviation.html", json_data=json_data) # CSS 偏移反爬实现 # @antispider.route('/deviation1') # def deviation1(): # return render_template("antispider/deviation1.html") # CSS 伪类实现反爬 @antispider.route('/css_antispider') def css_antispider(): with open(app.root_path + '/data/blogs.json', 'r', encoding='utf-8') as f: json_data = json.loads(f.read()) # 将数据生成到 CSS 中 css_str = "" for index, item in enumerate(json_data): browse = item["browse"] comment = item["comment"] collection = item["collection"] css_str += f""".browse{index+1}::after{{content:'{browse}';font-size:14px;}}.comment{index+1}::after{{content:'{comment}';font-size:14px;}}.collection{index+1}::after{{content:'{collection}';font-size:14px;}}\n""" compressed_css = compress(css_str) with open(app.static_folder + '/css/blog_antispider.min.css', 'w') as f: f.write(compressed_css) return render_template("antispider/css.html",data=json_data)