发明内容
鉴于上述问题,本发明提出了一种视频直播的风险控制方法及装置,降低了代码开发量,且实现了快速响应,便于调试和维护。
第一方面,本申请通过本申请的一实施例提供如下技术方案:
一种视频直播的风险控制方法,包括:
获取用户登录后产生的数据源以及所述用户的身份信息;
加载并拷贝预设的惩罚数据表,获得二维执行数据表;其中,所述惩罚数据表为二维的数据表,在所述惩罚数据表中存放有多个惩罚函数、多个身份信息和多个数据源;一所述身份信息与一所述数据源可定位一所述惩罚函数;一所述惩罚函数与一所述数据源可定位另一惩罚函数;
根据预设的接口函数与所述二维执行数据表,构建一维执行数据表;其中,所述一维执行数据表中的元素值为初始化的无效数据;
当所述身份信息对应的用户未被风险控制时,根据所述数据源与所述身份信息,对所述一维执行数据表中的对应的元素赋值,获得目标元素值;将所述目标元素值对应的惩罚函数确定为需要执行的惩罚函数;
当所述身份信息对应的用户被风险控制时,获取所述用户当前正在被执行的惩罚函数;根据所述数据源与所述正在被执行的惩罚函数,对所述一维执行数据表中的对应的元素赋值,获得目标元素值;将所述目标元素值对应的惩罚函数确定为需要执行的惩罚函数;
根据所述身份信息,执行所述惩罚函数,以对所述用户进行风险控制。
可选的,所述加载并拷贝预设的惩罚数据表之前,还包括:
定义所述身份信息对应的身份等级;所述身份等级从低至高依次包括:游客、低等级用户、低活跃用户、沉默用户、高等级用户、活跃用户以及VIP用户;
定义所述惩罚函数;所述惩罚函数的等级从轻至重依次包括:将用户离线、在预设时间内禁止登录、禁止发送弹幕以及封禁用户账号;
对所述数据源划分数据类型;所述数据类型包括:ip数据、设备信息、行为数据、作弊识别数据以及代码校验数据;
根据所述身份等级、所述惩罚函数以及所述数据源的数据类型,构建所述惩罚数据表;其中,所述惩罚数据表中所述身份等级由低至高排列,所述惩罚函数的等级由轻至重排列。
可选的,在所述惩罚数据表中,
采用Identity_End标识所述身份等级编排完成;
采用Punish_End标识所述惩罚函数编排完成;以及
采用Data_End标识所述数据源的数据类型编排完成。
可选的,所述根据预设的接口函数与所述二维执行数据表,构建一维执行数据表,包括:
通过函数punishinfo_resize(identiy_num*data_num,numeric_limits<uint16_t>::max())构建一维空数组;其中,identiy_num为身份等级的总个数,data_num为数据源的总个数;numeric_limits<uint16_t>::max()表示将元素值初始化为uint16_t的最大值,所述最大值表示为无效数据;
通过函数size_t index(),将所述二维执行数据表中的元素填充至所述空数组中,获得所述一维执行数据表。
可选的,所述根据所述身份信息,执行所述惩罚函数之前,包括:
通过bind函数对所述惩罚函数绑定一传参位置,获得函数执行体;
根据多个惩罚函数对应的函数执行体,获得惩罚函数执行数组。
可选的,所述根据所述身份信息,执行所述惩罚函数,包括:
根据所述惩罚函数,在所述惩罚函数执行数组中查询目标函数执行体;所述目标函数执行体为所述惩罚函数对应的函数执行体;
向所述目标函数执行体的传参位置传入所述身份信息,以执行所述惩罚函数对所述用户进行风险控制。
第二方面,基于同一发明构思,本申请通过本申请的一实施例提供如下技术方案:
一种视频直播的风险控制装置,包括:
第一获取模块,用于获取用户登录后产生的数据源以及所述用户的身份信息;
第二获取模块,用于加载并拷贝预设的惩罚数据表,获得二维执行数据表;其中,所述惩罚数据表为二维的数据表,在所述惩罚数据表中存放有多个惩罚函数、多个身份信息和多个数据源;一所述身份信息与一所述数据源可定位一所述惩罚函数;一所述惩罚函数与一所述数据源可定位另一惩罚函数;
转化模块,用于根据预设的接口函数与所述二维执行数据表,构建一维执行数据表;其中,所述一维执行数据表中的元素值为初始化的无效数据;
第一确定模块,用于当所述身份信息对应的用户未被风险控制时,根据所述数据源与所述身份信息,对所述一维执行数据表中的对应的元素赋值,获得目标元素值;将所述目标元素值对应的惩罚函数确定为需要执行的惩罚函数;
第二确定模块,用于当所述身份信息对应的用户被风险控制时,获取所述用户当前正在被执行的惩罚函数;根据所述数据源与所述正在被执行的惩罚函数,对所述一维执行数据表中的对应的元素赋值,获得目标元素值;将所述目标元素值对应的惩罚函数确定为需要执行的惩罚函数;
执行模块,用于根据所述身份信息,执行所述惩罚函数,以对所述用户进行风险控制。
可选的,还包括构建模块,用于:
定义所述身份信息对应的身份等级;所述身份等级从低至高依次包括:游客、低等级用户、低活跃用户、沉默用户、高等级用户、活跃用户以及VIP用户;定义所述惩罚函数;所述惩罚函数的等级从轻至重依次包括:将用户离线、在预设时间内禁止登录、禁止发送弹幕以及封禁用户账号;对所述数据源划分数据类型;所述数据类型包括:ip数据、设备信息、行为数据、作弊识别数据以及代码校验数据;根据所述身份等级、所述惩罚函数以及所述数据源的数据类型,构建所述惩罚数据表;其中,所述惩罚数据表中所述身份等级由低至高排列,所述惩罚函数的等级由轻至重排列。
可选的,所述转化模块,具体用于:
通过函数punishinfo_resize(identiy_num*data_num,numeric_limits<uint16_t>::max())构建一维空数组;其中,identiy_num为身份等级的总个数,data_num为数据源的总个数;numeric_limits<uint16_t>::max()表示将元素值初始化为uint16_t的最大值,所述最大值表示为无效数据;通过函数size_tindex(),将所述二维执行数据表中的元素填充至所述空数组中,获得所述一维执行数据表。
第三方面,基于同一发明构思,本申请通过本申请的一实施例提供如下技术方案:
一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述第一方面中任一项所述方法的步骤。
本发明实施例提供的一种视频直播的风险控制方法及装置,在用户登录时获取用户登录后产生的数据源以及用户的身份信息;然后,加载并拷贝预设的惩罚数据表,获得二维执行数据表;其中,惩罚数据表为二维的数据表,在惩罚数据表中存放有多个惩罚函数、多个身份信息和多个数据源;一身份信息与一数据源可定位一惩罚函数;一惩罚函数与一数据源可定位另一惩罚函数;通过拷贝惩罚数据表可避免添加线程锁,提高了执行效率,保证高时效性;进一步的,根据预设的接口函数与二维执行数据表,构建一维执行数据表;其中,一维执行数据表中的元素值为初始化的无效数据,实现了将二维数组转化为一维数组,提高了查找效率。根据数据源与身份等级,在一维执行数据表中确定需要执行的惩罚函数;在确定惩罚函数时会考虑当前用户正在接受的风险控制,如处理风险控制时会基于正在执行的惩罚函数重新确定更加严格的风险控制的手段,实现更加有效管控;最后,根据身份信息,执行惩罚函数,以对用户进行风险控制。通过身份等级和数据源在一维执行数据表中定位需要对用户执行的风险控制措施,然后根据身份信息对用户执行对应的惩罚函数,实现了用户的身份信息、数据源以及惩罚函数之间的解耦合;进一步的,在需要增加或减少相应的数据源类型、身份等级以及惩罚函数时可更加的方便维护和扩展,并且避免了对每一种用户对应的每一种数据源进行逻辑判断,极大的降低了代码开发量。因此,本实施例的视频直播的风险控制方法及装置降低了代码开发量,且实现了快速响应,便于调试和维护。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
第一实施例
请参见图1,示出了本发明第一实施例提供的一种视频直播的风险控制方法,该方法可应用于直播平台服务器,所述方法包括:
步骤S10:获取用户登录后产生的数据源以及所述用户的身份信息;
在步骤S10中,用户为使用直播平台的用户,每个用户均具有一个身份信息,身份信息可为用户的唯一标识号或用户账号。数据源为用户在直播平台进行操作的时候产生的数据信息,例如,使用第三方账号登录、发送弹幕、发送留言、等等。
在本实施例中,因为风险控制是基于用户的身份级别和用户产生的数据源,那么对于不同的身份级别对应上报同一数据源时,可能需要执行不同的风险控制策略;对于同一的身份级别对应上报不同数据源时,也可能需要执行不同的风险控制策略;而我们的用户的身份数据以及数据源则非常多,所以我们需要定义并区分用户不同的身份信息,以及定义区分不用的数据源。同时,为了方便建立惩罚数据表以及使用惩罚数据表对用户进行风险控制。也需要对用户的身份信息以及用户产生的数据源进行定义,以便索引。如下:
定义身份信息对应的身份等级;身份等级从低至高依次包括:游客、低等级用户、低活跃用户、沉默用户、高等级用户、活跃用户以及VIP用户。此外根据需求还可进行更多的身份等级扩展。
在本实施例中身份信息和后续的数据源均设计为枚举类型,可便于身份信息和惩罚函数进行转换,同时枚举类型从0开始编码,可以方便根据这些数据建立惩罚数据表,从而快速的索引,提升查找和转换的效率。此外,使用枚举类型可以保障每个数据信息都是唯一的,不会存在2个同样的数据。定义身份信息通过程序语言实现可如下:
将不可信任有风险的身份信息放到前面,而可信任放到后面。
enum class Identity:uint16_t{
Identity_Guest=0;用前缀Identity_表示当前身份,Guest表示当前的身份等级为游客。同时,对身份登记进行编号,编号必须从0开始,后续依次递增1。便于后续进行数组的查找,同时便于设置无效值。
Identity_LowLevel,表示当前身份等级为低等级用户。
Identity_LowActity,表示是前身份等级为低活跃用户。
Identity_Silent,表示前身份等级为沉默用户;即很少登录,偶尔登录一次的用户。
Identity_HighLevel,表示前身份等级为高等级用户。
Identity_Actity,表示前身份等级为活跃用户。
Identity_Vip,表示前身份等级为VIP(very important people,非常重要的人)用户。
还可在后续增对用户的身份等级进行扩展。
需要注意的时,身份等级需要从低到高,风险越高越放到开头,从而便于后续的风控策略检查。最后,可采用Identity_End来标识身份等级信息的完结,以与惩罚函数进行分隔。在身份等级之后会继续编排定义惩罚函数,这样,可便于查询当前的用户,是否已经处于被风险控制的过程中。
在本实施例中,和传统方案不一样是,将当前用户的可能收到的风险控制也和身份信息一起设计成一个数据类型,并且编排在一起。例如,一个用户如果被限制登录5分钟,那么如果其再做了其他有风险的操作,也是可以在这个限制上产生新的数据源,从而执行更为严重的风险控制。即惩罚函数也会作为一种身份等级。定义惩罚函数,惩罚函数的等级从轻至重依次包括:将用户离线、在预设时间内禁止登录、禁止发送弹幕以及封禁用户账号;程序语言表示可如下:
Punish_Tick,将用户离线,将用户踢下线。
在预设时间内禁止登录,例如:Punish_Login5Minute,禁止用户登录5分钟;Punish_Login24Hour,禁止用户登录24小时。
Punish_Dnmu,禁止发送弹幕,禁言。
Punish_Lock,封禁用户账号。
在上述的惩罚函数编排的中是接着以身份等级进行的编号,以便于进行索引查找。因为身份等级是从0开始的编号,最后以Punish_End结尾,可方便确定惩罚函数的总个数。Punish_End的值则是总的惩罚函数和身份标记之和的总个数,Punish_End必须放在最尾部。本实施例中,除了上述惩罚函数之外还可扩展增加其他的惩罚措施。
当用户登录直播平台后,会与直播平台进行数据交互,也会上报一些用户的身份设备标识等信息。例如,包括,验证信息,用户行为打点信息,这些数据源则是我们对用户进行风险控制的依据。但是每个数据源的数据类型大都不一样。例如,ip(InternetProtocol,网际互连协议)数据是一个字符串的数据,用户的某个行为打点数据则是一大串的数据,无法进行统一。因此,本实施例中需要对数据源进行抽象,将数据源按照数据类型进行划分,从而只提取数据源的类型信息。具体的,数据源可划分为如下的数据类型,包括:ip数据、设备信息、行为数据、作弊识别数据以及代码校验数据;具体的,部分程序语言示例可如下:
enum class Data:uint16_t{;与身份信息类似的,数据源定义也设计为枚举类型的数据。由于数据源类型非常多,为了支持后续扩展,本实施例中采用16位bit。
Data_ip=0,表示用户的ip数据,起始数据编号为0,后续数据进行递增。
Data_DeviceInfo,表示用户的设备信息,其中设备信息包含了用户设备的设备ID(Identity document,身份标示号)以及设备的各种硬件信息。硬件信息,如CPU(centralprocessing unit,中央处理器)序列号,磁盘序号,MAC(Media Access Control Address,媒体存取控制位址)地址、等等。
行为数据可包括多种,比如:
Data_Action1,行为打点数据1,表示一种行为打点数据,例如用户使用微博账号进行了账号密码登录则是一种行为打点;
Data_Action2,行为打点数据2,表示一种行为打点数据,例如用户使用腾讯账号进行了账号密码登录则是一种行为打点。
Data_Check1,客户端的防作弊识别算法上报的作弊识别数据。例如,客户端会采集当前用户的设备是否是被root设备;是否使用了一些常见的作弊插件等等。其中,root设备,表示获得超级管理员权限的设备。
Data_CodeCheck1,客户端的代码完整性校验的代码校验数据,表示用户是否有修改客户端的代码。
最后,以Data_End结尾,方便后续确定数据源的总个数。因为是从0开始编号,所以Data_End的值则是总的数据源的总个数,Data_End必须放在最尾部。本实施例中,必须是低风险的数据源在前,高风险的数据源在后,从而便于后续的自动检查。对于本实施例中未穷举列出的数据源,可往后继续扩展添加。
在定义完成上述的身份等级、惩罚函数以及数据源的数据类型后,可进行惩罚数据表的构建。具体的,根据身份等级、惩罚函数以及数据源的数据类型,构建惩罚数据表;其中,惩罚数据表中身份等级由低至高排列,惩罚函数的等级由轻至重排列。
本实施例中,对于构建的惩罚数据表可进行自动检查。在之前的步骤中设计了身份等级的排布,低等级在前高等级在后。对于惩罚函数,也遵循了低处罚在前高处罚在后。那么基于上述的设计,我们在进行检查时,就可以知道低等级低风险数据源对应的一定是低处罚函数,从而可以基于上述的表格进行判断,表格越往后处罚函数对应的处罚程度越严重,越往前越轻。那么检查可以从横向和纵向2个方向进行,横向上惩罚等级由低到高,纵向上惩罚等级由低到高。可选定一个中间点,中间点是指用户身份等级的中间点,以及数据源风险等级的中间点,那么对应的处罚等级也是一个中间点。那么以此中间点,我们可以扩散开来,可以知道中间点左边上边的处罚会比其低,而下边后边会比其高。
进一步的,为了后续定位惩罚函数后方便对用户执行惩罚函数,需要编写定义函数执行体。惩罚函数执行时需要传入参数,程序语言可表示如下:
Void Punish_Tick_Func(params param){,参数传入用户的身份信息,功能为是执行将用户离线的风险控制逻辑。Void Punish_Login5Minute_Func(params param){,参数传入用户的身份信息,功能为执行禁止登陆5分钟的风险控制逻辑。这样将各种处罚函数都编写好。然后,通过bind函数对惩罚函数绑定一传参位置,获得函数执行体;再根据多个惩罚函数对应的函数执行体,获得惩罚函数执行数组。程序语言可表示如下:
Vector<Function>vec;表示设计一个惩罚函数执行数组,使用Function表示一个通用的功能函数。通过vec.resize(Punish_End),为其分配空间大小。然后进行惩罚函数与身份信息的绑定,此时由于未传入身份信息,可预留一个传参位置,该传参位置用于填入身份信息。例如,vec.push_back(bind(Punish_Tick_Func,_1)),表示存储一个Punish_Tick_Func函数,然后使用bind来将函数和传参位置绑定。因为目前还没有用户的身份信息,此处需要使用_1表示传参位置。等需要执行的时候再传入用户的身份信息至传参位置。最后每个惩罚函数对应的函数执行体存储到Vec中,可得到惩罚函数执行数组。对于函数执行体的排列,需要将控制程度较轻的函数执行体排列在惩罚函数执行数组的前面,控制程度较重的高等级的函数执行体排列在惩罚函数执行数组的后面,从而便于后续的自动检查。
本实施例中,通过定义函数执行体获得惩罚函数执行数组,可实现身份信息、数据源以及惩罚函数之间解耦合,可简化编程的代码量。
步骤S20:加载并拷贝预设的惩罚数据表,获得二维执行数据表;其中,所述惩罚数据表为二维的数据表,在所述惩罚数据表中存放有多个惩罚函数、多个身份信息和多个数据源;一所述身份信息与一所述数据源可定位一所述惩罚函数;一所述惩罚函数与一所述数据源可定位另一惩罚函数。
在步骤S20中,当一个用户创建后则具有了身份信息,其登录直播平台则会产生各种数据源,数据源和身份信息在步骤S10中已经进行了获取。基于数据源则会判断当前用户是否具备被风险控制的条件。在本实施例中,如何对产生不同数据源的用户进行风险控制是基于惩罚数据表执行的。为了便于执行惩罚函数,我们需要设计一个类来封装数据和其上的对应的惩罚函数,从而我们的惩罚函数的具体执行数据操作都进行了封装,对外部使用者则是透明的,内部进行聚敛。
具体的,将惩罚数据表加载到至内存中,加载后不会经常变动。同时,本实施中的数据源以及身份信息可只提供对应的标记,如上述的编号。数据源及身份信息的数据本身不参与处理,只需要对应的数据编号。因此身份信息、数据源二者是独立的。传统方案可能会设置线程锁来保障punishinfo(惩罚数据表)整个表格的数据一致性。本方案与其不同的是,不加线程锁性能将更好。为了实现不使用线程锁,设置每个线程独立的拷贝一份punishinfo的整个对象,并将其作为二维执行数据表。所以其可以不需要进行加锁,也不会导致数据的一致性问题。不加锁那么整个程序的执行效率会非常快,从而可以达到风险控制的时效性,降低用户或直播平台的损失。
步骤S30:根据预设的接口函数与所述二维执行数据表,构建一维执行数据表;其中,所述一维执行数据表中的元素值为初始化的无效数据。
在步骤S30中,将二维执行数据表转化为以为执行数据表时,具体方式如下:
通过函数punishinfo_resize(identiy_num*data_num,numeric_limits<uint16_t>::max())构建一维空数组;其中,identiy_num为身份等级的总个数,data_num为数据源的总个数;numeric_limits<uint16_t>::max()表示将元素值初始化为uint16_t的最大值,uint16_t的最大值表示为无效数据;然后,通过函数size_t index(),将二维执行数据表中的元素填充至空数组中,获得一维执行数据表,可提高查找和执行的效率,同时也可以节省内存空间。由于前面定义身份信息的身份等级与数据源的数据类型使用的是Punish_End和Data_End作为结尾,这样当增加了新的惩罚函数或者新增加了数据源时,上述函数可实现自动增加。
步骤S40:根据所述数据源与所述身份信息,在所述一维执行数据表中确定需要执行的惩罚函数。
在步骤S40执行时具有两种情况:
1、当身份信息对应的用户未被风险控制时,步骤S40包括:根据数据源与身份信息,对一维执行数据表中的对应的元素赋值,获得目标元素值;其中数据源对应一定义好的数据类型,身份信息对应一身份等级,赋值时可赋值为数据类型或身份登记,或赋值为数据类型或身份登记对应的编号,后文也应作此理解,不再赘述;将目标元素值对应的惩罚函数确定为需要执行的惩罚函数。通过赋值填表的方式快速确定对用户进行的风险控制,并且由于数据源、惩罚函数、身份信息之间是解耦合的,这样可极大的简化实现风险控制的程序代码。
2、当身份信息对应的用户被风险控制时,步骤S40包括:获取用户当前正在被执行的惩罚函数;根据数据源与正在被执行的惩罚函数,对一维执行数据表中的对应的元素赋值,获得目标元素值;将目标元素值对应的惩罚函数确定为需要执行的惩罚函数。此时,惩罚函数将作为用户对应的一种身份信息。当用户已经被进行风险控制之后,依然继续产生具有风险的数据源时,就可在已经实现的风险控制的基础上进行更加严厉的风险控制。
步骤S50:根据所述身份信息,执行所述惩罚函数,以对所述用户进行风险控制。
在步骤S50中,具体包括:根据惩罚函数,在惩罚函数执行数组中查询目标函数执行体;目标函数执行体为惩罚函数对应的函数执行体;向目标函数执行体的传参位置传入身份信息,以执行惩罚函数对用户进行风险控制。
步骤S30-S50的程序语言实现过程可大致参考如下:
class PunishInfo{,表示惩罚执行类封装了数据和执行操作。
vector<uint16_t>punishinfo_;表示成员变量,存储了身份信息和数据源对应的惩罚函数。我们设计成一个数组的形式,可以提高我们的查找和执行的效率,同时也可以节省内存空间。
接下来编写我们的接口函数:
PunishExcute(uint32_t identiy_num,uint32_t data_num){;首先是构造函数,需要2个参数,identiy_num是身份等级的总个数,data_num是数据源的总个数。其中,在构造时可以使用上面的Punish_End和Data_End。如果我们不使用这样的结尾的技巧,直接编写数字的话,当我们新增加了新的惩罚函数或者新增加了数据源,我们则需要记得修改上面构造函数传入的这2个值;而使用结尾标记,则无需修改,他本身是结尾会自动增加。因为我们的设计是一个Punish_End*Data_End的数组。
punishinfo_resize(identiy_num*data_num,numeric_limits<uint16_t>::max());表示为上面建立的空数组分配空间,并每个元素初始化为uint16_t的MAX(最大)值,这样表明是一个无效的数据。从而可以区分出有效数据,因为所有数据都不可能是uint16_t的MAX值。
接下来是我们需要去填充这个一个空数组:
在填充数组时,为了便于计算每个数据的填充位置,我们编写了一个方便的计算公式:
size_t index(Identity i,Data d)const{;其中,参数是身份信息和数据源;然后,return i*Data_End+d;其中,表示一个数组存放了所有信息,将二维数组转换成一维数组(即转化为上述的一维执行数组),横向是身份信息和惩罚函数,纵向是数据源。Data_End则是数据源的最大值,也表明纵向数据的总数。
那么具体的风险控制执行则可以通过填写表格来达到策略执行的功能。如下:
punishinfo_[index(Identity_Guest,Data_ip)]=Punish_Tick;表示当前身份等级为一个Identity_Guest(游客),当收到一个ip数据源后,确认是一个非法ip。此时,可进行风险控制,执行惩罚函数Punish_Tick。其中,通过index函数计算身份等级和数据源填入的位置。
又如:punishinfo_[index(Identity_LowLevel,Data_DeviceInfo)]=Punish_Login24Hour;表示身份等级为Identity_LowLevel时,接收到了非法的设备信息Data_DeviceInfo,则执行处罚函数Punish_Login24Hour,控制其24小时不能够登陆。
又如:punishinfo_[index(Punish_Login24Hour,Data_CodeCheck1)]=Punish_Lock;如果当前身份信息是已经处于风险控制状态中的24小时无法登录状态,而此时其客户端上报了代码完整性检测有问题,那么可执行处罚函数Punish_Lock,对其进行了账号封禁控制。此时的风险控制措施可以基于后续的数据源进行更严厉的控制。
上述基于枚举类型的变量名称来填写,使得整个逻辑从填写的数据看非常的清晰。进一步的,我们需要编写一个查找接口,该查找接口是便于我们知道当前的身份信息收到什么数据,需要执行何种惩罚措施。部分程序语言表示如下:
pair<Identity,bool>find(Identity i,Data d)const{;表示传入2个参数,一个是身份信息一个是数据源;其中,返回值设计为2个变量的绑定,从而可以返回2个数据,Identity用于表示处罚措施的数据,bool用于表示是否查找到。
Uint16_t res=punishinfo_[index(i,d)];表示查找通过index计算得到数组的位置,然后读取上述一维执行数组中的值,数组的值是上面我们填入的。
然后,需要判断res是否是一个有效数据,具体过程如下:
If(numeric_limits<uint16_t>::max()==res);
Return make_pair(res,false);说明是无效的数据,此处我们在数组中初始化数组的每个元素为numeric_limits<uint16_t>::max(),而如果没有填入数据则还是初始化的值。
Else;make_pair(res,true);表示为有效数据。
进一步的,当一维执行数组构造好后,直播平台会依据这个构造的信息来执行具体的惩罚函数。对于每个用户,直播平台都会给用户一个身份信息,当用户进行登录后,会不断的给直播平台上发各种数据源,那么基于数据源和身份信息则可判断该用户需要执行什么样的风险控制。本实施例中可设计了一个独立的执行处罚的功能类。便于进行灵活控制。部分程序语言表示如下:
Class Pnuish_Execute{表示,具体风险控制的执行。
PunishInfo info_;其中有一个成员变量;这样设计的好处是我们可以灵活的变换策略。目前设计了一个PunishInfo表格,即惩罚数据表。我们也可以基于其他的目的设计多个PunishInfo表格,从而对于不同的用户使用不同的表格,表格内容不一样,那么其执行的惩罚措施则会不一样,可便于扩展和维护。
编写接口:
bool ececute(Identity&i,Data d){;其中第一个参数我们必须使用Identity&,表示当前身份并且具有数据源d时,其需要执行什么类型的风险控制,同时调用者需要得到惩罚函数,便于后续得到其他数据源,可以继续执行惩罚函数以进行风险控制。
tie(newi,check)=find(i,d);表示同之前编写的接口来查询,newi为返回新的身份信息,check表示是否成功。
If(check){
i=newi;表示如果成功,赋值为新的身份信息,同时此处我们则可以执行具体的惩罚函数。具体执行则是执行我们之前编写好的惩罚函数执行体,例如Punish_Tick_Func,等等。我们的身份信息和执行惩罚函数是一一对应的,所以我们可以Vec[i]来得到惩罚函数的函数执行体,从而执行惩罚函数。
Return true;表示执行完成后返回true,表示执行成功。
Else{
Return false};表示没有查找到,则返回失败。
综上所述,本实施例提供的一种视频直播的风险控制方法,在用户登录时获取用户登录后产生的数据源以及用户的身份信息;然后,加载并拷贝预设的惩罚数据表,获得二维执行数据表;其中,惩罚数据表为二维的数据表,在惩罚数据表中存放有多个惩罚函数、多个身份信息和多个数据源;一身份信息与一数据源可定位一惩罚函数;一惩罚函数与一数据源可定位另一惩罚函数;通过拷贝惩罚数据表可避免添加线程锁,提高了执行效率,保证高时效性;进一步的,根据预设的接口函数与二维执行数据表,构建一维执行数据表;其中,一维执行数据表中的元素值为初始化的无效数据,实现了将二维数组转化为一维数组,提高了查找效率。根据数据源与身份等级,在一维执行数据表中确定需要执行的惩罚函数;在确定惩罚函数时会考虑当前用户正在接受的风险控制,如处理风险控制时会基于正在执行的惩罚函数重新确定更加严格的风险控制的手段,实现更加有效管控;最后,根据身份信息,执行惩罚函数,以对用户进行风险控制。通过身份等级和数据源在一维执行数据表中定位需要对用户执行的风险控制措施,然后根据身份信息对用户执行对应的惩罚函数,实现了用户的身份信息、数据源以及惩罚函数之间的解耦合;进一步的,在需要增加或减少相应的数据源类型、身份等级以及惩罚函数时可更加的方便维护和扩展,并且避免了对每一种用户对应的每一种数据源进行逻辑判断,极大的降低了代码开发量。因此,本实施例的视频直播的风险控制方法降低了代码开发量,且实现了快速响应,便于调试和维护。
第二实施例
请参阅图2,基于同一发明构思,本发明第二实施例提供了一种视频直播的风险控制装300。所述视频直播的风险控制装置300,包括:
第一获取模块301,用于获取用户登录后产生的数据源以及所述用户的身份信息;
第二获取模块302,用于加载并拷贝预设的惩罚数据表,获得二维执行数据表;其中,所述惩罚数据表为二维的数据表,在所述惩罚数据表中存放有多个惩罚函数、多个身份信息和多个数据源;一所述身份信息与一所述数据源可定位一所述惩罚函数;一所述惩罚函数与一所述数据源可定位另一惩罚函数;
转化模块303,用于根据预设的接口函数与所述二维执行数据表,构建一维执行数据表;其中,所述一维执行数据表中的元素值为初始化的无效数据;
第一确定模块304,用于当所述身份信息对应的用户未被风险控制时,根据所述数据源与所述身份信息,对所述一维执行数据表中的对应的元素赋值,获得目标元素值;将所述目标元素值对应的惩罚函数确定为需要执行的惩罚函数;
第二确定模块305,用于当所述身份信息对应的用户被风险控制时,获取所述用户当前正在被执行的惩罚函数;根据所述数据源与所述正在被执行的惩罚函数,对所述一维执行数据表中的对应的元素赋值,获得目标元素值;将所述目标元素值对应的惩罚函数确定为需要执行的惩罚函数;
执行模块306,用于根据所述身份信息,执行所述惩罚函数,以对所述用户进行风险控制。
作为一种可选的实施方式,还包括构建模块,用于:
定义所述身份信息对应的身份等级;所述身份等级从低至高依次包括:游客、低等级用户、低活跃用户、沉默用户、高等级用户、活跃用户以及VIP用户;定义所述惩罚函数;所述惩罚函数的等级从轻至重依次包括:将用户离线、在预设时间内禁止登录、禁止发送弹幕以及封禁用户账号;对所述数据源划分数据类型;所述数据类型包括:ip数据、设备信息、行为数据、作弊识别数据以及代码校验数据;根据所述身份等级、所述惩罚函数以及所述数据源的数据类型,构建所述惩罚数据表;其中,所述惩罚数据表中所述身份等级由低至高排列,所述惩罚函数的等级由轻至重排列。
作为一种可选的实施方式,所述转化模块303,具体用于:
通过函数punishinfo_resize(identiy_num*data_num,numeric_limits<uint16_t>::max())构建一维空数组;其中,identiy_num为身份等级的总个数,data_num为数据源的总个数;numeric_limits<uint16_t>::max()表示将元素值初始化为uint16_t的最大值,所述最大值表示为无效数据;通过函数size_tindex(),将所述二维执行数据表中的元素填充至所述空数组中,获得所述一维执行数据表。
需要说明的是,本发明实施例所提供的装置300,其具体实现及产生的技术效果和前述方法实施例相同,为简要描述,装置实施例部分未提及之处,可参考前述方法实施例中相应内容。
本发明提供的装置集成的功能模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例的方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的网关、代理服务器、系统中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。