Spaces:
Paused
Paused
| 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() | |
| # 获取单个作品数据 | |
| async def fetch_one_video(request: Request, | |
| aweme_id: str = Query(example="7372484719365098803", description="作品id/Video id")): | |
| """ | |
| # [中文] | |
| ### 用途: | |
| - 获取单个作品数据 | |
| ### 参数: | |
| - aweme_id: 作品id | |
| ### 返回: | |
| - 作品数据 | |
| # [English] | |
| ### Purpose: | |
| - Get single video data | |
| ### Parameters: | |
| - aweme_id: Video id | |
| ### Return: | |
| - Video data | |
| # [示例/Example] | |
| aweme_id = "7372484719365098803" | |
| """ | |
| 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()) | |
| # 获取用户作品集合数据 | |
| 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()) | |
| # 获取用户喜欢作品数据 | |
| 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) | |
| 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()) | |
| # 获取用户合辑作品数据 | |
| 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()) | |
| # 获取用户直播流数据 | |
| 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()) | |
| # 获取指定用户的直播流数据 | |
| 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()) | |
| # 获取直播间送礼用户排行榜 | |
| 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()) | |
| # 抖音直播间商品信息 | |
| 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()) | |
| # 获取指定用户的信息 | |
| 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()) | |
| # 获取单个视频评论数据 | |
| async def fetch_video_comments(request: Request, | |
| aweme_id: str = Query(example="7372484719365098803", 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 = "7372484719365098803" | |
| 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()) | |
| # 获取指定视频的评论回复数据 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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参数 | |
| 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()) | |
| # 使用接口地址生成Abogus参数 | |
| async def generate_a_bogus(request: Request, | |
| url: str = Query( | |
| example="https://www.douyin.com/aweme/v1/web/aweme/detail/?device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&version_code=190500&version_name=19.5.0&cookie_enabled=true&browser_language=zh-CN&browser_platform=Win32&browser_name=Firefox&browser_online=true&engine_name=Gecko&os_name=Windows&os_version=10&platform=PC&screen_width=1920&screen_height=1080&browser_version=124.0&engine_version=122.0.0.0&cpu_core_num=12&device_memory=8&aweme_id=7372484719365098803"), | |
| 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")): | |
| """ | |
| # [中文] | |
| ### 用途: | |
| - 使用接口网址生成A-Bogus参数 | |
| ### 参数: | |
| - url: 接口网址 | |
| - user_agent: 用户代理,暂时不支持自定义,直接使用默认值即可。 | |
| # [English] | |
| ### Purpose: | |
| - Generate A-Bogus parameter using API URL | |
| ### Parameters: | |
| - url: API URL | |
| - user_agent: User agent, temporarily does not support customization, just use the default value. | |
| # [示例/Example] | |
| url = "https://www.douyin.com/aweme/v1/web/aweme/detail/?device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&version_code=190500&version_name=19.5.0&cookie_enabled=true&browser_language=zh-CN&browser_platform=Win32&browser_name=Firefox&browser_online=true&engine_name=Gecko&os_name=Windows&os_version=10&platform=PC&screen_width=1920&screen_height=1080&browser_version=124.0&engine_version=122.0.0.0&cpu_core_num=12&device_memory=8&aweme_id=7372484719365098803" | |
| 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: | |
| a_bogus = await DouyinWebCrawler.get_a_bogus(url, user_agent) | |
| return ResponseModel(code=200, | |
| router=request.url.path, | |
| data=a_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 | |
| 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 | |
| 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 | |
| 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 | |
| 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()) | |
| # 提取列表直播间号 | |
| 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()) | |
| # 提取列表直播间号 | |
| 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()) | |