Skip to content

Commit 571748c

Browse files
支持了基础的黑名单功能。下一个版本会提供黑名单文档和接口。
1 parent 3b05996 commit 571748c

File tree

10 files changed

+616
-14
lines changed

10 files changed

+616
-14
lines changed

README.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ ghost_sa(鬼策)可以理解为不带前端界面的神策服务端。
3131

3232
9.召回信息发送
3333

34+
10.支持黑名单功能,便于提高一些免费邮件如阿里的授信,也减少其他渠道的无效召回浪费
35+
3436
使用了flask框架,可以通过uwsgi部署。数据库建议使用TiDB,实测1天200万事件量,单次查询当天事件在10毫秒左右,查询1个月范围的数据,返回在30-60秒左右。
3537
实际使用在TiDB最低的配置3x8c_32g的情况下,每天可以支持500万的事件量。
3638
如果只是体验和测试功能,也可以用MySQL 5.7(含)以上的版本,不过性能很差。
@@ -106,24 +108,31 @@ https://space.bilibili.com/920446/channel/detail?cid=124583
106108

107109
# 2020年12月28日版本升级注意事项:
108110

109-
1.鬼策老用户如需升级2020年12月28日及以后的版本,须文件覆盖后,运行/tools/update_20201015.py程序升级数据表。该操作不可逆,但升级后的数据表与老版本鬼策兼容。但程序与老版本鬼策不兼容,需要完整覆盖安装目录才能继续运行。建议新老版本分开两个目录放置。clone新目录->升级->运行新目录的程序即可。
111+
1.鬼策老用户如需升级2020年12月28日及以后的版本,须文件覆盖后,运行/tools/update_base_to_20201015.py程序升级数据表。该操作不可逆,但升级后的数据表与老版本鬼策兼容。但程序与老版本鬼策不兼容,需要完整覆盖安装目录才能继续运行。建议新老版本分开两个目录放置。clone新目录->升级->运行新目录的程序即可。
110112

111113
2.由于TiDB v4的新特性,鬼策缩短了一些之前预留较长的字段,以提高兼容性,mysql版本也不需要额外使用安装程序,统一使用/component/setup.py安装即可。缩短后我已经在生产环境使用超过半个月,尚无不良影响。如果您的应用环境特殊,请谨慎升级TiDB到v4及以后版本,并自行修改建表程序中的字段长度。如果您的鬼策是在TiDB v3环境下安装的,那么升级到TiDB v4后,字段长度不会改变,依然有效。
112114

115+
# 2021年03月15日版本升级注意事项:
116+
117+
1.2020年12月28日之前版本的鬼策老用户如需升级2021年03月15日及以后的版本,须文件覆盖后,运行/tools/update_base_to_20210226.py程序升级数据表。或2020年12月28日之后版本的鬼策老用户如需升级2021年03月15日及以后的版本,须文件覆盖后,运行/tools/update_20201015_to_20210226.py程序升级数据表。该操作不可逆,但升级后的数据表与老版本鬼策兼容。但程序与老版本鬼策不兼容,需要完整覆盖安装目录才能继续运行。建议新老版本分开两个目录放置。clone新目录->升级->运行新目录的程序即可。
118+
119+
2.黑名单开关可以在configs/admin.py里配置
113120

114121

115122
# 近期大版本迭代规划:
116123

117-
2021年02月<-补齐用户分群及召回功能的文档和交互用接口。ghost_console(管理端)功能补齐
124+
2021年03月<-黑名单支持外部接口
118125

119-
2021年03月<-召回支持黑名单功能,便于提高一些免费邮件如阿里的授信,也减少其他渠道的无效召回浪费
126+
2021年04月<-补齐用户分群及召回功能的文档和交互用接口。ghost_console(管理端)功能补齐
120127

121-
2021年04月<-召回功能的消息中心支持非模板消息
128+
2021年05月<-增加连接池,提高高并发性能
122129

123130
2021年06月<-召回功能适配更多的渠道
124131

125132
2021年08月<-支持广告位管理及第三方监测(如秒针等。这个是用来给第三方监测的。不是自己用CPC广告的那些,那个早就支持了。)
126133

127134
2021年10月<-支持项目管理和神策的crc校验功能,减少恶意攻击和恶意刷量。
128135

