首页 > 其他分享 >爬虫风控轨迹详解

爬虫风控轨迹详解

时间:2024-12-16 09:33:35浏览次数:3  
标签:numberListre 爬虫 param 风控 start 详解 np end type

一、录制轨迹

其实这是一个比较原始的方式,我在最早做某音滑块的时候因为不会写轨迹算法,就选择一条一条在网址滑动录制下来,依稀记得我滑了一晚上,成功率还感人,不到百分之二十......
但是这个需要看用什么场景,例如一些滑动到底的滑块就很好应用,是的没错,就是我们的老朋友某里231与某团的,这里短暂看一下先看一下某里的(后面会单独出一个某团的滑块文章详解),我最早做140,223的时候就选择这个方法,巨好用,当时自己也差不多滑了一晚上,存了几万条随取随用,唯一不好的就是太笨重了,整个项目很臃肿。

二、缩放轨迹

简而言之,也类似录制轨迹,只不过唯一不同的这个相对于缺口滑块的成功率会更高,当初某盾与某数就是这么做的,网址多滑动几次轨迹,以此保存下来,按照识别滑块的距离使用不同比例的缩放,这里我简单示范一下1.从⽹站上拿⼀条真实轨迹,然后对该轨迹进⾏操作2.滑动滑块(尽量拉到底),先在js中跟栈,然后找出该次滑动对应的坐标以及轨迹3.进⾏缩放,⽐如拿到的轨迹对应的坐标是250,那么当坐标为150时,两个轨迹的倍数就是250/150,然后按照这个倍数对250的那条轨迹进⾏整体缩放

三、缓动函数

在简述了上面两种方式后,这里已经对轨迹有逐步的解了,但是以上两种只能针对一些风控较弱或者特定的一些场景,到了这里如果一些网址开始加强一些风控的时候,那么这两个方案就不在生效了,那么这个时候就开始需要一些拟人的特征,那么在初步的风控中也就可以应用到缓动函数了。这里先简单了解一下什么是缓动函数:BackEase:动画开始在指定路径上运动前稍微收缩动画的运行。

BounceEase:创建弹跳效果。

CircleEase:使用圆函数创建加速和/或减速的动画。CubicEase:使用公式 f(t) = t3 创建加速和/或减速的动画。ElasticEase:创建一个动画,模拟弹簧的来回振荡运动,直到它达到停止状态。ExponentialEase:使用指数公式创建加速和/或减速的动画。PowerEase:使用公式 f(t) = tp 创建加速和/或减速的动画,其中 p 等于 Power 属性。QuadraticEase:使用公式 f(t) = t2 创建加速和/或减速的动画。QuarticEase:使用公式 f(t) = t4 创建加速和/或减速的动画。QuinticEase:使用公式 f(t) = t5 创建加速和/或减速的动画。SineEase:使用正弦公式创建加速和/或减速的动画。

缓动函数之前多数应用于动画场景,用于控制动画过渡过程中的速度变化,通过不同的函数曲线使得动画看起来更自然与流畅,但是其中有最为关键的一点:自动加减速,那么能做这一点就可以用到逆向领域了,我们可以在网址手动滑动一下,用python自带的画图库画出来,看一下轨迹的一个波动曲线,在针对下图进行代码轨迹特征进行适配,来找到一个最为相似的进行编写。

 这里我简单放几个缓动函数的算法,大家可以参考一下
easeInSine

function easeInSine(x: number): number {
  return 1 - cos((x * PI) / 2);
}

easeOutSine

function easeOutSine(x: number): number {
  return sin((x * PI) / 2);
}

easeInQuad

function easeInOutSine(x: number): number {
  return -(cos(PI * x) - 1) / 2;
}

四、贝塞尔曲线

首先我们先来了解一下什么是贝塞尔曲线:

贝塞尔曲线是一种用数学公式定义的参数化曲线,广泛应用于计算机图形学、动画、矢量图形设计、字体渲染等领域。贝塞尔曲线的核心是通过少量参数(控制点)灵活地创建复杂的平滑曲线,同时提供精确的数学描述。这个是目前最主流的,也算是最常用的,现在最新的231就基于这个来处理的,在生成能用的轨迹过后,在单独加上一些噪点即可

import numpy as np
import math
import random


