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

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

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


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


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


@antispider.route('/cookie_demo')
def cookie_demo():
    if 'story' in request.cookies:
        # 如果存在 'story' cookie,则执行相应操作
        return render_template("antispider/cookie_demo.html")
    else:
        return "没有权限", 403
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 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 98 99 100 101 102 103


# 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))

        """
        <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


    return render_template("antispider/deviation.html",json_data=json_data)

# CSS 偏移反爬实现
@antispider.route('/deviation1')
def deviation1():
    return render_template("antispider/deviation1.html")