index.py 4.2 KB
Newer Older
梦想橡皮擦's avatar
梦想橡皮擦 已提交
1 2
from flask import Blueprint, jsonify, request, redirect, url_for
from flask import render_template
梦想橡皮擦's avatar
梦想橡皮擦 已提交
3
from csscompressor import compress
4 5 6 7
import random
import json

from app import app
梦想橡皮擦's avatar
梦想橡皮擦 已提交
8 9 10 11 12 13 14 15 16 17 18 19

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:
梦想橡皮擦's avatar
梦想橡皮擦 已提交
20
        return "错误请求", 403
梦想橡皮擦's avatar
梦想橡皮擦 已提交
21 22 23 24 25 26 27 28 29 30


@antispider.route('/show')
def index():
    return render_template("antispider/ua_show.html")


@antispider.route('/error403')
def error403():
    return "缺少关键参数", 403
梦想橡皮擦's avatar
梦想橡皮擦 已提交
31 32 33 34 35 36 37 38 39


@antispider.route('/cookie_demo')
def cookie_demo():
    if 'story' in request.cookies:
        # 如果存在 'story' cookie,则执行相应操作
        return render_template("antispider/cookie_demo.html")
    else:
        return "没有权限", 403
40 41 42 43 44 45 46 47 48 49 50 51 52


# CSS 偏移反爬实现
@antispider.route('/deviation')
def deviation():
    # 假设原数字是 819
    # 随机生成1~3位数字,该值表示替换几个数字
    # 如果生成1,代表替换一个数字,然后在随机从三个索引位置取一个值,表示替换该值
    # 例如随机索引 0,表示生成的数字要替换数字8,接下来生成一个数字,例如生成了 6
    # 传递给前台 619,还有被替换的索引0位置的8
    # 三个坐标正常生成,然后索引位置为8的数字进行CSS偏移替换。
    json_data = None

梦想橡皮擦's avatar
梦想橡皮擦 已提交
53
    with open(app.root_path + '/data/travel.json', 'r', encoding='utf-8') as f:
54 55 56 57 58 59 60 61
        json_data = json.loads(f.read())

    # 随机三位数和四位数,累计20个
    num_list = list()
    for i in range(20):
        num_list.append(random.randint(100, 9999))

    # 循环读取所有生成的数字
梦想橡皮擦's avatar
梦想橡皮擦 已提交
62
    for ii, num in enumerate(num_list):
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
        # 将数字转换为字符列表,便于进行切割
        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))

        """
        <b style="width:48px;left:-48px;"><i style="width: 16px;">8</i><i style="width: 16px;">1</i><i style="width: 16px;">6</i></b>
        <b style="width:16px;left:-16px">9</b>
        """
        # 原数字的对应关系
        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

梦想橡皮擦's avatar
梦想橡皮擦 已提交
98
    return render_template("antispider/deviation.html", json_data=json_data)
99 100 101


# CSS 偏移反爬实现
梦想橡皮擦's avatar
梦想橡皮擦 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
# @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)