Jelajahi Sumber

新增测试文件

mrh 1 tahun lalu
induk
melakukan
b1f54885f8

+ 18 - 0
testm/easydb.py

@@ -0,0 +1,18 @@
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(__file__)))
+
+from database.config import ai_yunying_db,minio_block
+
+import prefect.client
+from dp.page import page
+
+from conf.config import logger,OUTPUT
+
+test_table = ai_yunying_db['test']
+
+# fake data
+fake_data = {'name': 'test', 'age': 18}
+# other fake dict
+fake_data2 = {'ai_yunying_db': 'test2', 'test2': 18, 'fake_data': fake_data}
+id = test_table.insert(fake_data2)

+ 20 - 0
testm/medata.py

@@ -0,0 +1,20 @@
+import base64  
+from pydantic import BaseModel, ValidationError  
+  
+def find_base64_truncation(encoded_data):  
+    # 将输入字符串划分为4字符的组  
+    for i in range(0, len(encoded_data), 4):  
+        chunk = encoded_data[i:i+4]  
+        try:  
+            # 尝试解码当前4字符组  
+            res = base64.b64decode(chunk)  
+            print(f"解码成功,截断点位于索引 {i}, 字符组为 '{chunk}', 解码结果为: {res.decode()}")  
+        except Exception as e:  
+            # 如果解码失败,打印出错误位置和可能的截断点  
+            print(f"可能的截断点位于索引 {i}, 字符组为 '{chunk}', 错误信息: {e}")  
+            break  # 假设你有一个 Base64 编码的字符串  
+encoded_data = "gAAAAABmK1YeWb24sQcKaJVtnmeoexGo3-W8dJlNEFrLZzBhtpZPUglAkG-VNzMBnLiY14vRuOORZen24-I0wVytnbNa61LO0UY2bZqF4k6vugsPGCgPUT5vvvm7hYlG3FcGwTG1zNM6EMfGelC2vS-LTFjByMwQ8AB_YjLtkRFaJ4nHEgUexow="
+find_base64_truncation(encoded_data=encoded_data)
+# Base64 解码  
+# decoded_data = base64.b64decode(encoded_data)  
+# print(decoded_data)  

+ 147 - 0
testm/prefect_dp.py