class bezierTrajectory:

    def _bztsg(self, dataTrajectory):
        lengthOfdata = len(dataTrajectory)

        def staer(x):
            t = ((x - dataTrajectory[0][0]) / (dataTrajectory[-1][0] - dataTrajectory[0][0]))
            y = np.array([0, 0], dtype=np.float64)
            for s in range(len(dataTrajectory)):
                y += dataTrajectory[s] * ((math.factorial(lengthOfdata - 1) / (
                        math.factorial(s) * math.factorial(lengthOfdata - 1 - s))) * math.pow(t, s) * math.pow(
                    (1 - t), lengthOfdata - 1 - s))
            return y[1]

        return staer

    def _type(self, type, x, numberList):
        numberListre = []
        pin = (x[1] - x[0]) / numberList
        if type == 0:
            for i in range(numberList):
                numberListre.append(i * pin)
            if pin >= 0:
                numberListre = numberListre[::-1]
        elif type == 1:
            for i in range(numberList):
                numberListre.append(1 * ((i * pin) ** 2))
            numberListre = numberListre[::-1]
        elif type == 2:
            for i in range(numberList):
                numberListre.append(1 * ((i * pin - x[1]) ** 2))

        elif type == 3:
            dataTrajectory = [np.array([0, 0]), np.array([(x[1] - x[0]) * 0.8, (x[1] - x[0]) * 0.6]),
                              np.array([x[1] - x[0], 0])]
            fun = self._bztsg(dataTrajectory)
            numberListre = [0]
            for i in range(1, numberList):
                numberListre.append(fun(i * pin) + numberListre[-1])
            if pin >= 0:
                numberListre = numberListre[::-1]
        numberListre = np.abs(np.array(numberListre) - max(numberListre))
        biaoNumberList = ((numberListre - numberListre[numberListre.argmin()]) / (
                numberListre[numberListre.argmax()] - numberListre[numberListre.argmin()])) * (x[1] - x[0]) + x[0]
        biaoNumberList[0] = x[0]
        biaoNumberList[-1] = x[1]
        return biaoNumberList

    def getFun(self, s):
        '''
        :param s: 传入P点
        :return: 返回公式
        '''
        dataTrajectory = []
        for i in s:
            dataTrajectory.append(np.array(i))
        return self._bztsg(dataTrajectory)

    def simulation(self, start, end, le=1, deviation=0, bias=0.5):
        '''
        :param start:开始点的坐标 如 start = [0, 0]
        :param end:结束点的坐标 如 end = [100, 100]
        :param le:几阶贝塞尔曲线,越大越复杂 如 le = 4
        :param deviation:轨迹上下波动的范围 如 deviation = 10
        :param bias:波动范围的分布位置 如 bias = 0.5
        :return:返回一个字典equation对应该曲线的方程,P对应贝塞尔曲线的影响点
        '''
        start = np.array(start)
        end = np.array(end)
        cbb = []
        if le != 1:
            e = (1 - bias) / (le - 1)
            cbb = [[bias + e * i, bias + e * (i + 1)] for i in range(le - 1)]

        dataTrajectoryList = [start]

        t = random.choice([-1, 1])
        w = 0
        for i in cbb:
            px1 = start[0] + (end[0] - start[0]) * (random.random() * (i[1] - i[0]) + (i[0]))
            p = np.array([px1, self._bztsg([start, end])(px1) + t * deviation])
            dataTrajectoryList.append(p)
            w += 1
            if w >= 2:
                w = 0
                t = -1 * t

        dataTrajectoryList.append(end)
        return {"equation": self._bztsg(dataTrajectoryList), "P": np.array(dataTrajectoryList)}

    def trackArray(self, start, end, numberList, le=1, deviation=0, bias=0.5, type=0, cbb=0, yhh=10):
        '''
        :param start:开始点的坐标 如 start = [0, 0]
        :param end:结束点的坐标 如 end = [100, 100]
        :param numberList:返回的数组的轨迹点的数量 numberList = 150
        :param le:几阶贝塞尔曲线,越大越复杂 如 le = 4
        :param deviation:轨迹上下波动的范围 如 deviation = 10
        :param bias:波动范围的分布位置 如 bias = 0.5
        :param type:0表示均速滑动,1表示先慢后快,2表示先快后慢,3表示先慢中间快后慢 如 type = 1
        :param cbb:在终点来回摆动的次数
        :param yhh:在终点来回摆动的范围
        :return:返回一个字典trackArray对应轨迹数组,P对应贝塞尔曲线的影响点
        '''
        s = []
        fun = self.simulation(start, end, le, deviation, bias)
        w = fun['P']
        fun = fun["equation"]
        if cbb != 0:
            numberListOfcbb = round(numberList * 0.2 / (cbb + 1))
            numberList -= (numberListOfcbb * (cbb + 1))

            xTrackArray = self._type(type, [start[0], end[0]], numberList)
            for i in xTrackArray:
                s.append([i, fun(i)])
            dq = yhh / cbb
            kg = 0
            ends = np.copy(end)
            for i in range(cbb):
                if kg == 0:
                    d = np.array([end[0] + (yhh - dq * i),
                                  ((end[1] - start[1]) / (end[0] - start[0])) * (end[0] + (yhh - dq * i)) + (
                                          end[1] - ((end[1] - start[1]) / (end[0] - start[0])) * end[0])])
                    kg = 1
                else:
                    d = np.array([end[0] - (yhh - dq * i),
                                  ((end[1] - start[1]) / (end[0] - start[0])) * (end[0] - (yhh - dq * i)) + (
                                          end[1] - ((end[1] - start[1]) / (end[0] - start[0])) * end[0])])
                    kg = 0
                print(d)
                y = self.trackArray(ends, d, numberListOfcbb, le=2, deviation=0, bias=0.5, type=0, cbb=0, yhh=10)
                s += list(y['trackArray'])
                ends = d
            y = self.trackArray(ends, end, numberListOfcbb, le=2, deviation=0, bias=0.5, type=0, cbb=0, yhh=10)
            s += list(y['trackArray'])

        else:
            xTrackArray = self._type(type, [start[0], end[0]], numberList)
            for i in xTrackArray:
                s.append([i, fun(i)])
        return {"trackArray": np.array(s), "P": w}


