Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 397, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

中宣部防沉迷系统python版本

import json
from Crypto.Cipher import AES
import base64
import requests
import hashlib
import time
import os
import binascii
URL = "https://wlc.nppa.gov.cn/test/authentication/check"  #接口调用地址(实名认证)
KEY = "d10d8642c66c1c785aa32b194aba2afa"                   #访问密钥                     
APPID = "9177929f5010481b858f661a409fd764"                 #接口调用唯一凭证 由系统发放
BIZID = "1101999999"                                       #业务权限标识 与游戏备案识别码一致
#测试用例
TEST_PARAMS = {"ai":"100000000000000001",
"name":"某一一",
"idNum":"110000190101010001"}
class AES_GCM(object):
    def __init__(self, key):
        self.key = key  #秘钥
        self.MODE = AES.MODE_GCM
        self.iv = os.urandom(12)
    def aes_encrypt(self, params):
        aes = AES.new(binascii.unhexlify(self.key), self.MODE, self.iv)
        params, tag=aes.encrypt_and_digest(json.dumps(params).encode("utf-8"))
        base64_data= self.iv + params + tag
        encrypted_text = str(base64.b64encode(base64_data), encoding='utf-8')
        return encrypted_text
    def aes_decrypt(self, encrypted_text):
        encrypted_text = base64.b64decode(encrypted_text)
        cipher = AES.new(binascii.unhexlify(self.key), self.MODE, encrypted_text[:12])
        cc = cipher.decrypt_and_verify(encrypted_text[12:-16], encrypted_text[-16:])
        return json.loads(cc)
def hash256(pre_hash_text):
    hs256 = hashlib.sha256()
    hs256.update(pre_hash_text.encode())
    return hs256.hexdigest()
def sorted_params(params, param_="%s%s", none_keys = []):
    return "".join([
            param_ % i for i in
            sorted(params.items(), key=lambda d:d[0]) if i[0] not in none_keys
            ])
def main():
    aesobject = AES_GCM(KEY)
    _time = str(int(time.time() * 1000))
    #############上报用户行为(上线 下线),直接替换TEST_PARAMS 接口调用地址 http:// api2.wlc.nppa.gov.cn/behavior/collection/loginout  实名认证接结果查询接口http:// api2.wlc.nppa.gov.cn/idcard/authentication/query
    #no:[条目编码]在批量模式中标识一条行为数据,取值范围 1-128
    #si:[游戏内部会话标识]一个会话标识只能对应唯一的实名用户,一个实名用户可以拥有多个会话标识;同一用户单次游戏会话中,上下线动作必须使用同一会话标识上报备注:
    #                  会话标识仅标识一次用户会话,生命周期仅为一次上线和与之匹配的一次下线,不会对生命周期之外的任何业务有任何影响
    #bt:[用户行为类型]游戏用户行为类型0:下线,1:上线
    #ot:[行为发生时间]行为发生时间戳,单位秒
    #ct:[上报类型]用户行为数据上报类型,0:已认证通过用户,2:游客用户
    #di:[设备标识]游客模式设备标识,由游戏运营单位生成,游客用户下必填
    #pi:[用户唯一标识]已通过实名认证用户的唯一标识,已认证通过用户必填 由38位的字符串构成,其中包括用户出生日期和用户编码两部分。用户出生日期以26进制(10个数字+英文字母表前16个字母)的方式编码,位于用户唯一标识前6位;用户编码由网络游戏防沉迷实名认证系统生成,位于用户唯一标识的后32位。
    #   例如:用户唯一标识 1hpfml09b57f3f8185f8cb5094ea3f26278efb 用户生日部分是1hpfml 用户编码部分是09b57f3f8185f8cb5094ea3f26278efb 
    player_data = {'collections':[{"no":1,"si":"w7ligxjw355ftctm94yqt9dcew4zd723","bt":0,"ot":_time,"ct":0,"di":"uyiv6clpf7cu296pd4ppv11le820dhkw","pi":"1fffbjzos82bs9cnyj1dna7d6d29zg4esnh99u"}]}
    ##############
    aes_gcm = aesobject.aes_encrypt(TEST_PARAMS)
    body_data='{"data":"%s"}' % aes_gcm  ## 国家游戏防沉迷的api试了不能进行json.dumps()
    ## 加入请求头报文
    headers = {"Content-Type":"application/json; charset=utf-8","appId":APPID,"bizId":BIZID,"timestamps":_time}
    ## 对请求头报文排序并排除 不必要的字段进行字符串拼接
    params_str = sorted_params(headers, none_keys=["Content-Type"])
    headers["sign"] = hash256("".join([KEY, params_str, body_data]))
    # print(aesobject.aes_decrypt(aes_gcm)) ## 解码
    response = requests.post(URL, headers=headers, data= body_data)
    print(response.json())
if __name__ == '__main__':
    main()
    
附录:  响应参数 
字段                  类型       名称             字段说明 
errcode               Int       状态码             状态码 
errmsg                String    状态描述           状态描述 
data                  Object    响应对象          响应结果 
data.result           Object    响应结果对象      响应结果内容 
data.result.status    Int       实名认证结果      认证结果 0:认证成功 1:认证中  2:认证失败 
data.result.pi       String     用户唯一标识      已通过实名认证用户的唯一标识
    
接口返回状态码
状态码               状态描述           状态说明 
0                     OK                请求成功
1001                SYS ERROR           系统错误 
1002      SYS REQ RESOURCE NOT EXIST    接口请求的资源不存在 
1003        SYS REQ METHOD ERROR        接口请求方式错误 
1004      SYS REQ HEADER MISS ERROR     接口请求核心参数缺失 
1005      SYS REQ IP ERROR              接口请求IP地址非法 
1006      SYS REQ BUSY ERROR            接口请求超出流量限制 
1007      SYS REQ EXPIRE ERROR          接口请求过期 
1008      SYS REQ PARTNER ERROR         接口请求方身份非法 
1009      SYS REQ PARTNER AUTH DISABLE  接口请求方权限未启用 
1010        SYS REQ AUTH ERROR          接口请求方无该接口权限 
1011      SYS REQ PARTNER AUTH ERROR    接口请求方身份核验错误 
1012      SYS REQ PARAM CHECK ERROR     接口请求报文核验失败
实名认证业务异常
2001      BUS AUTH IDNUM ILLEGAL        身份证号格式校验失败 
2002      BUS AUTH RESOURCE LIMIT       实名认证条目已达上限 
2003      BUS AUTH CODE NO AUTH RECODE  无该编码提交的实名认证记录 
2004      BUS AUTH CODE ALREADY IN USE  编码已经被占用
游戏用户行为数据上报业务异常 
3001     BUS COLL PARTIAL ERROR         行为数据部分上报失败 
3002     BUS COLL BEHAVIOR NULL ERROR   行为数据为空 
3003     BUS COLL OVER LIMIT COUNT      行为数据超出条目数量限制 
3004     BUS COLL NO INVALID            行为数据编码错误 
3005     BUS COLL BEHAVIOR TIME ERROR   行为发生时间错误 
3006     BUS COLL PLAYER MODE INVALID   用户类型无效 
3007     BUS COLL BEHAVIOR MODE INVALID 行为类型无效 
3008     BUS COLL PLAYERID MISS         缺失PI(用户唯一标识)值 
3009     BUS COLL DEVICEID MISS         缺失DI(设备标识)值 3
010      BUS COLL PLAYERID INVALID PI (用户唯一标识)值无效

posted on 2021-08-28 10:52 Benjamin 阅读(4494) 评论(0)  编辑 收藏 引用 所属分类: python


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理