@@ -0,0 +1,147 @@
+import base64
+import json
+import os
+import pickle
+import re
+import time
+import os
+import sys
+import uuid
+sys.path.append(os.path.dirname(os.path.dirname(__file__)))
+
+import asyncio
+from uuid import UUID
+from conf.config import logger,OUTPUT
+from database.config import ai_yunying_db
+from dataset import Table
+from DrissionPage import ChromiumPage
+from DrissionPage._elements.chromium_element import ChromiumElement
+from DrissionPage._units.listener import DataPacket
+import jsonpath
+from prefect import flow,task
+from prefect.filesystems import LocalFileSystem, S3
+import os
+import prefect.results 
+from prefect.results import PersistedResult
+from prefect.serializers import PickleSerializer
+from prefect import get_client
+import prefect.client.schemas.objects
+import json  
+
+# import consul_srv_client
+# ip,port = consul_srv_client.get_srv("prefect.service.consul")
+prefect_api = f"http://{'10.0.0.1'}:{'8612'}/api"
+# 在导入 prefect 之前设置环境变量
+os.environ["PREFECT_API_URL"] = prefect_api
+
+from prefect import flow
+
+@task(persist_result=True, result_storage_key="{flow_run.flow_name}_{flow_run.name}_hello.json")
+def task_flow():
+    print(task_flow.result_serializer)
+    print(task_flow.result_storage_key)
+    return "task_flow"
+
+
+@flow(persist_result=True)
+def auto_douyin(msg:str="none"):
+    print(f"Hello, {msg}! Local quickstart flow is running! ")
+    task_flow()
+    return f"Hello, {msg}!  "
+
+
+# 通过本地存储获取结果(不方便)
+def get_result():
+    path = r'I:\code\ai-yunying\live-online-people\output\prefect\auto-douyin_pristine-gecko_hello.json'
+    with open(path, 'r') as f:
+        json_data = json.load(f)
+        base64_data = json_data['data']
+        decoded_data = base64.b64decode(base64_data)
+        result = pickle.loads(decoded_data)
+        print(result)  
+
+from prefect.client.schemas.objects import FlowRun
+from prefect.client.schemas.filters import FlowRunFilter,TaskRunFilter,TaskRunFilterSubFlowRuns,FlowRunFilterId
+from prefect.filesystems import LocalFileSystem
+
+
+# 通过api获取结果,较慢
+async def get_result_by_api():
+    flow_run_id = "cb1e2c24-988b-44aa-8980-00af79f7a842"
+    client = get_client()
+    flow_run:FlowRun = await client.read_flow_run(flow_run_id)
+    logger.info(f"flow_run {flow_run}")
+    flow_run_states = await client.read_flow_run_states(flow_run_id)
+    logger.info(f"flow_run_states {flow_run_states}")
+    # print(f"Flow Run: {flow_run} {type(flow_run)}")
+    print(f"parameters : {flow_run.parameters}")
+    print(f"parent_task_run_id : {flow_run.parent_task_run_id}")
+    print(f"state : {flow_run.state}")
+    state_result:PersistedResult = flow_run.state.result()
+    print(f"state_result : {state_result}")
+    print(f"typr state_result : {type(state_result)}")
+
+    result_value = await state_result.get()
+    print(f"result_value : {result_value}")
+    print(f"state_details: {flow_run.state.state_details}")
+    f = FlowRunFilter(id=FlowRunFilterId(any_=[flow_run_id]))
+    t = TaskRunFilter()
+    t.subflow_runs = TaskRunFilterSubFlowRuns(exists_=False)
+    # run_tasks = await client.read_task_runs(flow_run_filter=f, task_run_filter=t)
+    run_tasks = await client.read_task_runs(flow_run_filter=f)
+    # run_tasks = await client._client.post("/task_runs/filter", json={"flow_runs":{"id":{"any_":["cb1e2c24-988b-44aa-8980-00af79f7a842"]}},"task_runs":{"subflow_runs":{"exists_":False}},"sort":"EXPECTED_START_TIME_DESC","limit":200,"offset":0})
+    logger.info(f"run_tasks {run_tasks}")
+    for task in run_tasks:
+        res = task.state.result()
+        logger.info(f"{task.name} {await  res.get()}")
+
+from prefect.blocks.core import Block
+
+def localfilesystem_load():
+    # print(os.environ["PREFECT_API_URL"])
+    # get_result()
+    local_file_system_block = LocalFileSystem(basepath=os.path.join(OUTPUT, "prefect2"))
+    logger.info(f"local_file_system_block._block_schema_capabilities {local_file_system_block._block_schema_capabilities}") 
+    logger.info(f"local_file_system_block._block_type_name {local_file_system_block._block_type_name}") 
+    STORAGE:Block = local_file_system_block.load('anonymous-92ba6766-2461-4aa6-ba87-f101d0e127e6')
+
+    logger.info(f"STORAGE {STORAGE} {type(STORAGE)}") 
+    block_document, block_document_name = asyncio.run(STORAGE._get_block_document('anonymous-92ba6766-2461-4aa6-ba87-f101d0e127e6'))
+    logger.info(f"{block_document} {type(block_document)}")
+    logger.info(f"{block_document.data}")
+    logger.info(f"{block_document_name} {type(block_document_name)}")
+
+    logger.info(f"STORAGE.data {STORAGE.data}")
+    logger.info(f"STORAGE._block_document_id {STORAGE._block_document_id}")
+    # _block_type_id _block_schema_id _block_document_name _block_type_slug
+    logger.info(f"STORAGE._block_type_id {STORAGE._block_type_id}")
+    logger.info(f"STORAGE._block_schema_id {STORAGE._block_schema_id}")
+    logger.info(f"STORAGE._block_document_name {STORAGE._block_document_name}")
+    logger.info(f"STORAGE._block_type_slug {STORAGE._block_type_slug}")
+    res = PersistedResult(type='reference', artifact_type=None, artifact_description=None, serializer_type='pickle', storage_block_id=UUID('cbca441d-038d-43c0-a531-94f126101911'), storage_key='auto-douyin_mega-potoo_hello.json')
+    
+
+if __name__ == "__main__":
+    local_file_system_block = LocalFileSystem(basepath=os.path.join(OUTPUT, "prefect2"))
+    doc = local_file_system_block._to_block_document(name="test", 
+                                                     block_schema_id=uuid.uuid4(), 
+                                                     block_type_id=uuid.uuid4(),
+                                                     is_anonymous=True
+                                                     )
+    logger.info(f"{doc}")
+    # pickle_data = b"gAAAAABmKiLNhU5fGgCSwcDE-BgYOTAgxQJEjr0DcZRY2oSosTVM9qJ7fMnK373-v3gMrMO0ix_AmEaYQ8lfStKo71FGMofF1hOVtojEuLUXnqEkkNWk0eXefxj35mvGBNQfIL_lzBzxFuSxTTmDkOzPBP57UfNP8Q=="
+    # res = pickle.loads(pickle_data)
+    # logger.info(f"{res}")
+    # logger.info(f"STORAGE.get_block_capabilities {STORAGE.get_block_capabilities()}")
+    # # get_block_class_from_key 
+    # # logger.info(f"STORAGE.get_block_class_from_key {STORAGE.get_block_class_from_key()}")
+    # # get_block_class_from_schema 
+    # logger.info(f"STORAGE.get_block_class_from_schema {STORAGE.get_block_class_from_schema()}")
+    # # get_block_placeholder 
+    # logger.info(f"STORAGE.get_block_placeholder {STORAGE.get_block_placeholder()}")
+    # # get_description 
+    # logger.info(f"STORAGE.get_description {STORAGE.get_description()}")
+    # asyncio.run(get_result_by_api())
+
+    # new_flow = auto_douyin.with_options(result_storage=LocalFileSystem(basepath=os.path.join(OUTPUT, "prefect")))
+    # new_flow(msg="it's ok flow result")