129-
2022年4月<-支持oCPC广告位管理,支持第三方回调,简单的效果管理
136+
2022年4月<-支持oCPC广告位管理,支持第三方回调,简单的效果管理
137+
138+
2022年6月<-支持Hadoop等其他类型数据库

component/api_noti.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from scheduler_jobs.etl_model import apply_temple
1919

2020

21-
2221
def show_usergroup_plan():
2322
#查询用户分群计划列表
2423
start_time = time.time()
@@ -411,7 +410,6 @@ def create_scheduler_jobs_manual():
411410
returnjson = {'result':'fail','error':error}
412411
return jsonify(returnjson)
413412

414-
415413
def create_manual_temple_noti():
416414
#外部触发模板消息
417415
project = get_url_params('project')

component/db_func.py

Lines changed: 132 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,10 +403,10 @@ def select_usergroupdata_data(project,data_id):
403403
result = do_tidb_select(sql=sql)
404404
return result[0],result[1]
405405

406-
def insert_noti(project,type_1,created_at,updated_at,distinct_id,content,send_at,plan_id=0,list_id=0,data_id=0,temple_id=0,noti_group_id=0,priority=13,status=9,owner='noti',recall_result=None):
406+
def insert_noti(project,type_1,created_at,updated_at,distinct_id,content,send_at,plan_id=0,list_id=0,data_id=0,temple_id=0,noti_group_id=0,priority=13,status=9,owner='noti',recall_result=None,key=None,level=None):
407407
import json
408-
sql = """insert ignore {project}_noti (`distinct_id`,`plan_id`,`list_id`,`data_id`,`temple_id`,`noti_group_id`,`priority`,`status`,`owner`,`type`,`content`,`send_at`,`recall_result`,`created_at`,`updated_at`) values (%(distinct_id)s,%(plan_id)s,%(list_id)s,%(data_id)s,%(temple_id)s,%(noti_group_id)s,%(priority)s,%(status)s,%(owner)s,%(type)s,%(content)s,%(send_at)s,%(recall_result)s,%(created_at)s,%(updated_at)s)""".format(project=project)
409-
key = {'distinct_id':distinct_id,'type':type_1,'plan_id':plan_id,'list_id':list_id,'data_id':data_id,'temple_id':temple_id,'noti_group_id':noti_group_id,'priority':priority,'status':status,'owner':owner,'content':json.dumps(content),'recall_result':recall_result,'send_at':send_at if send_at else int(time.time()),'created_at':created_at if created_at else int(time.time()),'updated_at':updated_at if updated_at else int(time.time())}
408+
sql = """insert ignore {project}_noti (`distinct_id`,`plan_id`,`list_id`,`data_id`,`temple_id`,`noti_group_id`,`priority`,`status`,`owner`,`type`,`content`,`send_at`,`recall_result`,`created_at`,`updated_at`,`key`,`level`) values (%(distinct_id)s,%(plan_id)s,%(list_id)s,%(data_id)s,%(temple_id)s,%(noti_group_id)s,%(priority)s,%(status)s,%(owner)s,%(type)s,%(content)s,%(send_at)s,%(recall_result)s,%(created_at)s,%(updated_at)s,%(key)s,%(level)s)""".format(project=project)
409+
key = {'key':key,'distinct_id':distinct_id,'type':type_1,'plan_id':plan_id,'list_id':list_id,'data_id':data_id,'temple_id':temple_id,'noti_group_id':noti_group_id,'priority':priority,'status':status,'owner':owner,'content':json.dumps(content),'recall_result':recall_result,'send_at':send_at if send_at else int(time.time()),'created_at':created_at if created_at else int(time.time()),'updated_at':updated_at if updated_at else int(time.time()),'level':level}
410410
result = do_tidb_exe(sql=sql, args=key)
411411
return result[0],result[1]
412412

