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)