+ 72 - 0
testm/prefect_localfilesystem.py

@@ -0,0 +1,72 @@
+import asyncio
+import base64
+import os
+import pickle
+from uuid import UUID
+import uuid
+prefect_api = f"http://10.0.0.1:8612/api"
+# 在导入 prefect 之前设置环境变量
+os.environ["PREFECT_API_URL"] = prefect_api
+
+from prefect import flow,task
+from prefect.filesystems import LocalFileSystem, S3
+from prefect.results import PersistedResult
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(__file__)))
+
+from conf.config import logger,OUTPUT
+from prefect.states import State
+
+
+@task(persist_result=True, result_storage_key="{flow_run.flow_name}_{flow_run.name}_hello.json")
+def task_flow():
+    print(task_flow.result_serializer)
+    print(task_flow.result_storage_key)
+    return "task_flow"
+
+
+@flow(persist_result=True)
+def loacalfilesystem(msg:str="none"):
+    logger.info(f"{loacalfilesystem}")
+    print(f"Hello, {msg}! Local quickstart flow is running! ")
+    # task_flow()
+    return f"Hello, {msg}!  "
+from prefect import get_client
+def read_loacal_result():
+    local_dir = LocalFileSystem()
+    local_dir = local_dir.load('anonymous-92ba6766-2461-4aa6-ba87-f101d0e127e6')
+
+    # client = get_client()
+    # asyncio.run(client.read_block_document_by_name('anonymous-92ba6766-2461-4aa6-ba87-f101d0e127e6', block_type_slug=None))
+    return
+    res = PersistedResult(type= 'reference', artifact_type='result', serializer_type= 'pickle', storage_block_id=UUID('767df9e7-2669-4270-904d-ebdd43aaf30d'), storage_key='c0849a099d6e467a8c6a20093ba78226')
+    logger.info(res)
+    logger.info(res.get())
+    
+    base64_data = "gAAAAABmK1YeWb24sQcKaJVtnmeoexGo3-W8dJlNEFrLZzBhtpZPUglAkG-VNzMBnLiY14vRuOORZen24-I0wVytnbNa61LO0UY2bZqF4k6vugsPGCgPUT5vvvm7hYlG3FcGwTG1zNM6EMfGelC2vS-LTFjByMwQ8AB_YjLtkRFaJ4nHEgUexow="
+    base64_data = "gAWVJAAAAAAAAACMIEhlbGxvLCBsb2FjYWwgZmlsZXN5c3RlbSB0ZXN0ISAglC4=\n"
+    decoded_data = base64.b64decode(base64_data)
+    result = pickle.loads(decoded_data)
+
+
+    print(result)  
+def local_file_system_test():
+    local_dir = LocalFileSystem(basepath=os.path.join(OUTPUT, "prefect2"),)
+
+    new_flow = loacalfilesystem.with_options(result_storage=local_dir)
+    logger.info(f"new_flow {new_flow}")
+    res = new_flow(msg="loacal filesystem test",return_state=True)
+    logger.info(f"res {res}")
+    logger.info(f"name {res.name}")
+    logger.info(f"state_details {res.state_details}")
+    # data
+    logger.info(f"data {res.data} {type(res.data)}")
+    # res.data.get()
+    logger.info(f"data {res}")
+
+def main():
+    read_loacal_result()
+
+if __name__ == "__main__":
+    main()

