from typing import List from fastapi import APIRouter, Body, Query, Request, HTTPException # 导入FastAPI组件 from app.api.models.APIResponseModel import ResponseModel, ErrorResponseModel # 导入响应模型 from crawlers.douyin.web.web_crawler import DouyinWebCrawler # 导入抖音Web爬虫 router = APIRouter() DouyinWebCrawler = DouyinWebCrawler() # 获取单个作品数据 @router.get("/fetch_one_video", response_model=ResponseModel, summary="获取单个作品数据/Get single video data") async def fetch_one_video(request: Request, aweme_id: str = Query(example="7345492945006595379", description="作品id/Video id")): """ # [中文] ### 用途: - 获取单个作品数据 ### 参数: - aweme_id: 作品id ### 返回: - 作品数据 # [English] ### Purpose: - Get single video data ### Parameters: - aweme_id: Video id ### Return: - Video data # [示例/Example] aweme_id = "7345492945006595379" """ try: data = await DouyinWebCrawler.fetch_one_video(aweme_id) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取用户作品集合数据 @router.get("/fetch_user_post_videos", response_model=ResponseModel, summary="获取用户主页作品数据/Get user homepage video data") async def fetch_user_post_videos(request: Request, sec_user_id: str = Query( example="MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE", description="用户sec_user_id/User sec_user_id"), max_cursor: int = Query(default=0, description="最大游标/Maximum cursor"), count: int = Query(default=20, description="每页数量/Number per page")): """ # [中文] ### 用途: - 获取用户主页作品数据 ### 参数: - sec_user_id: 用户sec_user_id - max_cursor: 最大游标 - count: 最大数量 ### 返回: - 用户作品数据 # [English] ### Purpose: - Get user homepage video data ### Parameters: - sec_user_id: User sec_user_id - max_cursor: Maximum cursor - count: Maximum count number ### Return: - User video data # [示例/Example] sec_user_id = "MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE" max_cursor = 0 counts = 20 """ try: data = await DouyinWebCrawler.fetch_user_post_videos(sec_user_id, max_cursor, count) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取用户喜欢作品数据 @router.get("/fetch_user_like_videos", response_model=ResponseModel, summary="获取用户喜欢作品数据/Get user like video data") async def fetch_user_like_videos(request: Request, sec_user_id: str = Query( example="MS4wLjABAAAAW9FWcqS7RdQAWPd2AA5fL_ilmqsIFUCQ_Iym6Yh9_cUa6ZRqVLjVQSUjlHrfXY1Y", description="用户sec_user_id/User sec_user_id"), max_cursor: int = Query(default=0, description="最大游标/Maximum cursor"), counts: int = Query(default=20, description="每页数量/Number per page")): """ # [中文] ### 用途: - 获取用户喜欢作品数据 ### 参数: - sec_user_id: 用户sec_user_id - max_cursor: 最大游标 - count: 最大数量 ### 返回: - 用户作品数据 # [English] ### Purpose: - Get user like video data ### Parameters: - sec_user_id: User sec_user_id - max_cursor: Maximum cursor - count: Maximum count number ### Return: - User video data # [示例/Example] sec_user_id = "MS4wLjABAAAAW9FWcqS7RdQAWPd2AA5fL_ilmqsIFUCQ_Iym6Yh9_cUa6ZRqVLjVQSUjlHrfXY1Y" max_cursor = 0 counts = 20 """ try: data = await DouyinWebCrawler.fetch_user_like_videos(sec_user_id, max_cursor, counts) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取用户收藏作品数据(用户提供自己的Cookie) @router.get("/fetch_user_collection_videos", response_model=ResponseModel, summary="获取用户收藏作品数据/Get user collection video data") async def fetch_user_collection_videos(request: Request, cookie: str = Query(example="YOUR_COOKIE", description="用户网页版抖音Cookie/Your web version of Douyin Cookie"), max_cursor: int = Query(default=0, description="最大游标/Maximum cursor"), counts: int = Query(default=20, description="每页数量/Number per page")): """ # [中文] ### 用途: - 获取用户收藏作品数据 ### 参数: - cookie: 用户网页版抖音Cookie(此接口需要用户提供自己的Cookie) - max_cursor: 最大游标 - count: 最大数量 ### 返回: - 用户作品数据 # [English] ### Purpose: - Get user collection video data ### Parameters: - cookie: User's web version of Douyin Cookie (This interface requires users to provide their own Cookie) - max_cursor: Maximum cursor - count: Maximum number ### Return: - User video data # [示例/Example] cookie = "YOUR_COOKIE" max_cursor = 0 counts = 20 """ try: data = await DouyinWebCrawler.fetch_user_collection_videos(cookie, max_cursor, counts) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取用户合辑作品数据 @router.get("/fetch_user_mix_videos", response_model=ResponseModel, summary="获取用户合辑作品数据/Get user mix video data") async def fetch_user_mix_videos(request: Request, mix_id: str = Query(example="7348687990509553679", description="合辑id/Mix id"), max_cursor: int = Query(default=0, description="最大游标/Maximum cursor"), counts: int = Query(default=20, description="每页数量/Number per page")): """ # [中文] ### 用途: - 获取用户合辑作品数据 ### 参数: - mix_id: 合辑id - max_cursor: 最大游标 - count: 最大数量 ### 返回: - 用户作品数据 # [English] ### Purpose: - Get user mix video data ### Parameters: - mix_id: Mix id - max_cursor: Maximum cursor - count: Maximum number ### Return: - User video data # [示例/Example] url = https://www.douyin.com/collection/7348687990509553679 mix_id = "7348687990509553679" max_cursor = 0 counts = 20 """ try: data = await DouyinWebCrawler.fetch_user_mix_videos(mix_id, max_cursor, counts) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取用户直播流数据 @router.get("/fetch_user_live_videos", response_model=ResponseModel, summary="获取用户直播流数据/Get user live video data") async def fetch_user_live_videos(request: Request, webcast_id: str = Query(example="285520721194", description="直播间webcast_id/Room webcast_id")): """ # [中文] ### 用途: - 获取用户直播流数据 ### 参数: - webcast_id: 直播间webcast_id ### 返回: - 直播流数据 # [English] ### Purpose: - Get user live video data ### Parameters: - webcast_id: Room webcast_id ### Return: - Live stream data # [示例/Example] webcast_id = "285520721194" """ try: data = await DouyinWebCrawler.fetch_user_live_videos(webcast_id) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取指定用户的直播流数据 @router.get("/fetch_user_live_videos_by_room_id", response_model=ResponseModel, summary="获取指定用户的直播流数据/Get live video data of specified user") async def fetch_user_live_videos_by_room_id(request: Request, room_id: str = Query(example="7318296342189919011", description="直播间room_id/Room room_id")): """ # [中文] ### 用途: - 获取指定用户的直播流数据 ### 参数: - room_id: 直播间room_id ### 返回: - 直播流数据 # [English] ### Purpose: - Get live video data of specified user ### Parameters: - room_id: Room room_id ### Return: - Live stream data # [示例/Example] room_id = "7318296342189919011" """ try: data = await DouyinWebCrawler.fetch_user_live_videos_by_room_id(room_id) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取直播间送礼用户排行榜 @router.get("/fetch_live_gift_ranking", response_model=ResponseModel, summary="获取直播间送礼用户排行榜/Get live room gift user ranking") async def fetch_live_gift_ranking(request: Request, room_id: str = Query(example="7356585666190461731", description="直播间room_id/Room room_id"), rank_type: int = Query(default=30, description="排行类型/Leaderboard type")): """ # [中文] ### 用途: - 获取直播间送礼用户排行榜 ### 参数: - room_id: 直播间room_id - rank_type: 排行类型,默认为30不用修改。 ### 返回: - 排行榜数据 # [English] ### Purpose: - Get live room gift user ranking ### Parameters: - room_id: Room room_id - rank_type: Leaderboard type, default is 30, no need to modify. ### Return: - Leaderboard data # [示例/Example] room_id = "7356585666190461731" rank_type = 30 """ try: data = await DouyinWebCrawler.fetch_live_gift_ranking(room_id, rank_type) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 抖音直播间商品信息 @router.get("/fetch_live_room_product_result", response_model=ResponseModel, summary="抖音直播间商品信息/Douyin live room product information") async def fetch_live_room_product_result(request: Request, cookie: str = Query(example="YOUR_COOKIE", description="用户网页版抖音Cookie/Your web version of Douyin Cookie"), room_id: str = Query(example="7356742011975715619", description="直播间room_id/Room room_id"), author_id: str = Query(example="2207432981615527", description="作者id/Author id"), limit: int = Query(default=20, description="数量/Number")): """ # [中文] ### 用途: - 抖音直播间商品信息 ### 参数: - cookie: 用户网页版抖音Cookie(此接口需要用户提供自己的Cookie,如获取失败请手动过一次验证码) - room_id: 直播间room_id - author_id: 作者id - limit: 数量 ### 返回: - 商品信息 # [English] ### Purpose: - Douyin live room product information ### Parameters: - cookie: User's web version of Douyin Cookie (This interface requires users to provide their own Cookie, if the acquisition fails, please manually pass the captcha code once) - room_id: Room room_id - author_id: Author id - limit: Number ### Return: - Product information # [示例/Example] cookie = "YOUR_COOKIE" room_id = "7356742011975715619" author_id = "2207432981615527" limit = 20 """ try: data = await DouyinWebCrawler.fetch_live_room_product_result(cookie, room_id, author_id, limit) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取指定用户的信息 @router.get("/handler_user_profile", response_model=ResponseModel, summary="获取指定用户的信息/Get information of specified user") async def handler_user_profile(request: Request, sec_user_id: str = Query( example="MS4wLjABAAAAW9FWcqS7RdQAWPd2AA5fL_ilmqsIFUCQ_Iym6Yh9_cUa6ZRqVLjVQSUjlHrfXY1Y", description="用户sec_user_id/User sec_user_id")): """ # [中文] ### 用途: - 获取指定用户的信息 ### 参数: - sec_user_id: 用户sec_user_id ### 返回: - 用户信息 # [English] ### Purpose: - Get information of specified user ### Parameters: - sec_user_id: User sec_user_id ### Return: - User information # [示例/Example] sec_user_id = "MS4wLjABAAAAW9FWcqS7RdQAWPd2AA5fL_ilmqsIFUCQ_Iym6Yh9_cUa6ZRqVLjVQSUjlHrfXY1Y" """ try: data = await DouyinWebCrawler.handler_user_profile(sec_user_id) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取单个视频评论数据 @router.get("/fetch_video_comments", response_model=ResponseModel, summary="获取单个视频评论数据/Get single video comments data") async def fetch_video_comments(request: Request, aweme_id: str = Query(example="7345492945006595379", description="作品id/Video id"), cursor: int = Query(default=0, description="游标/Cursor"), count: int = Query(default=20, description="数量/Number")): """ # [中文] ### 用途: - 获取单个视频评论数据 ### 参数: - aweme_id: 作品id - cursor: 游标 - count: 数量 ### 返回: - 评论数据 # [English] ### Purpose: - Get single video comments data ### Parameters: - aweme_id: Video id - cursor: Cursor - count: Number ### Return: - Comments data # [示例/Example] aweme_id = "7345492945006595379" cursor = 0 count = 20 """ try: data = await DouyinWebCrawler.fetch_video_comments(aweme_id, cursor, count) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 获取指定视频的评论回复数据 @router.get("/fetch_video_comment_replies", response_model=ResponseModel, summary="获取指定视频的评论回复数据/Get comment replies data of specified video") async def fetch_video_comments_reply(request: Request, item_id: str = Query(example="7354666303006723354", description="作品id/Video id"), comment_id: str = Query(example="7354669356632638218", description="评论id/Comment id"), cursor: int = Query(default=0, description="游标/Cursor"), count: int = Query(default=20, description="数量/Number")): """ # [中文] ### 用途: - 获取指定视频的评论回复数据 ### 参数: - item_id: 作品id - comment_id: 评论id - cursor: 游标 - count: 数量 ### 返回: - 评论回复数据 # [English] ### Purpose: - Get comment replies data of specified video ### Parameters: - item_id: Video id - comment_id: Comment id - cursor: Cursor - count: Number ### Return: - Comment replies data # [示例/Example] aweme_id = "7354666303006723354" comment_id = "7354669356632638218" cursor = 0 count = 20 """ try: data = await DouyinWebCrawler.fetch_video_comments_reply(item_id, comment_id, cursor, count) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 生成真实msToken @router.get("/generate_real_msToken", response_model=ResponseModel, summary="生成真实msToken/Generate real msToken") async def generate_real_msToken(request: Request): """ # [中文] ### 用途: - 生成真实msToken ### 返回: - msToken # [English] ### Purpose: - Generate real msToken ### Return: - msToken """ try: data = await DouyinWebCrawler.gen_real_msToken() return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 生成ttwid @router.get("/generate_ttwid", response_model=ResponseModel, summary="生成ttwid/Generate ttwid") async def generate_ttwid(request: Request): """ # [中文] ### 用途: - 生成ttwid ### 返回: - ttwid # [English] ### Purpose: - Generate ttwid ### Return: - ttwid """ try: data = await DouyinWebCrawler.gen_ttwid() return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 生成verify_fp @router.get("/generate_verify_fp", response_model=ResponseModel, summary="生成verify_fp/Generate verify_fp") async def generate_verify_fp(request: Request): """ # [中文] ### 用途: - 生成verify_fp ### 返回: - verify_fp # [English] ### Purpose: - Generate verify_fp ### Return: - verify_fp """ try: data = await DouyinWebCrawler.gen_verify_fp() return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 生成s_v_web_id @router.get("/generate_s_v_web_id", response_model=ResponseModel, summary="生成s_v_web_id/Generate s_v_web_id") async def generate_s_v_web_id(request: Request): """ # [中文] ### 用途: - 生成s_v_web_id ### 返回: - s_v_web_id # [English] ### Purpose: - Generate s_v_web_id ### Return: - s_v_web_id """ try: data = await DouyinWebCrawler.gen_s_v_web_id() return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 使用接口地址生成Xbogus参数 @router.get("/generate_x_bogus", response_model=ResponseModel, summary="使用接口网址生成X-Bogus参数/Generate X-Bogus parameter using API URL") async def generate_x_bogus(request: Request, url: str = Query( example="https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7148736076176215311&device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1920&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=117.0.2045.47&browser_online=true&engine_name=Blink&engine_version="), user_agent: str = Query( example="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")): """ # [中文] ### 用途: - 使用接口网址生成X-Bogus参数 ### 参数: - url: 接口网址 # [English] ### Purpose: - Generate X-Bogus parameter using API URL ### Parameters: - url: API URL # [示例/Example] url = "https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7148736076176215311&device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1920&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Edge&browser_version=117.0.2045.47&browser_online=true&engine_name=Blink&engine_version=117.0.0.0&os_name=Windows&os_version=10&cpu_core_num=128&device_memory=10240&platform=PC&downlink=10&effective_type=4g&round_trip_time=100" user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36" """ try: x_bogus = await DouyinWebCrawler.get_x_bogus(url, user_agent) return ResponseModel(code=200, router=request.url.path, data=x_bogus) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 提取单个用户id @router.get("/get_sec_user_id", response_model=ResponseModel, summary="提取单个用户id/Extract single user id") async def get_sec_user_id(request: Request, url: str = Query( example="https://www.douyin.com/user/MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE")): """ # [中文] ### 用途: - 提取单个用户id ### 参数: - url: 用户主页链接 ### 返回: - 用户sec_user_id # [English] ### Purpose: - Extract single user id ### Parameters: - url: User homepage link ### Return: - User sec_user_id # [示例/Example] url = "https://www.douyin.com/user/MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE" """ try: data = await DouyinWebCrawler.get_sec_user_id(url) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 提取列表用户id @router.post("/get_all_sec_user_id", response_model=ResponseModel, summary="提取列表用户id/Extract list user id") async def get_all_sec_user_id(request: Request, url: List[str] = Body( example=[ "https://www.douyin.com/user/MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE?vid=7285950278132616463", "https://www.douyin.com/user/MS4wLjABAAAAVsneOf144eGDFf8Xp9QNb1VW6ovXnNT5SqJBhJfe8KQBKWKDTWK5Hh-_i9mJzb8C", "长按复制此条消息,打开抖音搜索,查看TA的更多作品。 https://v.douyin.com/idFqvUms/", "https://v.douyin.com/idFqvUms/", ], description="用户主页链接列表/User homepage link list" )): """ # [中文] ### 用途: - 提取列表用户id ### 参数: - url: 用户主页链接列表 ### 返回: - 用户sec_user_id列表 # [English] ### Purpose: - Extract list user id ### Parameters: - url: User homepage link list ### Return: - User sec_user_id list # [示例/Example] ```json { "urls":[ "https://www.douyin.com/user/MS4wLjABAAAANXSltcLCzDGmdNFI2Q_QixVTr67NiYzjKOIP5s03CAE?vid=7285950278132616463", "https://www.douyin.com/user/MS4wLjABAAAAVsneOf144eGDFf8Xp9QNb1VW6ovXnNT5SqJBhJfe8KQBKWKDTWK5Hh-_i9mJzb8C", "长按复制此条消息,打开抖音搜索,查看TA的更多作品。 https://v.douyin.com/idFqvUms/", "https://v.douyin.com/idFqvUms/" ] } ``` """ try: data = await DouyinWebCrawler.get_all_sec_user_id(url) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 提取单个作品id @router.get("/get_aweme_id", response_model=ResponseModel, summary="提取单个作品id/Extract single video id") async def get_aweme_id(request: Request, url: str = Query(example="https://www.douyin.com/video/7298145681699622182")): """ # [中文] ### 用途: - 提取单个作品id ### 参数: - url: 作品链接 ### 返回: - 作品id # [English] ### Purpose: - Extract single video id ### Parameters: - url: Video link ### Return: - Video id # [示例/Example] url = "https://www.douyin.com/video/7298145681699622182" """ try: data = await DouyinWebCrawler.get_aweme_id(url) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 提取列表作品id @router.post("/get_all_aweme_id", response_model=ResponseModel, summary="提取列表作品id/Extract list video id") async def get_all_aweme_id(request: Request, url: List[str] = Body( example=[ "0.53 02/26 I@v.sE Fus:/ 你别太帅了郑润泽# 现场版live # 音乐节 # 郑润泽 https://v.douyin.com/iRNBho6u/ 复制此链接,打开Dou音搜索,直接观看视频!", "https://v.douyin.com/iRNBho6u/", "https://www.iesdouyin.com/share/video/7298145681699622182/?region=CN&mid=7298145762238565171&u_code=l1j9bkbd&did=MS4wLjABAAAAtqpCx0hpOERbdSzQdjRZw-wFPxaqdbAzsKDmbJMUI3KWlMGQHC-n6dXAqa-dM2EP&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=05kGlqGmR4_IwCX.ZGk6xuL0osNA..5ur7b0jbOx6cc-&share_version=170400&ts=1699262937&from_aid=6383&from_ssr=1&from=web_code_link", "https://www.douyin.com/video/7298145681699622182?previous_page=web_code_link", "https://www.douyin.com/video/7298145681699622182", ], description="作品链接列表/Video link list")): """ # [中文] ### 用途: - 提取列表作品id ### 参数: - url: 作品链接列表 ### 返回: - 作品id列表 # [English] ### Purpose: - Extract list video id ### Parameters: - url: Video link list ### Return: - Video id list # [示例/Example] ```json { "urls":[ "0.53 02/26 I@v.sE Fus:/ 你别太帅了郑润泽# 现场版live # 音乐节 # 郑润泽 https://v.douyin.com/iRNBho6u/ 复制此链接,打开Dou音搜索,直接观看视频!", "https://v.douyin.com/iRNBho6u/", "https://www.iesdouyin.com/share/video/7298145681699622182/?region=CN&mid=7298145762238565171&u_code=l1j9bkbd&did=MS4wLjABAAAAtqpCx0hpOERbdSzQdjRZw-wFPxaqdbAzsKDmbJMUI3KWlMGQHC-n6dXAqa-dM2EP&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&with_sec_did=1&titleType=title&share_sign=05kGlqGmR4_IwCX.ZGk6xuL0osNA..5ur7b0jbOx6cc-&share_version=170400&ts=1699262937&from_aid=6383&from_ssr=1&from=web_code_link", "https://www.douyin.com/video/7298145681699622182?previous_page=web_code_link", "https://www.douyin.com/video/7298145681699622182", ] } ``` """ try: data = await DouyinWebCrawler.get_all_aweme_id(url) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 提取列表直播间号 @router.get("/get_webcast_id", response_model=ResponseModel, summary="提取列表直播间号/Extract list webcast id") async def get_webcast_id(request: Request, url: str = Query(example="https://live.douyin.com/775841227732")): """ # [中文] ### 用途: - 提取列表直播间号 ### 参数: - url: 直播间链接 ### 返回: - 直播间号 # [English] ### Purpose: - Extract list webcast id ### Parameters: - url: Room link ### Return: - Room id # [示例/Example] url = "https://live.douyin.com/775841227732" """ try: data = await DouyinWebCrawler.get_webcast_id(url) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict()) # 提取列表直播间号 @router.post("/get_all_webcast_id", response_model=ResponseModel, summary="提取列表直播间号/Extract list webcast id") async def get_all_webcast_id(request: Request, url: List[str] = Body( example=[ "https://live.douyin.com/775841227732", "https://live.douyin.com/775841227732?room_id=7318296342189919011&enter_from_merge=web_share_link&enter_method=web_share_link&previous_page=app_code_link", 'https://webcast.amemv.com/douyin/webcast/reflow/7318296342189919011?u_code=l1j9bkbd&did=MS4wLjABAAAAEs86TBQPNwAo-RGrcxWyCdwKhI66AK3Pqf3ieo6HaxI&iid=MS4wLjABAAAA0ptpM-zzoliLEeyvWOCUt-_dQza4uSjlIvbtIazXnCY&with_sec_did=1&use_link_command=1&ecom_share_track_params=&extra_params={"from_request_id":"20231230162057EC005772A8EAA0199906","im_channel_invite_id":"0"}&user_id=3644207898042206&liveId=7318296342189919011&from=share&style=share&enter_method=click_share&roomId=7318296342189919011&activity_info={}', "6i- Q@x.Sl 03/23 【醒子8ke的直播间】 点击打开👉https://v.douyin.com/i8tBR7hX/ 或长按复制此条消息,打开抖音,看TA直播", "https://v.douyin.com/i8tBR7hX/", ], description="直播间链接列表/Room link list")): """ # [中文] ### 用途: - 提取列表直播间号 ### 参数: - url: 直播间链接列表 ### 返回: - 直播间号列表 # [English] ### Purpose: - Extract list webcast id ### Parameters: - url: Room link list ### Return: - Room id list # [示例/Example] ```json { "urls": [ "https://live.douyin.com/775841227732", "https://live.douyin.com/775841227732?room_id=7318296342189919011&enter_from_merge=web_share_link&enter_method=web_share_link&previous_page=app_code_link", 'https://webcast.amemv.com/douyin/webcast/reflow/7318296342189919011?u_code=l1j9bkbd&did=MS4wLjABAAAAEs86TBQPNwAo-RGrcxWyCdwKhI66AK3Pqf3ieo6HaxI&iid=MS4wLjABAAAA0ptpM-zzoliLEeyvWOCUt-_dQza4uSjlIvbtIazXnCY&with_sec_did=1&use_link_command=1&ecom_share_track_params=&extra_params={"from_request_id":"20231230162057EC005772A8EAA0199906","im_channel_invite_id":"0"}&user_id=3644207898042206&liveId=7318296342189919011&from=share&style=share&enter_method=click_share&roomId=7318296342189919011&activity_info={}', "6i- Q@x.Sl 03/23 【醒子8ke的直播间】 点击打开👉https://v.douyin.com/i8tBR7hX/ 或长按复制此条消息,打开抖音,看TA直播", "https://v.douyin.com/i8tBR7hX/", ] } ``` """ try: data = await DouyinWebCrawler.get_all_webcast_id(url) return ResponseModel(code=200, router=request.url.path, data=data) except Exception as e: status_code = 400 detail = ErrorResponseModel(code=status_code, router=request.url.path, params=dict(request.query_params), ) raise HTTPException(status_code=status_code, detail=detail.dict())