@@ -776,4 +776,133 @@ def show_scheduler_jobs_count_db():
776776
sql = f"""select count(*)
777777
from scheduler_jobs """
778778
result = do_tidb_select(sql=sql)
779+
return result
780+
781+
def insert_update_recall_blacklist(project,key,type_id,status,reason_id,latest_owner,distinct_id='',timenow=None):
782+
sql="""INSERT INTO `recall_blacklist` ( `project`, `distinct_id`, `key`, `type_id`, `reason_id`, `owner`, `latest_owner`, `status`, `created_at` ,`updated_at`)
783+
VALUES
784+
(%(project)s,%(distinct_id)s,%(key)s,%(type_id)s,%(reason_id)s,%(owner)s,%(latest_owner)s,%(status)s,%(created_at)s,%(updated_at)s)
785+
ON DUPLICATE KEY UPDATE `reason_id` =IF(%(reason_id)s != 0 ,%(reason_id)s, reason_id ),`status` =IF(%(status)s != 0,%(status)s, status ),`distinct_id` = IF(%(distinct_id)s != '',%(distinct_id)s, distinct_id ),latest_owner =%(latest_owner)s,updated_at =%(updated_at)s;"""
786+
timenow = int(time.time()) if not timenow else timenow
787+
key = {'project':project,'distinct_id':distinct_id,'key':key,'type_id':type_id,'reason_id':reason_id,'owner':latest_owner,'latest_owner':latest_owner,'status':status,'created_at':timenow,'updated_at':timenow}
788+
result = do_tidb_exe(sql=sql, args=key)
789+
return result
790+
791+
def insert_recall_blacklist(project,key,type_id,status,reason_id,latest_owner,distinct_id='',timenow=None):
792+
sql="""INSERT INTO `recall_blacklist` ( `project`, `distinct_id`, `key`, `type_id`, `reason_id`, `owner`, `latest_owner`, `status`, `created_at` ,`updated_at`)
793+
VALUES
794+
(%(project)s,%(distinct_id)s,%(key)s,%(type_id)s,%(reason_id)s,%(owner)s,%(latest_owner)s,%(status)s,%(created_at)s,%(updated_at)s);"""
795+
timenow = int(time.time()) if not timenow else timenow
796+
key = {'project':project,'distinct_id':distinct_id,'key':key,'type_id':type_id,'reason_id':reason_id,'owner':latest_owner,'latest_owner':latest_owner,'status':status,'created_at':timenow,'updated_at':timenow}
797+
result = do_tidb_exe(sql=sql, args=key)
798+
return result
799+
800+
def update_recall_blacklist(project,key,type_id,status,reason_id,latest_owner,distinct_id='',timenow=None):
801+
sql="""UPDATE `recall_blacklist` set `reason_id` =IF(%(reason_id)s != 0 ,%(reason_id)s, reason_id ),`status` =IF(%(status)s != 0,%(status)s, status ),`distinct_id` = IF(%(distinct_id)s != '',%(distinct_id)s, distinct_id ),latest_owner =%(latest_owner)s,updated_at =%(updated_at)s;"""
802+
timenow = int(time.time()) if not timenow else timenow
803+
key = {'project':project,'distinct_id':distinct_id,'key':key,'type_id':type_id,'reason_id':reason_id,'owner':latest_owner,'latest_owner':latest_owner,'status':status,'created_at':timenow,'updated_at':timenow}
804+
result = do_tidb_exe(sql=sql, args=key)
805+
return result
806+
807+
808+
def insert_recall_blacklist_reason(rbid,reason_id,reason_owner,final_status_id,reason_comment='',timenow=None):
809+
sql="""insert into `recall_blacklist_reason` (`rbid`,`reason_id`,`reason_owner`,`reason_comment`,`final_status_id`,`created_at`) VALUES (%(rbid)s,%(reason_id)s,%(reason_owner)s,%(reason_comment)s,%(final_status_id)s,%(created_at)s)"""
810+
timenow = int(time.time()) if not timenow else timenow
811+
key = {'rbid':rbid,'reason_id':reason_id,'reason_owner':reason_owner,'reason_comment':reason_comment,'final_status_id':final_status_id,'created_at':timenow}
812+
result = do_tidb_exe(sql=sql, args=key)
813+
return result
814+
815+
def select_recall_blacklist_id(type_id,distinct_id=None,key=None,project=None,status=None,limit=None):
816+
add_on_status =''
817+
add_limit =''
818+
add_fliter = ''
819+
if limit :
820+
add_limit = 'limit '+str(int(limit))
821+
if distinct_id :
822+
add_fliter = add_fliter + f' and recall_blacklist.`distinct_id` = "{distinct_id}"'
823+
if key :
824+
add_fliter = add_fliter + f' and recall_blacklist.`key` = "{key}"'
825+
if project :
826+
add_fliter = add_fliter + f' and recall_blacklist.`project` = "{project}"'
827+
if status :
828+
status_int = []
829+
for s in status:
830+
status_int.append(str(int(s)))
831+
add_on_status = "and recall_blacklist.status in ("+",".join(status_int)+")"
832+
833+
sql="""SELECT
834+
recall_blacklist.id,
835+
recall_blacklist.reason_id,
836+
r_id.`desc`,
837+
recall_blacklist.`owner`,
838+
recall_blacklist.latest_owner,
839+
recall_blacklist.`status`,
840+
s_id.`desc`,
841+
cast(FROM_UNIXTIME(recall_blacklist.created_at) as char),
842+
cast(FROM_UNIXTIME(recall_blacklist.updated_at) as char),
843+
recall_blacklist_reason.final_status_id,
844+
s2_id.`desc`,
845+
recall_blacklist_reason.reason_id,
846+
r2_id.`desc`,
847+
recall_blacklist_reason.reason_owner,
848+
recall_blacklist_reason.reason_comment,
849+
cast(FROM_UNIXTIME(recall_blacklist_reason.created_at) as char)
850+
FROM
851+
recall_blacklist
852+
JOIN recall_blacklist_reason ON recall_blacklist.id = recall_blacklist_reason.rbid
853+
join status_code as r_id on recall_blacklist.reason_id = r_id.id
854+
join status_code as s_id on recall_blacklist.`status` = s_id.id
855+
join status_code as r2_id on recall_blacklist_reason.`reason_id` = r2_id.id
856+
join status_code as s2_id on recall_blacklist_reason.`final_status_id` = s2_id.id
857+
where recall_blacklist.type_id = {type_id} {add_fliter} {add_on_status}
858+
ORDER BY
859+
recall_blacklist_reason.created_at DESC {add_limit} ;""".format(type_id=type_id,add_fliter=add_fliter,add_on_status=add_on_status,add_limit=add_limit)
860+
result = do_tidb_select(sql=sql)
861+
return result
862+
863+
def select_recall_blacklist_list(type_id,distinct_id=None,project=None,status=None,start=None,limit=None):
864+
add_on_status =''
865+
add_limit =''
866+
add_fliter = ''
867+
if not start:
868+
start = 0
869+
if limit :
870+
add_limit = f'limit {start},{limit}'
871+
if distinct_id :
872+
add_fliter = add_fliter + f' and recall_blacklist.`distinct_id` = "{distinct_id}"'
873+
if project :
874+
add_fliter = add_fliter + f' and recall_blacklist.`project` = "{project}"'
875+
if status :
876+
status_int = []
877+
for s in status:
878+
status_int.append(str(int(s)))
879+
add_on_status = "and recall_blacklist.status in ("+",".join(status_int)+")"
880+
881+
sql="""SELECT
882+
recall_blacklist.id,
883+
recall_blacklist.reason_id,
884+
r_id.`desc`,
885+
recall_blacklist.`owner`,
886+
recall_blacklist.latest_owner,
887+
recall_blacklist.`status`,
888+
s_id.`desc`,
889+
cast(FROM_UNIXTIME(recall_blacklist.created_at) as char),
890+
cast(FROM_UNIXTIME(recall_blacklist.updated_at) as char)
891+
FROM
892+
recall_blacklist
893+
join status_code as r_id on recall_blacklist.`reason_id` = r_id.id
894+
join status_code as s_id on recall_blacklist.`status` = s_id.id
895+
where recall_blacklist.type_id = {type_id} {add_fliter} {add_on_status} {add_limit} ;""".format(type_id=type_id,add_fliter=add_fliter,add_on_status=add_on_status,add_limit=add_limit)
896+
result = do_tidb_select(sql=sql)
897+
return result
898+
899+
900+
901+
902+
903+
def insert_recall_blacklist_history(rbid,checker,result_status_id,result_reason_id,timenow=None):
904+
sql="""insert into `recall_blacklist_history` (`rbid`,`checker`,`result_status_id`,`result_reason_id`,`created_at`) VALUES (%(rbid)s,%(checker)s,%(result_status_id)s,%(result_reason_id)s,%(created_at)s)"""
905+
timenow = int(time.time()) if not timenow else timenow
906+
key = {'rbid':rbid,'checker':checker,'result_status_id':result_status_id,'result_reason_id':result_reason_id,'created_at':timenow}
907+
result = do_tidb_exe(sql=sql, args=key)
779908
return result

0 commit comments

Comments
 (0)