+ 97 - 0
testm/prefect_s3_block.py

@@ -0,0 +1,97 @@
+import asyncio
+import base64
+import os
+import pickle
+from uuid import UUID
+import uuid
+prefect_api = f"http://10.0.0.1:8612/api"
+# 在导入 prefect 之前设置环境变量
+os.environ["PREFECT_API_URL"] = prefect_api
+
+from prefect import flow,task
+from prefect.filesystems import LocalFileSystem, RemoteFileSystem
+from prefect.results import PersistedResult
+import os
+import sys
+sys.path.append(os.path.dirname(os.path.dirname(__file__)))
+
+from conf.config import logger,OUTPUT
+from prefect.states import State
+import database.config
+
+@task(persist_result=True, result_storage_key="{flow_run.flow_name}_{flow_run.name}_hello.json")
+def task_flow():
+    print(task_flow.result_serializer)
+    print(task_flow.result_storage_key)
+    return "task_flow"
+
+
+@flow(persist_result=True)
+def miniofilesystem(msg:str="none"):
+    logger.info(f"{miniofilesystem}")
+    print(f"Hello, {msg}! minio quickstart flow is running! ")
+    # task_flow()
+    return f"Hello, {msg}!  "
+
+def read_loacal_result():
+    res = PersistedResult(type= 'reference', artifact_type='result', serializer_type= 'pickle', storage_block_id=UUID('767df9e7-2669-4270-904d-ebdd43aaf30d'), storage_key='c0849a099d6e467a8c6a20093ba78226')
+    logger.info(res)
+    logger.info(res.get())
+    
+    base64_data = "gAAAAABmK1YeWb24sQcKaJVtnmeoexGo3-W8dJlNEFrLZzBhtpZPUglAkG-VNzMBnLiY14vRuOORZen24-I0wVytnbNa61LO0UY2bZqF4k6vugsPGCgPUT5vvvm7hYlG3FcGwTG1zNM6EMfGelC2vS-LTFjByMwQ8AB_YjLtkRFaJ4nHEgUexow="
+    base64_data = "gAWVJAAAAAAAAACMIEhlbGxvLCBsb2FjYWwgZmlsZXN5c3RlbSB0ZXN0ISAglC4=\n"
+    decoded_data = base64.b64decode(base64_data)
+    result = pickle.loads(decoded_data)
+    print(result)  
+
+def load_block_data():
+    minio_block = RemoteFileSystem(
+        basepath="s3://swl",
+        settings={
+        "key": os.environ["s3_access_key"],
+        "secret": os.environ["s3_secret_key"],
+        "client_kwargs": {"endpoint_url": os.environ["s3_endpoint"]} ,
+    },)
+    block_document, block_document_name = asyncio.run(minio_block._get_block_document("minio"))
+    logger.info(f"{block_document} {type(block_document)}")
+    logger.info(f"{block_document.data}")
+    logger.info(f"{block_document_name} {type(block_document_name)}")
+
+
+    # block_document, block_document_name = asyncio.run(minio_block._get_block_document("anonymous-92ba6766-2461-4aa6-ba87-f101d0e127e6"))
+
+def minio_file_system_test():
+    logger.info(f"s3_endpoint " + os.environ["s3_endpoint"])
+    # https://docs.prefect.io/latest/concepts/filesystems/#s3
+    minio_block = RemoteFileSystem(
+        basepath="s3://swl",
+        settings={
+        "key": os.environ["s3_access_key"],
+        "secret": os.environ["s3_secret_key"],
+        "client_kwargs": {"endpoint_url": 'http://' + os.environ["s3_endpoint"]} ,
+    },)
+    minio_block.write_path("foo", b"hello")
+    res = minio_block.read_path("foo")
+    logger.info(f"{res}")
+    # base64_data = "gAAAAABmK1YeWb24sQcKaJVtnmeoexGo3-W8dJlNEFrLZzBhtpZPUglAkG-VNzMBnLiY14vRuOORZen24-I0wVytnbNa61LO0UY2bZqF4k6vugsPGCgPUT5vvvm7hYlG3FcGwTG1zNM6EMfGelC2vS-LTFjByMwQ8AB_YjLtkRFaJ4nHEgUexow="
+    # data = minio_block.parse_obj(base64_data)
+    # logger.info(f"{data}")
+    # minio_block.save("minio")
+    return
+    new_flow = miniofilesystem.with_options(result_storage=minio_block)
+    logger.info(f"new_flow {new_flow}")
+    res = new_flow(msg="loacal filesystem test",return_state=True)
+    logger.info(f"res {res}")
+    logger.info(f"name {res.name}")
+    logger.info(f"state_details {res.state_details}")
+    # data
+    logger.info(f"data {res.data} {type(res.data)}")
+    # res.data.get()
+    logger.info(f"data {res}")
+
+def main():
+    # load_block_data()
+    minio_file_system_test()
+
+if __name__ == "__main__":
+    main()

