Google API를 사용하기위한 Node.js 클라이언트 라이브러리. OAUTH 2.0, API 키 및 JWT 토큰으로 인증 및 인증 지원이 포함되어 있습니다.
Google API
시작하기
설치
클라이언트 라이브러리 사용
샘플
API 참조
인증 및 승인
OAUTH2 클라이언트
API 키 사용
응용 프로그램 기본 자격 증명
서비스 계정 자격 증명
글로벌 또는 서비스 수준 인증을 설정합니다
용법
요청 본문 지정
미디어 업로드
요청 옵션
프록시 사용
지원되는 API
TypeScript
HTTP/2
특허
기여
질문/문제?
지원되는 API의 전체 목록은 Google API Explorer에서 찾을 수 있습니다. API 엔드 포인트가 자동으로 생성되므로 API가 목록에 없으면 현재이 API 클라이언트 라이브러리에서 지원되지 않습니다.
DataStore, Cloud Storage 또는 Pub/Sub와 같은 Google Cloud Platform API를 사용하면 @Google-Cloud 클라이언트 라이브러리를 활용하는 것이 좋습니다. 이 라이브러리는 특정 Google 클라우드 플랫폼 서비스를 위해 설계된 목적으로 건축 된 관용 Node.js 클라이언트입니다. @google-cloud/storage
와 같은 개별 API 패키지를 설치하는 것이 좋습니다. Google Cloud Platform API-pecific 패키지의 포괄적 인 목록을 살펴 보려면 https://cloud.google.com/nodejs/docs/reference를 참조하십시오.
이러한 클라이언트 라이브러리는 공식적으로 Google에서 지원됩니다. 그러나 이러한 라이브러리는 완전한 것으로 간주되며 유지 보수 모드입니다. 즉, 중요한 버그 및 보안 문제를 해결하지만 새로운 기능을 추가하지는 않습니다. Google Cloud Platform API의 경우 활성화중인 Google-Cloud-Node를 사용하는 것이 좋습니다.
이 라이브러리는 유지 보수 LT, 활성 LT 및 Node.js의 현재 릴리스를 지원합니다. 자세한 내용은 Node.js 릴리스 일정을 참조하십시오.
이 라이브러리는 npm
에 배포됩니다. 종속성으로 추가하려면 다음 명령을 실행하십시오.
$ npm 설치 GOOGLEAPIS
시작 시간을 줄여야하는 경우 하위 모듈을 자체 종속성으로 설치할 수 있습니다. 우리는이 목록에 없는 하위 모듈을 게시하기 위해 노력합니다. 종속성으로 추가하려면 선호하는 API로 대체하여 다음 샘플 명령을 실행하십시오.
$ npm install @googleapis/docs
npm
에서이 검색을 실행하여 사용 가능한 하위 모듈 목록을 찾을 수 있습니다.
이것은 매우 간단한 예입니다. 블로거 클라이언트를 생성하고 블로그 ID가 주어진 블로그의 세부 정보를 검색합니다.
const {google} = require ( 'googleapis'); // 각 API는 여러 버전을 지원할 수 있습니다. 이 샘플을 사용하면 Blogger API의 // v3을 받고 API 키를 사용하여 authenticate.const Blogger = Google.blogger ({{{ 버전 : 'v3', Auth : 'API 키'}); const params = { BlogId : '3213900'}; // 블로그를 가져옵니다. actorationbrogger.blogs.get (params, (err, res) => { if (err) {console.error (err); throw err; } console.log (`블로그 URL은 $ {res.data.url}};});
콜백을 사용하는 대신 약속을 사용할 수도 있습니다!
blogger.blogs.get (params) . (res => {console.log (`블로그 URL은 $ {res.data.url}`); }) .catch (error => {console.error (error); });
또는 비동기/대기 :
Async 함수 runsample () { const res = blogger.blogs.get (params); console.log (`블로그 URL은 $ {res.data.url}};} runsample (). catch (console.error);
또는 하위 모듈을 설치하여 API에 직접 전화를 걸 수 있습니다.
const docs = require ( '@googleapis/docs') const auth = new Docs.auth.googleAuth ({{ KeyFileName : 'path_to_service_account_key.json', // 스코프는 배열 또는 단일 공간에 따른 문자열로 지정할 수 있습니다. 스코프 : [ 'https://www.googleapis.com/auth/documents'});const authclient = await auth.getClient (); const client = await docs.docs ({버전 : 'v1', authclient }); const createrponse = await client.documents.create ({requestbody : {title : '새 문서!',},}); console.log (CreaterPronse.Data);
샘플이 많이 있습니까? API를 사용하는 방법을 알아 내려고한다면 먼저보세요! 누락 된 샘플이 있으면 문제를 제기하십시오.
이 라이브러리에는 전체 API 참조 문서 세트가 있습니다. 이 문서는 자동으로 생성되며 위치가 변경 될 수 있습니다.
Google API에 인증하는 방법에는 여러 가지가 있습니다. 일부 서비스는 모든 인증 방법을 지원하는 반면 다른 서비스는 하나 또는 두 가지만 지원할 수 있습니다.
OAUTH2- 주어진 사용자를 대신하여 API 호출을 할 수 있습니다. 이 모델에서 사용자는 응용 프로그램을 방문하고 Google 계정에 서명하며 응용 프로그램에 범위 세트에 대한 승인을 제공합니다. 자세히 알아보십시오.
API 키 - API 키를 사용하면 클라이언트 또는 서버에서 서비스에 액세스 할 수 있습니다. 일반적으로 안전하지 않으면 스코프가 제한된 작은 서비스에서만 사용할 수 있습니다. 자세히 알아보십시오.
애플리케이션 기본 정보 - 로컬 개발 용 Google Cloud SDK 또는 Google Cloud 플랫폼에 배포 된 응용 프로그램 용 GCE 메타 데이터 서버를 사용하여 Google API에 자동으로 액세스 할 수 있습니다. 자세히 알아보십시오.
서비스 계정 자격 증명 -이 모델에서 응용 프로그램은 서비스 계정을 사용하여 Google API와 직접 대화합니다. 백엔드에서 Google API와 직접 대화 할 백엔드 응용 프로그램이있을 때 유용합니다. 자세히 알아보십시오.
인증 클라이언트에 대한 자세한 내용은 Google Auth 라이브러리를 참조하십시오.
이 모듈에는 Access Token을 검색하고 새로 고쳐서 요청을 원활하게 재 시도 할 수있는 OAUTH2 클라이언트가 함께 제공됩니다. Google의 OAUTH2 구현의 기본 사항은 Google 승인 및 인증 문서에 설명되어 있습니다.
다음 예에서는 CLIENT_ID
, CLIENT_SECRET
및 REDIRECT_URL
필요할 수 있습니다. 개발자 콘솔로 이동하여 프로젝트를 클릭하여 이러한 정보를 찾을 수 있습니다 -> APIS & Auth -> Credentials.
클라우드 콘솔로 이동하여 새 OAUTH2 클라이언트 ID를 만듭니다.
응용 프로그램 유형의 Web Application
선택하십시오
http://localhost:3000/oauth2callback
(또는 시나리오의 해당 값) 값으로 공인 리디렉션 URI 추가
Create
클릭하고 다음 화면에서 Ok
새로 만든 OAUTH2 클라이언트 ID 옆에 Download
아이콘을 클릭하십시오.
이 파일을 안전한 장소에 저장 하고이 파일을 소스 컨트롤로 확인하지 마십시오!
OAUTH2 및 작동 방식에 대한 자세한 내용은 여기를 참조하십시오.
OAUTH2 클라이언트와 함께 승인하고 인증하는 완전한 샘플 응용 프로그램은 samples/oauth2.js
에서 사용할 수 있습니다.
액세스 토큰을 검색하기 위해 사용자에게 권한을 요청하려면 동의 페이지로 리디렉션됩니다. 동의 페이지를 만들려면 URL :
const {google} = require ( 'googleapis'); const oauth2client = new Google.auth.oauth2 ( your_client_id, your_client_secret, your_redirect_url); // Blogger 및 Google Calendar Scopesconst Scopes에 대한 권한을 요구하는 URL을 생성합니다. 'https://www.googleapis.com/auth/blogger', 'https://www.googleapis.com/auth/calendar']; const url = oauth2client.generateauthurl ({ // '온라인'(기본값) 또는 '오프라인'(getsepherm_token) access_type : '오프라인', // 하나의 범위 만 필요하면 문자열로 전달할 수 있습니다. 범위 : 스코프});
중요한 메모 - refresh_token
은 첫 번째 승인에서만 반환됩니다. 자세한 내용은 여기를 참조하십시오.
사용자가 동의 페이지에 권한이 부여되면 Google은 페이지를 코드 쿼리 매개 변수와 함께 제공 한 리디렉션 URL로 리디렉션합니다.
GET /oauthcallback?code={authorizationCode}
코드가 반환되면 아래와 같이 액세스 토큰을 요청할 수 있습니다.
// 이것은 ac
OAUTH2 클라이언트의 자격 증명을 설정하면 준비가되었습니다!
액세스 토큰이 만료됩니다. 이 라이브러리는 새로 고침 토큰을 자동으로 사용하여 만료 될 경우 새로운 액세스 토큰을 얻습니다. 가장 최근의 토큰을 항상 저장할 수있는 쉬운 방법은 tokens
이벤트를 사용하는 것입니다.
oauth2client.on ( '토큰', (토큰) => { if (tokens.refresh_token) {// refresh_token을 내 데이터베이스에 저장! console.log (tokens.refresh_token); } console.log (tokens.access_token);});
이 토큰 이벤트는 첫 번째 승인에서만 발생하며 generateAuthUrl
메소드를 호출하여 새로 고침 토큰을받을 때 access_type
offline
으로 설정해야합니다. 새로 고침 토큰을 수신하기위한 적절한 제약 조건을 설정하지 않고 이미 앱에 필요한 권한을 이미 제공 한 경우 신선한 새로 고침 토큰을 받으려면 응용 프로그램을 다시 승인해야합니다. 여기에서 앱의 계정에 대한 액세스를 취소 할 수 있습니다.
나중에 refresh_token
을 설정하려면 setCredentials
메소드를 사용할 수 있습니다.
OAuth2Client.setCredentials ({ refresh_token :`stored_refresh_token`});
클라이언트에 새로 고침 토큰이 있으면 API에 대한 다음 호출에서 액세스 토큰이 자동으로 획득되고 새로 고침됩니다.
새로 고침 토큰이 부여 된 후에는 작동을 중단 할 수 있습니다.
사용자는 앱의 액세스를 취소했습니다
새로 고침 토큰은 6 개월 동안 사용되지 않았습니다.
사용자가 암호를 변경했고 새로 고침 토큰에는 Gmail 스코프가 포함되어 있습니다.
사용자 계정은 최대 수의 라이브 새로 취급 토큰을 초과했습니다.
응용 프로그램은 '테스트'상태가 있으며 동의 화면은 외부 사용자 유형에 대해 구성되어 7 일 안에 토큰이 만료됩니다.
개발자는 새로 고침 토큰이 더 이상 작동하지 않는 경우를 처리하기 위해 코드를 작성해야합니다.
요청과 함께 API 키를 보내야 할 수도 있습니다. 다음은 API 키를 사용하여 Blogger API 서비스에 요청하여 블로그 이름, URL 및 총 게시물을 검색합니다.
const {google} = require ( 'googleapis'); const blogger = google.blogger_v3 ({{ 버전 : 'v3', Auth : 'Your_api_key'// 여기에 API 키를 지정}); const params = { blogid : '3213900'}; Async 함수 main (params) { const res = blogger.blogs.get ({blogid : params.blogid}); console.log (`$ {res.data.name}은 $ {res.data.posts.totalitems} 게시물을 가지고 있습니다! 블로그 URL은 $ {res.data.url}`)}; main (). catch (콘솔입니다. 오류);
API 키에 대한 자세한 내용은 문서를 참조하십시오.
OAUTH2 클라이언트, JWT 클라이언트 또는 컴퓨팅 클라이언트를 수동으로 생성하는 대신 Auth 라이브러리는 코드가 실행중인 환경에 따라 귀하에게 적합한 자격 증명 유형을 만들 수 있습니다.
예를 들어, 로컬 개발자 시스템에서 코드가 실행될 때 JWT Auth 클라이언트가 생성되며 구성된 Google Compute Engine 인스턴스에서 동일한 코드가 실행될 때 Compute 클라이언트가 작성됩니다. 아래 코드는 런타임 환경에 따라 기본 자격 증명 유형을 검색하는 방법을 보여줍니다.
Google Cloud SDK와 함께 로컬로 애플리케이션 기본 자격 증명을 사용하려면 실행합니다.
$ gcloud Auply Application-Default 로그인
GCP에서 실행할 때 서비스 인증은 GCE 메타 데이터 서버를 통해 자동으로 제공됩니다.
const {google} = require ( 'googleapis'); const compute = google.compute ( 'v1'); async function main () { const auth = new google.auth.googleAuth ({// 스코프는 배열 또는 단일 공간-델리 메이트로 지정할 수 있습니다. }); const authclient = await auth.getClient (); // 현재 프로젝트 ID를 얻습니다 const project = await auth.getProjectId (); // 프로젝트 내에서 GCE 영역 목록을 가져옵니다. const res = compute.zones.list ({project, auth : authclient}); console.log (res.data);} main (). catch (console.error);
서비스 계정을 사용하면 로봇 계정을 사용하여 서버 간 앱 레벨 인증을 수행 할 수 있습니다. 서비스 계정을 만들고 키 파일을 다운로드하여 Google API에 인증하는 데 사용합니다. 서비스 계정을 만들려면 :
서비스 계정 만들기 키 페이지로 이동하십시오
드롭 다운에서 New Service Account
선택하십시오
Create
버튼을 클릭하십시오
서비스 계정 자격 증명 파일을 안전한 곳에 저장 하고이 파일을 소스 컨트롤로 확인하지 마십시오 ! 서비스 계정 자격 증명 파일을 참조하려면 몇 가지 옵션이 있습니다.
GOOGLE_APPLICATION_CREDENTIALS
Env var GOOGLE_APPLICATION_CREDENTIALS
라는 환경 변수로 프로세스를 시작할 수 있습니다. 이 env var의 값은 서비스 계정 자격 증명 파일의 전체 경로 여야합니다.
$ google_application_credentials =./your-secret-key.json node server.js
keyFile
속성 사용 또는 GoogleAuth
생성자의 keyFile
속성을 통해 서비스 계정 자격 증명 파일의 경로를 지정할 수 있습니다.
const {google} = require ( 'googleapis'); const auth = new Google.auth.googleAuth ({{ 키 파일 : '/spath/to/your-secret-key.json', 스코프 : [ 'https://www.googleapis.com/auth/cloud-platform'],});
auth
글로벌 또는 서비스 수준 옵션으로 설정할 수 있으므로 모든 요청을 지정할 필요가 없습니다. 예를 들어, auth
전역 옵션으로 설정할 수 있습니다.
const {google} = require ( 'googleapis'); const oauth2client = new Google.auth.oauth2 ( your_client_id, your_client_secret, your_redirect_url); // auth를 global defaultgoogle.options ({ Auth : Oauth2Client});
전반적으로 옵션을 설정하는 대신 서비스 수준에서 인증 클라이언트를 설정할 수도 있습니다.
const {google} = require ( 'googleapis'); const oauth2client = new Google.auth.oauth2 ( your_client_id, your_client_secret, your_redirect_url); const drive = google.drive ({ 버전 : 'v2', Auth : Oauth2Client});
자세한 내용은 옵션 섹션을 참조하십시오.
요청 본문은 요청의 requestBody
매개 변수 객체에 지정되어 있습니다. 본문은 키/값 쌍이있는 JavaScript 객체로 지정됩니다. 예를 들어,이 샘플은 이메일이 Gmail 계정으로 전송 될 때 Google Cloud Pub/Sub Topic에 알림을 게시하는 감시자를 만듭니다.
const res = gmail.users.watch ({{ userid : 'me', requestbody : {//`project/$ {project_id}/topics/$ {topic_name}`topicname :`projects/el-gato/topics/gmail`으로 대체합니다 }}); console.log (res.data);
이 클라이언트는 멀티 파트 미디어 업로드를 지원합니다. 리소스 매개 변수는 requestBody
매개 변수 객체에 지정되어 있으며 미디어 자체는 media.mimeType
에 지정된 MIME 유형이있는 media.body
매개 변수에 지정됩니다.
이 예제는 "테스트"와 "hello world"라는 제목으로 일반 텍스트 파일을 Google 드라이브에 업로드합니다.
const drive = google.drive ({ 버전 : 'v3', Auth : Oauth2Client}); const res = await drive.files.create ({{ requestbody : {name : 'test', mimetype : 'text/plain' }, 미디어 : {Mimetype : 'Text/Plain', Body : 'Hello World' }});
미디어를 지정하여 media.body
읽을 수있는 스트림으로 업로드 할 수도 있습니다. 이를 통해 메모리에 맞지 않는 매우 큰 파일을 업로드 할 수 있습니다.
const fs = require ( 'fs'); const drive = google.drive ({{ 버전 : 'v3', Auth : Oauth2Client}); Async 함수 main () { const res = await drive.files.create ({requestbody : {name : 'testimage.png', mimetype : 'image/png'}, media : {mimetype : 'image/png', body : fs.createreadstream ( 'awesome .png ')} }); console.log (res.data);} main (). catch (console.error);
미디어 첨부 파일이 포함 된 생성 및 수정 요청에 대한 더 많은 예를 보려면 samples/drive/upload.js
샘플을 참조하십시오.
API 통화 방법에 대한보다 미세 조정 된 제어를 위해이 라이브러리에 사용 된 'Gaxios'객체에 직접 적용하여 API에 네트워크 호출을 할 수있는 추가 옵션을 지정할 수있는 기능을 제공합니다.
글로벌 google
객체 또는 서비스 클라이언트 기준으로 추가 옵션을 지정할 수 있습니다. 지정한 옵션은 gaxios
객체에 첨부되므로 gaxios
지원하는 모든 것이 무엇이든이 라이브러리가 지원합니다. 또한 모든 API 호출에 첨부 될 글로벌 또는 서비스 당 요청 매개 변수를 지정할 수도 있습니다.
지원되는 옵션의 전체 목록은 여기에서 찾을 수 있습니다.
각 요청과 함께 전송 될 기본 옵션을 선택할 수 있습니다. 이 옵션은 Google 클라이언트가 인스턴스화하는 모든 서비스에 사용됩니다. 이 예에서는 GaxiosOptions
의 timeout
속성이 모든 요청에 대해 설정됩니다.
const {google} = require ( 'googleapis'); google.options ({{ //이 개체로 작성된 모든 요청은 재정의하지 않는 한이 설정을 사용합니다. 타임 아웃 : 1000, Auth : Auth});
각 요청과 함께 전송 된 매개 변수를 수정할 수도 있습니다.
const {google} = require ( 'googleapis'); google.options ({{ // 모든 서비스의 모든 요청에는 위의 쿼리 매개 변수가 포함됩니다. // 서비스 클라이언트 또는 개별 API 호출에서 재정의하지 않는 한. 매개 변수 : {quotauser : '[email protected]' }});
서비스 클라이언트를 만들 때 옵션을 지정할 수도 있습니다.
Const Blogger = Google.blogger ({ 버전 : 'v3', //이 객체로 작성된 모든 요청은 지정된 인증을 사용합니다. Auth : 'API 키';});
이렇게하면이 서비스 클라이언트와 함께 작성된 모든 API 호출은 'API KEY'
사용하여 인증합니다.
참고 : 생성 된 클라이언트는 불변 이므로 다른 옵션을 지정하려면 새 클라이언트를 만들어야합니다.
위의 예와 유사하게 주어진 서비스의 모든 호출에 사용되는 매개 변수를 수정할 수도 있습니다.
Const Blogger = Google.blogger ({ 버전 : 'v3', //이 서비스 클라이언트와 함께 작성된 모든 요청에는 다음에 // 개별 API 호출에서 재정의하지 않는 한 blogid query 매개 변수. 매개 변수 : {blogid : '3213900' }}); //이 드라이브 클라이언트로 호출 할 수 있습니다.
요청 당 사용할 auth
객체를 지정할 수 있습니다. 각 요청은 또한 서비스 수준 및 글로벌 수준에서 지정된 옵션을 상속합니다.
예를 들어:
const {google} = require ( 'googleapis'); const bigquery = google.bigquery ( 'v2'); async function main () { //이 메소드는 gcloud_project 및 google_application_credentials를 찾습니다 // 환경 변수. const auth = new Google.auth.googleAuth ({스코프 : [ 'https://www.googleapis.com/auth/cloud-platform']] }); const authclient = await auth.getClient (); const projectid = await auth.getProjectId (); const request = {projectId, dataSetId : '<your_dataset_id>', // 이것은 "요청 레벨"옵션입니다 : Authclient }; const res = bigQuery.datasets.delete (요청); console.log (res.data);} main (). catch (console.error);
url
, method
및 responseType
와 같은 요청 당 GAXIOS 옵션을 무시할 수도 있습니다.
예를 들어:
const res = drive.files.export ({{ fileId : 'asxkjod9s79', // Google Doc Mimetype : 'Application/Pdf'}, { // 이진 데이터를 얻으십시오 responseType : 'stream'});
다음 환경 변수를 사용하여 HTTP 및 HTTPS 요청을 프록시 할 수 있습니다.
HTTP_PROXY
/ http_proxy
HTTPS_PROXY
/ https_proxy
http_proxy / http_proxy가 설정되면 명시 적 프록시 구성 옵션이없는 비 SSL 요청을 프록시하는 데 사용됩니다. 마찬가지로, HTTPS_PROXY / HTTPS_PROXY는 명시 적 프록시 구성 옵션이없는 SSL 요청에 대해 존중됩니다. 환경 변수 중 하나에서 프록시를 정의하는 것이 유효한 다음 프록시 구성 옵션을 사용하여 특정 요청에 대해 상환하는 것이 유효합니다.
지원되는 API 목록 및 사용 가능한 모든 버전을 프로그래밍 방식으로 얻을 수 있습니다.
const {google} = require ( 'googleapis'); const apis = google.getsupportedapis ();
API 이름을 객체 속성 이름으로 반환하고 버전 배열이 객체 값으로 반환됩니다.
이 라이브러리는 TypeScript로 작성되었으며 상자 밖에서 유형을 제공합니다. 각 API에 대해 생성 된 모든 클래스 및 인터페이스는 ${apiName}_${version}
네임 스페이스에 따라 내보내집니다. 예를 들어 Drive V3 API 유형은 모두 drive_v3
네임 스페이스에서 사용할 수 있습니다.
수입 { Google, // 서비스에 액세스하는 데 사용되는 최상위 객체 drive_v3, // 모든 서비스 클라이언트의 경우 내보내는 네임 스페이스가 있습니다. Auth, // 인증 관련 유형의 네임 스페이스 'googleapis'에서의 일반적인, // 라이브러리 전체에 사용 된 일반 유형}; // 참고 :`auth.googleauth`와 같은 명시 적 유형을 사용하는 것은 // 데모 목적으로 만 여기에 있습니다. 일반적으로 TypeScript를 사용하면 이러한 유형이 // 추론됩니다. 버전 : 'v3', auth,}); // 모든 요청 매개 변수 세트에 대한 생성 유형이 있습니다. listparams : drive_v3.params $ resource $ files $ list = {}; const res = await drive.files.list (listParams); // 생성됩니다. 응답 필드에 대한 유형과 wworthst listresults : drive_v3.schema $ filelist = res.data;
이 라이브러리는 HTTP/2를 지원합니다. 이를 활성화하려면 http2
옵션을 사용하여 요청 매개 변수가 수락됩니다.
const {google} = require ( 'googleapis'); google.options ({{ http2 : true,});
HTTP/2는 단일 소켓을 통해 여러 동시 요청을 멀티플렉싱 할 수 있으므로 종종 더 성능이 뛰어납니다. 기존의 HTTP/2 API에서 클라이언트는 요청을하기 위해 세션을 열고 폐쇄 할 책임이 있습니다. 기존 API와의 호환성을 유지하기 위해이 모듈은 기존 세션을 자동으로 재사용하며 500ms에 공전 한 후 수집됩니다. 성능 이득의 대부분은 배치 스타일의 워크로드와 단단한 루프로 보입니다.
릴리스 노트에서 상세한 변경 사항 및 새로운 기능 목록을 찾을 수 있습니다. 25.x
전에이 라이브러리를 사용한 경우 릴리스 노트를 참조하여 코드를 24.xx
에서 25.xx
로 마이그레이션하는 방법에 대해 알아보십시오. 꽤 쉽습니다 :)
이 라이브러리는 Apache 2.0에 따라 라이센스가 부여됩니다. 전체 라이센스 텍스트는 라이센스로 제공됩니다.
우리는 기여를 좋아합니다! 풀 요청을 제출하기 전에 항상 새로운 문제로 시작하는 것이 좋습니다. 자세한 내용은 기여를 참조하십시오.
StackoverFlow에 대한 개발 관련 질문을하십시오.
버그/문제를 발견 한 경우 Github에 제출하십시오.