a = bezierTrajectory()
r = a.trackArray(start=[830, 559], end=[1085, 554], numberList=30, le=4, deviation=0, bias=0.5, type=2, cbb=0,
                 yhh=0)
g = []
for i, l in enumerate(r['trackArray']):
    s = {}
    s['pageX'] = int(l[0])
    s['clientX'] = int(l[0])
    s['pageY'] = int(l[1])
    s['clientY'] = int(l[1])
    s['type'] = "mousedown" if i == 3 else "mousemove"
    s['which'] = 1 if i == 3 else 0
    g.append(s)
print(g)

  

                                                         

标签:numberListre,爬虫,param,风控,start,详解,np,end,type
From: https://www.cnblogs.com/yoyo1216/p/18609225

相关文章

  • kafka详解
    kafka详解一、简介kafka是一个高吞吐的分布式消息系统,生产者生产数据,消费者消费数据。二、基本架构kafka是一个去中心化的架构,元数据存储在zookeeper中,数据存在硬盘上。producer:消息生存者consumer:消息消费者broker:kafka集群的server,负责处理消息读、写请求,存储消息topic......
  • burpsuite,Decoder comparer logger模块使用详解
    公众号:泷羽Sec-尘宇安全声明!学习视频来自B站up主泷羽sec有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击......
  • 深度Q网络(Deep Q-Network, DQN)详解
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 使用YOLOv4训练DeepFashion2数据集详解
    文章目录使用YOLOv4训练DeepFashion2数据集详解一、引言二、准备工作1、数据集和代码准备2、环境配置三、数据预处理1、生成训练和验证集标签2、调整数据集路径四、模型训练1、修改配置文件2、开始训练五、使用示例六、总结使用YOLOv4训练DeepFashion2数据集详解......
  • MyBatis详解---关联映射
    目录引入一、创建表结构1.学生表2.老师表二、查询学生对应的老师1.第一种形式连表查询 ①:设置实体类②:查询语句2.第二种形式分步查询(分段查询--支持懒加载)①:设置实体类②:查询语句三、查询教师的学生(一对多)1.第一种形式:按照结果嵌套处理 ①.设置实体类②......
  • 简单上手Python爬虫实战:QQ邮箱收件箱信息爬取
        本次Python爬虫实战运用到的技术比原来多了一个selenium,如果有小伙伴不知道selenium是什么的话,这边建议你们出门左拐去搜一下,毕竟山海君也不会讲原理,怕误人子弟。这个实战本来是我们实验报告里的,但是感觉实战专栏里没有涉及到selenium这一部分,就放到这里了。(邮箱涉......
  • 推荐3款自动爬虫神器,再也不用手撸代码了
    网络爬虫是一种常见的数据采集技术,你可以从网页、APP上抓取任何想要的公开数据,当然需要在合法前提下。爬虫使用场景也很多,比如:搜索引擎机器人爬行网站,分析其内容,然后对其进行排名,比如百度、谷歌价格比较网站,部署机器人自动获取联盟卖家网站上的价格和产品描述,比如什么值......
  • Kubernetes Service 详解:如何轻松管理集群中的服务
    KubernetesService详解:如何轻松管理集群中的服务在Kubernetes中,Service是一个非常核心的概念。它解决了容器之间的通信问题,确保了无论容器如何启动或销毁,服务都能保持稳定的访问方式。今天,我想通过一篇简单易懂的文章,带大家一起探讨一下Kubernetes中的Service,它的作用......
  • 微信native支付对接案例详解
    微信native支付对接案例详解效果展示native支付产品介绍接入前准备开发指引API列表支付通知开发者社区整体原则就是按照官方文档一步一步来支付产品微信认证注意:只有服务号才能对接微信支付。每年都需要花300块认证费用。......
  • 最新毕设-SpringBoot-养老院信息管理系统-17255(免费领项目)可做计算机毕业设计JAVA、PH
    基于SpringBoot的养老院信息管理系统的设计与实现摘 要21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管......