update
This commit is contained in:
parent
4e08f4b68b
commit
369efd9da7
36
README.md
36
README.md
@ -4,43 +4,21 @@
|
|||||||
- 打点上报接口
|
- 打点上报接口
|
||||||
|
|
||||||
##### 请求URL
|
##### 请求URL
|
||||||
- ` http://taapi.legu.cc/v1/point/ `
|
- ` http://taapi.legu.cc/v1/ `
|
||||||
##### 请求方式
|
##### 请求方式
|
||||||
- POST
|
- POST
|
||||||
|
|
||||||
##### 参数
|
##### 参数
|
||||||
|
|
||||||
| 参数名 | 必选 | 类型 | 说明 |
|
| 参数名 | 必选 | 类型 | 说明 |
|
||||||
| :---------- | :--- | :----- | -------------------------------------------------- |
|
| :--------- | :--- | :--------- | -------------------------------------------------- |
|
||||||
| distinct_id | 是 | string | 账户id |
|
| public | 是 | dict | 公共部分 |
|
||||||
| game | 是 | string | 游戏代号 |
|
| data | 是 | list[dict] | 记录列表 |
|
||||||
| account_id | 是 | string | 访客id |
|
|
||||||
| act | 是 | string | ta sdk方法(track,user_set,user_setOnce等) |
|
|
||||||
| event_name | 否 | string | 事件名 当act为track时 此参数必须 |
|
|
||||||
| properties | 是 | 字典 | 属性 |
|
|
||||||
| ts | 是 | int | 时间戳 |
|
|
||||||
| sign | 是 | string | 签名 md5(distinct_id+account_id+act+ts+"0r4X00mH") |
|
|
||||||
|
|
||||||
##### 请求示例
|
##### 请求示例
|
||||||
```shell
|
```shell
|
||||||
curl -X 'POST' \
|
|
||||||
'http://taapi.legu.cc/v1/point/' \
|
|
||||||
-H 'accept: application/json' \
|
|
||||||
-H 'Content-Type: application/json' \
|
|
||||||
-d '{"distinct_id":"aaa",
|
|
||||||
"account_id":"bb",
|
|
||||||
"game":"test",
|
|
||||||
"act":"track",
|
|
||||||
"event_name":"ceshi",
|
|
||||||
"properties":{
|
|
||||||
"lv":6,
|
|
||||||
"vip":7,
|
|
||||||
"#device_id":"aaaa",
|
|
||||||
"herostate": [["fffgsa", 2, 3, 4, 5], ["ddd", 4, 5, 6, 8]]
|
|
||||||
},
|
|
||||||
"sign":"b0991b9928fd17bd43b4092677f05088",
|
|
||||||
"ts":1617096477
|
|
||||||
}'
|
|
||||||
```
|
```
|
||||||
|
|
||||||
##### 返回示例
|
##### 返回示例
|
||||||
|
@ -6,9 +6,20 @@ __all__ = 'restore_field', 'sort_kv', 'check_sign'
|
|||||||
|
|
||||||
|
|
||||||
def restore_field(data: dict) -> dict:
|
def restore_field(data: dict) -> dict:
|
||||||
|
"""
|
||||||
|
不在预置字段 去掉前置#
|
||||||
|
:param data:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
res = dict()
|
res = dict()
|
||||||
for k, v in data.items():
|
for k, v in data.items():
|
||||||
res[settings.FIELD_MAP.get(k) or k] = v
|
map_name = settings.FIELD_MAP.get(k)
|
||||||
|
if map_name:
|
||||||
|
res[map_name] = v
|
||||||
|
elif k.startswith('#'):
|
||||||
|
res[k[1:]] = v
|
||||||
|
else:
|
||||||
|
res[k] = v
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
|
import arrow
|
||||||
|
|
||||||
from settings import settings
|
from settings import settings
|
||||||
|
|
||||||
|
|
||||||
@ -12,11 +16,11 @@ class TaHandler:
|
|||||||
msg = dict()
|
msg = dict()
|
||||||
for k in settings.TA_OUTER:
|
for k in settings.TA_OUTER:
|
||||||
v = data.get(k)
|
v = data.get(k)
|
||||||
if v:
|
if v is not None:
|
||||||
msg[k] = data.pop(k)
|
msg[k] = data.pop(k)
|
||||||
msg['properties'] = data.pop('properties')
|
msg['properties'] = data.pop('properties')
|
||||||
if msg['#type'] == 'track':
|
if msg['#type'] == 'track':
|
||||||
msg.update(data)
|
msg['properties'].update(data)
|
||||||
elif data['#type'] == 'user':
|
elif data['#type'] == 'user':
|
||||||
data['#type'] = 'user' + data['#event_name']
|
data['#type'] = 'user' + data['#event_name']
|
||||||
msg['properties']['#user_id'] = data['#user_id']
|
msg['properties']['#user_id'] = data['#user_id']
|
||||||
@ -36,6 +40,18 @@ async def add_ip(request, rdb, data):
|
|||||||
data['#ip'] = data.get('#ip') or ip
|
data['#ip'] = data.get('#ip') or ip
|
||||||
|
|
||||||
|
|
||||||
|
@TaHandler
|
||||||
|
async def to_date(request, rdb, data):
|
||||||
|
"""
|
||||||
|
时间戳转日期字符串
|
||||||
|
:param request:
|
||||||
|
:param rdb:
|
||||||
|
:param data:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
data['#time'] = arrow.get(data['#time'], tzinfo='Asia/Shanghai').strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
|
||||||
|
|
||||||
|
|
||||||
@TaHandler
|
@TaHandler
|
||||||
async def device_label(request, rdb, data):
|
async def device_label(request, rdb, data):
|
||||||
"""
|
"""
|
||||||
|
@ -11,23 +11,26 @@ router = APIRouter()
|
|||||||
|
|
||||||
@router.post("/")
|
@router.post("/")
|
||||||
async def point(request: Request, items: DataModel):
|
async def point(request: Request, items: DataModel):
|
||||||
public_data: dict = restore_field(items.public)
|
try:
|
||||||
rdb = request.app.state.redis
|
public_data: dict = restore_field(items.public)
|
||||||
data_factory = request.app.state.data_factory
|
rdb = request.app.state.redis
|
||||||
output_factory = request.app.state.output_factory
|
data_factory = request.app.state.data_factory
|
||||||
appid = items.public['b01']
|
output_factory = request.app.state.output_factory
|
||||||
output_factory.name = settings.OUTPUT_NAME[appid]
|
appid = items.public['b01']
|
||||||
for item in items.data:
|
output_factory.name = settings.OUTPUT_NAME[appid]
|
||||||
data: dict = restore_field(item)
|
for item in items.data:
|
||||||
sign = data.pop('sign')
|
data: dict = restore_field(item)
|
||||||
properties = data.pop('properties')
|
sign = data.pop('sign')
|
||||||
if not check_sign(sign, settings.SALT.get('appid',''), data, properties):
|
properties = data.pop('properties')
|
||||||
# continue
|
if not check_sign(sign, settings.SALT.get(appid,''), data, properties):
|
||||||
return {"code": -1, 'msg': '签名错误'}
|
# continue
|
||||||
single_data = dict(**public_data, **data, properties=properties)
|
return {"code": -1, 'msg': '签名错误'}
|
||||||
await asyncio.gather(
|
single_data = dict(**public_data, **data, properties=properties)
|
||||||
*map(lambda o: asyncio.create_task(o(request, rdb, single_data)), data_factory.handler_link))
|
await asyncio.gather(
|
||||||
msg = data_factory.format_data(single_data)
|
*map(lambda o: asyncio.create_task(o(request, rdb, single_data)), data_factory.handler_link))
|
||||||
output_factory.send(msg)
|
msg = data_factory.format_data(single_data)
|
||||||
|
output_factory.send(msg)
|
||||||
|
|
||||||
return {"code": 0, 'msg': 'ok'}
|
return {"code": 0, 'msg': 'ok'}
|
||||||
|
except Exception as e:
|
||||||
|
return {"code": -1, 'msg': '数据异常'}
|
||||||
|
@ -57,10 +57,12 @@ class Config:
|
|||||||
'db': 1
|
'db': 1
|
||||||
}
|
}
|
||||||
SALT = {
|
SALT = {
|
||||||
'3F9AdWKZGhhNS2': 's4epprEG8DdyG5'
|
'3F9AdWKZGhhNS2': 's4epprEG8DdyG5',
|
||||||
|
'G5OYZLM21H': 's4epprEG8DdyG5'
|
||||||
}
|
}
|
||||||
OUTPUT_NAME = {
|
OUTPUT_NAME = {
|
||||||
'3F9AdWKZGhhNS2': 'test'
|
'3F9AdWKZGhhNS2': 'test',
|
||||||
|
'G5OYZLM21H': 'test'
|
||||||
}
|
}
|
||||||
KAFKA_CONF = {
|
KAFKA_CONF = {
|
||||||
'bootstrap_servers': ["192.168.0.30:9092", "192.168.0.71:9092", "192.168.0.229:9092"],
|
'bootstrap_servers': ["192.168.0.30:9092", "192.168.0.71:9092", "192.168.0.229:9092"],
|
||||||
|
Loading…
Reference in New Issue
Block a user