From 2ea83ae69eb339794ebf6db7b476dd8f68e9366e Mon Sep 17 00:00:00 2001 From: pengtao Date: Fri, 9 Aug 2019 10:47:06 +0800 Subject: [PATCH] a --- README.MD | 364 +++++++++++--------- __pycache__/config.cpython-36.pyc | Bin 312 -> 672 bytes ad_interface_tornado.py | 190 ++++------ ad_tasks.py | 160 +++++++++ handler/__pycache__/__init__.cpython-36.pyc | Bin 122 -> 122 bytes handler/__pycache__/company.cpython-36.pyc | Bin 4245 -> 4476 bytes handler/__pycache__/location.cpython-36.pyc | Bin 3358 -> 4120 bytes handler/ad.py | 134 ++++++- handler/company.py | 4 +- handler/location.py | 36 +- log/__pycache__/__init__.cpython-36.pyc | Bin 118 -> 118 bytes log/__pycache__/mylog.cpython-36.pyc | Bin 721 -> 721 bytes myredis/__pycache__/__init__.cpython-36.pyc | Bin 122 -> 122 bytes myredis/__pycache__/myredis.cpython-36.pyc | Bin 487 -> 508 bytes mysql/__pycache__/__init__.cpython-36.pyc | Bin 120 -> 120 bytes mysql/__pycache__/mmysql.cpython-36.pyc | Bin 4100 -> 4086 bytes server.py | 3 +- 17 files changed, 573 insertions(+), 318 deletions(-) create mode 100644 ad_tasks.py diff --git a/README.MD b/README.MD index 0841cd9..d4274ff 100644 --- a/README.MD +++ b/README.MD @@ -2,11 +2,8 @@ TODO: -广告添加 own字段 -返回所有广告[status] -返回单条广告 -图片上传接口 +区域/类型 增删改检查的接口 @@ -14,7 +11,7 @@ TODO: ##### 接口地址 -http://192.168.100.20:8888/company +http://154.8.214.202:5015/interface/company ##### 返回格式:json @@ -24,7 +21,7 @@ http://192.168.100.20:8888/company http://154.8.214.202:5015/company -http://192.168.100.20:8888/company?status=0 +http://154.8.214.202:5015/interface/company?status=0 ##### 请求参数说明 @@ -47,36 +44,26 @@ http://192.168.100.20:8888/company?status=0 | companykey | string | 是 | 用于API认证 | ##### 返回示例 - { - "code": 200, - "message": [ - { - "appid": "zpoHY37u", - "appkey": "undefined", - "contact": "miles", - "id": "1006", - "name": "kingsome", - "status": 0, - "tel": "17771" - }, - { - "appid": "5bOaA82t", - "appkey": "undefined", - "contact": "miles", - "id": "1007", - "name": "kingsome", - "status": 0, - "tel": "17771" - } - ] + "code": 200, + "message": [ + { + "appid": "BKadJbmZ", + "appkey": "undefined", + "contact": "pt", + "id": "1001", + "name": "kings", + "status": 0, + "tel": "1234", + "user": "None" + } + ] } - #### 2、新增公司信息 ##### 接口地址 -http://192.168.100.20:8888/company +http://154.8.214.202:5015/interface/company ##### 返回格式:json @@ -84,7 +71,7 @@ http://192.168.100.20:8888/company ##### 请求示范 -http://192.168.100.20:8888/company?name=kings&contact=pt&tel=1234 +http://154.8.214.202:5015/interface/company?name=kings&contact=pt&tel=1234 ##### 请求参数说明 @@ -112,7 +99,7 @@ http://192.168.100.20:8888/company?name=kings&contact=pt&tel=1234 ##### 接口地址 -http://192.168.100.20:8888/company +http://154.8.214.202:5015/interface/company ##### 返回格式:json @@ -120,7 +107,7 @@ http://192.168.100.20:8888/company ##### 请求示范 -http://192.168.100.20:8888/company?appid=zpoHY37u&appkey=undefined&contact=miles001&id=1006&name=kingsome&status=1&tel=17771&user=assd +http://154.8.214.202:5015/interface/company?appid=zpoHY37u&appkey=undefined&contact=miles001&id=1006&name=kingsome&status=1&tel=17771&user=assd ##### 请求参数说明 @@ -152,7 +139,7 @@ http://192.168.100.20:8888/company?appid=zpoHY37u&appkey=undefined&contact=miles ##### 接口地址 -http://192.168.100.20:8888/company +http://154.8.214.202:5015/interface/company ##### 返回格式:json @@ -160,7 +147,7 @@ http://192.168.100.20:8888/company ##### 请求示范 -http://192.168.100.20:8888/company?id=1006 +http://154.8.214.202:5015/interface/company?id=1006 ##### 请求参数说明 @@ -185,7 +172,7 @@ http://192.168.100.20:8888/company?id=1006 ##### 接口地址 -http://192.168.100.20:8888/location +http://154.8.214.202:5015/interface/location ##### 返回格式:json @@ -193,13 +180,14 @@ http://192.168.100.20:8888/location ##### 请求示范 -http://192.168.100.20:8888/location +http://154.8.214.202:5015/interface/location?gameid=1004 ##### 请求参数说明 -| 名称 | 类型 | 必填 | 说明 | -| ------ | ---- | ---- | ------ | -| gameid | int | 是 | 游戏ID | +| 名称 | 类型 | 必填 | 说明 | +| --------- | ---- | ---- | ------------------ | +| gameid | int | 是 | 游戏ID | +| channelid | int | 是 | 渠道ID,默认是6001 | ##### 返回参数说明 @@ -209,24 +197,24 @@ http://192.168.100.20:8888/location | message | json | 是 | 所有位置信息 | ##### 返回示例 - { - "code": 200, - "message": [ - { - "area": 1, - "gameid": 1003, - "id": 1001, - "type": 1 - } - ] + "code": 200, + "message": [ + { + "area": "1,8,15", + "channelid": 6001, + "gameid": 1004, + "id": 1007, + "mode": 1, + "type": 2 + } + ] } - #### 6、添加位置服务信息 ##### 接口地址 -http://192.168.100.20:8888/location +http://154.8.214.202:5015/interface/location ##### 返回格式:json @@ -234,15 +222,17 @@ http://192.168.100.20:8888/location ##### 请求示范 -http://192.168.100.20:8888/location?area=1&type=1&gameid=1003 +http://154.8.214.202:5015/interface/location?gameid=1003&area=1,1,1&type=1&mode=2 ##### 请求参数说明 -| 名称 | 类型 | 必填 | 说明 | -| ---- | ---- | ---- | ---------------------------------------- | -| area | int | 是 | 区域(1=首页,2=游戏中,3=结算页,4=关闭) | -| type | int | 是 | 类型(1=icon,2=banner,3=浮窗) | -| | int | 是 | 游戏ID | +| 名称 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ------------------------------------------------------------ | +| area | string | 是 | 区域(第一元素:1=首页,2=游戏中,3=结算页,4=关闭,第二元素:X轴第三元素:Y轴,其中X,Y取值范围(0,15))如(1,0,0)代表首页左上 | +| type | int | 是 | 类型(1=icon,2=banner,3=浮窗) | +| mode | int | 是 | 广告单播或轮播模式(1=单播,2=轮播) | +| gameid | int | 是 | 游戏ID | +| channelid | int | 否 | 渠道ID,默认是6001 | ##### 返回参数说明 @@ -256,89 +246,11 @@ http://192.168.100.20:8888/location?area=1&type=1&gameid=1003 "code": 200 } -#### 7、删除位置服务信息 +#### 7、变更位置服务信息 ##### 接口地址 -http://192.168.100.20:8888/location - -##### 返回格式:json - -##### 请求方式:delete - -##### 请求示范 - -http://192.168.100.20:8888/location?id=1002 - -##### 请求参数说明 - -| 名称 | 类型 | 必填 | 说明 | -| ---- | ---- | ---- | -------------- | -| id | int | 是 | 需删除的位置ID | - -##### 返回参数说明 - -| 名称 | 类型 | 必填 | 说明 | -| ---- | ---- | ---- | -------- | -| code | int | 是 | 返回状态 | - -##### 返回示例 - -{ - "code": 200 -} - - - -#### 8、添加广告信息 - -##### 接口地址 - -http://192.168.100.20:8888/ad - -##### 返回格式:json - -##### 请求方式:post - -##### 请求示范 - -http://192.168.100.20:8888/ad?name=abc&gameid=1003&locationid=1&ad_title=hello&ad_body=hi world&ad_image=http://1&ad_url=http://2&companyid=2 - -##### 请求参数说明 - -| 名称 | 类型 | 必填 | 说明 | -| ---------- | -------- | ---- | --------------------------------------------------- | -| name | string | 是 | 广告名称 | -| gameid | int | 是 | 广告投放的游戏ID | -| locationid | int | 是 | 位置ID | -| ad_title | string | 是 | 广告标题 | -| ad_body | string | 是 | 广告正文 | -| ad_image | string | 是 | 头像链接 | -| ad_url | string | 是 | 跳转链接 | -| begin_time | datetime | 否 | 开始时间,默认是1999-01-01 | -| end_time | datetime | 否 | 结束时间,默认是3000-01-01 | -| ad_num | int | 否 | 投放次数,默认是0(次数无限) | -| ad_sort | int | 否 | 优先级默认为0 | -| status | int | 否 | 默认为0(未审批),1=审批通过,2=审批未通过,3=暂停 | -| companyid | int | 是 | 广告提交公司 | - -##### 返回参数说明 - -| 名称 | 类型 | 必填 | 说明 | -| ---- | ---- | ---- | -------- | -| code | int | 是 | 返回状态 | - -##### 返回示例 - -{ - "code": 200 -} - -#### 9、变更广告信息(审批) - -##### 接口地址 - -http://192.168.100.20:8888/ad +http://154.8.214.202:5015/interface/location ##### 返回格式:json @@ -346,28 +258,19 @@ http://192.168.100.20:8888/ad ##### 请求示范 -http://192.168.100.20:8888/ad?name=abc&gameid=1003&locationid=1&ad_title=hello&ad_body=hi world&ad_image=http://1&ad_url=http://2&begin_time=2019-06-01&end_time=2019-12-01&ad_num=300&ad_sort=1&status=1&id=1001&companyid=2 +http://154.8.214.202:5015/interface/location?area=1&type=1&gameid=1003 ##### 请求参数说明 -##### - -| 名称 | 类型 | 必填 | 说明 | -| ---------- | -------- | ---- | --------------------------------------------------- | -| id | int | 是 | 广告ID | -| name | string | 是 | 广告名称 | -| gameid | int | 是 | 广告投放的游戏ID | -| locationid | int | 是 | 位置ID | -| ad_title | string | 是 | 广告标题 | -| ad_body | string | 是 | 广告正文 | -| ad_image | string | 是 | 头像链接 | -| ad_url | string | 是 | 跳转链接 | -| begin_time | datetime | 是 | 开始时间,默认是1999-01-01 | -| end_time | datetime | 是 | 结束时间,默认是3000-01-01 | -| ad_num | int | 是 | 投放次数,默认是-1(无限) | -| ad_sort | int | 是 | 优先级默认为0 | -| status | int | 是 | 默认为0(未审批),1=审批通过,2=审批未通过,3=暂停 | -| companyid | int | 是 | 广告提交公司 | +| 名称 | 类型 | 必填 | 说明 | +| --------- | ------ | ---- | ------------------------------------------------------------ | +| area | string | 是 | 区域(第一元素:1=首页,2=游戏中,3=结算页,4=关闭,第二元素:X轴第三元素:Y轴,其中X,Y取值范围(0,15))如(1,0,0)代表首页左上 | +| type | int | 是 | 类型(1=icon,2=banner,3=浮窗) | +| mode | int | 是 | 广告单播或轮播模式(1=单播,2=轮播) | +| id | int | 是 | 位置ID | +| | int | 是 | 状态 0=未审批,1=审批通过,2=审批未通过,默认为1 | +| gameid | int | 是 | 游戏ID | +| channelid | int | 否 | 渠道ID,默认是6001 | ##### 返回参数说明 @@ -381,11 +284,11 @@ http://192.168.100.20:8888/ad?name=abc&gameid=1003&locationid=1&ad_title=hello&a "code": 200 } -#### 10、删除广告信息 +#### 8、删除位置服务信息 ##### 接口地址 -http://192.168.100.20:8888/ad +http://154.8.214.202:5015/interface/location ##### 返回格式:json @@ -393,7 +296,7 @@ http://192.168.100.20:8888/ad ##### 请求示范 -http://192.168.100.20:8888/ad +http://154.8.214.202:5015/interface/location?id=1015 ##### 请求参数说明 @@ -413,11 +316,140 @@ http://192.168.100.20:8888/ad "code": 200 } -#### 11、返回广告列表信息 + + +#### 9、添加广告信息 ##### 接口地址 -http://192.168.100.20:8888/ad +http://154.8.214.202:5015/interface/prometion + +##### 返回格式:json + +##### 请求方式:post + +##### 请求示范 + +http://154.8.214.202:5015/interface/promotion?name=abc&gameid=1003&locationid=1007&ad_title=hello&ad_body=hi world&ad_image=http://1&ad_url=http://2&companyid=2&ad_property={‘is_shake’:1}&jump_status=1 + +##### 请求参数说明 + +| 名称 | 类型 | 必填 | 说明 | +| ----------- | -------- | ---- | ------------------------------------------------------- | +| name | string | 是 | 广告名称 | +| gameid | int | 是 | 广告投放的游戏ID | +| channelid | int | 是 | 渠道ID,默认是6001 NEW | +| locationid | int | 是 | 位置ID,通过该ID到localtion表中获得area,type,mode信息 | +| ad_title | string | 是 | 广告标题 | +| ad_body | string | 是 | 广告正文 | +| ad_image | string | 是 | 头像链接 | +| ad_url | string | 是 | 跳转链接 | +| begin_time | datetime | 否 | 开始时间,默认是1999-01-01 | +| end_time | datetime | 否 | 结束时间,默认是3000-01-01 | +| ad_num | int | 否 | 投放次数,默认是0(次数无限) | +| ad_sort | int | 否 | 优先级默认为0 | +| status | int | 否 | 默认为0(未审批),1=审批通过,2=审批未通过,3=暂停 | +| companyid | int | 是 | 广告提交公司 | +| ad_property | json | 是 | 广告属性描述 | + +##### 返回参数说明 + +| 名称 | 类型 | 必填 | 说明 | +| ---- | ---- | ---- | -------- | +| code | int | 是 | 返回状态 | + +##### 返回示例 + +{ + "code": 200 +} + +#### 10、变更广告信息(审批) + +##### 接口地址 + +http://154.8.214.202:5015/interface/promotion + +##### 返回格式:json + +##### 请求方式:put + +##### 请求示范 + +http://154.8.214.202:5015/interface/promotion?name=abc&gameid=1003&locationid=1&ad_title=hello&ad_body=hi world&ad_image=http://1&ad_url=http://2&begin_time=2019-06-01&end_time=2019-12-01&ad_num=300&ad_sort=1&status=1&id=1001&companyid=2 + +##### 请求参数说明 + +##### + +| 名称 | 类型 | 必填 | 说明 | +| ----------- | -------- | ---- | --------------------------------------------------- | +| id | int | 是 | 广告ID | +| name | string | 是 | 广告名称 | +| gameid | int | 是 | 广告投放的游戏ID | +| channelid | int | 是 | 渠道ID,默认是6001 NEW | +| locationid | int | 是 | 位置ID | +| ad_title | string | 是 | 广告标题 | +| ad_body | string | 是 | 广告正文 | +| ad_image | string | 是 | 头像链接 | +| ad_url | string | 是 | 跳转链接 | +| begin_time | datetime | 是 | 开始时间,默认是1999-01-01 | +| end_time | datetime | 是 | 结束时间,默认是3000-01-01 | +| ad_num | int | 是 | 投放次数,默认是-1(无限) | +| ad_sort | int | 是 | 优先级默认为0 | +| status | int | 是 | 默认为0(未审批),1=审批通过,2=审批未通过,3=暂停 | +| companyid | int | 是 | 广告提交公司 | +| ad_property | json | 是 | 广告属性描述 | + +##### 返回参数说明 + +| 名称 | 类型 | 必填 | 说明 | +| ---- | ---- | ---- | -------- | +| code | int | 是 | 返回状态 | + +##### 返回示例 + +{ + "code": 200 +} + +#### 11、删除广告信息,实际将status 改为4 + +##### 接口地址 + +http://154.8.214.202:5015/interface/promotion + +##### 返回格式:json + +##### 请求方式:delete + +##### 请求示范 + +http://154.8.214.202:5015/interface/promotion + +##### 请求参数说明 + +| 名称 | 类型 | 必填 | 说明 | +| ---- | ---- | ---- | -------------- | +| id | int | 是 | 需删除的位置ID | + +##### 返回参数说明 + +| 名称 | 类型 | 必填 | 说明 | +| ---- | ---- | ---- | -------- | +| code | int | 是 | 返回状态 | + +##### 返回示例 + +{ + "code": 200 +} + +#### 12、返回广告列表信息 + +##### 接口地址 + +http://154.8.214.202:5015/interface/promotion ##### 返回格式:json @@ -425,11 +457,11 @@ http://192.168.100.20:8888/ad ##### 请求示范 -http://192.168.100.20:8888/ad?id=1002 +http://154.8.214.202:5015/interface/promotion?id=1002 -http://192.168.100.20:8888/ad?companyid=0 +http://154.8.214.202:5015/interface/promotion?companyid=0 -http://192.168.100.20:8888/ad?status=0 +http://154.8.214.202:5015/interface/promotion?status=0 ##### 请求参数说明 @@ -481,3 +513,5 @@ http://192.168.100.20:8888/ad?status=0 } } +#### ad_channel 获得接口 +http://mp.kingsome.cn/api/open/promotion/get-uid?game_id=8002&platform_id=6001 \ No newline at end of file diff --git a/__pycache__/config.cpython-36.pyc b/__pycache__/config.cpython-36.pyc index fdde27bf1943a883f6aec526660ce228c6552ec7..741e2f80ae9adce1dfdb8d40c47762955aba8b6a 100644 GIT binary patch literal 672 zcmY*WO>fgM7`C0XP1CguHp-YlD&o{b({$luK?tFVYU0uhaEXMftgqXerAe^8t?iNV z3pjA%5Ac_KYYy0u@zJ46k>+ZWRo%a)qkRRlqR>Jrt4)qxU2+)K? zgp&^x*fovVIW5LMxBi@lAyH{260V|hta3im|FZ($ z*qST7e0bV_+Ztu*SWH@1LQh+>h5DFuB?qBe;}{j-foR<$M10-Dhq%2k3_E@g`_c`3 z-`~XTnqiqT)**sw5Xf2}wiWwSg^7dRIgO>;|-*(}o{OaJUw`|}ac ziyc$r^IS+i)MCa>6Ezc|^iZUl%W*v7!?kmzlm6-JfwB67SKo<5+c)s*eivdLcPB!3 r@pCpgx|`fyzA(=7Sq2vge^C^y4iOyYQkOZjL3imInZs;mQ=9$<+uppC delta 227 zcmZ3$x`V0Sn3tF9`B$abK1K$H#|%h-707k~;$kHrk;0I|n8K98Jcl`oA%!K1F@-gS zErmUWBZYGgOB7QIS1^MncNL$ZrIDVYnT4LAfq|ZpLFQ`-28NeFV;MA=Z?Rxy6){l&K)Yz!1fnn>jg@QBhixbegin_time and '{now}' 0: - num = my_redis.get(f"ad::{line['id']}::num") - if not num: - num = 0 - if int(line['ad_num']) > int(num): - my_redis.sadd(key, line['id']) - my_redis.expire(key, 120) - n = int(line['ad_num']) - int(num) - log.info(f"add {line['id']} to {key} ,num was {line['ad_num']},limit was {n}!") - else: - if my_redis.sismember(key, line['id']): - my_redis.srem(key, line['id']) - log.info(f"remove {line['id']} from {key}!") - elif int(line['ad_num']) == 0: - my_redis.sadd(key, line['id']) - my_redis.expire(key, 120) - log.info(f"add {line['id']} to {key} ,num was unlimit !") - else: - log.error(f"get ad_num from mysql failed! ad_num={line['ad_num']}") - - if not my_redis.exists(f"ad::{line['id']}::info"): - # remove some filed from adinfo - remove_list = ('ad_num', 'companyid', 'gameid', 'locationid') - for item in remove_list: - line.pop(item) - my_redis.hmset(f"ad::{line['id']}::info", line) - my_redis.expire(f"ad::{line['id']}::info", 120) - # my_redis.expire(f"ad::{line['id']}::info", 3600 * 24 * 7) - log.info(f"add ad::{line['id']}::info to redis!") - - # 删除过期的数据 - log.info("remove expire data from cache!") - expire_sql = f"select id,gameid,locationid from ad where '{now}'>end_time" - remove_data = mydb.query(expire_sql) - if remove_data: - for line in remove_data: - try: - id, gameid, locationid = line - key = f"{gameid}:{locationid}" - if my_redis.sismember(key, id): - my_redis.srem(key, id) - log.info(f"remove {id} from {key} success!") - except Exception: - log.error("拆解过期数据出错!", exc_info=True) - class DispatchHandler(tornado.web.RequestHandler): @gen.coroutine @@ -127,16 +39,22 @@ class DispatchHandler(tornado.web.RequestHandler): def _upAdRecording(self): try: - adid = self.get_query_argument('adid') + adid = unquote(self.get_query_argument('adid'), 'utf-8') + log.info(f" get adid was {adid}") + ids = json.loads(adid) except Exception: result = {'errcode': 2, "errmsg": f"get args failed`"} log.error(result, exc_info=True) self.write({'errcode': 1, "errmsg": 'get adid failed!'}) - if adid: - key = f"ad::{adid}::num" - my_redis.incr(key, amount=1) - self.write({'errcode': 0, "errmsg": '', "message": f"{adid} incr success!"}) + if ids: + for id in ids: + if id: + key = f"ad::{id}::num" + my_redis.incr(key, amount=1) + self.write({'errcode': 0, "errmsg": '', "message": f"{ids} incr success!"}) + else: + self.write({'errcode': 1, "errmsg": 'get adid failed!'}) def _selfCheckingHandler(self): @@ -149,44 +67,58 @@ class DispatchHandler(tornado.web.RequestHandler): try: input = json.loads(self.get_query_argument('body')) gameid = input['gameid'] - locationid = input['locationid'] + channelid=input.get('channelid',None) or 6001 + area=input.get('area',0) + locationid = input.get('locationid',0) except Exception as e: result = {'errcode': 2, "errmsg": f"get args failed,{str(e)}"} log.error(result) - self.write_error(2) - return False + return self.write_error(2) if gameid and locationid: - key = f"ad::{gameid}::{locationid}" - - ids = my_redis.smembers(key) - info = [] - if not ids: - result = {'errcode': 0, "errmsg": '', "message": {"totoal": len(info), "result": info}} - else: - try: - # 如果取得的记录条数大于预设,扔掉多余的记录,当前采用的是随机选择,以后可能需要添加加权选择 - id_list = [] - if limit < len(ids): - nums = limit - else: - nums = len(ids) - - for i in range(nums): - while 1: - new = my_redis.srandmember(key) - if new not in id_list: - id_list.append(new) - break - for id in id_list: - temp = my_redis.hgetall(f"ad::{id}::info") - info.append(temp) - result = {'errcode': 0, "errmsg": '', "message": {"totoal": len(info), "result": info}} - except Exception as e: - result = {'errcode': 1, "errmsg": e} - self.write(result) + key_word = f"ad::{gameid}::{channelid}::*::{locationid}" + elif gameid and area: + key_word = f"ad::{gameid}::{channelid}::{area}*" else: - result = {'errcode': 2, "errmsg": f"get args failed!"} - self.write(result) + pass + ad_keys = my_redis.keys(key_word) + ids = [] + for ad_key in ad_keys: + adlists = my_redis.smembers(ad_key) + try: + for key in adlists: + ids.append(key) + except Exception: + log.error(f"get redis data failed!", exc_info=True) + return self.write({'errcode': 2, "errmsg": f"get redis data failed!"}) + dist_ids = list(set(ids)) + info = [] + if not dist_ids: + result = {'errcode': 0, "errmsg": '', "message": {"totoal": len(info), "result": info}} + else: + try: + # 如果取得的记录条数大于预设,扔掉多余的记录,当前采用的是随机选择,以后可能需要添加加权选择 + id_list = [] + if limit < len(dist_ids): + nums = limit + else: + nums = len(dist_ids) + + for i in range(nums): + while 1: + # new = my_redis.srandmember(key) + import random + new = random.choice(dist_ids) + if new not in id_list: + id_list.append(new) + break + for id in id_list: + temp = my_redis.hgetall(f"ad::{id}::info") + info.append(temp) + result = {'errcode': 0, "errmsg": '', "message": {"totoal": len(info), "result": info}} + except Exception as e: + result = {'errcode': 1, "errmsg": e} + return self.write(result) + def make_app(): @@ -195,8 +127,6 @@ def make_app(): if __name__ == "__main__": print('start!') - send_cache_data() app = make_app() app.listen(ad_list_interface_port) - tornado.ioloop.PeriodicCallback(send_cache_data, 60000).start() tornado.ioloop.IOLoop.current().start() diff --git a/ad_tasks.py b/ad_tasks.py new file mode 100644 index 0000000..e3bef5b --- /dev/null +++ b/ad_tasks.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +from myredis.myredis import my_redis +import datetime +from mysql.mmysql import MysqlBase +from config import mysql_promotion_config +from log.mylog import define_logger +import logging +from config import BEGIN, END, ad_list_interface_port +import pdb + +define_logger("/data/logs/ad_tasks.log") +log = logging.getLogger(__name__) + +limit = 10 + + +def send_cache_data(): + mydb = MysqlBase(**mysql_promotion_config) + log.info("start update cache !") + now = datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + all = [] + + get_data_sql = f"""select + a.id, + a.name, + a.ad_num, + a.ad_title, + a.ad_body, + a.ad_image, + a.jump_param, + a.ad_sort, + a.companyid, + a.gameid, + a.channelid, + a.jump_status, + a.ad_property, + b.area, + b.type, + b.mode, + a.locationid + from + (select + id, + name, + ad_num, + ad_title, + ad_body, + ad_image, + jump_param, + ad_sort, + companyid, + gameid, + channelid, + jump_status, + locationid , + ad_property + from + ad + where + status=1 + and in_used=1 + and '{now}'> begin_time + and '{now}' 0: + num = my_redis.get(f"ad::{line['id']}::num") + if not num: + num = 0 + if int(line['ad_num']) > int(num): + my_redis.sadd(key, line['id']) + my_redis.expire(key, 120) + n = int(line['ad_num']) - int(num) + log.info(f"add {line['id']} to {key} ,num was {line['ad_num']},limit was {n}!") + else: + if my_redis.sismember(key, line['id']): + my_redis.srem(key, line['id']) + log.info(f"remove {line['id']} from {key}!") + elif int(line['ad_num']) == 0: + my_redis.sadd(key, line['id']) + my_redis.expire(key, 120) + log.info(f"add {line['id']} to {key} ,num was unlimit !") + else: + log.error(f"get ad_num from mysql failed! ad_num={line['ad_num']}") + + if not my_redis.exists(f"ad::{line['id']}::info"): + # remove some filed from adinfo + remove_list = ('ad_num', 'gameid') + for item in remove_list: + line.pop(item) + my_redis.hmset(f"ad::{line['id']}::info", line) + my_redis.expire(f"ad::{line['id']}::info", 120) + # my_redis.expire(f"ad::{line['id']}::info", 3600 * 24 * 7) + log.info(f"add ad::{line['id']}::info to redis!") + + # 删除过期的数据 + log.info("remove expire data from cache!") + + expire_sql = f"""select + a.id,a.gameid,a.channelid,a.locationid,a.status,b.area + from + (select + id,gameid,channelid,locationid,status + from + ad + where + '{now}'> end_time + or status in (3,4) ) a , + (select + id, + area + from + location) b + where + a.locationid=b.id""" + remove_data = mydb.query(expire_sql) + if remove_data: + for line in remove_data: + try: + id, gameid, channelid, locationid, _, area = line + key = f"ad::{gameid}::{channelid}::{area.split(',')[0].strip()}::{locationid}" + # key = f"{gameid}:{locationid}" + if my_redis.sismember(key, id): + my_redis.srem(key, id) + my_redis.expire(f"ad::{id}::info", 1) + log.info(f"remove {id} from {key} success!") + except Exception: + log.error("拆解过期数据出错!", exc_info=True) + + +if __name__ == "__main__": + log.info('start!') + send_cache_data() diff --git a/handler/__pycache__/__init__.cpython-36.pyc b/handler/__pycache__/__init__.cpython-36.pyc index 5721090d9e0d62ed0e76966b8722b45500c4f55b..d066b6659055d004cb620f62a07009827b1c9191 100644 GIT binary patch delta 13 Ucmb=bVmIdHk delta 13 Ucmb=bVmIdH<+}e+X(D?u02{yrKmY&$ diff --git a/handler/__pycache__/company.cpython-36.pyc b/handler/__pycache__/company.cpython-36.pyc index 2ffe3005c32d65c6c5dcbb8659b97bb3deff9acf..2965e3bda3094796e98f026e44f0deff813c91dd 100644 GIT binary patch literal 4476 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 PU(+*NrU$Y=_qYECPD2v< delta 2216 zcmZWq&2Jk;6rb5|uh$<*9J@(NNh=z%X`7bPB1F?lrAbjyRZt5B46SiJ>vSD|b#{a5 zXk8<@NJt1onZl*y1Q)KH`X_MUggEVm6NgHGIB=>s@ZPL(qSUK-esA8)?7ZK5@3;RR z{Q7|XVkTpEzdCgNuk3w$IB@F3%YH%2Q=ZW%3`u#~n{E`DIi!?G%^GW|v1X68^jLGo zS_ZY(2+OkEJ;HKcYN(b=OuI_l{9^(?m&Up3&7jlV2)&AM=zZ}W{di6R&v_U@7DPxI zbVwpnQ5b=J^s=jpH8~UBLYw;q?jP5AjGZt1$XiKpN z*Q#q?xDS-zI0!;*cr>cO$l_2mYAbora8^^6;NJo}FMc)_PcYaJkp^LOhV*G~mMIcD z6^cNS$(G3lq)!0S>blLZiAD3qU>3G*n%rx3KJw-^t+{&DZ+h&&TQ22z5gES3gFgeN zYs&cfv*?;baR|i$6wjf+h+Q=a6SGh@nb)iYx0^|j+mRYD?}gsvE3hcQq+zrQb!b-1 zSl=H*oMN@T(c(uz<4Y)ZVPykW6<%$#PHRQ{VZA($ix7b!#LuXVUfCIaUyW40C@!VW zzJC(W8wU}m@F+-~&s;6JJGN{&UAyJg))NPxfBFjiC78PiBXB?vNQOgg@q2116@tlV zpN3+;eTlZky8U2)aQcr`3F7$G33La+6{~(bOyEQ$M;9p@t?HeM&*bZ46^z|5Wbp2_ zgeQD<1-1qS5JZ+q9w05yB9u>7+)W=hz5z$?hG=G97$6%_ra`Nch9Y%+nJ@$9%w=po zjad;LLd!wPEJDfXP%@v6TGMElEX8b=mMv*9hh@esiB>kT+}vf3$nXq`2^3fp9KjVm zXM!$>&zvI?nB8@j^cg>m%MoRntl03|fyYNE?J7DYN!$W1-c>1Dw-baFa0FQGWYkcA z36z^dRSP=kbmp*OK-c$v1#ngd-Pa`&fQW1jT%=`53pkLaqzw%Rv}Qk5YL8fY zhu=XqhDKCbCZfQ+Dv+7BO@W~2$E)8aY+_4clgMk59gidl0Ctqz2wO1)Q>?(IWeV`1 z;{Pd-9~huQiS-Wr#l!4!QTDs$vop{0QwWvBYp?h-J8vM<@%>^ZcdR696f4Z)P56k(KF2Bx3?v+&`>*FlWokOvm_c77%NpK*yN|LdtrCR$f+t#g=m9g^D z>+TWv@`DSn;t4W1?9MoI#RGZ|!Z)iNYK~9goKt12QsrwKEf0DXPk!o^VrAmc6cRIx H9gq4SD9pK2 diff --git a/handler/__pycache__/location.cpython-36.pyc b/handler/__pycache__/location.cpython-36.pyc index b96642fa4bdcdc9d68edf13526ceed7a16b4778b..1b73a5bdaddca490a2a3c12b4de687b2235e788d 100644 GIT binary patch literal 4120 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 diff --git a/log/__pycache__/mylog.cpython-36.pyc b/log/__pycache__/mylog.cpython-36.pyc index 7e29cae17a8d747b1c44e3f40546c8bc5861ae7a..e1170e065c24dced86a79cf61c9269e95e3bdcb1 100644 GIT binary patch delta 16 Xcmcb}dXbggn3tDpy{GO*_ESs%D76H% delta 16 Xcmcb}dXbggn3tEUV3O)a_ESs%D2fEO diff --git a/myredis/__pycache__/__init__.cpython-36.pyc b/myredis/__pycache__/__init__.cpython-36.pyc index 4d7684c0317bc44758930a898fe3543833911644..7c3c5b52235071a7d54da3bf407d67f2ff9b4b34 100644 GIT binary patch delta 13 Ucmb=bVmIdHk delta 13 Ucmb=bVmIdH<+}DnX(D?u02`SEIsgCw diff --git a/myredis/__pycache__/myredis.cpython-36.pyc b/myredis/__pycache__/myredis.cpython-36.pyc index 5315049e3d73df930b9c97cd8e3304681bba8270..2ff9c186f1df61f67ca41bf4db084d24cf44dcfa 100644 GIT binary patch delta 176 zcmaFP{D)cDn3tDJzDhUtDcA>u3p9{-c+_IwiKpd22JjX6TDT}3KENp%TsPKr6h%DvKFxd4Jcv*61O?s_*EK%I4%vn6C+$o&B zj8VL)Y*B0}Ou-DATob2x3o)f6g=n%Au>!Ref%F!!PiAG*V!SokfH6}diZ?kww;(aE pGQKD^C9`-XLlHkn3IF6Zj8-B7Kqe0(2M`J{aWM%n@-gu+0szIS9+v0P3XZ-ARayYW)o>*Sr~?$*|)#u7SrfSj3nMK$teUPo?!jL?+8gBxXctcp(xdNVw%bHi}6mVmzOU z5KZVs>w5d5lvMPS4#c+!N#g9%R&ub6w@-f@Se_x640XiAo9`x@g5F;ipZ|02P8k;yd?M*ALr zmXF+4G>?>U7Oh>&eP>sEXLQDb9>m(Dw>nbV(|vxAzQG$es=N#9s-`aK=IPyd1kLO8 YaTF=q9npPJsOYXJ)FOWAe$O@j0s!xc4gdfE delta 761 zcmZ|NK~K~`6ae6P)9G|NJ6n*&O3WJeAjCa@sPRa=BgTWq#e)Z-kn8|m={8ZwkWE}q zdUHrT`4=!k;>nxFUtnUw$zS2wH{I^8gqSAn^mRJ(z4zwN?3;$XQ?1Gu@8_P?E`652 z*!>%ZXixjb?*kAVa~<>vkX-0635*{T7jKbt2{2mDkmZa@B8D?^m4p^V?ew0%3Kcom zZM4(wW|lYXTRv~U@>}zKqqDo)&a-Jk$Qf&=Tb(nJb#`{vpKokumob>dc(b+ONu;QR zDat`Ygirf2XsujD8ffa6hrA#&hd2krGzu7|knj;q4AXcGPf1GG?2I^q$M%yS+i&7v zvgvkqrqW;^ge$X;@V)Ce1ZHUDF`%Gm1S8RxaJdkn$#^JYD5BcCAfmcZ=Dy~MXS_i% z^B`e^@ldoZH!nI)U9sD0ap9Fq@w!V9o6hi}Sm>xsa+(%}AE*3X{eUC;uKF>EMNLe}`svN+1JoDs Yccp}zjZG3%;K318vZzOV`+Fk(3sg3WcK`qY diff --git a/server.py b/server.py index 7271616..f145ccb 100644 --- a/server.py +++ b/server.py @@ -21,8 +21,9 @@ api = Api(app) api.add_resource(Company, '/interface/company') api.add_resource(Location, '/interface/location') -api.add_resource(Ad, '/interface/ad') +api.add_resource(Ad, '/interface/promotion') api.add_resource(Cos_sdk, '/interface/cos_upload') + if __name__ == '__main__': app.run(host='0.0.0.0', debug=True, port=5015)