ksjsb/tests/test_h5_state_context.py
2026-07-30 20:25:56 +08:00

132 lines
4.8 KiB
Python

import json
import unittest
from core.h5_jsbridge import build_h5_sign_input
from core.h5_sig3 import h5_sig3_crc32_from_sign_input
from main import SIGN_IN_EVENT_TRACKING, KsNebulaClient, ResponseRecord, normalize_h5_cookie_wire_values
def make_client() -> KsNebulaClient:
return KsNebulaClient(
full_cookie="kpn=NEBULA; kpf=ANDROID_PHONE; userId=1; did=ANDROID_old; "
"kuaishou.api_st=TOKEN; token=TOKEN; egid=EGID; oDid=ODID; rdid=RDID",
client_salt="salt",
cookie_dict={
"kpn": "NEBULA",
"kpf": "ANDROID_PHONE",
"userId": "1",
"did": "ANDROID_old",
"kuaishou.api_st": "TOKEN",
"token": "TOKEN",
"egid": "EGID",
"oDid": "ODID",
"rdid": "RDID",
},
timeout=1,
dry_run=True,
)
class H5StateContextTests(unittest.TestCase):
def test_decoded_env_device_fields_match_har_h5_sign_crc_after_wire_normalize(self):
cookie = {
"kpn": "NEBULA",
"kpf": "ANDROID_PHONE",
"userId": "5402308233",
"did": "ANDROID_f05497e9cef09a7f",
"c": "OPPO",
"appver": "14.5.50.11631",
"language": "zh-cn",
"mod": "OnePlus(PJZ110)",
"did_tag": "0",
"egid": "DFPB64A5E60567B56334B78B18A5E6E1F6C046F7CE90B0C1456E104EB8DE88C9",
"oDid": "ANDROID_46a032e0a2af8184",
"androidApiLevel": "36",
"newOc": "OPPO",
"browseType": "3",
"socName": "Qualcomm Snapdragon 8750",
"abi": "arm64",
"userRecoBit": "0",
"device_abi": "arm64",
"grant_browse_type": "AUTHORIZED",
"rdid": "ANDROID_741de4351c44850d",
}
normalized = normalize_h5_cookie_wire_values(cookie)
sign_input = build_h5_sign_input(
normalized,
query={"eventTrackingLogInfo": SIGN_IN_EVENT_TRACKING},
)
self.assertEqual(normalized["mod"], "OnePlus%28PJZ110%29")
self.assertEqual(normalized["socName"], "Qualcomm+Snapdragon+8750")
self.assertEqual(h5_sig3_crc32_from_sign_input(sign_input), 0x1F818C51)
def test_sign_in_keeps_har_external_popup_event_tracking_context(self):
client = make_client()
dynamic_event = {
"deliverOrderId": "393",
"eventTrackingTaskId": 20022,
"resourceId": "earnPage_taskList_2",
"extParams": {
"isServerRecordClickAction": True,
"signInThresholdTaskType": 0,
"businessPriceUniqueId": "EP2AgICwndScChjgUyCk8aac9TMo9KLynQM=",
},
"resourceFirstLevelName": "EARN_PAGE",
"resourceSecondLevelName": "TASK_LIST",
}
client._update_h5_state_contexts(
{
"data": {
"dailyTasks": [
{
"id": 20022,
"linkUrl": "https://nebula.kuaishou.com/rest/wd/encourage/unionTask/signIn/report",
"eventTrackingLogInfo": dynamic_event,
}
]
}
}
)
captured = {}
def fake_h5_get(label, title, request_id, path, params, header_key):
captured.update(params)
return ResponseRecord(label, title, request_id, 200, True, path, {"result": 1}, "")
client._next_h5_sig3 = lambda *args, **kwargs: "SIG3"
client._h5_get = fake_h5_get
client.sign_in()
self.assertEqual(
captured["eventTrackingLogInfo"],
SIGN_IN_EVENT_TRACKING,
)
def test_treasure_open_body_preserves_har_source_context(self):
client = make_client()
dynamic_event = {
"eventTrackingTaskId": 20035,
"resourceId": "externalFeed_externalTreasureChestWidget",
"extParams": {"isServerRecordClickAction": True},
"deliverOrderId": "5128",
"resourceFirstLevelName": "EXTERNAL_FEED",
"resourceSecondLevelName": "EXTERNAL_TREASURE_CHEST_WIDGET",
}
client._update_h5_state_contexts({"data": {"eventTrackingLogInfo": dynamic_event}})
body = json.loads(client._treasure_open_body())
inner_event = json.loads(body["eventTrackingLogInfo"])
self.assertEqual(inner_event["eventTrackingTaskId"], 20035)
self.assertEqual(inner_event["resourceId"], "externalFeed_externalTreasureChestWidget")
self.assertEqual(inner_event["deliverOrderId"], "5128")
self.assertEqual(inner_event["extParams"]["isServerRecordClickAction"], True)
self.assertEqual(inner_event["extParams"]["source"], "bottom_guide_first")
if __name__ == "__main__":
unittest.main()