From 87b5ad96a015c4fe251ef7e90614d9cdb6cf9125 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Wed, 2 Mar 2022 17:54:27 +0900 Subject: [PATCH 01/18] initial commit for nogizaka46 messages app support --- CHANGELOG.md | 6 ++++++ Cargo.lock | 2 +- Cargo.toml | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76cb6c7..4ce4908 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ ## Packaging +# v3.0.0 + +## BREAKING CHANGES + +* support "乃木坂46メッセージ" + # v2.0.4 https://github.com/proshunsuke/colmsg/pull/57 diff --git a/Cargo.lock b/Cargo.lock index 00e5661..debe110 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -240,7 +240,7 @@ dependencies = [ [[package]] name = "colmsg" -version = "2.0.4" +version = "3.0.0" dependencies = [ "ansi_colours", "ansi_term 0.12.1", diff --git a/Cargo.toml b/Cargo.toml index e2b8e3b..295fb02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "colmsg" -version = "2.0.4" +version = "3.0.0" authors = ["proshunsuke "] categories = ["command-line-utilities"] -description="「櫻坂46メッセージ」「日向坂46メッセージ」アプリのメッセージをPCに保存します." +description="Save the messages of '櫻坂46メッセージ', '日向坂46メッセージ' and '乃木坂46メッセージ' apps to the local." homepage = "https://github.com/proshunsuke/colmsg" license = "MIT" readme = "README.md" From af3f2cc7a9fcc4ffa600decbbd50227838a71f1c Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sun, 6 Mar 2022 03:59:53 +0900 Subject: [PATCH 02/18] Create OpenApi specification for api.kh.glastonr.net --- api/api-kh-glastonr-net.yaml | 1591 +++++++++++++++++ .../schemas/RequestHeaderAccept-Encoding.yaml | 6 + .../schemas/RequestHeaderAccept-Language.yaml | 6 + .../schemas/RequestHeaderAccept.yaml | 7 + .../schemas/RequestHeaderAuthorization.yaml | 6 + .../schemas/RequestHeaderConnection.yaml | 6 + .../schemas/RequestHeaderContent-Length.yaml | 6 + .../schemas/RequestHeaderContent-type.yaml | 6 + api/components/schemas/RequestHeaderHost.yaml | 6 + api/components/schemas/RequestHeaderTE.yaml | 6 + .../schemas/RequestHeaderUser-Agent.yaml | 6 + .../schemas/RequestHeaderX-Talk-App-ID.yaml | 6 + .../schemas/ResponseHeaderCache-Control.yaml | 4 + .../schemas/ResponseHeaderConnection.yaml | 4 + .../schemas/ResponseHeaderContent-Length.yaml | 4 + .../schemas/ResponseHeaderContent-Type.yaml | 4 + .../schemas/ResponseHeaderDate.yaml | 4 + .../schemas/ResponseHeaderPragma.yaml | 4 + .../schemas/ResponseHeaderVary.yaml | 4 + .../schemas/ResponseHeaderX-Request-Id.yaml | 4 + api/components/schemas/Timeline.yaml | 25 + .../schemas/TimelineCanceledObject.yaml | 40 + api/components/schemas/TimelineLetter.yaml | 64 + api/components/schemas/TimelinePicture.yaml | 21 + .../schemas/TimelinePictureObject.yaml | 59 + api/components/schemas/TimelineText.yaml | 21 + .../schemas/TimelineTextObject.yaml | 42 + api/components/schemas/TimelineVideo.yaml | 21 + .../schemas/TimelineVideoObject.yaml | 55 + api/components/schemas/TimelineVoice.yaml | 21 + .../schemas/TimelineVoiceObject.yaml | 42 + 31 files changed, 2101 insertions(+) create mode 100644 api/api-kh-glastonr-net.yaml create mode 100644 api/components/schemas/RequestHeaderAccept-Encoding.yaml create mode 100644 api/components/schemas/RequestHeaderAccept-Language.yaml create mode 100644 api/components/schemas/RequestHeaderAccept.yaml create mode 100644 api/components/schemas/RequestHeaderAuthorization.yaml create mode 100644 api/components/schemas/RequestHeaderConnection.yaml create mode 100644 api/components/schemas/RequestHeaderContent-Length.yaml create mode 100644 api/components/schemas/RequestHeaderContent-type.yaml create mode 100644 api/components/schemas/RequestHeaderHost.yaml create mode 100644 api/components/schemas/RequestHeaderTE.yaml create mode 100644 api/components/schemas/RequestHeaderUser-Agent.yaml create mode 100644 api/components/schemas/RequestHeaderX-Talk-App-ID.yaml create mode 100644 api/components/schemas/ResponseHeaderCache-Control.yaml create mode 100644 api/components/schemas/ResponseHeaderConnection.yaml create mode 100644 api/components/schemas/ResponseHeaderContent-Length.yaml create mode 100644 api/components/schemas/ResponseHeaderContent-Type.yaml create mode 100644 api/components/schemas/ResponseHeaderDate.yaml create mode 100644 api/components/schemas/ResponseHeaderPragma.yaml create mode 100644 api/components/schemas/ResponseHeaderVary.yaml create mode 100644 api/components/schemas/ResponseHeaderX-Request-Id.yaml create mode 100644 api/components/schemas/Timeline.yaml create mode 100644 api/components/schemas/TimelineCanceledObject.yaml create mode 100644 api/components/schemas/TimelineLetter.yaml create mode 100644 api/components/schemas/TimelinePicture.yaml create mode 100644 api/components/schemas/TimelinePictureObject.yaml create mode 100644 api/components/schemas/TimelineText.yaml create mode 100644 api/components/schemas/TimelineTextObject.yaml create mode 100644 api/components/schemas/TimelineVideo.yaml create mode 100644 api/components/schemas/TimelineVideoObject.yaml create mode 100644 api/components/schemas/TimelineVoice.yaml create mode 100644 api/components/schemas/TimelineVoiceObject.yaml diff --git a/api/api-kh-glastonr-net.yaml b/api/api-kh-glastonr-net.yaml new file mode 100644 index 0000000..35bd862 --- /dev/null +++ b/api/api-kh-glastonr-net.yaml @@ -0,0 +1,1591 @@ +openapi: 3.0.0 +info: + title: api.kh.glastonr.net + version: '2.0' + description: '"櫻坂46メッセージ", "日向坂46メッセージ" ver2.00' + contact: + name: pro_shunsuke + url: 'https://twitter.com/pro_shunsuke' + email: shunsuke0901@gmail.com +servers: + - url: 'https://api.kh.glastonr.net' +paths: + /v2/update_token: + post: + summary: /v2/update_token + operationId: post-v2-update_token + description: access_tokenの更新 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderContent-Length.yaml' + requestBody: + content: + application/json: + schema: + type: object + properties: + refresh_token: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + example: 7bfd1c98-fb66-4c2d-a1da-af65845fb1da + required: + - refresh_token + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + access_token: + type: string + pattern: "^[a-zA-Z0-9]{36}\\.[a-zA-Z0-9]{44}\\.[a-zA-Z0-9-_]{43}$" + expires_in: + type: integer + minimum: 0 + enum: + - 3600 + refresh_token: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + required: + - access_token + - expires_in + - refresh_token + examples: + example: + value: + access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIxMjE1MzQsInN1YiI6IjEzMDIxMSJ9.tz663WGim12HGUj4F-R-yJc8Iieu70A6MKVR0iSv-Ns + expires_in: 3600 + refresh_token: 331c4f45-fcfb-4306-9588-f02cc5dcd575 + '400': + description: Bad Request + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + code: + type: string + message: + type: string + parameter: + type: string + required: + - code + - message + - parameter + examples: + invalid_parameter: + value: + code: invalid_parameter + message: リフレッシュトークンが正しくありません + parameter: refresh_token + /v2/signin: + post: + summary: /v2/signin + operationId: post-v2-signin + description: sign in + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderContent-Length.yaml' + requestBody: + content: + application/json: + schema: + type: object + properties: + auth_type: + type: string + enum: + - facebook + - google + - twitter + device_uuid: + type: string + pattern: '^[A-Z0-9]{43}=$' + token: + type: string + pattern: '^[A-Za-z0-9_]{1025}$' + required: + - auth_type + - device_uuid + - token + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + access_token: + type: string + pattern: "^[A-Za-z0-9]{36}\\.[A-Za-z0-9]{44}\\.[A-Za-z0-9]{43}$" + auth_type: + type: string + enum: + - facebook + - google + - twitter + device_uuid: + type: string + expires_in: + type: number + enum: + - 3600 + refresh_token: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + username: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + required: + - access_token + - auth_type + - device_uuid + - expires_in + - refresh_token + - username + examples: + example: + value: + access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIwOTU1MDUsInN1YiI6IjEzMDIxMSJ9.TAesJMXAgS8fopvSv4Rbxb3N8HGUuu7p4Y8d7xToNrQ + auth_type: google + device_uuid: aiA4wmWk8TMFc6XoNglRbeAwIRM4KDKMqea1FYns= + expires_in: 3600 + refresh_token: 331c4f45-fcfb-4306-9588-f02cc5dcd575 + username: 2rydsxfe-pzb1-3386-46339-j3mq6olz1p00 + /v2/groups: + get: + summary: /v2/groups + operationId: get-v2-groups + description: メンバー一覧の取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: array + minItems: 20 + items: + type: object + properties: + id: + type: integer + minimum: 1 + is_letter_destination: + type: boolean + name: + $ref: '#/components/schemas/MembersEnum' + phone_image: + type: string + format: uri + priority: + type: integer + minimum: 0 + state: + type: string + enum: + - open + - closed + tags: + $ref: '#/components/schemas/TagsEnum' + thumbnail: + type: string + format: uri + trial_days: + type: integer + minimum: 0 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + subscription: + type: object + properties: + auto_renewing: + type: boolean + end_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + start_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + type: + type: string + enum: + - paid + - nopaid + - free + required: + - id + - is_letter_destination + - name + - phone_image + - priority + - state + - tags + - thumbnail + - updated_at + examples: + example: + value: + - id: 1 + is_letter_destination: false + name: 石森 虹花 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/f34f2d429909b3081b9649f61ac6a853bcff66b38f2e57ff790d33735c150a41.jpg' + priority: 13200 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/c5457b3984a1d25809b897f0ec1f25bde61905b7b34d5aa06fde987527d1cbd0.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:07:14Z' + - id: 3 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2019-01-31T03:28:28Z' + - id: 4 + is_letter_destination: false + name: 上村 莉菜 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/080bf573c998850d153d0a701ede6319a216602eadac420210c811c858fa057c.jpg' + priority: 12900 + state: open + subscription: + auto_renewing: false + end_at: '2020-06-19T19:17:30Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/fd95235814086fc9491ce00942a2bb8fb40f19af57563ea136209fca9c3f749f.jpg' + trial_days: 0 + unread_count: 1 + updated_at: '2020-05-27T12:04:04Z' + - id: 5 + is_letter_destination: false + name: 尾関 梨香 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/759b7631aa6998abd103f80b8e6cd0ae78345fb5b9558d8c053744dc2126f644.jpg' + priority: 12700 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/2d48211ac656cb45d8dca015ee08b91c4c1d90ecfca7efeeaf8059166b50cbc2.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:07:36Z' + - id: 6 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-03-26T03:41:38Z' + - id: 7 + is_letter_destination: false + name: 小池 美波 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/f2c4fc108accfe9b4c8738cdc894aba4ee439395a841f3e88b7b3704da07867b.jpg' + priority: 12200 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/a04421750cb2855c567d190f8974421395559d5b95981db6fa32a62829e68aee.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:07:59Z' + - id: 8 + is_letter_destination: false + name: 小林 由依 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/be0bf045a253d30017ad98db3a334586a20384786dfaefe5847f53e0bc4e96e1.jpg' + priority: 12100 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/a71b6ddf9b4fc159b184924049f1c0fc9fb330ccb7647531a107fc962de13b00.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:08:29Z' + - id: 9 + is_letter_destination: false + name: 齋藤 冬優花 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/2866d70220ffdc28c1f506f266f1c8213472d815eea3f7567596c116aee88c7a.jpg' + priority: 11900 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/7b31256fe4913e1e434ed90c72f4c7d36c45f14a9c86f947980fa6f933ef0b13.jpg' + trial_days: 0 + updated_at: '2020-03-02T05:50:35Z' + - id: 10 + is_letter_destination: false + name: 佐藤 詩織 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/bedc7a58947005e26274837b62e1bd115af692ee1fab40bf4f83d53e4c62bf84.jpg' + priority: 11600 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/729ab41e06096b1af43f550bb62d59725a387ebb55682a0b54bc8ddbdf6fb2e8.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:08:57Z' + - id: 11 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2019-02-28T03:00:50Z' + - id: 12 + is_letter_destination: false + name: 菅井 友香 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/6ab5db72a0e772104aea0955f9733cb387fd454f6caef455aa3c10c72f2c5ebb.jpg' + priority: 11400 + state: open + subscription: + auto_renewing: false + end_at: '2020-07-01T04:00:50Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/56f6d350e48bc448bae400d1b8eac67f4cb0539a0cb3bbc5d46e4ecb713bee0e.jpg' + trial_days: 0 + updated_at: '2020-05-11T04:13:09Z' + - id: 13 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-03-26T03:42:15Z' + - id: 14 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-04-30T03:59:46Z' + - id: 31 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2019-08-31T03:00:48Z' + - id: 15 + is_letter_destination: false + name: 土生 瑞穂 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/4d3d0d0eb53ca32332b75594e5f9be051cc5c31c4c7f3c0434e79d61214f9dee.jpg' + priority: 10800 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/719fb08a44460ce49173790e82802f6bb91edb77afc21fc8344a793d4e6d65bb.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:09:23Z' + - id: 16 + is_letter_destination: false + name: 原田 葵 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/deace33dc2b6fce6a269b8f84da3c331c7be72f36f85eb40df90dc62a5085b92.jpg' + priority: 10700 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/965306b52bb419eb91640275d08cedb0f915f006337c564f7ed76dee8cde12d8.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:10:00Z' + - id: 17 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-03-26T03:42:42Z' + - id: 18 + is_letter_destination: false + name: 守屋 茜 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/52e3dbe8fb94650fe840c5823358cd7323e32b118b0a5ecbacac3190b038529c.jpg' + priority: 10400 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/4ae408b2871a9fa44d0d40705e37eb62702ab0bc931309596d6bc1838006dc93.jpg' + trial_days: 0 + updated_at: '2020-05-11T04:07:51Z' + - id: 19 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2019-02-28T03:00:33Z' + - id: 20 + is_letter_destination: false + name: 渡辺 梨加 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/f8266b7cf28d00bbf85c8d708d737948f58480aa9e212cabad8809a4f84989dd.jpg' + priority: 10200 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/21f2fc1e7519e746f215b9815680c3f9866a531cf9e1cc9e48286660126688c5.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:12:46Z' + - id: 21 + is_letter_destination: false + name: 渡邉 理佐 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/3ac51ba17c572e058a2e38491e222c67c03f7ff3c8ec399c39b3add0fdc32b56.jpg' + priority: 10100 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/939a1b239fbae269e170de6b2c2a54f7235fbe84dbec398fd66a3379b0294578.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:13:19Z' + - id: 44 + is_letter_destination: false + name: 井上 梨名 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/2ff101bba7e725bcdccced9260e73a99cd823e171819df5aba79e64f6cd38f9a.jpg' + priority: 9900 + state: open + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/4644bb81cb513cd1a8252520997ff76269c8d7d9d5358a3fa3d5f36478ae765a.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:13:48Z' + - id: 45 + is_letter_destination: false + name: 関 有美子 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/d9e09a66e50362763d8c5d7ac2995648c855e5a1e98de416ef49f302779f15dc.jpg' + priority: 9800 + state: open + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/1c13656ae9c843a71f8dbe8c3f9b47d73a38a064a8b47bad36a5434ec9a246d0.jpg' + trial_days: 0 + updated_at: '2020-05-11T04:09:46Z' + - id: 46 + is_letter_destination: false + name: 武元 唯衣 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/4cab486fd4253772698604ee8336420eeff2f289d392385444a3b89857791236.jpg' + priority: 9700 + state: open + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/30d02380c996ca59c60e11c62b101d39b4d345f6479f7cdb3e4dcbde4df1c345.jpg' + trial_days: 0 + updated_at: '2020-05-11T12:03:59Z' + - id: 47 + is_letter_destination: false + name: 田村 保乃 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/26c63381681700c7fb89dc93e37937c4d1801779c65565a79fd4c988358ebfde.jpg' + priority: 9600 + state: open + subscription: + auto_renewing: false + end_at: '2020-07-01T20:38:35Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/8523dad75fae61229e0196d99ec1154f14abc7a5f1a8daa28bcaa64fb83cde2c.jpg' + trial_days: 0 + updated_at: '2020-01-24T05:38:25Z' + - id: 48 + is_letter_destination: false + name: 藤吉 夏鈴 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/da8a1bec19fca3c33b4aada617a9ee3f401f60fcbc3a6f3413388a58f54fd6b4.jpg' + priority: 9500 + state: open + subscription: + auto_renewing: true + end_at: '2020-07-12T20:21:03Z' + start_at: '2020-06-12T20:21:03Z' + type: paid + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/df64366fccf97587de462766dcd444dfdbae1435a5f96e016c7a8824729bced0.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:14:18Z' + - id: 49 + is_letter_destination: false + name: 松田 里奈 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/4ca98352059bed6a5408b021ab52207e0c3ff0a0e9a6d2292ef78859700828dd.jpg' + priority: 9400 + state: open + subscription: + auto_renewing: false + end_at: '2020-06-22T04:49:06Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/3e1764e6af29153e716ae5b8ad01d8558e72cddea4d28fcf45a6e99e6860128c.jpg' + trial_days: 0 + unread_count: 2 + updated_at: '2020-05-11T04:14:39Z' + - id: 50 + is_letter_destination: false + name: 松平 璃子 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/1b3933d634ff73e1847daa119b7261fd3601f9c0184f0ee4ac42ccd08641cfc6.jpg' + priority: 9300 + state: open + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/010e14b7f5d4d161607bc0adaeddaab8efdeafcf759d2a7d8c4b7546eb6882d7.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:14:54Z' + - id: 51 + is_letter_destination: false + name: 森田 ひかる + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/baace2ffa3d7a8559cd1b40e671908d82721b5b903e4a22a9cd4c4ce3ba50f4f.jpg' + priority: 9200 + state: open + subscription: + auto_renewing: false + end_at: '2020-06-22T04:48:44Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/8c6fac9c337183971fa4bd758c1e857fab27d5e52c08550c96eb86d0b90410e5.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:15:33Z' + - id: 52 + is_letter_destination: false + name: 山﨑 天 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/2b740a578ccf83197386832fdbf347fa2486be51c006c9394c409b8489748902.jpg' + priority: 9100 + state: open + tags: + - keyakizaka46-2 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/c61d2807c418217d9126edddb674575d67e99afd32b4e983eabc2145545a6dbd.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:16:09Z' + - id: 2 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-04-13T03:00:14Z' + - id: 22 + is_letter_destination: false + name: 潮 紗理菜 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/e9ef791c2bda20bce8737387ac887c2ffb5d731345b1799979ce89009fdf6ff8.jpg' + priority: 2800 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/0e957b9efb900a059a072c4af9ef7b1a7bdf062db144311f629492102eec8feb.jpg' + trial_days: 0 + updated_at: '2020-05-11T04:05:07Z' + - id: 23 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2019-08-31T03:01:23Z' + - id: 24 + is_letter_destination: false + name: 影山 優佳 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/50dfd3e37ad1f56f7dae709c9134177fb7efbfc168e01cdf10bf87d1b2632819.jpg' + priority: 2400 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/565586b716a57f7439d999e3a514859f15b405d62ced897572e93b583c967e11.jpg' + trial_days: 0 + updated_at: '2020-05-11T03:58:59Z' + - id: 25 + is_letter_destination: false + name: 加藤 史帆 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/a73ad73d44e4d3508efe4eb7ffeb99ae1fe86495d1d3281d12f88c1295b68526.jpg' + priority: 2300 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/41e8635bd14524bd42c0c9fcd27713a95fd420148b49ffceced8a078c191d60c.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:36:58Z' + - id: 26 + is_letter_destination: false + name: 齊藤 京子 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/a2ad7536006de73bd284ff7fe925fe3d834e6a5affeb1ca0b4f1b33ac481c298.jpg' + priority: 2000 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/ba300f22ecc1cf3c67e23ebe3ffa24e93d56f8d1ab62bbf7a7330e03c42cafec.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:37:23Z' + - id: 27 + is_letter_destination: false + name: 佐々木 久美 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/c7242708612a57da1a1755e320552e03814ad830cd499b90bde50e1bfde55911.jpg' + priority: 1800 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/d3dfb77096b5105b6493cf95a74bc4dd5ef456bb91fc94836b0d5bb5736b223f.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:37:42Z' + - id: 28 + is_letter_destination: false + name: 佐々木 美玲 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/3cb56bdfdfd3af88119cebf7b607111144a4ff3d335982bf8cf4b887cf83efbd.jpg' + priority: 1700 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/b49b1d8516f23a2a042665e142639397f97d206314ab8f2a4a07ca1ee0b8acc0.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:38:04Z' + - id: 29 + is_letter_destination: false + name: 高瀬 愛奈 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/459e31c7548e03b3447f6ae069ce014dd1144856ebeca80f5979a91dad42d06d.jpg' + priority: 1200 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/6d6d5a4833c0dc2a4801ecafb8ea3d4c58adb72afadb4dc5fd28f1987a6cd08c.jpg' + trial_days: 0 + updated_at: '2020-05-11T03:58:32Z' + - id: 30 + is_letter_destination: false + name: 高本 彩花 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/1cb26f5f396665668aed2661a1237df77b835f97a9918f408050bec59ca56da9.jpg' + priority: 1100 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/c47d4c3397c81f36bb2cd1447fa1e1ad8a7063771b9a6557e63e8c622145abd7.jpg' + trial_days: 0 + updated_at: '2020-05-11T03:57:48Z' + - id: 32 + is_letter_destination: false + name: 東村 芽依 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/b0f0a12c966667bae8467eddb8371b561a927e13b7fcd755be212a39ea3decf5.jpg' + priority: 600 + state: open + tags: + - hinatazaka46-1 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/81932a314cd209293a30fa76221f7e29ecba4d89a2d79d2087af5039a20a1345.jpg' + trial_days: 0 + updated_at: '2020-05-11T03:47:39Z' + - id: 34 + is_letter_destination: false + name: 金村 美玖 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/ad01a1c1a106e4a69e6c15178c1f997794f25e4c5dcd26be44acfd393fddb1ff.jpg' + priority: 90 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/5af3600695af8512411916c3de479f8e7bd2caa4b56d2241a2f733679f779364.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:39:09Z' + - id: 35 + is_letter_destination: false + name: 河田 陽菜 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/350278c7341c888241f6c3b43415b1f491accd78be8a2a6822f74bc54eadf669.jpg' + priority: 80 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/f937e20cd5941aeae26ab599b47ae1d77bcf4bfbff784965db25365f278f0163.jpg' + trial_days: 0 + updated_at: '2020-05-11T03:59:31Z' + - id: 36 + is_letter_destination: false + name: 小坂 菜緒 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/481dc0a3248fb727c48641e31f59ede1aca09f8e837c37c602950c35f9471c66.jpg' + priority: 70 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/bed92230adb1d4f60a6f2e9b78ef2a0c99b0da5fe7eb09d8a5e35a3dce676704.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:39:47Z' + - id: 37 + is_letter_destination: false + name: 富田 鈴花 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/bfe29aaaf68bfac7f3c342adc5b4e20722ae4244140acc5ce46934ada77338fb.jpg' + priority: 60 + state: open + subscription: + auto_renewing: false + end_at: '2020-06-18T03:12:45Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/0c317396d99d464a9276c8cc0cf6f0ab332ecd932ee8ea4e75e7be49e49573cc.jpg' + trial_days: 0 + unread_count: 59 + updated_at: '2020-05-28T08:47:08Z' + - id: 38 + is_letter_destination: false + name: 丹生 明里 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/46be4a6a38419daf59562749888c70885e6a1b578b1e94ea739e379849b3c9db.jpg' + priority: 50 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/c7aca5fba0fc5ca5dd62ffda88c417642aa328efb52858fd42999602fb514778.jpg' + trial_days: 0 + updated_at: '2020-05-11T04:00:06Z' + - id: 39 + is_letter_destination: false + name: 濱岸 ひより + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/a4170438d74cd2de56f72433c3e9964e9655fd2bca6efee5e2f1b45227cd4e44.jpg' + priority: 40 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/3c193f799f93de0eaa28912a59b9c40b053b82d89f8476b172c75d68e13fa267.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:40:38Z' + - id: 40 + is_letter_destination: false + name: 松田 好花 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/92d7082ce1a5b58fb30e85605513734ab5082e7062de8a05e481fd2e22fcc909.jpg' + priority: 30 + state: open + subscription: + auto_renewing: true + end_at: '2020-06-14T02:10:53Z' + start_at: '2020-06-14T02:10:52Z' + type: paid + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/c70ebeef81990a06d5f4588652b97f087e36f1e60839a6c10868b122a915bcac.jpg' + trial_days: 0 + unread_count: 35 + updated_at: '2020-05-11T04:04:04Z' + - id: 41 + is_letter_destination: false + name: 宮田 愛萌 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/f38485a55a553aa53abc5e2aed6a8fb4b43345006b6a26adc29a5b34918619d8.jpg' + priority: 20 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/da82455b2a05a1a89521cc72cc9960b4df6ba3d280ddf5099531b7387f14f815.jpg' + trial_days: 0 + updated_at: '2020-02-04T08:41:14Z' + - id: 42 + is_letter_destination: false + name: 渡邉 美穂 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/3b160d0bd1601c0f55ebf944a579efb2684b6db77dec0981f492be95f813800b.jpg' + priority: 10 + state: open + tags: + - hinatazaka46-2 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/b943ebc06a063ad2cc02723bb9fa6a8448d31b49213906e30429055eeae7203c.jpg' + trial_days: 0 + updated_at: '2020-05-11T04:46:38Z' + - id: 53 + is_letter_destination: false + name: 上村 ひなの + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/9aca4118fedc81d22e3765c3c1bf55e149c858ee815c19ae165d7ec847b9852f.jpg' + priority: 9 + state: open + subscription: + auto_renewing: true + end_at: '2020-07-12T04:06:44Z' + start_at: '2020-06-12T04:06:44Z' + type: paid + tags: + - hinatazaka46-3 + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/9745eaf3433dddaac0e248002c7fecf20b6fd305e3f88126ade55125291a6dab.jpg' + trial_days: 0 + unread_count: 9 + updated_at: '2020-05-11T04:01:02Z' + - id: 33 + is_letter_destination: false + name: 欅坂46 + priority: 1 + state: open + subscription: + auto_renewing: false + start_at: '2017-09-27T18:39:05Z' + type: free + tags: + - keyakizaka46-announcements + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/77d1e0b14daf385f98e4905446ddae6b6658d10379aee99a0f8a15a5d5b0bdd6.jpg' + updated_at: '2019-03-26T22:19:38Z' + - id: 43 + is_letter_destination: false + name: 日向坂46 + priority: 0 + state: open + subscription: + auto_renewing: false + start_at: '2019-04-01T14:47:59Z' + type: free + tags: + - hinatazaka46-announcements + - hinatazaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/6bdfb1e8d59baf89e51ac14e9c579d1829e5087e89360ec07aa20c725ac01272.jpg' + updated_at: '2019-03-26T22:20:09Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + /v2/tags: + get: + summary: /v2/tags + operationId: get-v2-tags + description: タグ一覧の取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: array + uniqueItems: false + items: + type: object + properties: + meta: + type: object + required: + - color + properties: + color: + type: string + enum: + - '#82D87E' + - '#5BBEE5' + dimension: + type: string + enum: + - company + name: + type: string + enum: + - 欅坂46 + - 欅坂46 二期生 + - 日向坂46 + - 日向坂46 二期生 + - 日向坂46 三期生 + - 欅坂46 お知らせ + - 日向坂46 お知らせ + priority: + type: integer + minimum: 0 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + uuid: + type: string + enum: + - keyakizaka46.com + - keyakizaka46-1 + - keyakizaka46-2 + - hinatazaka46.com + - hinatazaka46-1 + - hinatazaka46-2 + - hinatazaka46-3 + - keyakizaka46-announcements + - hinatazaka46-announcements + required: + - meta + - name + - priority + - updated_at + - uuid + examples: + example: + value: + - meta: + color: '#82D87E' + dimension: company + name: 欅坂46 + priority: 21 + updated_at: '2020-06-09T18:12:54Z' + uuid: keyakizaka46.com + - meta: + color: '#82D87E' + name: 欅坂46 + priority: 20 + updated_at: '2020-06-09T18:12:54Z' + uuid: keyakizaka46-1 + - meta: + color: '#82D87E' + name: 欅坂46 二期生 + priority: 15 + updated_at: '2020-06-09T18:12:54Z' + uuid: keyakizaka46-2 + - meta: + color: '#5BBEE5' + dimension: company + name: 日向坂46 + priority: 11 + updated_at: '2020-06-09T18:12:54Z' + uuid: hinatazaka46.com + - meta: + color: '#5BBEE5' + name: 日向坂46 + priority: 10 + updated_at: '2020-06-09T18:12:54Z' + uuid: hinatazaka46-1 + - meta: + color: '#5BBEE5' + name: 日向坂46 二期生 + priority: 5 + updated_at: '2020-06-09T18:12:54Z' + uuid: hinatazaka46-2 + - meta: + color: '#5BBEE5' + name: 日向坂46 三期生 + priority: 4 + updated_at: '2020-06-09T18:12:54Z' + uuid: hinatazaka46-3 + - meta: + color: '#82D87E' + name: 欅坂46 お知らせ + priority: 1 + updated_at: '2020-06-09T18:12:54Z' + uuid: keyakizaka46-announcements + - meta: + color: '#5BBEE5' + name: 日向坂46 お知らせ + priority: 0 + updated_at: '2020-06-09T18:12:54Z' + uuid: hinatazaka46-announcements + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + '/v2/groups/{id}': + parameters: + - schema: + type: string + name: id + in: path + required: true + get: + summary: '/v2/groups/{id}' + operationId: get-v2-group-id + description: 特定IDのメンバー取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + id: + type: integer + minimum: 1 + is_letter_destination: + type: boolean + name: + $ref: '#/components/schemas/MembersEnum' + phone_image: + type: string + format: uri + priority: + type: integer + minimum: 0 + state: + type: string + enum: + - open + - closed + tags: + type: array + items: + $ref: '#/components/schemas/TagsEnum' + thumbnail: + type: string + format: uri + trial_days: + type: integer + minimum: 0 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + subscription: + type: object + properties: + auto_renewing: + type: boolean + end_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + start_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + type: + type: string + enum: + - paid + - nopaid + - free + examples: + notpaid: + value: + id: 1 + is_letter_destination: false + name: 石森 虹花 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/f34f2d429909b3081b9649f61ac6a853bcff66b38f2e57ff790d33735c150a41.jpg' + priority: 13200 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/c5457b3984a1d25809b897f0ec1f25bde61905b7b34d5aa06fde987527d1cbd0.jpg' + trial_days: 0 + updated_at: '2020-05-27T12:07:14Z' + paid: + value: + id: 4 + is_letter_destination: false + name: 上村 莉菜 + phone_image: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/phoneimage/080bf573c998850d153d0a701ede6319a216602eadac420210c811c858fa057c.jpg' + priority: 12900 + state: open + subscription: + auto_renewing: false + end_at: '2020-06-19T19:17:30Z' + start_at: '2020-06-09T18:19:48Z' + type: paid + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/public/legacy-K/thumb/fd95235814086fc9491ce00942a2bb8fb40f19af57563ea136209fca9c3f749f.jpg' + trial_days: 0 + unread_count: 1 + updated_at: '2020-05-27T12:04:04Z' + graduated: + value: + id: 6 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-03-26T03:41:38Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + '/v2/groups/{id}/timeline': + parameters: + - schema: + type: string + name: id + in: path + required: true + get: + summary: '/v2/groups/{id}/timeline?created_from=%Y-%m-%dT%H:%M:%SZ&updated_from=%Y-%m-%dT%H:%M:%SZ&count=num&order=asc' + operationId: get-v2-group-id-timeline + description: 特定IDのメンバー取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + - schema: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + in: query + name: created_from + required: true + - schema: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + in: query + name: updated_from + required: true + - schema: + type: integer + minimum: 0 + in: query + name: count + required: true + - schema: + type: string + enum: + - asc + - desc + in: query + name: order + required: true + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + anyOf: + - $ref: './components/schemas/Timeline.yaml' + - $ref: './components/schemas/TimelineLetter.yaml' + examples: + text: + value: + comments: [] + letters: [] + messages: + - group_id: 12 + id: 158213 + is_favorite: false + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:10:07Z' + state: published + text: "こんにちは☀︎\r\n昨日からサントリーさんの緑茶「伊右衛門」のWebCMにほのすと出演させて頂いていますが‪\uD83C\uDF75‬悪魔のおにぎりと一緒に楽しんでくださいな☺︎" + type: text + updated_at: '2020-04-14T02:11:27Z' + queried_at: '2020-06-14T05:07:09Z' + picture: + value: + comments: [] + letters: [] + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg?Expires=1592113752&Signature=PIjm0GhyD1yYUR~4XIWZZxLY8fi9BexKbY0Rd37SNxdgK7vf5u5~QKKiHUGiQ66iOAW01G1Vb85DKlJAoPFAfyMGEE0wVtpCVTKE84J4c3dKZ35u4-aZN3a5Vh8q36iu5opkUEwj3mW2Lg8~9F2gqkAUKYL086~v6EdJ3zaV~LkE19Br3POhBcp3SQ8qekEraFxivTgHrc7KGWDkrFU~v~~tKyw4KUH02K37ryRfMOdUzzvOFglHn~EZWoHcEpjFMUgmUcajBCGYKGwH3Jj9Q-mVeUyI9~Sft4afX4QljuXTBEDfZIOQRycxB9Pwxc-T~fLF7nrByAsWBCCSq5uXvQ__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157690 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T08:53:33Z' + state: published + text: 米粉蒸しパンを作ってみたら大きく膨れすぎました(笑) + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg-00001.jpg?Expires=1592113752&Signature=P~Vsv2OE1hFWF5FVMmWcTe3nclxOFjhHn0gQvKHpFMIjk6YQUZn-wwuk3wNtkLGqi9QrbRAGa9tshoQmtYMVq11BWlAwVbRhmEBFc3pMx~CJONpPwuKKUBq13wQP9tdbnGOiRoJjezs4cJMvVwP0OmXLBZ~cCd6k0PCkCW59lKFjwgTHntLD8mJwqGuAK9JVRXb5p5raly6QbYo4V7G-M6Q7-En90ZM0bJz~EmUBQl3TNhdQkTWw-Wc0f3BO90xA~0bU6y9CA14NwVRVzYptnUPKZQzidzYvez~TqI0-KlqVVkFk4-CRz6GyIIWDFFyzFahLeLa9nO9kNPyvwuOEdA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 170 + thumbnail_width: 240 + type: picture + updated_at: '2020-04-11T08:54:55Z' + queried_at: '2020-06-14T05:07:09Z' + video: + value: + comments: [] + letters: [] + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4?Expires=1592113752&Signature=wHrXBz1gsCG2FJdfPdTSA713bL8r6kHRgwPDMBrnL6HBzRTiD7CVOct-H3-zVBBwEOMODRElw92LrymcFJjArSzVG5xZPb2Y1GgPrhaau5PnaVUmQDxqPxRkczczH~YurlnzHB9hDWEXv08Jn0CPFGNjgWvH18T60h3hkbuqM4v0zqJxSaTLBKXvsK6BA-PJFPMlo4BpBisxScWeH0MPB9L6pA0xvrezKTuJwQmt7X64PGSiWhlnlkezoHmC5YaEfdmfwaXl46y~k24Dg2yrXaz7rkNmDFzLuwWpaEiMH931fchJtytrw8moFM51Olqk2EaRXDEsMooybTkaNFqljg__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 158214 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:15:07Z' + state: published + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4-00001.jpg?Expires=1592113752&Signature=cd98xaVmPSNhj7Giez-M5-Kp2uVhblLZNO0IqdUAARcxdvH8fCT~7Pc8qGzkU7jinefDlmxKTkRQ7oUAjMxZBmwuCv9eTELpsexgeyDYx~LqJUOdHYMF7QLYRf1DHVmoHtkle9SACoqvuka0dFX3NBcE7Z5vrS7mDPYfZbzarKPvCHMQr-mnafatOcCiPEuhMvqhjY-gv4lgV4cqrPnxUftng3o~gLk8M~WC8~VnBwOAM-X39jAFUKk2hf41aVHqgCs8eApaPvrDwfIzFzsTktNqqkOSZUs8DPddrDs~ohSa8gFEu7d49JiubgbCZ53zwRS12EqfTEPcBPF44RJDIw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 240 + thumbnail_width: 320 + type: video + updated_at: '2020-04-14T02:16:26Z' + queried_at: '2020-06-14T05:07:09Z' + voice: + value: + comments: [] + letters: [] + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/245bf6fd021ec120835fc96ffddb446b9e6adfcf2a9c7d004351437c6b7c5fd7.mp4?Expires=1592113752&Signature=lwbG3C1mfQ13oWpHSL8xxaxAG6QTJGmsYdWIkFK3NFQQXPrerOmE1ySaVKVaNOg2eZv9RYpkNOi5xOTUHHm6NhdFvRfs3cogfRsoVNgEJAyLcob6pJKSAXTczoE-q~OOegjpp5n4RkMYi5xB9L5qsUCd6poqAbiIhAE5bbB2BeiAscJ5vUAqJpW9V6PiVSsmTdjE72de9nuG9Lol1GP0cJlh~OXNzBUuYAfMvKxYMOAOiaoFrOXrki9B4Z0OkdNihyZAMYMuMSNLP9RghVP-u9InVol4eaeexORDgjaaO8G7uSkA~PRfcd7m8tPWloVZduc8EeOmJwkL0~dm8q4wsw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157764 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T10:48:40Z' + state: published + type: voice + updated_at: '2020-04-11T10:50:03Z' + queried_at: '2020-06-14T05:07:09Z' + letter: + value: + comments: [] + letters: + - client_token: VI4PoKp9EeqI1wahea/0DFSOD6mqfRHqiNcGoXmv9Aw= + created_at: '2020-04-06T10:42:54Z' + file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg?Expires=1592113752&Signature=IN8Fb8mOYsoDQcMijdn4xn7PS92-oRbJerxOE7KaK6B7LWi-ejkM9GXZqWQxy13rB0hQH~dsewfFYa-K4OJd3sZZjt97fP0UJoYRFmlaslGfPRyDaxO8CXJvYfpug3RUUS9Hbx0tt-MWxkJqbWxRqihpvRW64XAt47nkOJkmaj-SHMJK3q6grJDYwej4XJQgtc6VIGl3-DKAIUH22l5ztohftkrrckIdj1xOBcvNBBG-gpXFYZGtdi3OsbG9vHjBppIXua5FowiCJ0Jk19IQo5ktlQBhtd96goSNsFNZzfsfJSeVyuXtil79Mb0I2AeZloXR8ni3bKXWLT~W1JW78w__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 1030494 + is_favorite: false + member_id: 12 + opened_at: '2020-04-07T03:57:08Z' + text: "はじめでレター送ります!" + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg-00001.jpg?Expires=1592113752&Signature=Dftz~blkdErkR16UetMcj1fB0Qpap9PoXFmXvnqDPq-qYqhkLe1qNVnO6HGPwCqrIhGZ95Vaw6jJxrQoDycQH8tYXJn9Vy3kT6DBSAp1pxr0lSF9Isx1NHLav0xIlxM8YC4e4BbqbW9AbtQPsiPp4XIIQ080TmSfkkRSX~IDyGoJVtIvHZIRkJ9fv7v-y-SV1knfLtmuLqLvd8Gkb~RP1qbwWXmznGm3XUDXTwcQy6bCKGi~3frgtX9QWv83VHtIiAkfO3eb47cvcQtSec4CBURZnBy7nbU9CZyBtBOSoukn5D9oHo1w352Jd6lb-7RB3a-CthbUQdKEhNdgWRQKjA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 480 + thumbnail_width: 320 + updated_at: '2020-04-07T03:57:08Z' + messages: [] + queried_at: '2020-06-14T05:07:09Z' + canceled: + value: + comments: [] + letters: [] + messages: + - group_id: 48 + id: 118504 + is_favorite: true + is_silent: false + member_id: 84 + published_at: '2019-06-24T04:50:31Z' + state: canceled + type: picture + updated_at: '2019-06-24T04:53:29Z' + queried_at: '2020-06-14T05:07:09Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー +components: + schemas: + MembersEnum: + enum: + - 石森 虹花 + - 上村 莉菜 + - 尾関 梨香 + - 小池 美波 + - 小林 由依 + - 齋藤 冬優花 + - 佐藤 詩織 + - 菅井 友香 + - 土生 瑞穂 + - 原田 葵 + - 守屋 茜 + - 渡辺 梨加 + - 渡邉 理佐 + - 井上 梨名 + - 関 有美子 + - 武元 唯衣 + - 田村 保乃 + - 藤吉 夏鈴 + - 松田 里奈 + - 松平 璃子 + - 森田 ひかる + - 山﨑 天 + - 井口 眞緒 + - 潮 紗理菜 + - 影山 優佳 + - 加藤 史帆 + - 齊藤 京子 + - 佐々木 久美 + - 佐々木 美玲 + - 高瀬 愛奈 + - 高本 彩花 + - 東村 芽依 + - 金村 美玖 + - 河田 陽菜 + - 小坂 菜緒 + - 富田 鈴花 + - 丹生 明里 + - 濱岸 ひより + - 松田 好花 + - 宮田 愛萌 + - 渡邉 美穂 + - 上村 ひなの + - 欅坂46 + - 日向坂46 + - '' + TagsEnum: + enum: + - - keyakizaka46-1 + - keyakizaka46.com + - - keyakizaka46-2 + - keyakizaka46.com + - - hinatazaka46-1 + - hinatazaka46.com + - - hinatazaka46-2 + - hinatazaka46.com + - - hinatazaka46-3 + - hinatazaka46.com diff --git a/api/components/schemas/RequestHeaderAccept-Encoding.yaml b/api/components/schemas/RequestHeaderAccept-Encoding.yaml new file mode 100644 index 0000000..c0ac405 --- /dev/null +++ b/api/components/schemas/RequestHeaderAccept-Encoding.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: gzip +in: header +name: Accept-Encoding +required: true diff --git a/api/components/schemas/RequestHeaderAccept-Language.yaml b/api/components/schemas/RequestHeaderAccept-Language.yaml new file mode 100644 index 0000000..e76ca29 --- /dev/null +++ b/api/components/schemas/RequestHeaderAccept-Language.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: ja-JP +in: header +name: Accept-Language +required: true diff --git a/api/components/schemas/RequestHeaderAccept.yaml b/api/components/schemas/RequestHeaderAccept.yaml new file mode 100644 index 0000000..2f41e62 --- /dev/null +++ b/api/components/schemas/RequestHeaderAccept.yaml @@ -0,0 +1,7 @@ +schema: + type: string + default: application/json +in: header +name: Accept +required: true +description: '' diff --git a/api/components/schemas/RequestHeaderAuthorization.yaml b/api/components/schemas/RequestHeaderAuthorization.yaml new file mode 100644 index 0000000..34d2b88 --- /dev/null +++ b/api/components/schemas/RequestHeaderAuthorization.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIwOTU1MDUsInN1YiI6IjEzMDIxMSJ9.TAesJMXAgS8fopvSv4Rbxb3N8HGUuu7p4Y8d7xToNrQ +in: header +name: Authorization +required: true diff --git a/api/components/schemas/RequestHeaderConnection.yaml b/api/components/schemas/RequestHeaderConnection.yaml new file mode 100644 index 0000000..28aa31a --- /dev/null +++ b/api/components/schemas/RequestHeaderConnection.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: Keep-Alive +in: header +name: Connection +required: true diff --git a/api/components/schemas/RequestHeaderContent-Length.yaml b/api/components/schemas/RequestHeaderContent-Length.yaml new file mode 100644 index 0000000..0b5be6b --- /dev/null +++ b/api/components/schemas/RequestHeaderContent-Length.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: '173' +in: header +name: Content-Length +required: true diff --git a/api/components/schemas/RequestHeaderContent-type.yaml b/api/components/schemas/RequestHeaderContent-type.yaml new file mode 100644 index 0000000..bf7ada4 --- /dev/null +++ b/api/components/schemas/RequestHeaderContent-type.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: application/json +in: header +name: Content-type +required: true diff --git a/api/components/schemas/RequestHeaderHost.yaml b/api/components/schemas/RequestHeaderHost.yaml new file mode 100644 index 0000000..719394b --- /dev/null +++ b/api/components/schemas/RequestHeaderHost.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: api.kh.glastonr.net +in: header +name: Host +required: true diff --git a/api/components/schemas/RequestHeaderTE.yaml b/api/components/schemas/RequestHeaderTE.yaml new file mode 100644 index 0000000..b0aa263 --- /dev/null +++ b/api/components/schemas/RequestHeaderTE.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: 'gzip, deflate; q=0.5' +in: header +name: TE +required: true diff --git a/api/components/schemas/RequestHeaderUser-Agent.yaml b/api/components/schemas/RequestHeaderUser-Agent.yaml new file mode 100644 index 0000000..98de2a3 --- /dev/null +++ b/api/components/schemas/RequestHeaderUser-Agent.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: Dalvik/2.1.0 (Linux; U; Android 6.0; Samsung Galaxy S7 for keyaki messages Build/MRA58K) +in: header +name: User-Agent +required: true diff --git a/api/components/schemas/RequestHeaderX-Talk-App-ID.yaml b/api/components/schemas/RequestHeaderX-Talk-App-ID.yaml new file mode 100644 index 0000000..1afe1b7 --- /dev/null +++ b/api/components/schemas/RequestHeaderX-Talk-App-ID.yaml @@ -0,0 +1,6 @@ +schema: + type: string + default: jp.co.sonymusic.communication.keyakizaka 2.0 +in: header +name: X-Talk-App-ID +required: true diff --git a/api/components/schemas/ResponseHeaderCache-Control.yaml b/api/components/schemas/ResponseHeaderCache-Control.yaml new file mode 100644 index 0000000..e673955 --- /dev/null +++ b/api/components/schemas/ResponseHeaderCache-Control.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: 'private, no-cache, no-store, must-revalidate' +required: true diff --git a/api/components/schemas/ResponseHeaderConnection.yaml b/api/components/schemas/ResponseHeaderConnection.yaml new file mode 100644 index 0000000..a315bb6 --- /dev/null +++ b/api/components/schemas/ResponseHeaderConnection.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: keep-alive +required: true diff --git a/api/components/schemas/ResponseHeaderContent-Length.yaml b/api/components/schemas/ResponseHeaderContent-Length.yaml new file mode 100644 index 0000000..1fc2c43 --- /dev/null +++ b/api/components/schemas/ResponseHeaderContent-Length.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: 56 +required: true diff --git a/api/components/schemas/ResponseHeaderContent-Type.yaml b/api/components/schemas/ResponseHeaderContent-Type.yaml new file mode 100644 index 0000000..d63ad39 --- /dev/null +++ b/api/components/schemas/ResponseHeaderContent-Type.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: application/json; charset=UTF-8 +required: true diff --git a/api/components/schemas/ResponseHeaderDate.yaml b/api/components/schemas/ResponseHeaderDate.yaml new file mode 100644 index 0000000..d5e0e28 --- /dev/null +++ b/api/components/schemas/ResponseHeaderDate.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: 'Sat, 13 Jun 2020 23:44:32 GMT' +required: true diff --git a/api/components/schemas/ResponseHeaderPragma.yaml b/api/components/schemas/ResponseHeaderPragma.yaml new file mode 100644 index 0000000..4738896 --- /dev/null +++ b/api/components/schemas/ResponseHeaderPragma.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: no-cache +required: true diff --git a/api/components/schemas/ResponseHeaderVary.yaml b/api/components/schemas/ResponseHeaderVary.yaml new file mode 100644 index 0000000..9aa13ea --- /dev/null +++ b/api/components/schemas/ResponseHeaderVary.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: Accept-Encoding +required: true diff --git a/api/components/schemas/ResponseHeaderX-Request-Id.yaml b/api/components/schemas/ResponseHeaderX-Request-Id.yaml new file mode 100644 index 0000000..6c8f515 --- /dev/null +++ b/api/components/schemas/ResponseHeaderX-Request-Id.yaml @@ -0,0 +1,4 @@ +schema: + type: string + default: brim9o0c7pom6kc9lpp0 +required: true diff --git a/api/components/schemas/Timeline.yaml b/api/components/schemas/Timeline.yaml new file mode 100644 index 0000000..1271bc4 --- /dev/null +++ b/api/components/schemas/Timeline.yaml @@ -0,0 +1,25 @@ +type: object +properties: + comments: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + letters: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + messages: + type: array + items: + - $ref: './TimelineTextObject.yaml' + - $ref: './TimelinePictureObject.yaml' + - $ref: './TimelineVideoObject.yaml' + - $ref: './TimelineVoiceObject.yaml' + - $ref: './TimelineCanceledObject.yaml' + queried_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineCanceledObject.yaml b/api/components/schemas/TimelineCanceledObject.yaml new file mode 100644 index 0000000..0e6c76f --- /dev/null +++ b/api/components/schemas/TimelineCanceledObject.yaml @@ -0,0 +1,40 @@ +type: object +properties: + group_id: + type: integer + minimum: 0 + enum: + - 12 + id: + type: integer + minimum: 0 + is_favorite: + type: boolean + enum: + - false + is_silent: + type: boolean + enum: + - false + member_id: + type: integer + minimum: 0 + enum: + - 12 + published_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - canceled + type: + type: string + enum: + - text + - picture + - video + - voice + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineLetter.yaml b/api/components/schemas/TimelineLetter.yaml new file mode 100644 index 0000000..6c3e201 --- /dev/null +++ b/api/components/schemas/TimelineLetter.yaml @@ -0,0 +1,64 @@ +type: object +properties: + comments: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + letters: + type: array + items: + type: object + properties: + client_token: + type: string + created_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + file: + type: string + format: uri + group_id: + type: integer + minimum: 0 + id: + type: integer + minimum: 0 + is_favorite: + type: bool + enum: + - false + member_id: + type: integer + minimum: 0 + opened_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + text: + type: string + thumbnail: + type: string + format: uri + thumbnail_height: + type: integer + minimum: 0 + enum: + - 480 + thumbnail_width: + type: integer + minimum: 0 + enum: + - 320 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + messages: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + queried_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelinePicture.yaml b/api/components/schemas/TimelinePicture.yaml new file mode 100644 index 0000000..7129cd3 --- /dev/null +++ b/api/components/schemas/TimelinePicture.yaml @@ -0,0 +1,21 @@ +type: object +properties: + comments: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + letters: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + messages: + type: array + allOf: + - $ref: './TimelinePictureObject.yaml' + queried_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelinePictureObject.yaml b/api/components/schemas/TimelinePictureObject.yaml new file mode 100644 index 0000000..eb80556 --- /dev/null +++ b/api/components/schemas/TimelinePictureObject.yaml @@ -0,0 +1,59 @@ +type: object +properties: + file: + type: string + enum: + - 'https://raw.githubusercontent.com/proshunsuke/colmsg-files/master/164134_1_20200507212854.jpg?token=AAYAVX7NYPTK7V4NLYEN7PS65JIKY' + group_id: + type: integer + minimum: 0 + enum: + - 12 + id: + type: integer + minimum: 0 + is_favorite: + type: boolean + enum: + - false + is_silent: + type: boolean + enum: + - false + member_id: + type: integer + minimum: 0 + enum: + - 12 + published_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - published + - notpublished + text: + type: string + enum: + - 画像のテキスト + thumbnail: + type: string + format: uri + thumbnail_height: + type: integer + minimum: 0 + enum: + - 170 + thumbnail_width: + type: integer + minimum: 0 + enum: + - 240 + type: + type: string + enum: + - picture + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineText.yaml b/api/components/schemas/TimelineText.yaml new file mode 100644 index 0000000..a2237af --- /dev/null +++ b/api/components/schemas/TimelineText.yaml @@ -0,0 +1,21 @@ +type: object +properties: + comments: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + letters: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + messages: + type: array + allOf: + - $ref: './TimelineTextObject.yaml' + queried_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineTextObject.yaml b/api/components/schemas/TimelineTextObject.yaml new file mode 100644 index 0000000..6bf5c0b --- /dev/null +++ b/api/components/schemas/TimelineTextObject.yaml @@ -0,0 +1,42 @@ +type: object +properties: + group_id: + type: integer + minimum: 0 + enum: + - 12 + id: + type: integer + minimum: 0 + is_favorite: + type: boolean + enum: + - false + is_silent: + type: boolean + enum: + - false + member_id: + type: integer + minimum: 0 + enum: + - 12 + published_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - published + - notpublished + text: + type: string + enum: + - "こんにちは☀︎\r\n昨日からサントリーさんの緑茶「伊右衛門」のWebCMにほのすと出演させて頂いていますが‪\uD83C\uDF75‬悪魔のおにぎりと一緒に楽しんでくださいな☺︎" + type: + type: string + enum: + - text + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineVideo.yaml b/api/components/schemas/TimelineVideo.yaml new file mode 100644 index 0000000..a1028ac --- /dev/null +++ b/api/components/schemas/TimelineVideo.yaml @@ -0,0 +1,21 @@ +type: object +properties: + comments: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + letters: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + messages: + type: array + allOf: + - $ref: './TimelineVideoObject.yaml' + queried_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineVideoObject.yaml b/api/components/schemas/TimelineVideoObject.yaml new file mode 100644 index 0000000..ef7b1af --- /dev/null +++ b/api/components/schemas/TimelineVideoObject.yaml @@ -0,0 +1,55 @@ +type: object +properties: + file: + type: string + enum: + - 'https://raw.githubusercontent.com/proshunsuke/colmsg-files/master/160593_2_20200424152535.mp4?token=AAYAVX7DNSCLRHLVEZ7FHHC65JKOQ' + group_id: + type: integer + minimum: 0 + enum: + - 12 + id: + type: integer + minimum: 0 + is_favorite: + type: boolean + enum: + - false + is_silent: + type: boolean + enum: + - false + member_id: + type: integer + minimum: 0 + enum: + - 12 + published_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - published + - notpublished + thumbnail: + type: string + format: uri + thumbnail_height: + type: integer + minimum: 0 + enum: + - 170 + thumbnail_width: + type: integer + minimum: 0 + enum: + - 240 + type: + type: string + enum: + - video + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineVoice.yaml b/api/components/schemas/TimelineVoice.yaml new file mode 100644 index 0000000..6c4d6fc --- /dev/null +++ b/api/components/schemas/TimelineVoice.yaml @@ -0,0 +1,21 @@ +type: object +properties: + comments: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + letters: + type: array + items: + type: integer # 空配列以外見たことがないので実際の中身は分からない + minItems: 0 + maxItems: 0 + messages: + type: array + allOf: + - $ref: './TimelineVoiceObject.yaml' + queried_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' diff --git a/api/components/schemas/TimelineVoiceObject.yaml b/api/components/schemas/TimelineVoiceObject.yaml new file mode 100644 index 0000000..47da042 --- /dev/null +++ b/api/components/schemas/TimelineVoiceObject.yaml @@ -0,0 +1,42 @@ +type: object +properties: + file: + type: string + enum: + - 'https://raw.githubusercontent.com/proshunsuke/colmsg-files/master/177043_3_20200609214710.mp4?token=AAYAVXZVJ47VXKAXYHB36W265JLLK' + group_id: + type: integer + minimum: 0 + enum: + - 12 + id: + type: integer + minimum: 0 + is_favorite: + type: boolean + enum: + - false + is_silent: + type: boolean + enum: + - false + member_id: + type: integer + minimum: 0 + enum: + - 12 + published_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - published + - notpublished + type: + type: string + enum: + - voice + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' From 935187df3c17f042646125546be8c9fe5efa2d17 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sun, 6 Mar 2022 04:00:31 +0900 Subject: [PATCH 03/18] create docker-compose for mock server --- docker-compose.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..49eca71 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,34 @@ +version: '3.9' + +services: + swagger-editor-kh: + image: swaggerapi/swagger-editor + container_name: "swagger-editor-kh" + ports: + - "8001:8080" + volumes: + - ./api/api-kh-glastonr-net.yaml:/api-kh-glastonr-net.yaml + - ./api/components:/components + environment: + SWAGGER_FILE: /api-kh-glastonr-net.yaml + + swagger-ui-kh: + image: swaggerapi/swagger-ui + container_name: "swagger-ui-kh" + ports: + - "8002:8080" + volumes: + - ./api/api-kh-glastonr-net.yaml:/api-kh-glastonr-net.yaml + - ./api/components:/components + environment: + SWAGGER_JSON: /api-kh-glastonr-net.yaml + + swagger-api-kh: + image: stoplight/prism:3 + container_name: "swagger-api-kh" + ports: + - "8003:4010" + command: mock -h 0.0.0.0 /api-kh-glastonr-net.yaml + volumes: + - ./api/api-kh-glastonr-net.yaml:/api-kh-glastonr-net.yaml + - ./api/components:/components From 9359d16be1da3b220812966f6952bc1bb093104a Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sun, 6 Mar 2022 04:01:21 +0900 Subject: [PATCH 04/18] fix for mock server docker --- Makefile | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Makefile b/Makefile index e8bc873..9a8a510 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,11 @@ VERSION=`$(shell pwd)/target/release/colmsg -V | cut -b 8-` +CONTAINER_NAME=swagger-api-kh + +ifeq ($(shell uname),Linux) + OPEN=xdg-open +else + OPEN=open +endif release/x86_64-linux: cargo build --release @@ -11,3 +18,33 @@ release/x86_64-darwin: release/x86_64-win: cross build --release --target x86_64-pc-windows-gnu @cd target/x86_64-pc-windows-gnu/release/ && zip colmsg-v${VERSION}-x86_64-pc-windows-gnu.zip colmsg.exe + +server/kh: + docker-compose up swagger-api-kh + +stop/server/kh: + docker-compose stop swagger-api-kh + +restart/server/kh: + docker-compose restart swagger-api-kh + +start/ui-editor/kh: + docker-compose up -d swagger-editor-kh swagger-ui-kh + +stop/ui-editor/kh: + docker-compose stop swagger-editor-kh swagger-ui-kh + +restart/ui-editor/kh: + docker-compose restart swagger-editor-kh swagger-ui-kh + +open/editor/kh: + $(OPEN) http://localhost:8001/ + +open/ui/kh: + $(OPEN) http://localhost:8002/ + +down: + docker-compose down --rmi all --volumes --remove-orphans + +ssh: + docker exec -it $(CONTAINER_NAME) /bin/sh From 760ace4230d8bfa2c3619bde4aab45a6ca05b3f7 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sun, 6 Mar 2022 04:05:47 +0900 Subject: [PATCH 05/18] fix to be able to control whether the mock server returns values dynamically or not --- src/http/client.rs | 65 ++++++++++++++++++++++++++++++++-------- src/http/groups.rs | 2 +- src/http/tags.rs | 2 +- src/http/timeline.rs | 2 +- src/http/update_token.rs | 2 +- 5 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/http/client.rs b/src/http/client.rs index de51861..5675d98 100644 --- a/src/http/client.rs +++ b/src/http/client.rs @@ -29,23 +29,32 @@ impl Client { } } - pub fn post_request(&self, path: &str, json: &JT) -> Result + pub fn post_request(&self, path: &str, json: &JT, is_dynamic: bool) -> Result where RT: DeserializeOwned, JT: Serialize + ?Sized { + let mut header = self.insert_headers(HeaderMap::new())?; + header = self.insert_dynamic_header(header, is_dynamic)?; let url = Url::parse(&self.base_url)?.join(&path)?; let request_url = url.as_ref().to_string(); let response: Response = self.client .post(url) - .headers(self.insert_headers(HeaderMap::new())?) + .headers(header) .json(json) .send()? .error_for_status()?; self.handle_response(response, &request_url) } - pub fn get_request(&self, path: &str, access_token: &str, parameters: Option>) -> Result + pub fn get_request( + &self, + path: &str, + access_token: &str, + parameters: Option>, + is_dynamic: bool + ) -> Result where RT: DeserializeOwned { let mut header = self.insert_headers(HeaderMap::new())?; header = self.insert_optional_headers(header, access_token)?; + header = self.insert_dynamic_header(header, is_dynamic)?; let iter = match parameters { Some(v) => v, @@ -107,15 +116,33 @@ impl Client { #[cfg(not(feature = "401"))] fn insert_401_header(&self, header: HeaderMap) -> Result { Ok(header) } + + fn insert_dynamic_header(&self, mut header: HeaderMap, is_dynamic: bool) -> Result { + // 開発時はmockサーバーがOpenApiで定義された動的なデータを返すようにする + match (env::var("H_BASE_URL"), env::var("H_BASE_URL"), is_dynamic) { + (Err(_), Err(_), _) => Ok(header), + (_, _, false) => Ok(header), + _ => { + header.insert("Prefer", "dynamic=true".parse()?); + Ok(header) + } + } + } } pub trait SHClient: Clone { fn new() -> Self where Self: Sized; - fn post_request(&self, path: &str, json: &JT) -> Result + fn post_request(&self, path: &str, json: &JT, is_dynamic: bool) -> Result where RT: DeserializeOwned, JT: Serialize + ?Sized; - fn get_request(&self, path: &str, access_token: &str, parameters: Option>) -> Result + fn get_request( + &self, + path: &str, + access_token: &str, + parameters: Option>, + is_dynamic: bool + ) -> Result where RT: DeserializeOwned; } @@ -134,14 +161,20 @@ impl SHClient for SClient { } } - fn post_request(&self, path: &str, json: &JT) -> Result + fn post_request(&self, path: &str, json: &JT, is_dynamic: bool) -> Result where RT: DeserializeOwned, JT: Serialize + ?Sized { - self.client.post_request(path, json) + self.client.post_request(path, json, is_dynamic) } - fn get_request(&self, path: &str, access_token: &str, parameters: Option>) -> Result + fn get_request( + &self, + path: &str, + access_token: &str, + parameters: Option>, + is_dynamic: bool + ) -> Result where RT: DeserializeOwned { - self.client.get_request(path, access_token, parameters) + self.client.get_request(path, access_token, parameters, is_dynamic) } } @@ -166,14 +199,20 @@ impl SHClient for HClient { } } - fn post_request(&self, path: &str, json: &JT) -> Result + fn post_request(&self, path: &str, json: &JT, is_dynamic: bool) -> Result where RT: DeserializeOwned, JT: Serialize + ?Sized { - self.client.post_request(path, json) + self.client.post_request(path, json, is_dynamic) } - fn get_request(&self, path: &str, access_token: &str, parameters: Option>) -> Result + fn get_request( + &self, + path: &str, + access_token: &str, + parameters: Option>, + is_dynamic: bool + ) -> Result where RT: DeserializeOwned { - self.client.get_request(path, access_token, parameters) + self.client.get_request(path, access_token, parameters, is_dynamic) } } diff --git a/src/http/groups.rs b/src/http/groups.rs index 49f35b4..65136b0 100644 --- a/src/http/groups.rs +++ b/src/http/groups.rs @@ -30,5 +30,5 @@ pub struct Groups { pub fn request(client: C, access_token: &String) -> Result> { let access_token = String::from(access_token); - client.get_request::>(PATH, &access_token, None) + client.get_request::>(PATH, &access_token, None, false) } diff --git a/src/http/tags.rs b/src/http/tags.rs index 62e5c77..5c06110 100644 --- a/src/http/tags.rs +++ b/src/http/tags.rs @@ -21,5 +21,5 @@ pub struct Tags { pub fn request(client: C, access_token: &String) -> Result> { let access_token = String::from(access_token); - client.get_request::>(PATH, &access_token, None) + client.get_request::>(PATH, &access_token, None, false) } diff --git a/src/http/timeline.rs b/src/http/timeline.rs index 92034c1..a82f7e5 100644 --- a/src/http/timeline.rs +++ b/src/http/timeline.rs @@ -63,5 +63,5 @@ pub fn request(client: C, access_token: &String, id: &u32, fromdate ("order", ORDER) ]; - client.get_request::(path.as_str(), &access_token, Some(parameters)) + client.get_request::(path.as_str(), &access_token, Some(parameters), true) } diff --git a/src/http/update_token.rs b/src/http/update_token.rs index b61a2ba..a40abb5 100644 --- a/src/http/update_token.rs +++ b/src/http/update_token.rs @@ -26,5 +26,5 @@ pub fn request(client: C, refresh_token: &String) -> Result(PATH, &update_token_json) + client.post_request::(PATH, &update_token_json, true) } From 37e01c1593deacd0883bdace22b3831751a11bd5 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sun, 6 Mar 2022 04:06:05 +0900 Subject: [PATCH 06/18] fix README --- README.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 6913fe0..0b6d44a 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ 購読しているメンバー全員の全期間のメッセージが保存されます。 ```shell script -$ colmsg --s_refresh_token --h_refresh_token +colmsg --s_refresh_token --h_refresh_token ``` Windowsの場合は実行ファイル名を `colmsg.exe` に読み替えてください。 @@ -47,31 +47,31 @@ configファイルについては[こちら](#configファイル)を参照して 特定のメンバーのメッセージを保存したい場合 ```shell script -$ colmsg -n 菅井友香 -n 佐々木久美 +colmsg -n 菅井友香 -n 佐々木久美 ``` 特定のグループのメッセージを保存したい場合 ```shell script -$ colmsg -g sakurazaka +colmsg -g sakurazaka ``` 特定の種類のメッセージを保存したい場合 ```shell script -$ colmsg -k image -k video +colmsg -k picture -k video ``` 特定の日時以降のメッセージを保存したい場合 ```shell script -$ colmsg -F '2020/01/01 00:00:00' +colmsg -F '2020/01/01 00:00:00' ``` オプションは組み合わせて使用することが出来ます。より詳細な説明は以下を実行して確認してください。 ```shell script -$ colmsg --help +colmsg --help ``` ## 詳細な仕様 @@ -98,7 +98,7 @@ $ colmsg --help * 3: ボイス * 各環境毎のデフォルトの保存先は以下を実行することで確認することが出来ます * ```shell script - $ colmsg --download-dir + colmsg --download-dir ``` * 既に保存済のメッセージは上書き保存されません @@ -108,7 +108,7 @@ $ colmsg --help デフォルトのパスは以下を実行することで確認することが出来ます。 ```shell script -$ colmsg --config-dir +colmsg --config-dir ``` また、環境変数 `COLMSG_CONFIG_PATH` に設定ファイルの場所を明記することもできます。 @@ -147,8 +147,8 @@ Windows用のビルド済実行ファイルをzipに圧縮して[リリースペ Homebrewでインストールすることが出来ます。 ```shell script -$ brew tap proshunsuke/colmsg -$ brew install colmsg +brew tap proshunsuke/colmsg +brew install colmsg ``` ### Arch Linux @@ -165,24 +165,25 @@ yay -S colmsg ## 開発 -`colmsg` は外部APIを叩きます。開発時はAPIのモックサーバを建てると良いでしょう。そのためのSwagger Specを配置してあります。 -TODO: Swagger Specを置く +`colmsg` は外部APIを叩きます。開発時はOpenApiを利用したモックサーバーを建てることが出来ます。 -モックサーバのbase urlを環境変数 `S_BASE_URL` , `H_BASE_URL` で指定することが出来ます。以下のように指定することでモックサーバ宛てにAPIを叩きにいきます。 +```shell +make server/kh +``` + +モックサーバのbase urlを環境変数 `S_BASE_URL` , `H_BASE_URL` で指定することが出来ます。 ```shell script -$ S_BASE_URL=http://127.0.0.1:3100 cargo run -- --help +S_BASE_URL=http://localhost:8003 H_BASE_URL=http://localhost:8003 cargo run -- -d ~/Downloads/temp/ --help ``` ## TODO * [ ] deleteの実装 -* [ ] docker環境の用意 * [ ] CIによる自動テスト * [ ] examplesの用意 * [ ] メッセージ保存処理の並列化 * [ ] api clientのcrate化 -* [ ] swagger specの配置 ## ライセンス From a0d4e138adf197460fc641323064437236b7b87f Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Mon, 7 Mar 2022 00:21:25 +0900 Subject: [PATCH 07/18] create OpenApi spcec for api.n46.glastonr.net --- api/api-n46-glastonr-net.yaml | 1873 ++++++++++++++++++++++ api/components/schemas/PastMessages.yaml | 10 + 2 files changed, 1883 insertions(+) create mode 100644 api/api-n46-glastonr-net.yaml create mode 100644 api/components/schemas/PastMessages.yaml diff --git a/api/api-n46-glastonr-net.yaml b/api/api-n46-glastonr-net.yaml new file mode 100644 index 0000000..44f4854 --- /dev/null +++ b/api/api-n46-glastonr-net.yaml @@ -0,0 +1,1873 @@ +openapi: 3.0.0 +info: + title: api.n46.glastonr.net + version: '2.0' + description: '"乃木坂46メッセージ" ver2.00' + contact: + name: pro_shunsuke + url: 'https://twitter.com/pro_shunsuke' + email: shunsuke0901@gmail.com +servers: + - url: 'https://api.n46.glastonr.net' + description: Production server (uses live data) + - url: 'http://localhost:8006' + description: Sandbox server (uses test data) +paths: + /v2/update_token: + post: + summary: /v2/update_token + operationId: post-v2-update_token + description: access_tokenの更新 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderContent-Length.yaml' + requestBody: + content: + application/json: + schema: + type: object + properties: + refresh_token: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + example: 7bfd1c98-fb66-4c2d-a1da-af65845fb1da + required: + - refresh_token + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + access_token: + type: string + pattern: "^[a-zA-Z0-9]{36}\\.[a-zA-Z0-9]{44}\\.[a-zA-Z0-9-_]{43}$" + expires_in: + type: integer + minimum: 0 + enum: + - 3600 + refresh_token: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + required: + - access_token + - expires_in + - refresh_token + examples: + example: + value: + access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIxMjE1MzQsInN1YiI6IjEzMDIxMSJ9.tz663WGim12HGUj4F-R-yJc8Iieu70A6MKVR0iSv-Ns + expires_in: 3600 + refresh_token: 331c4f45-fcfb-4306-9588-f02cc5dcd575 + '400': + description: Bad Request + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + code: + type: string + message: + type: string + parameter: + type: string + required: + - code + - message + - parameter + examples: + invalid_parameter: + value: + code: invalid_parameter + message: リフレッシュトークンが正しくありません + parameter: refresh_token + /v2/signin: + post: + summary: /v2/signin + operationId: post-v2-signin + description: sign in + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderContent-Length.yaml' + requestBody: + content: + application/json: + schema: + type: object + properties: + auth_type: + type: string + enum: + - facebook + - google + - twitter + device_uuid: + type: string + pattern: '^[A-Z0-9]{43}=$' + token: + type: string + pattern: '^[A-Za-z0-9_]{1025}$' + required: + - auth_type + - device_uuid + - token + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + access_token: + type: string + pattern: "^[A-Za-z0-9]{36}\\.[A-Za-z0-9]{44}\\.[A-Za-z0-9]{43}$" + auth_type: + type: string + enum: + - facebook + - google + - twitter + device_uuid: + type: string + expires_in: + type: number + enum: + - 3600 + refresh_token: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + username: + type: string + pattern: '^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$' + required: + - access_token + - auth_type + - device_uuid + - expires_in + - refresh_token + - username + examples: + example: + value: + access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIwOTU1MDUsInN1YiI6IjEzMDIxMSJ9.TAesJMXAgS8fopvSv4Rbxb3N8HGUuu7p4Y8d7xToNrQ + auth_type: google + device_uuid: aiA4wmWk8TMFc6XoNglRbeAwIRM4KDKMqea1FYns= + expires_in: 3600 + refresh_token: 331c4f45-fcfb-4306-9588-f02cc5dcd575 + username: 2rydsxfe-pzb1-3386-46339-j3mq6olz1p00 + /v2/subscriptions: + post: + summary: /v2/subscriptions + operationId: post-v2-subscriptions + description: 購読情報の取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderContent-Length.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + requestBody: + content: + application/json: + schema: + type: object + properties: + group_id: + type: integer + minimum: 0 + example: 45 + required: + - group_id + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + auto_renewing: + type: boolean + start_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - active + type: + type: string + enum: + - paid + - nopaid + - free + examples: + example: + value: + auto_renewing: false + group_id: 45 + start_at: 2022-02-27T15:21:12Z + state: active + type: free + /v2/groups: + get: + summary: /v2/groups + operationId: get-v2-groups + description: メンバー一覧の取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: array + minItems: 20 + items: + type: object + properties: + id: + type: integer + minimum: 1 + is_letter_destination: + type: boolean + name: + $ref: '#/components/schemas/MembersEnum' + phone_image: + type: string + format: uri + priority: + type: integer + minimum: 0 + state: + type: string + enum: + - open + - closed + tags: + $ref: '#/components/schemas/TagsEnum' + thumbnail: + type: string + format: uri + trial_days: + type: integer + minimum: 0 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + options: + type: object + properties: + is_letter_open_notified: + type: boolean + is_message_commentable: + type: boolean + mobile_mail_address: + type: string + pattern: 'touser-%w{6}_%w{6}-[a-z0-9]{8}@mail\.nogizaka46\.qw\.to' + sp_message_permission: + type: string + enum: + - none + required: + - is_letter_open_notified + - is_message_commentable + - sp_message_permission + subscription: + type: object + properties: + auto_renewing: + type: boolean + start_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + end_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - active + type: + type: string + enum: + - paid + - nopaid + - free + required: + - auto_renewing + - start_at + - state + - type + required: + - id + - is_letter_destination + - name + - priority + - state + - tags + - thumbnail + - updated_at + examples: + example: + value: + - id: 45 + is_letter_destination: false + name: 乃木坂46 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/official.jpg' + priority: 10010 + state: open + subscription: + auto_renewing: false + start_at: '2022-02-27T15:21:12Z' + state: active + type: free + tags: + - nogizaka46.com + - nogizaka46-announcements + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/official.jpg' + updated_at: '2022-03-03T04:22:29Z' + - id: 1 + is_letter_destination: false + name: 秋元 真夏 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-manatsu_akimoto-1d3df0f2@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/akimotomanatsu.jpg' + priority: 10000 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/1-20220204-060039.jfif' + updated_at: '2022-02-21T15:10:03Z' + - id: 17 + is_letter_destination: false + name: 伊藤 理々杏 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-riria_ito-lL6w3s2i@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/itouriria.jpg' + priority: 9990 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/17-20220204-060707.jfif' + updated_at: '2022-02-21T15:11:11Z' + - id: 18 + is_letter_destination: false + name: 岩本 蓮加 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-renka_iwamoto-qeZ0h1ss@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/iwamotorenka.jpg' + priority: 9980 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/18-20220204-060724.jfif' + updated_at: '2022-02-21T15:11:25Z' + - id: 19 + is_letter_destination: false + name: 梅澤 美波 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-minami_umezawa-YsAe3NwK@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/umezawaminami.jpg' + priority: 9970 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/19-20220204-060741.jfif' + updated_at: '2022-02-21T15:11:35Z' + - id: 29 + is_letter_destination: false + name: 遠藤 さくら + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-sakura_endo-nTp8iN3A@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/endousakura.jpg' + priority: 9960 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/29-20220204-061041.jfif' + updated_at: '2022-02-21T15:11:47Z' + - id: 30 + is_letter_destination: false + name: 賀喜 遥香 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-haruka_kaki-3BWijU2s@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kakiharuka.jpg' + priority: 9950 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/30-20220204-061056.jfif' + updated_at: '2022-02-21T15:11:58Z' + - id: 31 + is_letter_destination: false + name: 掛橋 沙耶香 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-sayaka_kakehashi-6WVUHeLM@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kakehashisayaka.jpg' + priority: 9940 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/31-20220204-061114.jfif' + updated_at: '2022-02-21T15:12:08Z' + - id: 32 + is_letter_destination: false + name: 金川 紗耶 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-saya_kanagawa-bPUASTpu@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kanagawasaya.jpg' + priority: 9930 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/32-20220204-061132.jfif' + updated_at: '2022-02-21T15:12:17Z' + - id: 33 + is_letter_destination: false + name: 北川 悠理 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-yuri_kitagawa-WPXXTrju@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kitagawayuri.jpg' + priority: 9920 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/33-20220204-061152.jfif' + updated_at: '2022-02-21T15:12:26Z' + - id: 10 + is_letter_destination: false + name: 北野 日奈子 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-hinako_kitano-0zf12b50@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kitanohinako.jpg' + priority: 9910 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/10-20220204-060422.jfif' + updated_at: '2022-02-21T15:12:35Z' + - id: 21 + is_letter_destination: false + name: 久保 史緒里 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-shiori_kubo-NF9AfclC@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kuboshiori.jpg' + priority: 9900 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/21-20220204-060757.jfif' + updated_at: '2022-02-21T15:12:43Z' + - id: 34 + is_letter_destination: false + name: 黒見 明香 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-haruka_kuromi-rmKBZSw3@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/kuromiharuka.jpg' + priority: 9890 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/34-20220204-061210.jfif' + updated_at: '2022-02-21T15:12:53Z' + - id: 3 + is_letter_destination: false + name: 齋藤 飛鳥 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-asuka_saito-9jh0yCp3@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/saitouasuka.jpg' + priority: 9880 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/3-20220204-060100.jfif' + updated_at: '2022-02-21T15:13:02Z' + - id: 22 + is_letter_destination: false + name: 阪口 珠美 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-tamami_sakaguchi-Jz87HkGi@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/sakaguchitamami.jpg' + priority: 9870 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/22-20220204-060811.jfif' + updated_at: '2022-02-21T15:13:11Z' + - id: 23 + is_letter_destination: false + name: 佐藤 楓 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-kaede_satou-fBvDXXrW@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/satoukaede.jpg' + priority: 9860 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/23-20220204-060830.jfif' + updated_at: '2022-02-21T15:13:18Z' + - id: 35 + is_letter_destination: false + name: 佐藤 璃果 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-rika_sato-VxaxV7XQ@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/satourika.jpg' + priority: 9850 + state: open + subscription: + auto_renewing: true + start_at: '2022-02-27T15:53:48Z' + state: active + type: paid + end_at: '2022-03-27T17:53:33Z' + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/35-20220204-061227.jfif' + updated_at: '2022-02-21T15:13:27Z' + - id: 36 + is_letter_destination: false + name: 柴田 柚菜 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-yuna_shibata-xzzShmwp@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/shibatayuna.jpg' + priority: 9840 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/36-20220204-061242.jfif' + updated_at: '2022-02-21T15:13:35Z' + - id: 12 + is_letter_destination: false + name: 鈴木 絢音 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-ayane_suzuki-NfjRt6o7@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/suzukiayane.jpg' + priority: 9820 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/12-20220204-060448.jfif' + updated_at: '2022-02-21T15:13:45Z' + - id: 37 + is_letter_destination: false + name: 清宮 レイ + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-rei_seimiya-LErUVMjD@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/seimiyarei.jpg' + priority: 9810 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/37-20220204-061256.jfif' + updated_at: '2022-02-21T15:13:58Z' + - id: 38 + is_letter_destination: false + name: 田村 真佑 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-mayu_tamura-7cAVpSQC@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/tamuramayu.jpg' + priority: 9800 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/38-20220204-061314.jfif' + updated_at: '2022-02-21T15:14:16Z' + - id: 39 + is_letter_destination: false + name: 筒井 あやめ + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-ayame_tsutsui-eJzA3FXf@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/tsutsuiayame.jpg' + priority: 9790 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/39-20220204-061349.jfif' + updated_at: '2022-02-21T15:15:49Z' + - id: 24 + is_letter_destination: false + name: 中村 麗乃 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-reno_nakamura-Bt50AGR8@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/nakamurareno.jpg' + priority: 9770 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/24-20220204-060900.jfif' + updated_at: '2022-02-21T15:16:05Z' + - id: 40 + is_letter_destination: false + name: 早川 聖来 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-seira_hayakawa-4Q557LGs@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/hayakawaseira.jpg' + priority: 9760 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/40-20220204-061413.jfif' + updated_at: '2022-02-21T15:16:32Z' + - id: 41 + is_letter_destination: false + name: 林 瑠奈 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-runa_hayashi-VnpZM4Ya@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/hayashiruna.jpg' + priority: 9750 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/41-20220204-061430.jfif' + updated_at: '2022-02-21T15:16:44Z' + - id: 5 + is_letter_destination: false + name: 樋口 日奈 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-hina_higuchi-056a827e@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/higuchihina.jpg' + priority: 9740 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/5-20220204-060120.jfif' + updated_at: '2022-02-21T15:16:55Z' + - id: 42 + is_letter_destination: false + name: 松尾 美佑 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-miyu_matsuo-RSjsB9pb@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/matsuomiyu.jpg' + priority: 9720 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/42-20220204-061441.jfif' + updated_at: '2022-02-21T15:17:08Z' + - id: 25 + is_letter_destination: false + name: 向井 葉月 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-hazuki_mukai-8nWmD9NT@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/mukaihazuki.jpg' + priority: 9710 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/25-20220204-060933.jfif' + updated_at: '2022-02-21T15:17:20Z' + - id: 43 + is_letter_destination: false + name: 矢久保 美緒 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-mio_yakubo-p8jU7Ms4@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/yakubomio.jpg' + priority: 9700 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/43-20220204-061455.jfif' + updated_at: '2022-02-21T15:17:31Z' + - id: 15 + is_letter_destination: false + name: 山崎 怜奈 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-rena_yamazaki-IY60T4Qy@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/yamazakirena.jpg' + priority: 9690 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/15-20220204-060644.jfif' + updated_at: '2022-02-21T15:17:42Z' + - id: 26 + is_letter_destination: false + name: 山下 美月 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-mizuki_yamashita-48oHk2uD@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/yamashitamizuki.jpg' + priority: 9680 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/26-20220204-060951.jfif' + updated_at: '2022-02-21T15:17:53Z' + - id: 44 + is_letter_destination: false + name: 弓木 奈於 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-nao_yumiki-YTzgGxNZ@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/yumikinao.jpg' + priority: 9670 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/44-20220204-061509.jfif' + updated_at: '2022-02-21T15:18:04Z' + - id: 27 + is_letter_destination: false + name: 吉田 綾乃クリスティー + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-ayano_christie_yoshida-4qQYP4Yn@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/yoshidaayanochristie.jpg' + priority: 9660 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/27-20220204-061008.jfif' + updated_at: '2022-02-21T15:18:16Z' + - id: 28 + is_letter_destination: false + name: 与田 祐希 + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-yuuki_yoda-u3leF8ZB@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/yodayuuki.jpg' + priority: 9650 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/28-20220204-061023.jfif' + updated_at: '2022-02-21T15:18:28Z' + - id: 8 + is_letter_destination: false + name: 和田 まあや + options: + is_letter_open_notified: false + is_message_commentable: false + sp_message_permission: none + mobile_mail_address: 'touser-maaya_wada-7a7a31fc@mail.nogizaka46.qw.to' + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/wadamaaya.jpg' + priority: 9640 + state: open + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/8-20220204-060348.jfif' + updated_at: '2022-02-21T15:18:40Z' + - id: 2 + is_letter_destination: false + name: 生田 絵梨花 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T18:59:34Z' + - id: 4 + is_letter_destination: false + name: 高山 一実 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T18:59:40Z' + - id: 6 + is_letter_destination: false + name: 星野 みなみ + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T18:59:47Z' + - id: 7 + is_letter_destination: false + name: 松村 沙友理 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T18:59:54Z' + - id: 9 + is_letter_destination: false + name: 伊藤 純奈 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T19:00:00Z' + - id: 11 + is_letter_destination: false + name: 新内 眞衣 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T19:00:07Z' + - id: 13 + is_letter_destination: false + name: 寺田 蘭世 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T19:00:13Z' + - id: 14 + is_letter_destination: false + name: 堀 未央奈 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T19:00:20Z' + - id: 16 + is_letter_destination: false + name: 渡辺 みり愛 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T19:00:27Z' + - id: 20 + is_letter_destination: false + name: 大園 桃子 + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2022-02-09T19:00:33Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + /v2/tags: + get: + summary: /v2/tags + operationId: get-v2-tags + description: タグ一覧の取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: array + uniqueItems: false + items: + type: object + properties: + meta: + type: object + properties: + dimension: + type: string + enum: + - company + name: + type: string + enum: + - 乃木坂46 + - 乃木坂46 お知らせ + - 乃木坂46 2期生 + - 乃木坂46 3期生 + - 乃木坂46 4期生 + priority: + type: integer + minimum: 0 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + uuid: + type: string + enum: + - nogizaka46.com + - nogizaka46-announcements + - nogizaka46-1 + - nogizaka46-2 + - nogizaka46-3 + - nogizaka46-4 + required: + - name + - priority + - updated_at + - uuid + examples: + example: + value: + - meta: + dimension: company + name: 乃木坂46 + priority: 200 + updated_at: '2022-02-21T17:20:38Z' + uuid: nogizaka46.com + - name: 乃木坂46 お知らせ + priority: 199 + updated_at: '2022-02-21T17:20:49Z' + uuid: nogizaka46-announcements + - name: 乃木坂46 + priority: 198 + updated_at: '2022-02-21T15:25:57Z' + uuid: nogizaka46-1 + - name: 乃木坂46 2期生 + priority: 197 + updated_at: '2022-02-09T18:55:03Z' + uuid: nogizaka46-2 + - name: 乃木坂46 3期生 + priority: 196 + updated_at: '2022-02-09T18:55:12Z' + uuid: nogizaka46-3 + - name: 乃木坂46 4期生 + priority: 195 + updated_at: '2022-02-09T18:55:22Z' + uuid: nogizaka46-4 + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + '/v2/groups/{id}': + parameters: + - schema: + type: string + name: id + in: path + required: true + get: + summary: '/v2/groups/{id}' + operationId: get-v2-group-id + description: 特定IDのメンバー取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + type: object + properties: + id: + type: integer + minimum: 1 + is_letter_destination: + type: boolean + name: + $ref: '#/components/schemas/MembersEnum' + phone_image: + type: string + format: uri + priority: + type: integer + minimum: 0 + state: + type: string + enum: + - open + - closed + tags: + type: array + items: + $ref: '#/components/schemas/TagsEnum' + thumbnail: + type: string + format: uri + trial_days: + type: integer + minimum: 0 + updated_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + subscription: + type: object + properties: + auto_renewing: + type: boolean + end_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + start_at: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + state: + type: string + enum: + - active + type: + type: string + enum: + - paid + - nopaid + - free + required: + - auto_renewing + - start_at + - state + - type + options: + type: object + properties: + is_letter_open_notified: + type: boolean + is_message_commentable: + type: boolean + mobile_mail_address: + type: string + pattern: 'touser-%w{6}_%w{6}-[a-z0-9]{8}@mail\.nogizaka46\.qw\.to' + sp_message_permission: + type: string + enum: + - none + required: + - is_letter_open_notified + - is_message_commentable + - sp_message_permission + required: + - id + - is_letter_destination + - name + - priority + - state + - tags + - thumbnail + - updated_at + examples: + paid: + value: + id: 35 + is_letter_destination: false + name: 佐藤 璃果 + options: + is_letter_open_notified: false + is_message_commentable: false + mobile_mail_address: 'touser-rika_sato-VxaxV7XQ@mail.nogizaka46.qw.to' + sp_message_permission: none + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/satourika.jpg' + priority: 9850 + state: open + subscription: + auto_renewing: true, + end_at: '2022-03-27T17:53:33Z' + start_at: '2022-02-27T15:53:48Z' + state: active + type: paid + tags: + - nogizaka46.com + - nogizaka46-1 + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/35-20220204-061227.jfif' + trial_days: 0 + updated_at: '2022-02-21T15:13:27Z' + nopaid: + value: + id: 36 + is_letter_destination: false + name: 柴田 柚菜 + options: + is_letter_open_notified: false + is_message_commentable: false + mobile_mail_address: 'touser-yuna_shibata-xzzShmwp@mail.nogizaka46.qw.to' + sp_message_permission: none + phone_image: 'https://djznowbmqickg.cloudfront.net/public/groups/phone-images/shibatayuna.jpg' + priority: 9840 + state: open + tags: + - keyakizaka46-1 + - keyakizaka46.com + thumbnail: 'https://djznowbmqickg.cloudfront.net/public/groups/thumbnails/36-20220204-061242.jfif' + trial_days: 0 + updated_at: '2020-05-27T12:04:04Z' + graduated: + value: + id: 6 + is_letter_destination: false + name: '' + priority: 0 + state: closed + tags: [] + thumbnail: '' + updated_at: '2020-03-26T03:41:38Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + '/v2/groups/{id}/timeline': + parameters: + - schema: + type: string + name: id + in: path + required: true + get: + summary: '/v2/groups/{id}/timeline?created_from=%Y-%m-%dT%H:%M:%SZ&updated_from=%Y-%m-%dT%H:%M:%SZ&count=num&order=asc' + operationId: get-v2-group-id-timeline + description: 特定IDのメンバー取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + - schema: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + in: query + name: created_from + required: true + - schema: + type: string + pattern: '20[0-9]{2}-(02-(0[1-9]|1[0-9]|[2][0-8])|(0[469]|11)-(0[1-9]|[12][0-9]|30)|(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))T(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|[1-5][0-9]):(0[0-9]|[1-5][0-9])Z' + in: query + name: updated_from + required: true + - schema: + type: integer + minimum: 0 + in: query + name: count + required: true + - schema: + type: string + enum: + - asc + - desc + in: query + name: order + required: true + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + anyOf: + - $ref: './components/schemas/Timeline.yaml' + - $ref: './components/schemas/TimelineLetter.yaml' + examples: + text: + value: + comments: [] + letters: [] + messages: + - group_id: 12 + id: 158213 + is_favorite: false + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:10:07Z' + state: published + text: "こんにちは☀︎\r\n昨日からサントリーさんの緑茶「伊右衛門」のWebCMにほのすと出演させて頂いていますが‪\uD83C\uDF75‬悪魔のおにぎりと一緒に楽しんでくださいな☺︎" + type: text + updated_at: '2020-04-14T02:11:27Z' + queried_at: '2020-06-14T05:07:09Z' + picture: + value: + comments: [] + letters: [] + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg?Expires=1592113752&Signature=PIjm0GhyD1yYUR~4XIWZZxLY8fi9BexKbY0Rd37SNxdgK7vf5u5~QKKiHUGiQ66iOAW01G1Vb85DKlJAoPFAfyMGEE0wVtpCVTKE84J4c3dKZ35u4-aZN3a5Vh8q36iu5opkUEwj3mW2Lg8~9F2gqkAUKYL086~v6EdJ3zaV~LkE19Br3POhBcp3SQ8qekEraFxivTgHrc7KGWDkrFU~v~~tKyw4KUH02K37ryRfMOdUzzvOFglHn~EZWoHcEpjFMUgmUcajBCGYKGwH3Jj9Q-mVeUyI9~Sft4afX4QljuXTBEDfZIOQRycxB9Pwxc-T~fLF7nrByAsWBCCSq5uXvQ__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157690 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T08:53:33Z' + state: published + text: 米粉蒸しパンを作ってみたら大きく膨れすぎました(笑) + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg-00001.jpg?Expires=1592113752&Signature=P~Vsv2OE1hFWF5FVMmWcTe3nclxOFjhHn0gQvKHpFMIjk6YQUZn-wwuk3wNtkLGqi9QrbRAGa9tshoQmtYMVq11BWlAwVbRhmEBFc3pMx~CJONpPwuKKUBq13wQP9tdbnGOiRoJjezs4cJMvVwP0OmXLBZ~cCd6k0PCkCW59lKFjwgTHntLD8mJwqGuAK9JVRXb5p5raly6QbYo4V7G-M6Q7-En90ZM0bJz~EmUBQl3TNhdQkTWw-Wc0f3BO90xA~0bU6y9CA14NwVRVzYptnUPKZQzidzYvez~TqI0-KlqVVkFk4-CRz6GyIIWDFFyzFahLeLa9nO9kNPyvwuOEdA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 170 + thumbnail_width: 240 + type: picture + updated_at: '2020-04-11T08:54:55Z' + queried_at: '2020-06-14T05:07:09Z' + video: + value: + comments: [] + letters: [] + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4?Expires=1592113752&Signature=wHrXBz1gsCG2FJdfPdTSA713bL8r6kHRgwPDMBrnL6HBzRTiD7CVOct-H3-zVBBwEOMODRElw92LrymcFJjArSzVG5xZPb2Y1GgPrhaau5PnaVUmQDxqPxRkczczH~YurlnzHB9hDWEXv08Jn0CPFGNjgWvH18T60h3hkbuqM4v0zqJxSaTLBKXvsK6BA-PJFPMlo4BpBisxScWeH0MPB9L6pA0xvrezKTuJwQmt7X64PGSiWhlnlkezoHmC5YaEfdmfwaXl46y~k24Dg2yrXaz7rkNmDFzLuwWpaEiMH931fchJtytrw8moFM51Olqk2EaRXDEsMooybTkaNFqljg__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 158214 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:15:07Z' + state: published + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4-00001.jpg?Expires=1592113752&Signature=cd98xaVmPSNhj7Giez-M5-Kp2uVhblLZNO0IqdUAARcxdvH8fCT~7Pc8qGzkU7jinefDlmxKTkRQ7oUAjMxZBmwuCv9eTELpsexgeyDYx~LqJUOdHYMF7QLYRf1DHVmoHtkle9SACoqvuka0dFX3NBcE7Z5vrS7mDPYfZbzarKPvCHMQr-mnafatOcCiPEuhMvqhjY-gv4lgV4cqrPnxUftng3o~gLk8M~WC8~VnBwOAM-X39jAFUKk2hf41aVHqgCs8eApaPvrDwfIzFzsTktNqqkOSZUs8DPddrDs~ohSa8gFEu7d49JiubgbCZ53zwRS12EqfTEPcBPF44RJDIw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 240 + thumbnail_width: 320 + type: video + updated_at: '2020-04-14T02:16:26Z' + queried_at: '2020-06-14T05:07:09Z' + voice: + value: + comments: [] + letters: [] + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/245bf6fd021ec120835fc96ffddb446b9e6adfcf2a9c7d004351437c6b7c5fd7.mp4?Expires=1592113752&Signature=lwbG3C1mfQ13oWpHSL8xxaxAG6QTJGmsYdWIkFK3NFQQXPrerOmE1ySaVKVaNOg2eZv9RYpkNOi5xOTUHHm6NhdFvRfs3cogfRsoVNgEJAyLcob6pJKSAXTczoE-q~OOegjpp5n4RkMYi5xB9L5qsUCd6poqAbiIhAE5bbB2BeiAscJ5vUAqJpW9V6PiVSsmTdjE72de9nuG9Lol1GP0cJlh~OXNzBUuYAfMvKxYMOAOiaoFrOXrki9B4Z0OkdNihyZAMYMuMSNLP9RghVP-u9InVol4eaeexORDgjaaO8G7uSkA~PRfcd7m8tPWloVZduc8EeOmJwkL0~dm8q4wsw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157764 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T10:48:40Z' + state: published + type: voice + updated_at: '2020-04-11T10:50:03Z' + queried_at: '2020-06-14T05:07:09Z' + letter: + value: + comments: [] + letters: + - client_token: VI4PoKp9EeqI1wahea/0DFSOD6mqfRHqiNcGoXmv9Aw= + created_at: '2020-04-06T10:42:54Z' + file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg?Expires=1592113752&Signature=IN8Fb8mOYsoDQcMijdn4xn7PS92-oRbJerxOE7KaK6B7LWi-ejkM9GXZqWQxy13rB0hQH~dsewfFYa-K4OJd3sZZjt97fP0UJoYRFmlaslGfPRyDaxO8CXJvYfpug3RUUS9Hbx0tt-MWxkJqbWxRqihpvRW64XAt47nkOJkmaj-SHMJK3q6grJDYwej4XJQgtc6VIGl3-DKAIUH22l5ztohftkrrckIdj1xOBcvNBBG-gpXFYZGtdi3OsbG9vHjBppIXua5FowiCJ0Jk19IQo5ktlQBhtd96goSNsFNZzfsfJSeVyuXtil79Mb0I2AeZloXR8ni3bKXWLT~W1JW78w__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 1030494 + is_favorite: false + member_id: 12 + opened_at: '2020-04-07T03:57:08Z' + text: "はじめでレター送ります!" + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg-00001.jpg?Expires=1592113752&Signature=Dftz~blkdErkR16UetMcj1fB0Qpap9PoXFmXvnqDPq-qYqhkLe1qNVnO6HGPwCqrIhGZ95Vaw6jJxrQoDycQH8tYXJn9Vy3kT6DBSAp1pxr0lSF9Isx1NHLav0xIlxM8YC4e4BbqbW9AbtQPsiPp4XIIQ080TmSfkkRSX~IDyGoJVtIvHZIRkJ9fv7v-y-SV1knfLtmuLqLvd8Gkb~RP1qbwWXmznGm3XUDXTwcQy6bCKGi~3frgtX9QWv83VHtIiAkfO3eb47cvcQtSec4CBURZnBy7nbU9CZyBtBOSoukn5D9oHo1w352Jd6lb-7RB3a-CthbUQdKEhNdgWRQKjA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 480 + thumbnail_width: 320 + updated_at: '2020-04-07T03:57:08Z' + messages: [] + queried_at: '2020-06-14T05:07:09Z' + canceled: + value: + comments: [] + letters: [] + messages: + - group_id: 48 + id: 118504 + is_favorite: true + is_silent: false + member_id: 84 + published_at: '2019-06-24T04:50:31Z' + state: canceled + type: picture + updated_at: '2019-06-24T04:53:29Z' + queried_at: '2020-06-14T05:07:09Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー + '/v2/groups/{id}/past_messages': + parameters: + - schema: + type: string + name: id + in: path + required: true + get: + summary: '/v2/groups/{id}/past_messages?order=asc' + operationId: get-v2-group-id-past_messages + description: 特定メンバーの購読前のメッセージを取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + - schema: + type: string + enum: + - asc + - desc + in: query + name: order + required: true + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + oneOf: + - $ref: './components/schemas/PastMessages.yaml' + examples: + text: + value: + messages: + - group_id: 12 + id: 158213 + is_favorite: false + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:10:07Z' + state: published + text: "こんにちは☀︎\r\n昨日からサントリーさんの緑茶「伊右衛門」のWebCMにほのすと出演させて頂いていますが‪\uD83C\uDF75‬悪魔のおにぎりと一緒に楽しんでくださいな☺︎" + type: text + updated_at: '2020-04-14T02:11:27Z' + picture: + value: + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg?Expires=1592113752&Signature=PIjm0GhyD1yYUR~4XIWZZxLY8fi9BexKbY0Rd37SNxdgK7vf5u5~QKKiHUGiQ66iOAW01G1Vb85DKlJAoPFAfyMGEE0wVtpCVTKE84J4c3dKZ35u4-aZN3a5Vh8q36iu5opkUEwj3mW2Lg8~9F2gqkAUKYL086~v6EdJ3zaV~LkE19Br3POhBcp3SQ8qekEraFxivTgHrc7KGWDkrFU~v~~tKyw4KUH02K37ryRfMOdUzzvOFglHn~EZWoHcEpjFMUgmUcajBCGYKGwH3Jj9Q-mVeUyI9~Sft4afX4QljuXTBEDfZIOQRycxB9Pwxc-T~fLF7nrByAsWBCCSq5uXvQ__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157690 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T08:53:33Z' + state: published + text: 米粉蒸しパンを作ってみたら大きく膨れすぎました(笑) + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg-00001.jpg?Expires=1592113752&Signature=P~Vsv2OE1hFWF5FVMmWcTe3nclxOFjhHn0gQvKHpFMIjk6YQUZn-wwuk3wNtkLGqi9QrbRAGa9tshoQmtYMVq11BWlAwVbRhmEBFc3pMx~CJONpPwuKKUBq13wQP9tdbnGOiRoJjezs4cJMvVwP0OmXLBZ~cCd6k0PCkCW59lKFjwgTHntLD8mJwqGuAK9JVRXb5p5raly6QbYo4V7G-M6Q7-En90ZM0bJz~EmUBQl3TNhdQkTWw-Wc0f3BO90xA~0bU6y9CA14NwVRVzYptnUPKZQzidzYvez~TqI0-KlqVVkFk4-CRz6GyIIWDFFyzFahLeLa9nO9kNPyvwuOEdA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 170 + thumbnail_width: 240 + type: picture + updated_at: '2020-04-11T08:54:55Z' + video: + value: + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4?Expires=1592113752&Signature=wHrXBz1gsCG2FJdfPdTSA713bL8r6kHRgwPDMBrnL6HBzRTiD7CVOct-H3-zVBBwEOMODRElw92LrymcFJjArSzVG5xZPb2Y1GgPrhaau5PnaVUmQDxqPxRkczczH~YurlnzHB9hDWEXv08Jn0CPFGNjgWvH18T60h3hkbuqM4v0zqJxSaTLBKXvsK6BA-PJFPMlo4BpBisxScWeH0MPB9L6pA0xvrezKTuJwQmt7X64PGSiWhlnlkezoHmC5YaEfdmfwaXl46y~k24Dg2yrXaz7rkNmDFzLuwWpaEiMH931fchJtytrw8moFM51Olqk2EaRXDEsMooybTkaNFqljg__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 158214 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:15:07Z' + state: published + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4-00001.jpg?Expires=1592113752&Signature=cd98xaVmPSNhj7Giez-M5-Kp2uVhblLZNO0IqdUAARcxdvH8fCT~7Pc8qGzkU7jinefDlmxKTkRQ7oUAjMxZBmwuCv9eTELpsexgeyDYx~LqJUOdHYMF7QLYRf1DHVmoHtkle9SACoqvuka0dFX3NBcE7Z5vrS7mDPYfZbzarKPvCHMQr-mnafatOcCiPEuhMvqhjY-gv4lgV4cqrPnxUftng3o~gLk8M~WC8~VnBwOAM-X39jAFUKk2hf41aVHqgCs8eApaPvrDwfIzFzsTktNqqkOSZUs8DPddrDs~ohSa8gFEu7d49JiubgbCZ53zwRS12EqfTEPcBPF44RJDIw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 240 + thumbnail_width: 320 + type: video + updated_at: '2020-04-14T02:16:26Z' + voice: + value: + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/245bf6fd021ec120835fc96ffddb446b9e6adfcf2a9c7d004351437c6b7c5fd7.mp4?Expires=1592113752&Signature=lwbG3C1mfQ13oWpHSL8xxaxAG6QTJGmsYdWIkFK3NFQQXPrerOmE1ySaVKVaNOg2eZv9RYpkNOi5xOTUHHm6NhdFvRfs3cogfRsoVNgEJAyLcob6pJKSAXTczoE-q~OOegjpp5n4RkMYi5xB9L5qsUCd6poqAbiIhAE5bbB2BeiAscJ5vUAqJpW9V6PiVSsmTdjE72de9nuG9Lol1GP0cJlh~OXNzBUuYAfMvKxYMOAOiaoFrOXrki9B4Z0OkdNihyZAMYMuMSNLP9RghVP-u9InVol4eaeexORDgjaaO8G7uSkA~PRfcd7m8tPWloVZduc8EeOmJwkL0~dm8q4wsw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157764 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T10:48:40Z' + state: published + type: voice + updated_at: '2020-04-11T10:50:03Z' + letter: + value: + letters: + - client_token: VI4PoKp9EeqI1wahea/0DFSOD6mqfRHqiNcGoXmv9Aw= + created_at: '2020-04-06T10:42:54Z' + file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg?Expires=1592113752&Signature=IN8Fb8mOYsoDQcMijdn4xn7PS92-oRbJerxOE7KaK6B7LWi-ejkM9GXZqWQxy13rB0hQH~dsewfFYa-K4OJd3sZZjt97fP0UJoYRFmlaslGfPRyDaxO8CXJvYfpug3RUUS9Hbx0tt-MWxkJqbWxRqihpvRW64XAt47nkOJkmaj-SHMJK3q6grJDYwej4XJQgtc6VIGl3-DKAIUH22l5ztohftkrrckIdj1xOBcvNBBG-gpXFYZGtdi3OsbG9vHjBppIXua5FowiCJ0Jk19IQo5ktlQBhtd96goSNsFNZzfsfJSeVyuXtil79Mb0I2AeZloXR8ni3bKXWLT~W1JW78w__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 1030494 + is_favorite: false + member_id: 12 + opened_at: '2020-04-07T03:57:08Z' + text: "はじめでレター送ります!" + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg-00001.jpg?Expires=1592113752&Signature=Dftz~blkdErkR16UetMcj1fB0Qpap9PoXFmXvnqDPq-qYqhkLe1qNVnO6HGPwCqrIhGZ95Vaw6jJxrQoDycQH8tYXJn9Vy3kT6DBSAp1pxr0lSF9Isx1NHLav0xIlxM8YC4e4BbqbW9AbtQPsiPp4XIIQ080TmSfkkRSX~IDyGoJVtIvHZIRkJ9fv7v-y-SV1knfLtmuLqLvd8Gkb~RP1qbwWXmznGm3XUDXTwcQy6bCKGi~3frgtX9QWv83VHtIiAkfO3eb47cvcQtSec4CBURZnBy7nbU9CZyBtBOSoukn5D9oHo1w352Jd6lb-7RB3a-CthbUQdKEhNdgWRQKjA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 480 + thumbnail_width: 320 + updated_at: '2020-04-07T03:57:08Z' + canceled: + value: + messages: + - group_id: 48 + id: 118504 + is_favorite: true + is_silent: false + member_id: 84 + published_at: '2019-06-24T04:50:31Z' + state: canceled + type: picture + updated_at: '2019-06-24T04:53:29Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー +components: + schemas: + MembersEnum: + enum: + - 乃木坂46 + - 秋元 真夏 + - 伊藤 理々杏 + - 岩本 蓮加 + - 梅澤 美波 + - 遠藤 さくら + - 賀喜 遥香 + - 掛橋 沙耶香 + - 金川 紗耶 + - 北川 悠理 + - 北野 日奈子 + - 久保 史緒里 + - 黒見 明香 + - 齋藤 飛鳥 + - 阪口 珠美 + - 佐藤 楓 + - 佐藤 璃果 + - 柴田 柚菜 + - 鈴木 絢音 + - 清宮 レイ + - 田村 真佑 + - 筒井 あやめ + - 中村 麗乃 + - 早川 聖来 + - 林 瑠奈 + - 樋口 日奈 + - 松尾 美佑 + - 向井 葉月 + - 矢久保 美緒 + - 山崎 怜奈 + - 山下 美月 + - 弓木 奈於 + - 吉田 綾乃クリスティー + - 与田 祐希 + - 和田 まあや + - 生田 絵梨花 + - 高山 一実 + - 星野 みなみ + - 松村 沙友理 + - 伊藤 純奈 + - 新内 眞衣 + - 寺田 蘭世 + - 堀 未央奈 + - 渡辺 みり愛 + - 大園 桃子 + - '' + TagsEnum: + enum: + - - nogizaka46.com + - nogizaka46-announcements + - - nogizaka46.com + - nogizaka46-1 + parameters: + RequestHeaderX-Talk-App-ID: + schema: + type: string + default: jp.co.sonymusic.communication.nogizaka 2.2 + in: header + name: X-Talk-App-ID + required: true + RequestHeaderHost: + schema: + type: string + default: api.n46.glastonr.net + in: header + name: Host + required: true diff --git a/api/components/schemas/PastMessages.yaml b/api/components/schemas/PastMessages.yaml new file mode 100644 index 0000000..bd0ef0b --- /dev/null +++ b/api/components/schemas/PastMessages.yaml @@ -0,0 +1,10 @@ +type: object +properties: + messages: + type: array + items: + - $ref: './TimelineTextObject.yaml' + - $ref: './TimelinePictureObject.yaml' + - $ref: './TimelineVideoObject.yaml' + - $ref: './TimelineVoiceObject.yaml' + - $ref: './TimelineCanceledObject.yaml' From a09f37913585face98b69a3f2d56ca9ba45cdccf Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Mon, 7 Mar 2022 00:24:08 +0900 Subject: [PATCH 08/18] fix docker-compose for created api.n46.glastonr.net OpenApi spec --- Makefile | 24 ++++++++++++++++++++++++ docker-compose.yml | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/Makefile b/Makefile index 9a8a510..c4f7f2b 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,30 @@ open/editor/kh: open/ui/kh: $(OPEN) http://localhost:8002/ +server/n46: + docker-compose up swagger-api-n46 + +stop/server/n46: + docker-compose stop swagger-api-n46 + +restart/server/n46: + docker-compose restart swagger-api-n46 + +start/ui-editor/n46: + docker-compose up -d swagger-editor-n46 swagger-ui-n46 + +stop/ui-editor/n46: + docker-compose stop swagger-editor-n46 swagger-ui-n46 + +restart/ui-editor/n46: + docker-compose restart swagger-editor-n46 swagger-ui-n46 + +open/editor/n46: + $(OPEN) http://localhost:8004/ + +open/ui/n46: + $(OPEN) http://localhost:8005/ + down: docker-compose down --rmi all --volumes --remove-orphans diff --git a/docker-compose.yml b/docker-compose.yml index 49eca71..1fd3826 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,3 +32,35 @@ services: volumes: - ./api/api-kh-glastonr-net.yaml:/api-kh-glastonr-net.yaml - ./api/components:/components + + swagger-editor-n46: + image: swaggerapi/swagger-editor + container_name: "swagger-editor-n46" + ports: + - "8004:8080" + volumes: + - ./api/api-n46-glastonr-net.yaml:/api-n46-glastonr-net.yaml + - ./api/components:/components + environment: + SWAGGER_FILE: /api-n46-glastonr-net.yaml + + swagger-ui-n46: + image: swaggerapi/swagger-ui + container_name: "swagger-ui-n46" + ports: + - "8005:8080" + volumes: + - ./api/api-n46-glastonr-net.yaml:/api-n46-glastonr-net.yaml + - ./api/components:/components + environment: + SWAGGER_JSON: /api-n46-glastonr-net.yaml + + swagger-api-n46: + image: stoplight/prism:3 + container_name: "swagger-api-n46" + ports: + - "8006:4010" + command: mock -h 0.0.0.0 /api-n46-glastonr-net.yaml + volumes: + - ./api/api-n46-glastonr-net.yaml:/api-n46-glastonr-net.yaml + - ./api/components:/components From 38dc85a9759778c14c91c450464d5e9a9310f73e Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Mon, 7 Mar 2022 00:25:11 +0900 Subject: [PATCH 09/18] fix api-kh-glastonr-net.yaml to match api-n46-glastonr-net.yaml --- api/api-kh-glastonr-net.yaml | 42 +++++++++++++------ api/components/schemas/RequestHeaderHost.yaml | 6 --- .../schemas/RequestHeaderX-Talk-App-ID.yaml | 6 --- 3 files changed, 30 insertions(+), 24 deletions(-) delete mode 100644 api/components/schemas/RequestHeaderHost.yaml delete mode 100644 api/components/schemas/RequestHeaderX-Talk-App-ID.yaml diff --git a/api/api-kh-glastonr-net.yaml b/api/api-kh-glastonr-net.yaml index 35bd862..fd50598 100644 --- a/api/api-kh-glastonr-net.yaml +++ b/api/api-kh-glastonr-net.yaml @@ -9,6 +9,9 @@ info: email: shunsuke0901@gmail.com servers: - url: 'https://api.kh.glastonr.net' + description: Production server (uses live data) + - url: 'http://localhost:8003' + description: Sandbox server (uses test data) paths: /v2/update_token: post: @@ -18,11 +21,11 @@ paths: parameters: - $ref: './components/schemas/RequestHeaderAccept.yaml' - $ref: './components/schemas/RequestHeaderContent-type.yaml' - - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' - $ref: './components/schemas/RequestHeaderTE.yaml' - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' - - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' - $ref: './components/schemas/RequestHeaderConnection.yaml' - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' - $ref: './components/schemas/RequestHeaderContent-Length.yaml' @@ -132,11 +135,11 @@ paths: parameters: - $ref: './components/schemas/RequestHeaderAccept.yaml' - $ref: './components/schemas/RequestHeaderContent-type.yaml' - - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' - $ref: './components/schemas/RequestHeaderTE.yaml' - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' - - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' - $ref: './components/schemas/RequestHeaderConnection.yaml' - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' - $ref: './components/schemas/RequestHeaderContent-Length.yaml' @@ -232,11 +235,11 @@ paths: parameters: - $ref: './components/schemas/RequestHeaderAccept.yaml' - $ref: './components/schemas/RequestHeaderContent-type.yaml' - - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' - $ref: './components/schemas/RequestHeaderTE.yaml' - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' - - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' - $ref: './components/schemas/RequestHeaderConnection.yaml' - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' - $ref: './components/schemas/RequestHeaderAuthorization.yaml' @@ -1005,11 +1008,11 @@ paths: parameters: - $ref: './components/schemas/RequestHeaderAccept.yaml' - $ref: './components/schemas/RequestHeaderContent-type.yaml' - - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' - $ref: './components/schemas/RequestHeaderTE.yaml' - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' - - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' - $ref: './components/schemas/RequestHeaderConnection.yaml' - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' - $ref: './components/schemas/RequestHeaderAuthorization.yaml' @@ -1182,11 +1185,11 @@ paths: parameters: - $ref: './components/schemas/RequestHeaderAccept.yaml' - $ref: './components/schemas/RequestHeaderContent-type.yaml' - - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' - $ref: './components/schemas/RequestHeaderTE.yaml' - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' - - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' - $ref: './components/schemas/RequestHeaderConnection.yaml' - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' - $ref: './components/schemas/RequestHeaderAuthorization.yaml' @@ -1342,11 +1345,11 @@ paths: parameters: - $ref: './components/schemas/RequestHeaderAccept.yaml' - $ref: './components/schemas/RequestHeaderContent-type.yaml' - - $ref: './components/schemas/RequestHeaderX-Talk-App-ID.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' - $ref: './components/schemas/RequestHeaderTE.yaml' - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' - - $ref: './components/schemas/RequestHeaderHost.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' - $ref: './components/schemas/RequestHeaderConnection.yaml' - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' - $ref: './components/schemas/RequestHeaderAuthorization.yaml' @@ -1589,3 +1592,18 @@ components: - hinatazaka46.com - - hinatazaka46-3 - hinatazaka46.com + parameters: + RequestHeaderX-Talk-App-ID: + schema: + type: string + default: jp.co.sonymusic.communication.keyakizaka 2.0 + in: header + name: X-Talk-App-ID + required: true + RequestHeaderHost: + schema: + type: string + default: api.kh.glastonr.net + in: header + name: Host + required: true diff --git a/api/components/schemas/RequestHeaderHost.yaml b/api/components/schemas/RequestHeaderHost.yaml deleted file mode 100644 index 719394b..0000000 --- a/api/components/schemas/RequestHeaderHost.yaml +++ /dev/null @@ -1,6 +0,0 @@ -schema: - type: string - default: api.kh.glastonr.net -in: header -name: Host -required: true diff --git a/api/components/schemas/RequestHeaderX-Talk-App-ID.yaml b/api/components/schemas/RequestHeaderX-Talk-App-ID.yaml deleted file mode 100644 index 1afe1b7..0000000 --- a/api/components/schemas/RequestHeaderX-Talk-App-ID.yaml +++ /dev/null @@ -1,6 +0,0 @@ -schema: - type: string - default: jp.co.sonymusic.communication.keyakizaka 2.0 -in: header -name: X-Talk-App-ID -required: true From 34652fe263ee17d9a1a1db09581737762a555607 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 17:20:28 +0900 Subject: [PATCH 10/18] fix X-Talk-App-ID version for api.kh.glastonr.net --- api/api-kh-glastonr-net.yaml | 4 ++-- api/api-n46-glastonr-net.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/api-kh-glastonr-net.yaml b/api/api-kh-glastonr-net.yaml index fd50598..04dfe3a 100644 --- a/api/api-kh-glastonr-net.yaml +++ b/api/api-kh-glastonr-net.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: title: api.kh.glastonr.net - version: '2.0' + version: '2.2' description: '"櫻坂46メッセージ", "日向坂46メッセージ" ver2.00' contact: name: pro_shunsuke @@ -1596,7 +1596,7 @@ components: RequestHeaderX-Talk-App-ID: schema: type: string - default: jp.co.sonymusic.communication.keyakizaka 2.0 + default: jp.co.sonymusic.communication.keyakizaka 2.2 in: header name: X-Talk-App-ID required: true diff --git a/api/api-n46-glastonr-net.yaml b/api/api-n46-glastonr-net.yaml index 44f4854..f500a03 100644 --- a/api/api-n46-glastonr-net.yaml +++ b/api/api-n46-glastonr-net.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: title: api.n46.glastonr.net - version: '2.0' + version: '2.2' description: '"乃木坂46メッセージ" ver2.00' contact: name: pro_shunsuke From 30e659a8d3a39b4317a447cc0ad11d064da72a9f Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 17:24:08 +0900 Subject: [PATCH 11/18] add config of arguments for nogizaka --- src/bin/colmsg/clap_app.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/bin/colmsg/clap_app.rs b/src/bin/colmsg/clap_app.rs index 111e64d..6763227 100644 --- a/src/bin/colmsg/clap_app.rs +++ b/src/bin/colmsg/clap_app.rs @@ -5,15 +5,15 @@ pub fn build_app() -> ClapApp<'static, 'static> { .version(crate_version!()) .global_setting(AppSettings::ColoredHelp) .about( - "A CLI tool for '櫻坂46メッセージ' and '日向坂46メッセージ' app.\n\n\ + "A CLI tool for '櫻坂46メッセージ', '日向坂46メッセージ', and '乃木坂46メッセージ' app.\n\n\ Use '--help' instead of '-h' to see a more detailed version of the help text.", ) - .long_about("A CLI tool for saving messages of '櫻坂46メッセージ' and '日向坂46メッセージ' app locally.") + .long_about("A CLI tool for saving messages of '櫻坂46メッセージ', '日向坂46メッセージ' and '乃木坂46メッセージ' app locally.") .arg( Arg::with_name("group") .long("group") .short("g") - .possible_values(&["sakurazaka", "hinatazaka"]) + .possible_values(&["sakurazaka", "hinatazaka", "nogizaka"]) .help("Save messages of specific group.") .long_help("Save messages of specific group. If not specified, save messages both of groups") @@ -24,11 +24,11 @@ If not specified, save messages both of groups") Arg::with_name("name") .long("name") .short("n") - .help("Save messages of specific members (菅井友香,佐々木久美,..)") - .long_help("Save messages of specific members (菅井友香,佐々木久美,..) + .help("Save messages of specific members (菅井友香, 佐々木久美, 秋元真夏..)") + .long_help("Save messages of specific members (菅井友香, 佐々木久美, 秋元真夏..) Name must be a valid full name of kanji. If not specified, save messages of all members. -e.g. -n 菅井友香 -n 佐々木久美.") +e.g. -n 菅井友香 -n 佐々木久美 -n 秋元真夏.") .multiple(true) .takes_value(true), ) @@ -77,6 +77,13 @@ Use '--download-dir' to confirm the default directory.") .long_help("Set the hinatazaka refresh token.") .takes_value(true), ) + .arg( + Arg::with_name("n_refresh_token") + .long("n_refresh_token") + .help("Set the nogizaka refresh token.") + .long_help("Set the nogizaka refresh token.") + .takes_value(true), + ) .arg( Arg::with_name("delete") .long("delete") From abccbe843762c85efcaf6f3ffb3a1939ee781e58 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 17:25:10 +0900 Subject: [PATCH 12/18] 'group' should be able to accept multiple --- src/bin/colmsg/clap_app.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bin/colmsg/clap_app.rs b/src/bin/colmsg/clap_app.rs index 6763227..fe02529 100644 --- a/src/bin/colmsg/clap_app.rs +++ b/src/bin/colmsg/clap_app.rs @@ -13,6 +13,7 @@ pub fn build_app() -> ClapApp<'static, 'static> { Arg::with_name("group") .long("group") .short("g") + .multiple(true) .possible_values(&["sakurazaka", "hinatazaka", "nogizaka"]) .help("Save messages of specific group.") .long_help("Save messages of specific group. From 5fb8320d73fd8c3c3be9d1ba99f0b7e988ec9ac8 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 17:36:27 +0900 Subject: [PATCH 13/18] add client for nogizaka --- src/bin/colmsg/app.rs | 9 ++++++-- src/bin/colmsg/config.rs | 4 ++-- src/bin/colmsg/main.rs | 4 ++-- src/controller.rs | 6 +++--- src/http/client.rs | 44 +++++++++++++++++++++++++++++++++++++--- src/http/groups.rs | 4 ++-- src/http/tags.rs | 8 ++++---- src/http/timeline.rs | 4 ++-- src/http/update_token.rs | 4 ++-- src/lib.rs | 4 ++-- src/message/saver.rs | 8 ++++---- 11 files changed, 71 insertions(+), 28 deletions(-) diff --git a/src/bin/colmsg/app.rs b/src/bin/colmsg/app.rs index 942c74d..189f06e 100644 --- a/src/bin/colmsg/app.rs +++ b/src/bin/colmsg/app.rs @@ -10,7 +10,7 @@ use colmsg::{ errors::*, Config, Kind, - http::client::{SClient, SHClient, HClient} + http::client::{SClient, SHNClient, HClient, NClient} }; use crate::{ @@ -52,7 +52,12 @@ impl App { self.config("h_refresh_token", client) } - fn config, C: SHClient>(&self, refresh_token_str: S, client: C) -> Result> { + pub fn nogizaka_config(&self) -> Result> { + let client = NClient::new(); + self.config("n_refresh_token", client) + } + + fn config, C: SHNClient>(&self, refresh_token_str: S, client: C) -> Result> { let name = match self.matches.values_of("name") { Some(names) => { names diff --git a/src/bin/colmsg/config.rs b/src/bin/colmsg/config.rs index acd36c3..bbdee97 100644 --- a/src/bin/colmsg/config.rs +++ b/src/bin/colmsg/config.rs @@ -2,7 +2,7 @@ use std::{env, ffi::OsString, fs, fs::File, io::Write, path::PathBuf}; use shell_words; -use colmsg::{errors::*, http, dirs::PROJECT_DIRS, http::client::SHClient}; +use colmsg::{errors::*, http, dirs::PROJECT_DIRS, http::client::SHNClient}; pub fn config_file() -> PathBuf { env::var("COLMSG_CONFIG_PATH") @@ -36,7 +36,7 @@ fn get_args_from_str(content: &str) -> Result> { .collect::>()) } -pub fn get_access_token_from_file(refresh_token: &String, client: C) -> Result { +pub fn get_access_token_from_file(refresh_token: &String, client: C) -> Result { let dir = PROJECT_DIRS.config_dir().to_path_buf(); if !dir.is_dir() { fs::create_dir_all(&dir)? }; let file = dir.join("access_token"); diff --git a/src/bin/colmsg/main.rs b/src/bin/colmsg/main.rs index 57f5086..e241ab7 100644 --- a/src/bin/colmsg/main.rs +++ b/src/bin/colmsg/main.rs @@ -15,9 +15,9 @@ use colmsg::dirs::PROJECT_DIRS; use colmsg::{errors::*, Config}; use colmsg::errors::ErrorKind::ReqwestError; use colmsg::controller::Controller; -use colmsg::http::client::{SClient, SHClient, HClient}; +use colmsg::http::client::{SClient, SHNClient, HClient, NClient}; -fn run_controller(config: &Config) -> Result { +fn run_controller(config: &Config) -> Result { let controller = Controller::new(config); controller.run() } diff --git a/src/controller.rs b/src/controller.rs index 9b5f9bb..185abfa 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -1,10 +1,10 @@ -use crate::{errors::*, Config, message::saver::Saver, http::client::SHClient}; +use crate::{errors::*, Config, message::saver::Saver, http::client::SHNClient}; -pub struct Controller<'a, C: SHClient> { +pub struct Controller<'a, C: SHNClient> { config: &'a Config<'a, C> } -impl<'b, C: SHClient> Controller<'b, C> { +impl<'b, C: SHNClient> Controller<'b, C> { pub fn new<'a>(config: &'a Config) -> Controller<'a, C> { Controller { config } } diff --git a/src/http/client.rs b/src/http/client.rs index 5675d98..5ec0070 100644 --- a/src/http/client.rs +++ b/src/http/client.rs @@ -130,7 +130,7 @@ impl Client { } } -pub trait SHClient: Clone { +pub trait SHNClient: Clone { fn new() -> Self where Self: Sized; fn post_request(&self, path: &str, json: &JT, is_dynamic: bool) -> Result @@ -151,7 +151,7 @@ pub struct SClient { client: Client, } -impl SHClient for SClient { +impl SHNClient for SClient { fn new() -> SClient { SClient { client: Client::new( @@ -189,7 +189,7 @@ pub struct HClient { client: Client, } -impl SHClient for HClient { +impl SHNClient for HClient { fn new() -> HClient { HClient { client: Client::new( @@ -221,3 +221,41 @@ fn h_base_url() -> String { .ok() .unwrap_or_else(|| "https://api.kh.glastonr.net".to_string()) } + +#[derive(Debug, Clone)] +pub struct NClient { + client: Client, +} + +impl SHNClient for NClient { + fn new() -> NClient { + NClient { + client: Client::new( + n_base_url(), + "jp.co.sonymusic.communication.nogizaka 2.2".to_string(), + ), + } + } + + fn post_request(&self, path: &str, json: &JT, is_dynamic: bool) -> Result + where RT: DeserializeOwned, JT: Serialize + ?Sized { + self.client.post_request(path, json, is_dynamic) + } + + fn get_request( + &self, + path: &str, + access_token: &str, + parameters: Option>, + is_dynamic: bool + ) -> Result + where RT: DeserializeOwned { + self.client.get_request(path, access_token, parameters, is_dynamic) + } +} + +fn n_base_url() -> String { + env::var("N_BASE_URL") + .ok() + .unwrap_or_else(|| "https://api.n46.glastonr.net".to_string()) +} diff --git a/src/http/groups.rs b/src/http/groups.rs index 65136b0..c291416 100644 --- a/src/http/groups.rs +++ b/src/http/groups.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use crate::{errors::*, http::client::SHClient}; +use crate::{errors::*, http::client::SHNClient}; const PATH: &str = "/v2/groups"; @@ -27,7 +27,7 @@ pub struct Groups { pub subscription: Option, } -pub fn request(client: C, access_token: &String) -> Result> { +pub fn request(client: C, access_token: &String) -> Result> { let access_token = String::from(access_token); client.get_request::>(PATH, &access_token, None, false) diff --git a/src/http/tags.rs b/src/http/tags.rs index 5c06110..1e50eb0 100644 --- a/src/http/tags.rs +++ b/src/http/tags.rs @@ -1,24 +1,24 @@ use serde::{Deserialize, Serialize}; -use crate::{errors::*, http::client::SHClient}; +use crate::{errors::*, http::client::SHNClient}; const PATH: &str = "/v2/tags"; #[derive(Serialize, Deserialize, Debug)] pub struct TagsMeta { - pub color: String, + pub color: Option, // memo: khは必須だがには無い pub dimension: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct Tags { - pub meta: TagsMeta, + pub meta: Option, // memo: khは必須だがには無い場合がある pub name: String, pub priority: u32, pub updated_at: String, pub uuid: String, } -pub fn request(client: C, access_token: &String) -> Result> { +pub fn request(client: C, access_token: &String) -> Result> { let access_token = String::from(access_token); client.get_request::>(PATH, &access_token, None, false) diff --git a/src/http/timeline.rs b/src/http/timeline.rs index a82f7e5..ffa41df 100644 --- a/src/http/timeline.rs +++ b/src/http/timeline.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use crate::{errors::*, http::client::SHClient}; +use crate::{errors::*, http::client::SHNClient}; const PATH: &str = "/v2/groups"; const PATH2: &str = "/timeline"; @@ -53,7 +53,7 @@ pub struct Timeline { pub queried_at: String, } -pub fn request(client: C, access_token: &String, id: &u32, fromdate: &String) -> Result { +pub fn request(client: C, access_token: &String, id: &u32, fromdate: &String) -> Result { let path = format!("{}/{}{}", PATH, id, PATH2); let access_token = String::from(access_token); let parameters = vec![ diff --git a/src/http/update_token.rs b/src/http/update_token.rs index a40abb5..30c315f 100644 --- a/src/http/update_token.rs +++ b/src/http/update_token.rs @@ -1,5 +1,5 @@ use serde::{Deserialize, Serialize}; -use crate::{errors::*, http::client::SHClient}; +use crate::{errors::*, http::client::SHNClient}; const PATH: &str = "/v2/update_token"; @@ -22,7 +22,7 @@ pub struct UpdateTokenReq { pub refresh_token: String } -pub fn request(client: C, refresh_token: &String) -> Result { +pub fn request(client: C, refresh_token: &String) -> Result { let refresh_token = String::from(refresh_token); let update_token_json = UpdateTokenReq { refresh_token }; diff --git a/src/lib.rs b/src/lib.rs index 474c4c6..e6ae5cd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -46,7 +46,7 @@ pub mod errors { use std::path::PathBuf; use chrono::{NaiveDateTime}; -use crate::http::client::SHClient; +use crate::http::client::SHNClient; #[derive(Debug, Clone, Copy, PartialEq)] pub enum Kind { @@ -56,7 +56,7 @@ pub enum Kind { Voice, } -pub struct Config<'a, C: SHClient> { +pub struct Config<'a, C: SHNClient> { pub name: Vec<&'a str>, pub from: Option, pub kind: Vec, diff --git a/src/message/saver.rs b/src/message/saver.rs index 5741c9e..bbe5e11 100644 --- a/src/message/saver.rs +++ b/src/message/saver.rs @@ -7,15 +7,15 @@ use chrono::NaiveDateTime; use crate::{ errors::*, Config, message, Kind, - http::{self, groups::Groups, tags::Tags, timeline::TimelineMessages, client::SHClient}, + http::{self, groups::Groups, tags::Tags, timeline::TimelineMessages, client::SHNClient}, message::file::{Text, Picture, SaveToFile, Video, Voice}, }; -pub struct Saver<'a, C: SHClient> { - config: &'a Config<'a, C> +pub struct Saver<'a, C: SHNClient> { + config: &'a Config<'a, C>, } -impl<'b, C: SHClient> Saver<'b, C> { +impl<'b, C: SHNClient> Saver<'b, C> { pub fn new<'a>(config: &'a Config) -> Saver<'a, C> { Saver { config } } From 0dce333f48c101e2a5d1515f5ed2ad2d05e54834 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 17:42:44 +0900 Subject: [PATCH 14/18] support multiple 'group'. do not save if a refresh token is not specified for a group --- src/bin/colmsg/main.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/bin/colmsg/main.rs b/src/bin/colmsg/main.rs index e241ab7..ffed69e 100644 --- a/src/bin/colmsg/main.rs +++ b/src/bin/colmsg/main.rs @@ -23,23 +23,26 @@ fn run_controller(config: &Config) -> Result { } fn run_sakurazaka(app: &App) -> Result { - match app.matches.value_of("group") { - Some("hinatazaka") => Ok(true), - _ => { - let config: Config = app.sakurazaka_config()?; - run_controller(&config) - } - } + if let None = app.matches.value_of("s_refresh_token") { return Ok(true) }; + let is_run_by_group = match app.matches.values_of("group") { + Some(k) => k.clone().any(|v| v == "sakurazaka"), + None => true + }; + if !is_run_by_group { return Ok(true) }; + let config: Config = app.sakurazaka_config()?; + run_controller(&config) } fn run_hinatazaka(app: &App) -> Result { - match app.matches.value_of("group") { - Some("sakurazaka") => Ok(true), - _ => { - let config: Config = app.hinatazaka_config()?; - run_controller(&config) - } - } + if let None = app.matches.value_of("h_refresh_token") { return Ok(true) }; + let is_run_by_group = match app.matches.values_of("group") { + Some(k) => k.clone().any(|v| v == "hinatazaka"), + None => true + }; + if !is_run_by_group { return Ok(true) }; + let config: Config = app.hinatazaka_config()?; + run_controller(&config) +} } fn run() -> Result { From 11649412a2bbd944bbc4c9aacd7986c9734b7585 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 17:45:15 +0900 Subject: [PATCH 15/18] enable nogizaka messages to be saved in accordance with existing system. --- src/bin/colmsg/main.rs | 24 ++++++++++++++++++++++++ src/message/saver.rs | 6 ++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/bin/colmsg/main.rs b/src/bin/colmsg/main.rs index ffed69e..819ee6b 100644 --- a/src/bin/colmsg/main.rs +++ b/src/bin/colmsg/main.rs @@ -43,6 +43,16 @@ fn run_hinatazaka(app: &App) -> Result { let config: Config = app.hinatazaka_config()?; run_controller(&config) } + +fn run_nogizaka(app: &App) -> Result { + if let None = app.matches.value_of("n_refresh_token") { return Ok(true) }; + let is_run_by_group = match app.matches.values_of("group") { + Some(k) => k.clone().any(|v| v == "nogizaka"), + None => true + }; + if !is_run_by_group { return Ok(true) }; + let config: Config = app.nogizaka_config()?; + run_controller(&config) } fn run() -> Result { @@ -81,6 +91,20 @@ fn run() -> Result { } } + if let Err(_e) = &result { return result; } + + let mut result = run_nogizaka(&app); + loop { + match &result { + Err(Error(ReqwestError(re), _)) => { + if Some(StatusCode::UNAUTHORIZED) != re.status() { break; }; + delete_access_token_file()?; + result = run_nogizaka(&app); + } + _ => { break; } + } + } + result } diff --git a/src/message/saver.rs b/src/message/saver.rs index bbe5e11..70d1a18 100644 --- a/src/message/saver.rs +++ b/src/message/saver.rs @@ -51,9 +51,11 @@ impl<'b, C: SHNClient> Saver<'b, C> { let mut group = "".to_string(); let mut gen = "".to_string(); tags.iter().for_each(|t| { - if g.tags.contains(&t.uuid) && t.meta.dimension.is_some() { group = t.name.clone(); } - if g.tags.contains(&t.uuid) && t.meta.dimension.is_none() { gen = t.name.clone(); } + let dimension = t.meta.as_ref().and_then(|meta| meta.dimension.as_ref()); + if g.tags.contains(&t.uuid) && dimension.is_some() { group = t.name.clone(); } + if g.tags.contains(&t.uuid) && dimension.is_none() { gen = t.name.clone(); } }); + // 乃木坂の場合はg.tagsに世代情報(1期, 2期)が存在しないため全員乃木坂ディレクトリ以下に保存される member_identifier_vec.push(MemberIdentifier::new( g.id, self.trim(&g.name), group, gen, g.subscription.is_some(), )); From 7c30d08498fcf2ad06962797f3d704d64f8840f4 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 22:41:14 +0900 Subject: [PATCH 16/18] add past_messages to api.kh.glastonr.net OpenApi file --- api/api-kh-glastonr-net.yaml | 163 +++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/api/api-kh-glastonr-net.yaml b/api/api-kh-glastonr-net.yaml index 04dfe3a..2b77a97 100644 --- a/api/api-kh-glastonr-net.yaml +++ b/api/api-kh-glastonr-net.yaml @@ -1531,6 +1531,169 @@ paths: value: code: unauthorized message: 認証情報エラー + '/v2/groups/{id}/past_messages': + parameters: + - schema: + type: string + name: id + in: path + required: true + get: + summary: '/v2/groups/{id}/past_messages?order=asc' + operationId: get-v2-group-id-past_messages + description: 特定メンバーの購読前のメッセージを取得 + parameters: + - $ref: './components/schemas/RequestHeaderAccept.yaml' + - $ref: './components/schemas/RequestHeaderContent-type.yaml' + - $ref: '#/components/parameters/RequestHeaderX-Talk-App-ID' + - $ref: './components/schemas/RequestHeaderAccept-Language.yaml' + - $ref: './components/schemas/RequestHeaderTE.yaml' + - $ref: './components/schemas/RequestHeaderUser-Agent.yaml' + - $ref: '#/components/parameters/RequestHeaderHost' + - $ref: './components/schemas/RequestHeaderConnection.yaml' + - $ref: './components/schemas/RequestHeaderAccept-Encoding.yaml' + - $ref: './components/schemas/RequestHeaderAuthorization.yaml' + - schema: + type: string + enum: + - asc + - desc + in: query + name: order + required: true + responses: + '200': + description: OK + headers: + Cache-Control: + $ref: './components/schemas/ResponseHeaderCache-Control.yaml' + Content-Type: + $ref: './components/schemas/ResponseHeaderContent-Type.yaml' + Date: + $ref: './components/schemas/ResponseHeaderDate.yaml' + Pragma: + $ref: './components/schemas/ResponseHeaderPragma.yaml' + Content-Length: + $ref: './components/schemas/ResponseHeaderContent-Length.yaml' + Connection: + $ref: './components/schemas/ResponseHeaderConnection.yaml' + Vary: + $ref: './components/schemas/ResponseHeaderVary.yaml' + X-Request-Id: + $ref: './components/schemas/ResponseHeaderX-Request-Id.yaml' + content: + application/json: + schema: + oneOf: + - $ref: './components/schemas/PastMessages.yaml' + examples: + text: + value: + messages: + - group_id: 12 + id: 158213 + is_favorite: false + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:10:07Z' + state: published + text: "こんにちは☀︎\r\n昨日からサントリーさんの緑茶「伊右衛門」のWebCMにほのすと出演させて頂いていますが‪\uD83C\uDF75‬悪魔のおにぎりと一緒に楽しんでくださいな☺︎" + type: text + updated_at: '2020-04-14T02:11:27Z' + picture: + value: + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg?Expires=1592113752&Signature=PIjm0GhyD1yYUR~4XIWZZxLY8fi9BexKbY0Rd37SNxdgK7vf5u5~QKKiHUGiQ66iOAW01G1Vb85DKlJAoPFAfyMGEE0wVtpCVTKE84J4c3dKZ35u4-aZN3a5Vh8q36iu5opkUEwj3mW2Lg8~9F2gqkAUKYL086~v6EdJ3zaV~LkE19Br3POhBcp3SQ8qekEraFxivTgHrc7KGWDkrFU~v~~tKyw4KUH02K37ryRfMOdUzzvOFglHn~EZWoHcEpjFMUgmUcajBCGYKGwH3Jj9Q-mVeUyI9~Sft4afX4QljuXTBEDfZIOQRycxB9Pwxc-T~fLF7nrByAsWBCCSq5uXvQ__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157690 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T08:53:33Z' + state: published + text: 米粉蒸しパンを作ってみたら大きく膨れすぎました(笑) + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/18b0a4b59e215d1e891ad16bc278390907c9026b4bead5f89af1487d39dec366.jpg-00001.jpg?Expires=1592113752&Signature=P~Vsv2OE1hFWF5FVMmWcTe3nclxOFjhHn0gQvKHpFMIjk6YQUZn-wwuk3wNtkLGqi9QrbRAGa9tshoQmtYMVq11BWlAwVbRhmEBFc3pMx~CJONpPwuKKUBq13wQP9tdbnGOiRoJjezs4cJMvVwP0OmXLBZ~cCd6k0PCkCW59lKFjwgTHntLD8mJwqGuAK9JVRXb5p5raly6QbYo4V7G-M6Q7-En90ZM0bJz~EmUBQl3TNhdQkTWw-Wc0f3BO90xA~0bU6y9CA14NwVRVzYptnUPKZQzidzYvez~TqI0-KlqVVkFk4-CRz6GyIIWDFFyzFahLeLa9nO9kNPyvwuOEdA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 170 + thumbnail_width: 240 + type: picture + updated_at: '2020-04-11T08:54:55Z' + video: + value: + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4?Expires=1592113752&Signature=wHrXBz1gsCG2FJdfPdTSA713bL8r6kHRgwPDMBrnL6HBzRTiD7CVOct-H3-zVBBwEOMODRElw92LrymcFJjArSzVG5xZPb2Y1GgPrhaau5PnaVUmQDxqPxRkczczH~YurlnzHB9hDWEXv08Jn0CPFGNjgWvH18T60h3hkbuqM4v0zqJxSaTLBKXvsK6BA-PJFPMlo4BpBisxScWeH0MPB9L6pA0xvrezKTuJwQmt7X64PGSiWhlnlkezoHmC5YaEfdmfwaXl46y~k24Dg2yrXaz7rkNmDFzLuwWpaEiMH931fchJtytrw8moFM51Olqk2EaRXDEsMooybTkaNFqljg__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 158214 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-14T02:15:07Z' + state: published + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/050888aa9c14b5eb54212440528856dc5e5afc2773ee8dc83a721a5ecd2ef617.mp4-00001.jpg?Expires=1592113752&Signature=cd98xaVmPSNhj7Giez-M5-Kp2uVhblLZNO0IqdUAARcxdvH8fCT~7Pc8qGzkU7jinefDlmxKTkRQ7oUAjMxZBmwuCv9eTELpsexgeyDYx~LqJUOdHYMF7QLYRf1DHVmoHtkle9SACoqvuka0dFX3NBcE7Z5vrS7mDPYfZbzarKPvCHMQr-mnafatOcCiPEuhMvqhjY-gv4lgV4cqrPnxUftng3o~gLk8M~WC8~VnBwOAM-X39jAFUKk2hf41aVHqgCs8eApaPvrDwfIzFzsTktNqqkOSZUs8DPddrDs~ohSa8gFEu7d49JiubgbCZ53zwRS12EqfTEPcBPF44RJDIw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 240 + thumbnail_width: 320 + type: video + updated_at: '2020-04-14T02:16:26Z' + voice: + value: + messages: + - file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/contents/202004/245bf6fd021ec120835fc96ffddb446b9e6adfcf2a9c7d004351437c6b7c5fd7.mp4?Expires=1592113752&Signature=lwbG3C1mfQ13oWpHSL8xxaxAG6QTJGmsYdWIkFK3NFQQXPrerOmE1ySaVKVaNOg2eZv9RYpkNOi5xOTUHHm6NhdFvRfs3cogfRsoVNgEJAyLcob6pJKSAXTczoE-q~OOegjpp5n4RkMYi5xB9L5qsUCd6poqAbiIhAE5bbB2BeiAscJ5vUAqJpW9V6PiVSsmTdjE72de9nuG9Lol1GP0cJlh~OXNzBUuYAfMvKxYMOAOiaoFrOXrki9B4Z0OkdNihyZAMYMuMSNLP9RghVP-u9InVol4eaeexORDgjaaO8G7uSkA~PRfcd7m8tPWloVZduc8EeOmJwkL0~dm8q4wsw__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 157764 + is_favorite: true + is_silent: false + member_id: 12 + published_at: '2020-04-11T10:48:40Z' + state: published + type: voice + updated_at: '2020-04-11T10:50:03Z' + letter: + value: + letters: + - client_token: VI4PoKp9EeqI1wahea/0DFSOD6mqfRHqiNcGoXmv9Aw= + created_at: '2020-04-06T10:42:54Z' + file: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg?Expires=1592113752&Signature=IN8Fb8mOYsoDQcMijdn4xn7PS92-oRbJerxOE7KaK6B7LWi-ejkM9GXZqWQxy13rB0hQH~dsewfFYa-K4OJd3sZZjt97fP0UJoYRFmlaslGfPRyDaxO8CXJvYfpug3RUUS9Hbx0tt-MWxkJqbWxRqihpvRW64XAt47nkOJkmaj-SHMJK3q6grJDYwej4XJQgtc6VIGl3-DKAIUH22l5ztohftkrrckIdj1xOBcvNBBG-gpXFYZGtdi3OsbG9vHjBppIXua5FowiCJ0Jk19IQo5ktlQBhtd96goSNsFNZzfsfJSeVyuXtil79Mb0I2AeZloXR8ni3bKXWLT~W1JW78w__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + group_id: 12 + id: 1030494 + is_favorite: false + member_id: 12 + opened_at: '2020-04-07T03:57:08Z' + text: "はじめでレター送ります!" + thumbnail: 'https://d3ux740zhdvrpf.cloudfront.net/private/legacy-K/fanletter/93e47dac-533c-437a-83b3-2b4a85f39398/9bb6ec3aa999f7e9d7d52c5ac8b9e4926604049dcf17e1adbf0e224b523f5063.jpg-00001.jpg?Expires=1592113752&Signature=Dftz~blkdErkR16UetMcj1fB0Qpap9PoXFmXvnqDPq-qYqhkLe1qNVnO6HGPwCqrIhGZ95Vaw6jJxrQoDycQH8tYXJn9Vy3kT6DBSAp1pxr0lSF9Isx1NHLav0xIlxM8YC4e4BbqbW9AbtQPsiPp4XIIQ080TmSfkkRSX~IDyGoJVtIvHZIRkJ9fv7v-y-SV1knfLtmuLqLvd8Gkb~RP1qbwWXmznGm3XUDXTwcQy6bCKGi~3frgtX9QWv83VHtIiAkfO3eb47cvcQtSec4CBURZnBy7nbU9CZyBtBOSoukn5D9oHo1w352Jd6lb-7RB3a-CthbUQdKEhNdgWRQKjA__&Key-Pair-Id=APKAJUMGZKQSY7SBEKVQ' + thumbnail_height: 480 + thumbnail_width: 320 + updated_at: '2020-04-07T03:57:08Z' + canceled: + value: + messages: + - group_id: 48 + id: 118504 + is_favorite: true + is_silent: false + member_id: 84 + published_at: '2019-06-24T04:50:31Z' + state: canceled + type: picture + updated_at: '2019-06-24T04:53:29Z' + '401': + description: Unauthorized + content: + application/json: + schema: + type: object + properties: + code: + type: string + enum: + - unauthorized + message: + type: string + enum: + - 認証情報エラー + examples: + example: + value: + code: unauthorized + message: 認証情報エラー components: schemas: MembersEnum: From 02b357f7034e55044f940d8cd9d574c5ddd5ea9a Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 22:42:16 +0900 Subject: [PATCH 17/18] fix docs for nogizaka46 --- README.md | 50 ++++++++++++++++++--------------- doc/how_to_get_refresh_token.md | 7 +++-- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 0b6d44a..49198de 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ -# 櫻坂46メッセージのロゴ日向坂46メッセージのロゴ colmsg +# 櫻坂46メッセージのロゴ日向坂46メッセージのロゴ乃木坂46メッセージのロゴ colmsg -[「欅坂46/日向坂46 メッセージ」アプリを使用していた方へ](doc/changes_about_sakurazaka_and_hinatazaka_app.md) - -「櫻坂46メッセージ」「日向坂46メッセージ」アプリのメッセージをPCに保存します。 +「櫻坂46メッセージ」「日向坂46メッセージ」「乃木坂46メッセージ」アプリのメッセージをPCに保存します。 ![sample.png](https://user-images.githubusercontent.com/3148511/85219015-fef60580-b3da-11ea-8b99-51666d27abe3.png) @@ -10,16 +8,16 @@ `colmsg` のインストール方法は[こちら](#インストール)を参照してください。 -**まず初めに**「櫻坂46メッセージ」「日向坂46メッセージ」アプリそれぞれのrefresh_tokenを取得してください。 +**まず初めに**refresh_tokenを取得してください。 取得方法は[こちら](doc/how_to_get_refresh_token.md)を参照してください。 取得出来たら以下を実行してください。 -`` , `` に「櫻坂46メッセージ」「日向坂46メッセージ」それぞれで取得してきたrefresh_tokenを入れてください。 -※片方のアプリのみ購読している方は片方のみを指定してください。 +`` , `` , `` に「櫻坂46メッセージ」「日向坂46メッセージ」「乃木坂46メッセージ」それぞれで取得してきたrefresh_tokenを入れてください。 +※ 指定するのは購読しているアプリのみで問題ありません。 購読しているメンバー全員の全期間のメッセージが保存されます。 ```shell script -colmsg --s_refresh_token --h_refresh_token +colmsg --s_refresh_token --h_refresh_token --n_refresh_token ``` Windowsの場合は実行ファイル名を `colmsg.exe` に読み替えてください。 @@ -30,9 +28,10 @@ Windowsの場合は実行ファイル名を `colmsg.exe` に読み替えてく * ✅ Android, iosアプリどちらにも対応しています * ✅ Windows, macos, Linuxで実行できます * ✅ 様々な保存方法が選べます -* ✅ 2020年10月14日のアプリアップデート後のバージョンに対応しています - * 「櫻坂46メッセージ」: バージョン1.0.00.65 - * 「日向坂46メッセージ」: バージョン2.1.00.10020.68 +* ✅ 以下のアプリのバージョンに対応しています + * 「櫻坂46メッセージ」: バージョン1.3.00.120 + * 「日向坂46メッセージ」: バージョン2.4.00.120 + * 「乃木坂46メッセージ」: バージョン1.0.02.121 ## 使い方 @@ -79,15 +78,17 @@ colmsg --help * 既にいくつかメッセージが保存されている場合にコマンドを実行すると、最後に保存したメッセージ以降のメッセージを取得して保存します * 保存されるメッセージは次のディレクトリ構造で保存されます * ```shell script - colmsg/ - ├── 日向坂46 一期生 - │   └── 佐々木久美 - │   ├── 1_0_20191231235959.txt - │   └── 2_1_20200101000000.jpg - └── 櫻坂46 一期生 - └── 菅井友香 - ├── 3_2_20200101000001.mp4 - └── 4_3_20200101000002.mp4 + colmsg/ + ├── 日向坂46 一期生 + │   └── 佐々木久美 + │   └── 1_0_20191231235959.txt + ├── 乃木坂46 + │   └── 秋元真夏 + │   └── 2_1_20200101000000.jpg + └── 櫻坂46 一期生 + └── 菅井友香 + ├── 3_2_20200101000001.mp4 + └── 4_3_20200101000002.mp4 ``` * ファイル名の形式は `<シーケンス番号>_<種類>_<日付>.<拡張子>` となっています * シーケンス番号はメッセージの時系列を表す番号になっています。若い数字程昔のメッセージです。ファイルブラウザで辞書順に並べると保存したメッセージが時系列通りに並びます @@ -129,6 +130,9 @@ export COLMSG_CONFIG_PATH="/path/to/colmsg.conf" # h_refresh_tokenを指定 --h_refresh_token h_refresh_token +# n_refresh_tokenを指定 +--n_refresh_token n_refresh_token + # メディアファイルだけ保存するように設定 -k image -k video -k voice ``` @@ -169,17 +173,17 @@ yay -S colmsg ```shell make server/kh +make server/n46 ``` -モックサーバのbase urlを環境変数 `S_BASE_URL` , `H_BASE_URL` で指定することが出来ます。 +環境変数 `S_BASE_URL` , `H_BASE_URL` , `N_BASE_URL` を指定することでモックサーバーへリクエストすることが出来ます。 ```shell script -S_BASE_URL=http://localhost:8003 H_BASE_URL=http://localhost:8003 cargo run -- -d ~/Downloads/temp/ --help +S_BASE_URL=http://localhost:8003 H_BASE_URL=http://localhost:8003 N_BASE_URL=http://localhost:8006 cargo run -- -d ~/Downloads/temp/ --help ``` ## TODO -* [ ] deleteの実装 * [ ] CIによる自動テスト * [ ] examplesの用意 * [ ] メッセージ保存処理の並列化 diff --git a/doc/how_to_get_refresh_token.md b/doc/how_to_get_refresh_token.md index d7a90e2..d3a97ac 100644 --- a/doc/how_to_get_refresh_token.md +++ b/doc/how_to_get_refresh_token.md @@ -3,7 +3,7 @@ ## はじめに 以下で説明する方法によってデータ損失等が発生する可能性があります。自己責任でお願いします。 -また、以下の説明に用いている画像は「欅坂46/日向坂46 メッセージ」アプリのものですが、「櫻坂46メッセージ」「日向坂46メッセージ」共に同様の方法でrefresh_tokenは取得可能なため、適宜それぞれのアプリ用に読み替えてください。 +また、以下の説明に用いている画像は「欅坂46/日向坂46 メッセージ」アプリのものですが、「櫻坂46メッセージ」「日向坂46メッセージ」「乃木坂46メッセージ」共に同様の方法でrefresh_tokenは取得可能なため、適宜それぞれのアプリ用に読み替えてください。 ## 外部サービス連携 @@ -36,7 +36,10 @@ Android 6 以前を使用している人の場合は [Androidアプリ共通の Android 7 以降を使用している人の場合は後述するmitmproxyが動作しないため、[Genymotion](https://www.genymotion.com/)などのエミュレータを使用し、Android 6 以前の環境を作ってください。 [こちらの記事](https://qiita.com/sou_lab/items/bb06bb653b291c90bf45)などを参考にしてGenymotionにGoogle Play ストアを入れてください。 -その後「櫻坂46メッセージ」「日向坂46メッセージ」アプリをインストールしてください。 +その後「櫻坂46メッセージ」「日向坂46メッセージ」「乃木坂46メッセージ」アプリをインストールしてください。 + +※ Google Play ストアからインストール出来ない場合はインターネット上からapkファイルを探して直接インストールしてください(APKPureなど)。 + [Androidアプリ共通のデータ削除](#Androidアプリ共通のデータ削除) へ進んでください。 #### Androidアプリ共通のデータ削除 From a9a9ecdd402fbc80e57bf77b2774dc647a8ca2a8 Mon Sep 17 00:00:00 2001 From: proshunsuke Date: Sat, 12 Mar 2022 22:42:33 +0900 Subject: [PATCH 18/18] save past_messages --- src/http/mod.rs | 1 + src/http/past_messages.rs | 21 +++++++++++++++++++++ src/message/saver.rs | 6 ++++++ 3 files changed, 28 insertions(+) create mode 100644 src/http/past_messages.rs diff --git a/src/http/mod.rs b/src/http/mod.rs index a712c7c..e9bda4e 100644 --- a/src/http/mod.rs +++ b/src/http/mod.rs @@ -3,3 +3,4 @@ pub mod update_token; pub mod groups; pub mod tags; pub mod timeline; +pub mod past_messages; diff --git a/src/http/past_messages.rs b/src/http/past_messages.rs new file mode 100644 index 0000000..2413ce4 --- /dev/null +++ b/src/http/past_messages.rs @@ -0,0 +1,21 @@ +use serde::{Deserialize, Serialize}; +use crate::{errors::*, http::client::SHNClient, http::timeline::TimelineMessages}; + +const PATH: &str = "/v2/groups"; +const PATH2: &str = "/past_messages"; +const ORDER: &str = "asc"; + +#[derive(Serialize, Deserialize, Debug)] +pub struct PastMessages { + pub messages: Vec, +} + +pub fn request(client: C, access_token: &String, id: &u32) -> Result { + let path = format!("{}/{}{}", PATH, id, PATH2); + let access_token = String::from(access_token); + let parameters = vec![ + ("order", ORDER) + ]; + + client.get_request::(path.as_str(), &access_token, Some(parameters), true) +} diff --git a/src/message/saver.rs b/src/message/saver.rs index 70d1a18..bcfb39e 100644 --- a/src/message/saver.rs +++ b/src/message/saver.rs @@ -78,6 +78,12 @@ impl<'b, C: SHNClient> Saver<'b, C> { None => self.latest_date(&id_dates)? }; + // 購読開始から24時間前までに配信されたメッセージを保存する + let past_messages = http::past_messages::request(self.config.client.clone(), &self.config.access_token, &member_identifier.id)?; + for message in &past_messages.messages { + self.save_message(&message, &id_dates, &member_dir_buf)? + }; + // 購読しているメンバーのメッセージを取得するAPIを複数回叩くためのループ loop { let timeline = http::timeline::request(self.config.client.clone(), &self.config.access_token, &member_identifier.id, &fromdate)?;