132 lines
4.8 KiB
Python
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()
|