+ 216 - 0
testm/user_profile_response.py

@@ -0,0 +1,216 @@
+{
+    "extra": {
+        "fatal_item_ids": [],
+        "logid": "2024042415254129E239D784997E05805B",
+        "now": 1713943541000,
+    },
+    "log_pb": {"impr_id": "2024042415254129E239D784997E05805B"},
+    "status_code": 0,
+    "status_msg": None,
+    "user": {
+        "apple_account": 0,
+        "avatar_168x168": {
+            "height": 720,
+            "uri": "aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db",
+            "url_list": [
+                "https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db~c5_168x168.jpeg?from=2956013662"
+            ],
+            "width": 720,
+        },
+        "avatar_300x300": {
+            "height": 720,
+            "uri": "aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db",
+            "url_list": [
+                "https://p3-pc.douyinpic.com/img/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db~c5_300x300.jpeg?from=2956013662"
+            ],
+            "width": 720,
+        },
+        "avatar_larger": {
+            "height": 720,
+            "uri": "aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db",
+            "url_list": [
+                "https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db.jpeg?from=2956013662"
+            ],
+            "width": 720,
+        },
+        "avatar_medium": {
+            "height": 720,
+            "uri": "aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db",
+            "url_list": [
+                "https://p3-pc.douyinpic.com/aweme/720x720/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db.jpeg?from=2956013662"
+            ],
+            "width": 720,
+        },
+        "avatar_thumb": {
+            "height": 720,
+            "uri": "aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db",
+            "url_list": [
+                "https://p3-pc.douyinpic.com/aweme/100x100/aweme-avatar/tos-cn-i-0813_66c4e34ae8834399bbf967c3d3c919db.jpeg?from=2956013662"
+            ],
+            "width": 720,
+        },
+        "aweme_count": 4,
+        "aweme_count_correction_threshold": -1,
+        "birthday_hide_level": 1,
+        "can_set_item_cover": False,
+        "can_show_group_card": 0,
+        "city": "南宁",
+        "close_friend_type": 0,
+        "commerce_info": {
+            "challenge_list": None,
+            "head_image_list": None,
+            "offline_info_list": [],
+            "smart_phone_list": None,
+            "task_list": None,
+        },
+        "commerce_user_info": {"ad_revenue_rits": None, "has_ads_entry": True},
+        "commerce_user_level": 0,
+        "country": "中国",
+        "cover_and_head_image_info": {"cover_list": None, "profile_cover_list": []},
+        "cover_colour": "#02161823",
+        "cover_url": [
+            {
+                "uri": "c8510002be9a3a61aad2",
+                "url_list": [
+                    "https://p9-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1714114800&x-signature=xCK75U389HyoKSaOxBsGZcC2Tg8%3D&from=2480802190",
+                    "https://p6-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1714114800&x-signature=DLcT2%2FuGDaJPwZf%2ByXXj3OBusF0%3D&from=2480802190",
+                    "https://p3-pc-sign.douyinpic.com/obj/c8510002be9a3a61aad2?x-expires=1714114800&x-signature=IkOkiSE3yodhuYXID7ZWccGp9PA%3D&from=2480802190",
+                ],
+            }
+        ],
+        "custom_verify": "",
+        "district": None,
+        "dongtai_count": 0,
+        "dynamic_cover": {},
+        "enable_ai_double": 0,
+        "enable_wish": False,
+        "enterprise_user_info": '{"commerce_info":{"offline_info_list":[],"challenge_list":null,"task_list":null,"head_image_list":null,"smart_phone_list":null},"homepage_bottom_toast":null,"tab_ceiling_toast":null,"limiters":null,"attic_info":null,"profile_edit_button":null,"elite_center":null,"enterprise_card_visibility":false,"blue_label_edit_jump_url":"aweme://webview/?url=https%3A%2F%2Fapi.amemv.com%2Finsights%2Flite%2FcontactSetting%3Fhide_nav_bar%3D1%26title%3D%25E8%2581%2594%25E7%25B3%25BB%25E6%2596%25B9%25E5%25BC%258F%26enter_from%3Dcustomized_tab\\u0026hide_nav_bar=1\\u0026title=%E8%81%94%E7%B3%BB%E6%96%B9%E5%BC%8F\\u0026rn_schema=aweme%3A%2F%2Freactnative%2F%3Fchannel_name%3Drn_patch%26bundle_name%3Dbusiness%26module_name%3Dpage_e_lite_contactSetting%26force_h5%3D1%26hide_nav_bar%3D1%26bundle_url%3D%26title%3D%25E8%2581%2594%25E7%25B3%25BB%25E6%2596%25B9%25E5%25BC%258F%26enter_from%3Dcustomized_tab"}',
+        "enterprise_verify_reason": "",
+        "favorite_permission": 0,
+        "favoriting_count": 10,
+        "follow_guide": True,
+        "follow_status": 0,
+        "follower_count": 13,
+        "follower_request_status": 0,
+        "follower_status": 0,
+        "following_count": 3,
+        "forward_count": 0,
+        "gender": 1,
+        "general_permission": {"following_follower_list_toast": 1},
+        "has_e_account_role": False,
+        "has_subscription": False,
+        "im_primary_role_id": 29,
+        "im_role_ids": [29, 35],
+        "image_send_exempt": False,
+        "ins_id": "",
+        "ip_location": "IP属地:广西",
+        "is_activity_user": False,
+        "is_ban": False,
+        "is_block": False,
+        "is_blocked": False,
+        "is_effect_artist": False,
+        "is_gov_media_vip": False,
+        "is_mix_user": False,
+        "is_not_show": False,
+        "is_series_user": False,
+        "is_sharing_profile_user": 0,
+        "is_star": False,
+        "iso_country_code": "CN",
+        "life_story_block": {"life_story_block": False},
+        "live_commerce": False,
+        "live_status": 0,
+        "max_follower_count": 14,
+        "message_chat_entry": True,
+        "mix_count": 0,
+        "mplatform_followers_count": 13,
+        "new_friend_type": 0,
+        "nickname": "程序员马工",
+        "original_musician": {"digg_count": 0, "music_count": 0, "music_used_count": 0},
+        "pigeon_daren_status": "",
+        "pigeon_daren_warn_tag": "",
+        "profile_show": {"identify_auth_infos": None},
+        "profile_tab_type": 0,
+        "province": "广西",
+        "public_collects_count": 1,
+        "publish_landing_tab": 1,
+        "r_fans_group_info": {},
+        "recommend_reason_relation": "",
+        "recommend_user_reason_source": 0,
+        "risk_notice_text": "",
+        "role_id": "00541",
+        "room_id": 0,
+        "room_id_str": "0",
+        "school_name": "南宁学院",
+        "sec_uid": "MS4wLjABAAAAho2T5wBRqvxtjHsiZwZRLd6ez9qWREWsVifpeguz3lKSo8-y52whfIgjiOmGNMdu",
+        "secret": 0,
+        "series_count": 0,
+        "share_info": {
+            "bool_persist": 1,
+            "life_share_ext": '{"life_share_id":"58009de93cd34825b1c8e44144a6d1bd","from_user_id":2252215350222567}',
+            "share_desc": "长按复制此条消息,打开抖音搜索,查看TA的更多作品。",
+            "share_image_url": {
+                "uri": "tos-cn-p-0015/oM9njASnAWrQfBrlSBD8D867QBEbfCdYXgnPAQ",
+                "url_list": [
+                    "https://p9-pc-sign.douyinpic.com/obj/tos-cn-p-0015/oM9njASnAWrQfBrlSBD8D867QBEbfCdYXgnPAQ?x-expires=1714114800&x-signature=wNSOt2%2BDV0Qw4d5Wmx1VBODyZgc%3D&from=2480802190",
+                    "https://p6-pc-sign.douyinpic.com/obj/tos-cn-p-0015/oM9njASnAWrQfBrlSBD8D867QBEbfCdYXgnPAQ?x-expires=1714114800&x-signature=PJTgBRyooGaa9XPD78WtKBM8i3I%3D&from=2480802190",
+                    "https://p3-pc-sign.douyinpic.com/obj/tos-cn-p-0015/oM9njASnAWrQfBrlSBD8D867QBEbfCdYXgnPAQ?x-expires=1714114800&x-signature=LkCOMPXR8MT5KB7H3v43avprBIA%3D&from=2480802190",
+                ],
+            },
+            "share_qrcode_url": {
+                "uri": "31c270022f77a6c1786de",
+                "url_list": [
+                    "https://p11.douyinpic.com/obj/31c270022f77a6c1786de",
+                    "https://p3.douyinpic.com/obj/31c270022f77a6c1786de",
+                    "https://p26.douyinpic.com/obj/31c270022f77a6c1786de",
+                ],
+            },
+            "share_title": "快来加入抖音,让你发现最有趣的我!",
+            "share_url": "www.iesdouyin.com/share/user/MS4wLjABAAAAho2T5wBRqvxtjHsiZwZRLd6ez9qWREWsVifpeguz3lKSo8-y52whfIgjiOmGNMdu?u_code=2889kamlembm&did=MS4wLjABAAAAyVVaFxZrgwh9V1JDK92PkAcAf2ZCUjA3dLzWKHNhMdzXUe7uDawaLrvZuGYfINQd&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&sec_uid=MS4wLjABAAAAho2T5wBRqvxtjHsiZwZRLd6ez9qWREWsVifpeguz3lKSo8-y52whfIgjiOmGNMdu&from_ssr=1&from_aid=6383",
+            "share_weibo_desc": "长按复制此条消息,打开抖音搜索,查看TA的更多作品。",
+        },
+        "short_id": "0",
+        "show_favorite_list": True,
+        "show_subscription": False,
+        "signature": "擅长:c语言(单片机),Python(pyqt)桌面应用\n个人博客:magong.site\n合作/有偿咨询❤️:cxy-magong",
+        "signature_display_lines": 1,
+        "signature_language": "un",
+        "special_follow_status": 0,
+        "sync_to_toutiao": 0,
+        "tab_settings": {
+            "private_tab": {"private_tab_style": 1, "show_private_tab": False}
+        },
+        "total_favorited": 86,
+        "total_favorited_correction_threshold": -1,
+        "twitter_id": "",
+        "twitter_name": "",
+        "uid": "4394120158133083",
+        "unique_id": "43425699707",
+        "urge_detail": {
+            "ctl_map": '{"button_background_url":"http://p3-webcast.douyinpic.com/img/webcast/urge_update.png~tplv-obj.image","next_urge_type":"default","button_text":"求更新","toast":"✅作者已收到“求更新”提醒~"}',
+            "user_urged": 0,
+        },
+        "user_age": -1,
+        "user_not_see": 0,
+        "user_not_show": 1,
+        "verification_type": 0,
+        "video_cover": {},
+        "video_icon": {"height": 720, "uri": "", "url_list": [], "width": 720},
+        "watch_status": False,
+        "white_cover_url": [
+            {
+                "uri": "318f1000413827e122102",
+                "url_list": [
+                    "https://p6-pc-sign.douyinpic.com/obj/318f1000413827e122102?x-expires=1714114800&x-signature=AnUsgv8ESyTPU52%2BiUz5%2B8pk%2Fh4%3D&from=2480802190",
+                    "https://p9-pc-sign.douyinpic.com/obj/318f1000413827e122102?x-expires=1714114800&x-signature=TMDVehFDApk5XiTOp%2FbKwk0SSPY%3D&from=2480802190",
+                    "https://p3-pc-sign.douyinpic.com/obj/318f1000413827e122102?x-expires=1714114800&x-signature=xHuOIrHQPS3RHK8RoHaY4FA0QWo%3D&from=2480802190",
+                ],
+            }
+        ],
+        "with_commerce_enterprise_tab_entry": False,
+        "with_commerce_entry": False,
+        "with_fusion_shop_entry": False,
+        "with_new_goods": False,
+        "youtube_channel_id": "",
+        "youtube_channel_title": "",
+    },
+}