메모
API가 버전 2로 전환되면서 자연스럽게 획기적인 변경 사항이 도입되었습니다. 이 API의 이전 버전을 사용하려면 마지막 안정 버전을 참조하세요.
중요한
https://api-aniwatch.onrender.com은 API를 시연하기 위한 목적으로만 사용되며 대역폭 소비를 최소화하기 위해 속도 제한이 활성화되어 있습니다. 필요에 따라 API를 사용자 정의하여 개인적인 용도로 자체 인스턴스를 배포하는 것이 좋습니다.
이 API는 hianime.to의 비공식 API일 뿐이며 공식적으로 이와 관련이 없습니다.
이 API가 제공하는 콘텐츠는 내 것이 아니며 내가 호스팅하는 것도 아닙니다. 이는 해당 소유자의 것입니다. 이 API는 웹사이트를 스크랩하고 해당 콘텐츠를 사용하는 API를 구축하는 방법을 보여줍니다.
설치
현지의
도커
환경
인스턴스 호스팅
베르셀
세우다
선적 서류 비치
애니메이션 홈 페이지 받기
애니메이션 정보를 얻으세요
검색 결과 얻기
검색 제안 받기
프로듀서 애니메이션 받기
장르 애니메이션을 받으세요
카테고리 애니메이션 받기
예상 일정 받기
애니메이션 에피소드를 받으세요
애니메이션 에피소드 서버 받기
애니메이션 에피소드 스트리밍 링크 받기
개발
기여자
감사해요
지원하다
특허
스타의 역사
저장소를 복제하고 디렉터리로 이동합니다.
자식 클론 https://github.com/ghoshRitesh12/aniwatch-api.gitcd aniwatch-api
모든 종속성을 설치합니다.
npm i #또는 Yarn 설치 또는 pnpm i
서버를 시작하세요!
npm start #또는 Yarn 시작 또는 pnpm start
이제 서버는 http://localhost:4000에서 실행되어야 합니다.
Docker 이미지는 GitHub Container Registry에서 사용할 수 있습니다.
다음 명령을 실행하여 Docker 이미지를 가져와 실행합니다.
도커 풀 ghcr.io/ghoshritesh12/aniwatch docker run -p 4000:4000 ghcr.io/ghoshritesh12/aniwatch
위 명령은 포트 4000에서 서버를 시작합니다. http://localhost:4000에서 서버에 액세스할 수 있으며 -p
옵션을 -p <port>:4000
으로 변경하여 포트를 변경할 수도 있습니다.
-d
플래그를 추가하여 분리 모드에서 컨테이너를 실행할 수도 있습니다.
자세한 내용은 .env.example
파일에서 확인할 수 있습니다.
ANIWATCH_API_PORT
: 애니워치 API의 포트번호
ANIWATCH_API_WINDOW_MS
: 속도 제한 요청을 추적하는 기간(밀리초)
ANIWATCH_API_MAX_REQS
: ANIWATCH_API_WINDOW_MS
기간의 최대 요청 수
ANIWATCH_API_CORS_ALLOWED_ORIGINS
: 허용되는 출처, 쉼표로 구분되고 사이에 공백이 없습니다.
ANIWATCH_VERCEL_DEPLOYMENT
: vercel 배포를 다른 배포와 구별하는 데 필요하며 0이 아닌 다른 값에 대해 true로 설정합니다.
ANIWATCH_API_HOSTNAME
: 속도 제한을 활성화하려면 이를 API 인스턴스의 호스트 이름으로 설정하세요. 속도 제한을 원하지 않으면 이 값을 사용하지 마세요.
주의
개인 배포의 경우:
애플리케이션에 속도 제한을 적용하려면 ANIWATCH_API_HOSTNAME
환경을 배포된 인스턴스의 호스트 이름으로 설정하세요. 그렇지 않으면 이 환경을 설정하거나 갖지 마세요. 이 환경을 잘못된 값으로 설정하면 다른 문제가 발생할 수 있습니다.
71~83행에 걸쳐 server.ts
파일에서 if 블록을 제거합니다.
Vercel에 Aniwatch API의 자체 인스턴스를 배포하세요.
메모
vercel에 배포할 때 ANIWATCH_VERCEL_DEPLOYMENT
라는 환경을 true
또는 0이 아닌 값으로 설정하지만 이 환경이 있어야 합니다.
Render에 Aniwatch API의 자체 인스턴스를 배포하세요.
API에 의해 노출된 엔드포인트는 Fetch API를 사용하는 예시와 함께 아래에 나열되어 있지만 모든 http 라이브러리를 사용할 수 있습니다.
GET
/api/v2/hianime/홈
const resp = wait fetch("/api/v2/hianime/home");const data = wait resp.json();console.log(data);
{ 성공: 사실, data: {genres: ["Action", "Cars", "Adventure", ...],latestEpisodeAnimes: [ {id: string,name: string,poster: string,type: string,episodes: { sub: number, dub: 번호,} }, {...},],spotlightAnimes: [ {id: 문자열, 이름: 문자열,jname: 문자열, 포스터: 문자열, 설명: 문자열, 순위: 번호,otherInfo: 문자열[],episodes: { 하위: 번호, dub: 번호,}, }, {...},],top10Animes: { 오늘: [{ 에피소드: {sub: 번호,dub: 번호, }, id: 문자열 , 이름: 문자열, 포스터: 문자열, 순위: 번호},{...}, ], 월: [...], 주: [...]},topAiringAnimes: [ {id: 문자열, 이름: 문자열 ,jname: 문자열,포스터: 문자열, }, {...},],topUpcomingAnimes: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 기간: 문자열, 유형: 문자열, 등급: 문자열, 에피소드: { 하위: 번호, 더빙: 번호 ,} }, {...},],trendingAnimes: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 순위: 번호, }, {...},],mostPopularAnimes: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 유형: 문자열, 에피소드: { 하위: 번호, 더빙: 번호,} }, {...},],mostFavoriteAnimes: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 유형: 문자열,에피소드: { 하위: 번호, 더빙: 번호,} }, {...},],latestCompletedAnimes: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 유형: 문자열, 에피소드: { 하위: 번호, 더빙: 번호,} }, {...},], }}
? 맨 위로 돌아가기
GET
/api/v2/hianime/anime/{animeId}
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
animeId | 끈 | 고유한 애니메이션 ID입니다(케밥의 경우). | 예 | -- |
const resp = wait fetch("/api/v2/hianime/anime/attack-on-titan-112");const data = wait resp.json();console.log(data);
{ 성공: 사실, 데이터: {애니메이션: [ 정보: {id: 문자열, 이름: 문자열, 포스터: 문자열, 설명: 문자열, 통계: { 평가: 문자열, 품질: 문자열, 에피소드: {sub: 번호, 더빙: 번호 }, 유형: 문자열, 기간: 문자열},promotionalVideos: [ {제목: 문자열 | 정의되지 않음, 소스: 문자열 | 정의되지 않음,썸네일: 문자열 | 정의되지 않음 }, {...},],characterVoiceActor: [ {문자: { id: 문자열, 포스터: 문자열, 이름: 문자열, 캐스트: 문자열},voiceActor: { id: 문자열, 포스터: 문자열, 이름: 문자열, 출연: 문자열} }, {...},] } moreInfo: {aired: string,genres: ["Action", "Mystery", ...],status: string,studios: string,duration: string.. . }],mostPopularAnimes: [ {episodes: { 하위: 번호, 더빙: 번호,},id: 문자열,jname: 문자열, 이름: 문자열,poster: 문자열, 유형: 문자열 }, {...},],recommendedAnimes : [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 기간: 문자열, 유형: 문자열, 등급: 문자열, 에피소드: { 하위: 번호, 더빙: 번호,} }, {...},],관련애니메이션: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 기간: 문자열, 유형: 문자열, 등급: 문자열, 에피소드: { 하위: 번호, 더빙: 번호,} }, {...},],계절: [ {id: 문자열, 이름: 문자열, 제목: 문자열, 포스터: 문자열, isCurrent: 부울 }, {...}] }}
? 맨 위로 돌아가기
GET
# 기본 example/api/v2/hianime/search?q={query}&page={page}# 고급 example/api/v2/hianime/search?q={query}&page={page}&genres={genres}&type={type}&sort={sort}&season={season}&언어={sub_or_dub}&status={status} &rated={등급}&start_date={yyyy-mm-dd}&end_date={yyyy-mm-dd}&score={score}
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
q | 끈 | 검색어, 즉 찾고 있는 항목의 제목입니다. | 예 | -- |
page | 숫자 | 결과의 페이지 번호입니다. | 아니요 | 1 |
type | 끈 | 애니메이션의 종류. 예: movie | 아니요 | -- |
status | 끈 | 애니메이션의 상태. 예: finished-airing | 아니요 | -- |
rated | 끈 | 애니메이션의 평가. 예: r+ 또는 pg-13 | 아니요 | -- |
score | 끈 | 애니메이션의 점수. 예: good 또는 very-good | 아니요 | -- |
season | 끈 | 방영된 애니메이션의 시즌. 예: spring | 아니요 | -- |
language | 끈 | 애니메이션의 언어 카테고리. 예: sub 또는 sub-&-dub | 아니요 | -- |
start_date | 끈 | 애니메이션 시작 날짜(yyyy-mm-dd)입니다. 예: 2014-10-2 | 아니요 | -- |
end_date | 끈 | 애니메이션 종료 날짜(yyyy-mm-dd)입니다. 예: 2010-12-4 | 아니요 | -- |
sort | 끈 | 애니메이션 결과 정렬 순서입니다. 예: recently-added | 아니요 | -- |
genres | 끈 | 쉼표로 구분된 애니메이션 장르입니다. 예: isekai,shounen | 아니요 | -- |
팁
start_date
및end_date
모두에 대해 연도를 언급해야 합니다. 날짜나 월을 생략하려면 대신0
지정하세요. 예: 날짜 생략 -> 2014-10-0, 월 생략 -> 2014-0-12, 둘 다 생략 -> 2014-0-0
// 기본 예제const resp = wait fetch("/api/v2/hianime/search?q=titan&page=1");const data = wait resp.json();console.log(data);// 고급 exampleconst resp = 가져오기를 기다립니다( "/api/v2/hianime/search?q=girls&genres=action,adventure&type=movie&sort=score&season=spring&언어=dub&status=finished-airing&rated=pg-13&start_date=2014-0-0&score=good");const 데이터 = 응답을 기다립니다. json();console.log(data);
{ 성공: 사실, 데이터: {애니메이션: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 기간: 문자열, 유형: 문자열, 등급: 문자열, 에피소드: { 하위: 번호, 더빙: 번호,} }, {...} ,],mostPopularAnimes: [ {에피소드: { 하위: 번호, 더빙: 번호,},id: 문자열,jname: 문자열, 이름: 문자열, 포스터: 문자열, 유형: 문자열 }, {...},],currentPage : 1,totalPages: 1,hasNextPage: false,searchQuery: 문자열,searchFilters: { [filter_name]: [filter_value] ...} }}
? 맨 위로 돌아가기
GET
/api/v2/hianime/search/suggestion?q={쿼리}
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
q | 끈 | 검색 제안 쿼리입니다. | 예 | -- |
const resp = wait fetch("/api/v2/hianime/search/suggestion?q=monster");const data = wait resp.json();console.log(data);
{ 성공: 사실, 데이터: {제안: [ {id: 문자열, 이름: 문자열, 포스터: 문자열,jname: 문자열,moreInfo: ["2022년 1월 21일", "영화", "17분"] }, {...},] }}
? 맨 위로 돌아가기
GET
/api/v2/hianime/producer/{이름}?page={페이지}
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
name | 끈 | 애니메이션 제작자의 이름(케밥의 경우) | 예 | -- |
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
page | 숫자 | 결과의 페이지 번호입니다. | 아니요 | 1 |
const resp = wait fetch("/api/v2/hianime/producer/toei-animation?page=2");const data = wait resp.json();console.log(data);
{ 성공: 사실, 데이터: {producerName: "Toei Animation Anime",animes: [ {id: 문자열, 이름: 문자열, 포스터: 문자열, 기간: 문자열, 유형: 문자열, 등급: 문자열, 에피소드: { 하위: 번호, 더빙: 번호, } }, {...},],top10Animes: { 오늘: [{ 에피소드: {sub: 번호,dub: 번호, }, id: 문자열, 이름: 문자열, 포스터: 문자열, 순위: 번호},{...}, ], 월: [...], 주: [...]},topAiringAnimes: [ {에피소드: { 하위: 번호, 더빙: 번호,},id: 문자열,jname : 문자열,이름: 문자열,포스터: 문자열,유형: 문자열 }, {...},],currentPage: 2,totalPages: 11,hasNextPage: true }}
? 맨 위로 돌아가기
GET
/api/v2/hianime/genre/{이름}?page={페이지}
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
name | 끈 | 애니메이션 장르의 이름입니다(케밥의 경우). | 예 | -- |
매개변수 | 유형 | 설명 | 필수의? | 기본 |
---|---|---|---|---|
page | 숫자 | 결과의 페이지 번호입니다. | 아니요 | 1 |
const resp = wait fetch("/api/v2/hianime/genre/shounen?page=2");const data = wait resp.json();console.log(data);
{ 성공: 사실, 데이터: {genreName: "Shunen Anime",애니메이션: [ {