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()