Repository: YuzuRyo61/Misskey.py (language: python)

Issue:
Add support drive upload via BytesIO
Currently, Misskey.py only supports drive upload with specify file path.
But we often use on-memory processing to suppress disk usage and fast processing.
I hope that it can upload using BytesIO.

Example:
```py
from Misskey import Misskey
from PIL import Image, ImageDraw, ImageFont
msk = Misskey(i='xxxxxxx')
bio = io.BytesIO()

# some code here...

image.save(bio, 'PNG', optimize=True)

bio.seek(0)

file = msk.drive_files_create(bio, 'temp.png')
```


Discussion / hints:

Fix patch:
diff --git a/.coveragerc b/.coveragerc
new file mode 100644
index 0000000..342cc96
--- /dev/null
+++ b/.coveragerc
@@ -0,0 +1,2 @@
+[run]
+include = misskey/*
diff --git a/.coveralls.yml b/.coveralls.yml
deleted file mode 100644
index c6c602c..0000000
--- a/.coveralls.yml
+++ /dev/null
@@ -1,1 +0,0 @@
-repo_token: D0jph5jHJkX4TVKWSFcr0tIlGv0885e00
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..7fcde16
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[{*.yml,*.yaml}]
+indent_size = 2
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..e3e60f5
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,11 @@
+[flake8]
+exclude =
+    .git,
+    __pycache__,
+    docs/source/conf.py,
+    old,
+    build,
+    dist,
+    .venv,
+    misskey/legacy,
+    tests
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..87bcbf4
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,25 @@
+name: Publish to Pypi
+on:
+  release:
+    types: [published]
+jobs:
+  deploy:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - name: Set up Python
+      uses: actions/setup-python@v2
+      with:
+        python-version: 3.9
+    - name: Install dependencies
+      run: |
+        python -m pip install --upgrade pip
+        pip install --upgrade pipenv
+        pipenv sync --dev --bare
+    - name: Build package
+      run: pipenv run setup.py bdist_wheel
+    - name: Publish package
+      uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
+      with:
+        user: __token__
+        password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 0706d65..b9d7379 100644
--- a/.gitignore
+++ b/.gitignore
@@ -116,24 +116,12 @@ dmypy.json
 # Pyre type checker
 .pyre/
 
-# test files
-response*.json
-sample/key/*
-apiToken.txt
-
 # IDEA
 .idea
 
-# CUSTOM
-test/websocket-test.py
-test/websocket-test_reversi.py
-
 # TEMP FOLDER
 tmp/
 
-# IGNORE OLD SCRIPT
-/Misskey/MisskeyOld.py
-
 # Editor
 .vscode
 
@@ -141,4 +129,6 @@ tmp/
 *.ini
 !env.sample.ini
 !tox.ini
-requirements.tmp.txt
+
+# Docker compose volumes
+/.docker-compose/
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index e9930a8..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-language: python
-python:
-- 3.7
-before_install:
-- sudo apt-get update
-- sudo apt-get install -y libyaml-dev
-- pip3 install pipenv --upgrade-strategy=only-if-needed
-install:
-- pipenv --python 3
-- pipenv sync --dev --bare
-script:
-- pipenv run test
-after_success:
-- pipenv run reporttest
-deploy:
-  provider: pypi
-  user: __token__
-  password:
-    secure: gqxQi7RGZOunmk4NRR9KBjFoLVE21mmd+Nsiku7yrpIilJ5fmtvqtmiMPTsLSvrYRuKCiVx83mOrKMT8Uaq9GMiUv/s9srfXrpV6UVc5xrXry+SPbxCRPn5p/qcglf2HyoPJSrWxEnQe2PnmZQf99kpeHoXXa4Y/CJz6ir61ud9bSLAnscoEmyV3pdfzfsLil85wHsjR7nGl4jOPByKdKBQu8FAcADcqu0hsJUAoubnmGNG7ckad6/IY8k/l0JlOXjZiA47y1dEvkZLYZOHHgycX38XLR/FreqvpEe5OWfKPUXJILas2UyMJE519pwDgr6PfBh3ZwrD5uvVvGWEjucp9sq73FQDY+dADLlTz1BVGICeA8AUF85M2pxDg3iqj9yTGDIS22od+IhhLFAnTZoB2zpzJtPC7aBTDqVuTrVFP/ZZWTCToWx3DcH9CUCCg37muSyPtEcwu4q+23MHKx2SmHlXaxhZ1vJdQ3C7lt9dCT2FoQAXpEdo0sHOI20AOGpebCkBGoQPlMgpRLFKRFeoy9cy6CUbyJMmdjcc0R3tKsesrmMK8KKHDKwklVheiU+oIAlRkNjwrCmBxKtaYPW4irmwpWGVEN3hcCJWjONiZH+OnLjPpKp5g4CNqd9ajX/RbDsuUKUd30SVJkabMe29hQ/z7BfuSReRBnKN2Hns=
-  on:
-    tags: true
-  distributions: "bdist_wheel"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ad8b4eb..8a7feb1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,30 +1,3 @@
 # Contributing
 
-## Send a issue
-
-If you find a bug or want to support the new API, please suggest it.
-
-## Pull Request
-
-Performed when other API functions are implemented. It should be in the following format:
-
-```python
-# Original API URI is "example/new-api"
-def example_newApi(self, a=None, b=None):
-  """
-  This is example API
-  
-  :param a: This attribute is nullable
-  :param b: This attribute must not null (but optional)
-  :rtype: dict, list, or bool
-  """
-  payload = {
-    'a': a
-  }
-  
-  if b != None: # pragma: no cover
-    payload['b'] = b
-  
-  # (APIURI, isIncludeApiToken, expectHttpStatus, **kwargs(payload))
-  return self.__API('example/new-api', True, 200, **payload)
-```
+WIP
diff --git a/Pipfile b/Pipfile
index 8ac52e6..a02735c 100644
--- a/Pipfile
+++ b/Pipfile
@@ -5,29 +5,16 @@ verify_ssl = true
 
 [dev-packages]
 pylint = "*"
-coveralls = "*"
-coverage = "*"
-toml = "*"
-tox = "*"
-pyyaml = "*"
 pytest = "*"
-sphinx = "*"
-sphinx-rtd-theme = "*"
-sphinx-intl = "*"
-m2r = "*"
-vcrpy = "*"
-pytest-vcr = "*"
-importlib-metadata = "*"
 pytest-cov = "*"
+flake8 = "*"
+wheel = "*"
 
 [packages]
 requests = "*"
+m2r = "*"
 
 [requires]
 python_version = "3"
 
 [scripts]
-test = "tox"
-reporttest = "coveralls"
-build-pot = "sphinx-build -M gettext docs build"
-update-po = "sphinx-intl update -d docs/locales -p build/gettext -l ja"
diff --git a/Pipfile.lock b/Pipfile.lock
index 6d71cdc..a7a0537 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "d86855c13aff6993a71903e9a79bb5127bc346b35463a550531e121353c333cf"
+            "sha256": "8a08f4919906d8f2884fbbfb6d4d13030799ef29907821adfcae87e92ca94ded"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -18,65 +18,74 @@
     "default": {
         "certifi": {
             "hashes": [
-                "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3",
-                "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
+                "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee",
+                "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"
             ],
-            "version": "==2020.6.20"
+            "version": "==2021.5.30"
         },
-        "chardet": {
+        "charset-normalizer": {
             "hashes": [
-                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
-                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+                "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1",
+                "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"
             ],
-            "version": "==3.0.4"
+            "markers": "python_version >= '3'",
+            "version": "==2.0.3"
+        },
+        "docutils": {
+            "hashes": [
+                "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125",
+                "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
+            "version": "==0.17.1"
         },
         "idna": {
             "hashes": [
-                "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
-                "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+                "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a",
+                "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.10"
+            "markers": "python_version >= '3'",
+            "version": "==3.2"
+        },
+        "m2r": {
+            "hashes": [
+                "sha256:bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99"
+            ],
+            "index": "pypi",
+            "version": "==0.2.1"
+        },
+        "mistune": {
+            "hashes": [
+                "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e",
+                "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"
+            ],
+            "version": "==0.8.4"
         },
         "requests": {
             "hashes": [
-                "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
-                "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
+                "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
+                "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
             ],
             "index": "pypi",
-            "version": "==2.24.0"
+            "version": "==2.26.0"
         },
         "urllib3": {
             "hashes": [
-                "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a",
-                "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"
+                "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4",
+                "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
-            "version": "==1.25.10"
+            "version": "==1.26.6"
         }
     },
     "develop": {
-        "alabaster": {
-            "hashes": [
-                "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359",
-                "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"
-            ],
-            "version": "==0.7.12"
-        },
-        "appdirs": {
-            "hashes": [
-                "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41",
-                "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"
-            ],
-            "version": "==1.4.4"
-        },
         "astroid": {
             "hashes": [
-                "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703",
-                "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386"
+                "sha256:7b963d1c590d490f60d2973e57437115978d3a2529843f160b5003b721e1e925",
+                "sha256:83e494b02d75d07d4e347b27c066fd791c0c74fc96c613d1ea3de0c82c48168f"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==2.4.2"
+            "markers": "python_version ~= '3.6'",
+            "version": "==2.6.5"
         },
         "atomicwrites": {
             "hashes": [
@@ -88,245 +97,128 @@
         },
         "attrs": {
             "hashes": [
-                "sha256:0ef97238856430dcf9228e07f316aefc17e8939fc8507e18c6501b761ef1a42a",
-                "sha256:2867b7b9f8326499ab5b0e2d12801fa5c98842d2cbd22b35112ae04bf85b4dff"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==20.1.0"
-        },
-        "babel": {
-            "hashes": [
-                "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38",
-                "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.8.0"
-        },
-        "certifi": {
-            "hashes": [
-                "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3",
-                "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"
-            ],
-            "version": "==2020.6.20"
-        },
-        "chardet": {
-            "hashes": [
-                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
-                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
-            ],
-            "version": "==3.0.4"
-        },
-        "click": {
-            "hashes": [
-                "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a",
-                "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"
+                "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1",
+                "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==7.1.2"
+            "version": "==21.2.0"
         },
         "colorama": {
             "hashes": [
-                "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff",
-                "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"
+                "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
+                "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
             ],
-            "markers": "platform_system == 'Windows' and sys_platform == 'win32' and sys_platform == 'win32' and sys_platform == 'win32'",
-            "version": "==0.4.3"
+            "markers": "sys_platform == 'win32' and sys_platform == 'win32'",
+            "version": "==0.4.4"
         },
         "coverage": {
             "hashes": [
-                "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb",
-                "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3",
-                "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716",
-                "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034",
-                "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3",
-                "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8",
-                "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0",
-                "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f",
-                "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4",
-                "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962",
-                "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d",
-                "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b",
-                "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4",
-                "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3",
-                "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258",
-                "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59",
-                "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01",
-                "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd",
-                "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b",
-                "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d",
-                "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89",
-                "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd",
-                "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b",
-                "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d",
-                "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46",
-                "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546",
-                "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082",
-                "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b",
-                "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4",
-                "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8",
-                "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811",
-                "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd",
-                "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651",
-                "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0"
+                "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c",
+                "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6",
+                "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45",
+                "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a",
+                "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03",
+                "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529",
+                "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a",
+                "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a",
+                "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2",
+                "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6",
+                "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759",
+                "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53",
+                "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a",
+                "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4",
+                "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff",
+                "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502",
+                "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793",
+                "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb",
+                "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905",
+                "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821",
+                "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b",
+                "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81",
+                "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0",
+                "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b",
+                "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3",
+                "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184",
+                "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701",
+                "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a",
+                "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82",
+                "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638",
+                "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5",
+                "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083",
+                "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6",
+                "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90",
+                "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465",
+                "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a",
+                "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3",
+                "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e",
+                "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066",
+                "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf",
+                "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b",
+                "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae",
+                "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669",
+                "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873",
+                "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b",
+                "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6",
+                "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb",
+                "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160",
+                "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c",
+                "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079",
+                "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d",
+                "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"
             ],
-            "index": "pypi",
-            "version": "==5.2.1"
-        },
-        "coveralls": {
-            "hashes": [
-                "sha256:4430b862baabb3cf090d36d84d331966615e4288d8a8c5957e0fd456d0dd8bd6",
-                "sha256:b3b60c17b03a0dee61952a91aed6f131e0b2ac8bd5da909389c53137811409e1"
-            ],
-            "index": "pypi",
-            "version": "==2.1.2"
-        },
-        "distlib": {
-            "hashes": [
-                "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb",
-                "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"
-            ],
-            "version": "==0.3.1"
-        },
-        "docopt": {
-            "hashes": [
-                "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"
-            ],
-            "version": "==0.6.2"
-        },
-        "docutils": {
-            "hashes": [
-                "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
-                "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==0.16"
-        },
-        "filelock": {
-            "hashes": [
-                "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59",
-                "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"
-            ],
-            "version": "==3.0.12"
-        },
-        "idna": {
-            "hashes": [
-                "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
-                "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.10"
-        },
-        "imagesize": {
-            "hashes": [
-                "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
-                "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.2.0"
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
+            "version": "==5.5"
         },
-        "importlib-metadata": {
+        "flake8": {
             "hashes": [
-                "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83",
-                "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"
+                "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b",
+                "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"
             ],
             "index": "pypi",
-            "version": "==1.7.0"
+            "version": "==3.9.2"
         },
         "iniconfig": {
             "hashes": [
-                "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437",
-                "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"
+                "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3",
+                "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"
             ],
-            "version": "==1.0.1"
+            "version": "==1.1.1"
         },
         "isort": {
             "hashes": [
-                "sha256:0906e0e7092e060c05de709ad172e1ec1b26aa27fdd4e8093f257890cd881d18",
-                "sha256:8103bc070d9258fe97e82470cb30f0e4b730e94c44ac81ebae32b05d5a6c87ea"
-            ],
-            "markers": "python_version >= '3.6' and python_version < '4.0'",
-            "version": "==5.5.0"
-        },
-        "jinja2": {
-            "hashes": [
-                "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0",
-                "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"
+                "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899",
+                "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==2.11.2"
+            "markers": "python_version < '4' and python_full_version >= '3.6.1'",
+            "version": "==5.9.3"
         },
         "lazy-object-proxy": {
             "hashes": [
-                "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
-                "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
-                "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
-                "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
-                "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
-                "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
-                "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
-                "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
-                "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
-                "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
-                "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
-                "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
-                "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
-                "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
-                "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
-                "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
-                "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
-                "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
-                "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
-                "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
-                "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.4.3"
-        },
-        "m2r": {
-            "hashes": [
-                "sha256:bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99"
-            ],
-            "index": "pypi",
-            "version": "==0.2.1"
-        },
-        "markupsafe": {
-            "hashes": [
-                "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
-                "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
-                "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
-                "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
-                "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
-                "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
-                "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
-                "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
-                "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
-                "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
-                "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
-                "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
-                "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
-                "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
-                "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
-                "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
-                "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
-                "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
-                "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
-                "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
-                "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
-                "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
-                "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
-                "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
-                "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
-                "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
-                "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
-                "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
-                "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
-                "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
-                "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
-                "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
-                "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.1.1"
+                "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653",
+                "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61",
+                "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2",
+                "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837",
+                "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3",
+                "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43",
+                "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726",
+                "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3",
+                "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587",
+                "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8",
+                "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a",
+                "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd",
+                "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f",
+                "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad",
+                "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4",
+                "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b",
+                "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf",
+                "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981",
+                "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741",
+                "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e",
+                "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93",
+                "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
+            "version": "==1.6.0"
         },
         "mccabe": {
             "hashes": [
@@ -335,51 +227,13 @@
             ],
             "version": "==0.6.1"
         },
-        "mistune": {
-            "hashes": [
-                "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e",
-                "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"
-            ],
-            "version": "==0.8.4"
-        },
-        "more-itertools": {
-            "hashes": [
-                "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20",
-                "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==8.5.0"
-        },
-        "multidict": {
-            "hashes": [
-                "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a",
-                "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000",
-                "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2",
-                "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507",
-                "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5",
-                "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7",
-                "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d",
-                "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463",
-                "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19",
-                "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3",
-                "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b",
-                "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c",
-                "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87",
-                "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7",
-                "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430",
-                "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255",
-                "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==4.7.6"
-        },
         "packaging": {
             "hashes": [
-                "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8",
-                "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"
+                "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7",
+                "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==20.4"
+            "markers": "python_version >= '3.6'",
+            "version": "==21.0"
         },
         "pluggy": {
             "hashes": [
@@ -391,27 +245,35 @@
         },
         "py": {
             "hashes": [
-                "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2",
-                "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"
+                "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3",
+                "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.9.0"
+            "version": "==1.10.0"
         },
-        "pygments": {
+        "pycodestyle": {
             "hashes": [
-                "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44",
-                "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"
+                "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068",
+                "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==2.6.1"
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "version": "==2.7.0"
+        },
+        "pyflakes": {
+            "hashes": [
+                "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3",
+                "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "version": "==2.3.1"
         },
         "pylint": {
             "hashes": [
-                "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210",
-                "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"
+                "sha256:2e1a0eb2e8ab41d6b5dbada87f066492bb1557b12b76c47c2ee8aa8a11186594",
+                "sha256:8b838c8983ee1904b2de66cce9d0b96649a91901350e956d78f289c3bc87b48e"
             ],
             "index": "pypi",
-            "version": "==2.6.0"
+            "version": "==2.9.6"
         },
         "pyparsing": {
             "hashes": [
@@ -423,223 +285,41 @@
         },
         "pytest": {
             "hashes": [
-                "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4",
-                "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"
+                "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b",
+                "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"
             ],
             "index": "pypi",
-            "version": "==6.0.1"
+            "version": "==6.2.4"
         },
         "pytest-cov": {
             "hashes": [
-                "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191",
-                "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"
-            ],
-            "index": "pypi",
-            "version": "==2.10.1"
-        },
-        "pytest-vcr": {
-            "hashes": [
-                "sha256:23ee51b75abbcc43d926272773aae4f39f93aceb75ed56852d0bf618f92e1896",
-                "sha256:2f316e0539399bea0296e8b8401145c62b6f85e9066af7e57b6151481b0d6d9c"
-            ],
-            "index": "pypi",
-            "version": "==1.0.2"
-        },
-        "pytz": {
-            "hashes": [
-                "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed",
-                "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"
-            ],
-            "version": "==2020.1"
-        },
-        "pyyaml": {
-            "hashes": [
-                "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97",
-                "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76",
-                "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2",
-                "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648",
-                "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf",
-                "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f",
-                "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2",
-                "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee",
-                "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d",
-                "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c",
-                "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"
-            ],
-            "index": "pypi",
-            "version": "==5.3.1"
-        },
-        "requests": {
-            "hashes": [
-                "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
-                "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
-            ],
-            "index": "pypi",
-            "version": "==2.24.0"
-        },
-        "six": {
-            "hashes": [
-                "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
-                "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.15.0"
-        },
-        "snowballstemmer": {
-            "hashes": [
-                "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0",
-                "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"
-            ],
-            "version": "==2.0.0"
-        },
-        "sphinx": {
-            "hashes": [
-                "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8",
-                "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"
-            ],
-            "index": "pypi",
-            "version": "==3.2.1"
-        },
-        "sphinx-intl": {
-            "hashes": [
-                "sha256:2ff97cba0e4e43249e339a3c29dd2f5b63c25ce794050aabca320ad95f5c5b55",
-                "sha256:b25a6ec169347909e8d983eefe2d8adecb3edc2f27760db79b965c69950638b4"
-            ],
-            "index": "pypi",
-            "version": "==2.0.1"
-        },
-        "sphinx-rtd-theme": {
-            "hashes": [
-                "sha256:22c795ba2832a169ca301cd0a083f7a434e09c538c70beb42782c073651b707d",
-                "sha256:373413d0f82425aaa28fb288009bf0d0964711d347763af2f1b65cafcb028c82"
+                "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a",
+                "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"
             ],
             "index": "pypi",
-            "version": "==0.5.0"
-        },
-        "sphinxcontrib-applehelp": {
-            "hashes": [
-                "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a",
-                "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.0.2"
-        },
-        "sphinxcontrib-devhelp": {
-            "hashes": [
-                "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e",
-                "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.0.2"
-        },
-        "sphinxcontrib-htmlhelp": {
-            "hashes": [
-                "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f",
-                "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.0.3"
-        },
-        "sphinxcontrib-jsmath": {
-            "hashes": [
-                "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
-                "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.0.1"
-        },
-        "sphinxcontrib-qthelp": {
-            "hashes": [
-                "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72",
-                "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.0.3"
-        },
-        "sphinxcontrib-serializinghtml": {
-            "hashes": [
-                "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc",
-                "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"
-            ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.1.4"
+            "version": "==2.12.1"
         },
         "toml": {
             "hashes": [
-                "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f",
-                "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"
+                "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
+                "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
             ],
-            "index": "pypi",
-            "version": "==0.10.1"
-        },
-        "tox": {
-            "hashes": [
-                "sha256:e6318f404aff16522ff5211c88cab82b39af121735a443674e4e2e65f4e4637b",
-                "sha256:eb629ddc60e8542fd4a1956b2462e3b8771d49f1ff630cecceacaa0fbfb7605a"
-            ],
-            "index": "pypi",
-            "version": "==3.20.0"
-        },
-        "urllib3": {
-            "hashes": [
-                "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a",
-                "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
-            "version": "==1.25.10"
+            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "version": "==0.10.2"
         },
-        "vcrpy": {
+        "wheel": {
             "hashes": [
-                "sha256:4138e79eb35981ad391406cbb7227bce7eba8bad788dcf1a89c2e4a8b740debe",
-                "sha256:d833248442bbc560599add895c9ab0ef518676579e8dc72d8b0933bdb3880253"
+                "sha256:78b5b185f0e5763c26ca1e324373aadd49182ca90e825f7853f4b2509215dc0e",
+                "sha256:e11eefd162658ea59a60a0f6c7d493a7190ea4b9a85e335b33489d9f17e0245e"
             ],
             "index": "pypi",
-            "version": "==4.1.0"
-        },
-        "virtualenv": {
-            "hashes": [
-                "sha256:43add625c53c596d38f971a465553f6318decc39d98512bc100fa1b1e839c8dc",
-                "sha256:e0305af10299a7fb0d69393d8f04cb2965dda9351140d11ac8db4e5e3970451b"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==20.0.31"
+            "version": "==0.36.2"
         },
         "wrapt": {
             "hashes": [
                 "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"
             ],
             "version": "==1.12.1"
-        },
-        "yarl": {
-            "hashes": [
-                "sha256:040b237f58ff7d800e6e0fd89c8439b841f777dd99b4a9cca04d6935564b9409",
-                "sha256:17668ec6722b1b7a3a05cc0167659f6c95b436d25a36c2d52db0eca7d3f72593",
-                "sha256:3a584b28086bc93c888a6c2aa5c92ed1ae20932f078c46509a66dce9ea5533f2",
-                "sha256:4439be27e4eee76c7632c2427ca5e73703151b22cae23e64adb243a9c2f565d8",
-                "sha256:48e918b05850fffb070a496d2b5f97fc31d15d94ca33d3d08a4f86e26d4e7c5d",
-                "sha256:9102b59e8337f9874638fcfc9ac3734a0cfadb100e47d55c20d0dc6087fb4692",
-                "sha256:9b930776c0ae0c691776f4d2891ebc5362af86f152dd0da463a6614074cb1b02",
-                "sha256:b3b9ad80f8b68519cc3372a6ca85ae02cc5a8807723ac366b53c0f089db19e4a",
-                "sha256:bc2f976c0e918659f723401c4f834deb8a8e7798a71be4382e024bcc3f7e23a8",
-                "sha256:c22c75b5f394f3d47105045ea551e08a3e804dc7e01b37800ca35b58f856c3d6",
-                "sha256:c52ce2883dc193824989a9b97a76ca86ecd1fa7955b14f87bf367a61b6232511",
-                "sha256:ce584af5de8830d8701b8979b18fcf450cef9a382b1a3c8ef189bedc408faf1e",
-                "sha256:da456eeec17fa8aa4594d9a9f27c0b1060b6a75f2419fe0c00609587b2695f4a",
-                "sha256:db6db0f45d2c63ddb1a9d18d1b9b22f308e52c83638c26b422d520a815c4b3fb",
-                "sha256:df89642981b94e7db5596818499c4b2219028f2a528c9c37cc1de45bf2fd3a3f",
-                "sha256:f18d68f2be6bf0e89f1521af2b1bb46e66ab0018faafa81d70f358153170a317",
-                "sha256:f379b7f83f23fe12823085cd6b906edc49df969eb99757f58ff382349a3303c6"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==1.5.1"
-        },
-        "zipp": {
-            "hashes": [
-                "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b",
-                "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"
-            ],
-            "markers": "python_version >= '3.6'",
-            "version": "==3.1.0"
         }
     }
 }
diff --git a/README-JP.md b/README-JP.md
index 6d4ebc5..7ae5882 100644
--- a/README-JP.md
+++ b/README-JP.md
@@ -2,17 +2,14 @@
 
 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
 [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)
-[![Build Status](https://travis-ci.org/YuzuRyo61/Misskey.py.svg?branch=v1)](https://travis-ci.org/YuzuRyo61/Misskey.py)
-[![Coverage Status](https://coveralls.io/repos/github/YuzuRyo61/Misskey.py/badge.svg?branch=v1)](https://coveralls.io/github/YuzuRyo61/Misskey.py?branch=v1)
-[![Documentation Status](https://readthedocs.org/projects/misskeypy/badge/?version=latest)](https://misskeypy.readthedocs.io/en/latest/?badge=latest)
-
-> Do you looking for English version? [Click Here](README.md)
+[![Python test](https://github.com/YuzuRyo61/Misskey.py/actions/workflows/test.yml/badge.svg)](https://github.com/YuzuRyo61/Misskey.py/actions/workflows/test.yml)
+[![codecov](https://codecov.io/gh/YuzuRyo61/Misskey.py/branch/main/graph/badge.svg?token=97A1HJHUMW)](https://codecov.io/gh/YuzuRyo61/Misskey.py)
 
 Misskeyインスタンス用のPythonライブラリです。
 
 ※Python3でのみ使用できます。
 
-[Misskey](https://github.com/syuilo/misskey)は[syuilo](https://github.com/syuilo)氏が作成した分散型SNSソフトウェアです。
+[Misskey](https://github.com/misskey-dev/misskey) は [syuilo](https://github.com/syuilo) 氏が作成した分散型SNSソフトウェアです。
 
 ---
 
@@ -31,33 +28,37 @@ pip3 install Misskey.py
 ### ライブラリのインポートと初期化
 
 ```python
-from Misskey import Misskey
+from misskey import Misskey
+
+mk = Misskey("misskey.io")  # インスタンスアドレスを入力、未入力の場合は"misskey.io"が指定されます。
 
-misskey = Misskey("misskey.io") # インスタンスアドレスを入力、未入力の場合は"misskey.io"が指定されます。
+# ノートしてみましょう！
+mk.notes_create(
+    text="Hello Misskey.py!"
+)
 ```
 
 #### トークンキーを使用する
 
 ```python
-from Misskey import Misskey
+from misskey import Misskey
 
 # トークンを指定する場合
-misskey = Misskey("misskey.io", i="abcdef123...")
+mk = Misskey("misskey.io", i="abcdef123...")
 ```
 
 ### トークンを作成する
 
 ```python
-from Misskey import Misskey
-from Misskey.Util import MiAuth
+from misskey import Misskey, MiAuth
 
-auth = MiAuth("misskey.io", name="Misskey.py")
+auth = MiAuth("misskey.io", name="misskey.py")
 # 認証URLを取得し、クライアントのブラウザでこれを開きます。
-url = auth.getUrl()
+url = auth.generate_url()
 # 認証許可後、この関数を実行します。
 token = auth.check()
 # トークンを使ってMisskey.pyを使う場合は以下のようにします。
-misskey = Misskey("misskey.io", i=token["token"]) # または: misskey = Misskey("misskey.io", i=auth.token)
+mk = Misskey("misskey.io", i=token)  # または: misskey = misskey("misskey.io", i=auth.token)
 ```
 
 ## その他
diff --git a/README.md b/README.md
index 63dc7d3..ef5af58 100644
--- a/README.md
+++ b/README.md
@@ -2,17 +2,14 @@
 
 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
 [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE)
-[![Build Status](https://travis-ci.org/YuzuRyo61/Misskey.py.svg?branch=v1)](https://travis-ci.org/YuzuRyo61/Misskey.py)
-[![Coverage Status](https://coveralls.io/repos/github/YuzuRyo61/Misskey.py/badge.svg?branch=v1)](https://coveralls.io/github/YuzuRyo61/Misskey.py?branch=v1)
-[![Documentation Status](https://readthedocs.org/projects/misskeypy/badge/?version=latest)](https://misskeypy.readthedocs.io/en/latest/?badge=latest)
-
-> Japanese version available. [Click Here](https://github.com/YuzuRyo61/Misskey.py/blob/v2/README-JP.md).
+[![Python test](https://github.com/YuzuRyo61/Misskey.py/actions/workflows/test.yml/badge.svg)](https://github.com/YuzuRyo61/Misskey.py/actions/workflows/test.yml)
+[![codecov](https://codecov.io/gh/YuzuRyo61/Misskey.py/branch/main/graph/badge.svg?token=97A1HJHUMW)](https://codecov.io/gh/YuzuRyo61/Misskey.py)
 
 This script is Python library for Misskey Instance.
 
 This library is only available in Python3.
 
-[Misskey](https://github.com/syuilo/misskey) is made by [syuilo](https://github.com/syuilo).
+[Misskey](https://github.com/misskey-dev/misskey) is made by [syuilo](https://github.com/syuilo).
 
 ---
 
@@ -31,33 +28,37 @@ pip3 install Misskey.py
 ### import library (init)
 
 ```python
-from Misskey import Misskey
+from misskey import Misskey
+
+mk = Misskey("misskey.io")  # Input instance address (If leaved no attribute, it sets "misskey.io")
 
-misskey = Misskey("misskey.io") # Input instance address (If leaved no attribute, it sets "misskey.io")
+# Let's note!
+mk.notes_create(
+    text="Hello Misskey.py!"
+)
 ```
 
 #### Use token key
 
 ```python
-from Misskey import Misskey
+from misskey import Misskey
 
 # If use the token
-misskey = Misskey("misskey.io", i="abcdef123...")
+mk = Misskey("misskey.io", i="abcdef123...")
 ```
 
 ### Create token
 
 ```python
-from Misskey import Misskey
-from Misskey.Util import MiAuth
+from misskey import Misskey, MiAuth
 
-auth = MiAuth("misskey.io", name="Misskey.py")
+auth = MiAuth("misskey.io", name="misskey.py")
 # Get Authentication URL, then send to client browser
-url = auth.getUrl()
+url = auth.generate_url()
 # After permission granted, run this function
 token = auth.check()
-# To use Misskey.py with created token, please below
-misskey = Misskey("misskey.io", i=token["token"]) # or: misskey = Misskey("misskey.io", i=auth.token)
+# To use misskey.py with created token, please below
+misskey = Misskey("misskey.io", i=token)  # or: misskey = misskey("misskey.io", i=auth.token)
 ```
 
 ## Other
diff --git a/TODO.md b/TODO.md
deleted file mode 100644
index 1103051..0000000
--- a/TODO.md
+++ /dev/null
@@ -1,165 +0,0 @@
-# API TODO
-
-## app
-
-- [x] app/create
-- [ ] app/show
-- [x] app/session/generate
-- [x] app/session/userkey
-
-## blocking
-
-- [x] blocking/create
-- [x] blocking/delete
-- [x] blocking/list
-
-## users
-
-- [x] username/available
-- [x] users
-- [x] users/followers
-- [x] users/following
-- [ ] users/get-frequently-replied-users
-- [x] users/notes
-- [ ] users/recommendation
-- [x] users/relation
-- [ ] users/report-abuse
-- [ ] users/search
-- [x] users/show
-- [x] pinned-users (Misskey: >=11.12.0)
-
-## account
-
-- [x] i
-- [x] i/favorites
-- [x] i/notifications
-- [x] i/pin
-- [x] i/read-all-messaging-messages
-- [x] i/read-all-unread-notes
-- [x] i/unpin
-- [x] i/update
-- [ ] my/apps
-- [x] notifications/mark-all-as-read
-
-## drive
-
-- [x] drive
-- [x] drive/files
-- [x] drive/files/attached-notes
-- [x] drive/files/check-existence
-- [x] drive/files/create
-- [x] drive/files/delete
-- [x] drive/files/find
-- [x] drive/files/show
-- [x] drive/files/update
-- [x] drive/files/upload-from-url
-- [x] drive/folders
-- [x] drive/folders/create
-- [x] drive/folders/delete
-- [x] drive/folders/find
-- [x] drive/folders/show
-- [x] drive/folders/update
-- [x] drive/stream
-
-## hashtags
-
-- [ ] hashtags/list
-- [ ] hashtags/search
-- [ ] hashtags/trend
-- [ ] hashtags/users
-
-## notes
-
-- [x] notes
-- [ ] notes/children
-- [ ] notes/conversation
-- [x] notes/create
-- [x] notes/delete
-- [ ] notes/featured
-- [x] notes/global-timeline
-- [x] notes/hybrid-timeline
-- [x] notes/local-timeline
-- [ ] notes/mentions
-- [ ] notes/polls/recommendation
-- [x] notes/polls/vote
-- [x] notes/reactions
-- [x] notes/reactions/create
-- [x] notes/reactions/delete
-- [x] notes/renotes
-- [ ] notes/replies
-- [ ] notes/search-by-tag
-- [ ] notes/search
-- [x] notes/show
-- [ ] notes/state
-- [ ] notes/timeline
-- [x] notes/unrenote
-- [x] notes/user-list-timeline
-- [x] notes/watching/create
-- [x] notes/watching/delete
-- [x] users/notes
-
-## following
-
-- [x] following/create
-- [x] following/delete
-- [ ] following/requests/accept
-- [ ] following/requests/cancel
-- [ ] following/requests/list
-- [ ] following/requests/reject
-
-## favorites
-
-- [x] notes/favorites/create
-- [x] notes/favorites/delete
-
-## messaging
-
-- [x] messaging/history
-- [x] messaging/messages
-- [x] messaging/messages/create
-- [x] messaging/messages/delete
-- [x] messaging/messages/read
-
-## meta
-
-- [x] meta
-- [x] stats
-
-## mute
-
-- [x] mute/create
-- [x] mute/delete
-- [x] mute/list
-
-## lists
-
-- [x] users/lists/create
-- [x] users/lists/delete
-- [x] users/lists/list
-- [x] users/lists/pull
-- [x] users/lists/push
-- [x] users/lists/show
-- [x] users/lists/update
-
-## pages (Misskey: >=11.5.0)
-
-- [ ] i/pages
-- [ ] pages/create
-- [ ] pages/delete
-- [ ] pages/show
-- [ ] pages/update
-
-## groups (Misskey: >= 11.16.0)
-
-- [x] users/groups/create
-- [x] users/groups/delete
-- [ ] users/groups/joined
-- [ ] users/groups/owned
-- [ ] users/groups/pull
-- [ ] users/groups/push
-- [ ] users/groups/show
-- [ ] users/groups/invitations/accept (Misskey: >= 11.17.0)
-- [ ] users/groups/invitations/reject (Misskey: >= 11.17.0)
-- [ ] users/groups/invite (Misskey: >= 11.17.0)
-
-Info: **I will not implement chart, room and game API**
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..6690b49
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,38 @@
+# for Misskey.py testing, it does not use in production
+version: "3"
+
+services:
+  misskey-web:
+    image: misskey/misskey:latest
+    restart: always
+    links:
+      - db
+      - redis
+    ports:
+      - "127.0.0.1:3000:3000"
+    networks:
+      - internal_network
+      - external_network
+    volumes:
+      - ./tests/misskey_config:/misskey/.config
+
+  redis:
+    restart: always
+    image: redis:4.0-alpine
+    networks:
+      - internal_network
+
+  db:
+    restart: always
+    image: postgres:12.2-alpine
+    networks:
+      - internal_network
+    environment:
+      - POSTGRES_PASSWORD=example-misskey-pass
+      - POSTGRES_USER=example-misskey-user
+      - POSTGRES_DB=misskey
+
+networks:
+  internal_network:
+    internal: true
+  external_network:
diff --git a/docs/Makefile b/docs/Makefile
deleted file mode 100644
index 298ea9e..0000000
--- a/docs/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-# Minimal makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-SOURCEDIR     = .
-BUILDDIR      = _build
-
-# Put it first so that "make" without argument is like "make help".
-help:
-	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-.PHONY: help Makefile
-
-# Catch-all target: route all unknown targets to Sphinx using the new
-# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
-%: Makefile
-	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
\ No newline at end of file
diff --git a/docs/_static/.gitkeep b/docs/_static/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/docs/conf.py b/docs/conf.py
deleted file mode 100644
index e71b7e1..0000000
--- a/docs/conf.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# This file only contains a selection of the most common options. For a full
-# list see the documentation:
-# http://www.sphinx-doc.org/en/master/config
-
-# -- Path setup --------------------------------------------------------------
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-import os
-import sys
-import sphinx_rtd_theme
-
-sys.path.insert(0, os.path.abspath('..'))
-
-
-# -- Project information -----------------------------------------------------
-
-project = 'Misskey.py'
-copyright = '2019, YuzuRyo61'
-author = 'YuzuRyo61'
-
-
-# -- General configuration ---------------------------------------------------
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
-    'sphinx.ext.autodoc',
-    'sphinx.ext.viewcode',
-    'sphinx.ext.todo',
-]
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = 'en'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
-
-
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-#
-html_theme = "sphinx_rtd_theme"
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-
-# -- Extension configuration -------------------------------------------------
-# html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-locale_dirs = ['locale']
-
-# -- Options for todo extension ----------------------------------------------
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = True
diff --git a/docs/getting_started.rst b/docs/getting_started.rst
deleted file mode 100644
index 39d2cca..0000000
--- a/docs/getting_started.rst
+++ /dev/null
@@ -1,70 +0,0 @@
-====================
-Getting Started
-====================
-
-Installing
----------------
-Normally you would install the library from PyPi:
-
-.. code-block:: console
-
-    pip install Misskey.py
-
-Quickstart
----------------
-Import the Misskey class. Enter an instance of Misskey as the first argument during class initialization.
-
-.. code-block:: python3
-
-    from Misskey import Misskey
-
-    misskey = Misskey("misskey.io")
-
-In the above construction, the specified server will be accessed without a token.
-If you want to use token, do as follows.
-
-.. code-block:: python3
-
-    from Misskey import Misskey
-
-    misskey = Misskey("misskey.io", i="abcdefg123456")
-
-Enter the token in the argument i.
-With this argument, the Misskey class validates that this token is available at initialization.
-Throws ``MisskeyInitException`` if not available.
-
-.. automethod:: Misskey.Exceptions.MisskeyInitException
-
-Even after creating the instance, you can change it later by doing the following.
-
-.. code-block:: python3
-
-    from Misskey import Misskey
-
-    misskey = Misskey("misskey.io")
-
-    misskey.apiToken = "abcdefg123456"
-
-If you have set a token, you can read your account information.
-
-.. code-block:: python3
-
-    from Misskey import Misskey
-
-    misskey = Misskey("misskey.io", i="abcdefg123456")
-
-    your_data = misskey.i()
-
-.. automethod:: Misskey.Misskey.Misskey.i
-
-To post using your account:
-
-.. code-block:: python3
-
-    from Misskey import Misskey
-
-    misskey = Misskey("misskey.io", i="abcdefg123456")
-
-    created_notes = misskey.notes_create("This note is posted from Misskey.py!")
-
-.. automethod:: Misskey.Misskey.Misskey.notes_create
diff --git a/docs/index.rst b/docs/index.rst
deleted file mode 100644
index 5c5486c..0000000
--- a/docs/index.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-.. Misskey documentation master file, created by
-   sphinx-quickstart on Thu May  9 20:04:36 2019.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Misskey.py documentation
-===================================
-
-.. toctree::
-   :maxdepth: 4
-   :caption: Main documents:
-
-   getting_started
-
-.. toctree::
-   :maxdepth: 4
-   :caption: Module Contents:
-
-   module_Misskey
-   module_Util
-   module_Exceptions
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/docs/locales/ja/LC_MESSAGES/getting_started.po b/docs/locales/ja/LC_MESSAGES/getting_started.po
deleted file mode 100644
index 9b4c74a..0000000
--- a/docs/locales/ja/LC_MESSAGES/getting_started.po
+++ /dev/null
@@ -1,161 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2019, YuzuRyo61
-# This file is distributed under the same license as the Misskey.py package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Misskey.py \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-06 17:53+0900\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-
-#: ../../docs/getting_started.rst:3
-msgid "Getting Started"
-msgstr "入門"
-
-#: ../../docs/getting_started.rst:6
-msgid "Installing"
-msgstr "インストール"
-
-#: ../../docs/getting_started.rst:7
-msgid "Normally you would install the library from PyPi:"
-msgstr "通常であれば、PyPiからライブラリをインストールします。"
-
-#: ../../docs/getting_started.rst:14
-msgid "Quickstart"
-msgstr "クイックスタート"
-
-#: ../../docs/getting_started.rst:15
-msgid ""
-"Import the Misskey class. Enter an instance of Misskey as the first "
-"argument during class initialization."
-msgstr "Misskeyクラスをインポートします。クラスの初期化時に、最初の引数にMisskeyのインスタンスのアドレスを入力します。"
-
-#: ../../docs/getting_started.rst:23
-msgid ""
-"In the above construction, the specified server will be accessed without "
-"a token. If you want to use token, do as follows."
-msgstr "上記のコンストラクションでは、指定されたサーバーはトークン無しでアクセスします。トークンを使用する場合は次のようにします。"
-
-#: ../../docs/getting_started.rst:32
-msgid ""
-"Enter the token in the argument i. With this argument, the Misskey class "
-"validates that this token is available at initialization. Throws "
-"``MisskeyInitException`` if not available."
-msgstr "``i``という引数にトークンを入力します。この引数を使用すると、Misskeyクラスはこのトークンが初期化時に利用できるか検証します。利用できない場合は``MisskeyInitException``を送出します。"
-
-#: Misskey.Exceptions.MisskeyInitException:1 of
-msgid ""
-"This exception is raised if an error occurs during class initialization. "
-"For example, it is raised if it can not connect to the specified address "
-"or if the token is invalid."
-msgstr "この例外は、クラスの初期化中にエラーが発生した場合に発生します。 たとえば、指定されたアドレスに接続できない場合、またはトークンが無効な場合に発生します。"
-
-#: ../../docs/getting_started.rst:38
-msgid ""
-"Even after creating the instance, you can change it later by doing the "
-"following."
-msgstr "また、インスタンスを作成した後でも、次のようにして変更することができます。"
-
-#: ../../docs/getting_started.rst:48
-msgid "If you have set a token, you can read your account information."
-msgstr "トークンを設定している場合は、アカウント情報を読み出すことができます。"
-
-#: Misskey.Misskey.Misskey.i:1 of
-msgid "Show your credential."
-msgstr "自分のアカウント情報を表示します。"
-
-#: Misskey.Misskey.Misskey.i Misskey.Misskey.Misskey.notes_create of
-msgid "Return type"
-msgstr "返り型"
-
-#: ../../docs/getting_started.rst:60
-msgid "To post using your account:"
-msgstr "アカウントを使用して投稿するには："
-
-#: Misskey.Misskey.Misskey.notes_create:1 of
-msgid "Post a new note."
-msgstr "新しい投稿を作成します。"
-
-#: Misskey.Misskey.Misskey.notes_create of
-msgid "Parameters"
-msgstr "引数"
-
-#: Misskey.Misskey.Misskey.notes_create:3 of
-msgid "It is an argument of the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:4 of
-msgid "If set, this argument will be displayed in the main on the timeline."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:5 of
-msgid "Specify the open range."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:6 of
-msgid ""
-"When \"specified\" is specified, if the user ID is put in this argument, "
-"the user can view the post."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:7 of
-msgid "Mark it as posted as mobile if you set it to True."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:8 of
-msgid "You can specify whether to post only locally."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:9 of
-msgid "Specify whether to not expand mentions from the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:10 of
-msgid "Specifies whether to not expand the hash tag from the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:11 of
-msgid "Specify whether to not extract custom pictograms from the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:12 of
-msgid "You can specify the file ID attached to the post."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:13 of
-msgid "Specify the noteID to reply."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:14 of
-msgid "Specify the note ID to be Renote."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:15 of
-msgid "Designate when voting. You can specify 2 to 10 items."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:16 of
-msgid "Specifies whether to allow multiple votes."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:17 of
-msgid ""
-"Specifies the time to expire. If pollExpiresAt and pollExpiresAfter are "
-"not specified, it will be a vote indefinitely."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:18 of
-msgid ""
-"Specify the specified period from the post. If pollExpiresAt and "
-"pollExpiresAfter are not specified, it will be a vote indefinitely."
-msgstr ""
-
diff --git a/docs/locales/ja/LC_MESSAGES/index.po b/docs/locales/ja/LC_MESSAGES/index.po
deleted file mode 100644
index 3b4ab39..0000000
--- a/docs/locales/ja/LC_MESSAGES/index.po
+++ /dev/null
@@ -1,47 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2019, YuzuRyo61
-# This file is distributed under the same license as the Misskey.py package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Misskey.py \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-06 17:53+0900\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-
-#: ../../docs/index.rst:9
-msgid "Main documents:"
-msgstr ""
-
-#: ../../docs/index.rst:15
-msgid "Module Contents:"
-msgstr ""
-
-#: ../../docs/index.rst:7
-msgid "Misskey.py documentation"
-msgstr ""
-
-#: ../../docs/index.rst:25
-msgid "Indices and tables"
-msgstr ""
-
-#: ../../docs/index.rst:27
-msgid ":ref:`genindex`"
-msgstr ""
-
-#: ../../docs/index.rst:28
-msgid ":ref:`modindex`"
-msgstr ""
-
-#: ../../docs/index.rst:29
-msgid ":ref:`search`"
-msgstr ""
-
diff --git a/docs/locales/ja/LC_MESSAGES/module_Exceptions.po b/docs/locales/ja/LC_MESSAGES/module_Exceptions.po
deleted file mode 100644
index 7e5b1ed..0000000
--- a/docs/locales/ja/LC_MESSAGES/module_Exceptions.po
+++ /dev/null
@@ -1,73 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2019, YuzuRyo61
-# This file is distributed under the same license as the Misskey.py package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Misskey.py \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-06 17:07+0900\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-
-#: ../../docs/module_Exceptions.rst:2
-msgid "Exceptions"
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyAPIException:1
-#: Misskey.Exceptions.MisskeyAPITokenException:1
-#: Misskey.Exceptions.MisskeyAiException:1
-#: Misskey.Exceptions.MisskeyFileException:1
-#: Misskey.Exceptions.MisskeyMiAuthCheckException:1
-#: Misskey.Exceptions.MisskeyNotImplementedVersionException:1 of
-msgid "Bases: :class:`Exception`"
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyAPIException:1 of
-msgid ""
-"Raised if the API returns a status code that each function does not "
-"expect."
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyAPITokenException:1 of
-msgid "When the API token is changed, it will be raised if it is not valid."
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyAiException:1 of
-msgid ""
-"Raised if the specified function requires a token and no token is "
-"assigned to the class."
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyFileException:1 of
-msgid "Raised when the specified file can not be found."
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyInitException:1 of
-msgid "Bases: :class:`Misskey.Exceptions.MisskeyAPIException`"
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyInitException:1 of
-msgid ""
-"This exception is raised if an error occurs during class initialization. "
-"For example, it is raised if it can not connect to the specified address "
-"or if the token is invalid."
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyMiAuthCheckException:1 of
-msgid "This exception is thrown if the MiAuth token is not authenticated."
-msgstr ""
-
-#: Misskey.Exceptions.MisskeyNotImplementedVersionException:1 of
-msgid ""
-"Exception displayed when trying to execute with a version that is not "
-"implemented."
-msgstr ""
-
diff --git a/docs/locales/ja/LC_MESSAGES/module_Misskey.po b/docs/locales/ja/LC_MESSAGES/module_Misskey.po
deleted file mode 100644
index ed72999..0000000
--- a/docs/locales/ja/LC_MESSAGES/module_Misskey.po
+++ /dev/null
@@ -1,1146 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2019, YuzuRyo61
-# This file is distributed under the same license as the Misskey.py package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Misskey.py \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-06 17:07+0900\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-
-#: ../../docs/module_Misskey.rst:2
-msgid "Misskey Main Module"
-msgstr ""
-
-#: Misskey.Misskey.Misskey:1 of
-msgid "Bases: :class:`object`"
-msgstr ""
-
-#: Misskey.Misskey.Misskey:1 of
-msgid "Initialize the library."
-msgstr ""
-
-#: Misskey.Misskey.Misskey Misskey.Misskey.Misskey.blocking_list
-#: Misskey.Misskey.Misskey.drive_files
-#: Misskey.Misskey.Misskey.drive_files_attachedNotes
-#: Misskey.Misskey.Misskey.drive_files_checkExistence
-#: Misskey.Misskey.Misskey.drive_files_create
-#: Misskey.Misskey.Misskey.drive_files_delete
-#: Misskey.Misskey.Misskey.drive_files_find
-#: Misskey.Misskey.Misskey.drive_files_show
-#: Misskey.Misskey.Misskey.drive_files_update
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl
-#: Misskey.Misskey.Misskey.drive_folders
-#: Misskey.Misskey.Misskey.drive_folders_create
-#: Misskey.Misskey.Misskey.drive_folders_delete
-#: Misskey.Misskey.Misskey.drive_folders_find
-#: Misskey.Misskey.Misskey.drive_folders_show
-#: Misskey.Misskey.Misskey.drive_folders_update
-#: Misskey.Misskey.Misskey.drive_stream
-#: Misskey.Misskey.Misskey.following_create
-#: Misskey.Misskey.Misskey.following_delete Misskey.Misskey.Misskey.i_favorites
-#: Misskey.Misskey.Misskey.i_notifications Misskey.Misskey.Misskey.i_pin
-#: Misskey.Misskey.Misskey.i_unpin Misskey.Misskey.Misskey.i_update
-#: Misskey.Misskey.Misskey.messaging_history
-#: Misskey.Misskey.Misskey.messaging_messages
-#: Misskey.Misskey.Misskey.messaging_messages_create
-#: Misskey.Misskey.Misskey.messaging_messages_delete
-#: Misskey.Misskey.Misskey.messaging_messages_read Misskey.Misskey.Misskey.meta
-#: Misskey.Misskey.Misskey.mute_list Misskey.Misskey.Misskey.notes
-#: Misskey.Misskey.Misskey.notes_create Misskey.Misskey.Misskey.notes_delete
-#: Misskey.Misskey.Misskey.notes_favorites_create
-#: Misskey.Misskey.Misskey.notes_favorites_delete
-#: Misskey.Misskey.Misskey.notes_globalTimeline
-#: Misskey.Misskey.Misskey.notes_hybridTimeline
-#: Misskey.Misskey.Misskey.notes_localTimeline
-#: Misskey.Misskey.Misskey.notes_polls_vote
-#: Misskey.Misskey.Misskey.notes_reactions
-#: Misskey.Misskey.Misskey.notes_reactions_create
-#: Misskey.Misskey.Misskey.notes_reactions_delete
-#: Misskey.Misskey.Misskey.notes_renote Misskey.Misskey.Misskey.notes_renotes
-#: Misskey.Misskey.Misskey.notes_show Misskey.Misskey.Misskey.notes_unrenote
-#: Misskey.Misskey.Misskey.notes_userListTimeline Misskey.Misskey.Misskey.users
-#: Misskey.Misskey.Misskey.users_followers
-#: Misskey.Misskey.Misskey.users_following
-#: Misskey.Misskey.Misskey.users_lists_create
-#: Misskey.Misskey.Misskey.users_lists_delete
-#: Misskey.Misskey.Misskey.users_lists_pull
-#: Misskey.Misskey.Misskey.users_lists_push
-#: Misskey.Misskey.Misskey.users_lists_show
-#: Misskey.Misskey.Misskey.users_lists_update
-#: Misskey.Misskey.Misskey.users_notes Misskey.Misskey.Misskey.users_relation
-#: Misskey.Misskey.Misskey.users_show of
-msgid "Parameters"
-msgstr ""
-
-#: Misskey.Misskey.Misskey:3 of
-msgid ""
-"Instance address of Misskey. If leave a blank, library will use "
-"'misskey.io'."
-msgstr ""
-
-#: Misskey.Misskey.Misskey:4 of
-msgid "Use hashed keys or keys used on the web."
-msgstr ""
-
-#: Misskey.Misskey.Misskey:5 of
-msgid "Skip instance valid check. It is not recommended to make it True."
-msgstr ""
-
-#: Misskey.Misskey.Misskey Misskey.Misskey.Misskey.drive_files_create
-#: Misskey.Misskey.restrictVer of
-msgid "Raises"
-msgstr ""
-
-#: Misskey.Misskey.Misskey:6 of
-msgid ""
-"This exception is raised if an error occurs during class initialization. "
-"For example, it is raised if it can not connect to the specified address "
-"or if the token is invalid."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.address:1 of
-msgid "This is the address of the created instance. You can not change it."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.apiToken:1 of
-msgid ""
-"Contains keys for operating the API. You can check if the API key is "
-"valid when changing the variable."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_create:1 of
-msgid "Block a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_create
-#: Misskey.Misskey.Misskey.blocking_delete
-#: Misskey.Misskey.Misskey.drive_files_delete
-#: Misskey.Misskey.Misskey.drive_folders_delete
-#: Misskey.Misskey.Misskey.i_readAllMessagingMessages
-#: Misskey.Misskey.Misskey.i_readAllUnreadNotes
-#: Misskey.Misskey.Misskey.messaging_messages_delete
-#: Misskey.Misskey.Misskey.messaging_messages_read
-#: Misskey.Misskey.Misskey.mute_create Misskey.Misskey.Misskey.mute_delete
-#: Misskey.Misskey.Misskey.notes_delete
-#: Misskey.Misskey.Misskey.notes_favorites_create
-#: Misskey.Misskey.Misskey.notes_favorites_delete
-#: Misskey.Misskey.Misskey.notes_polls_vote
-#: Misskey.Misskey.Misskey.notes_reactions_create
-#: Misskey.Misskey.Misskey.notes_reactions_delete
-#: Misskey.Misskey.Misskey.notes_unrenote
-#: Misskey.Misskey.Misskey.notifications_markAllAsRead
-#: Misskey.Misskey.Misskey.users_lists_delete
-#: Misskey.Misskey.Misskey.users_lists_pull
-#: Misskey.Misskey.Misskey.users_lists_push of
-msgid "Returns"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_create:3
-#: Misskey.Misskey.Misskey.blocking_delete:3
-#: Misskey.Misskey.Misskey.drive_files_delete:5
-#: Misskey.Misskey.Misskey.drive_folders_delete:5
-#: Misskey.Misskey.Misskey.i_readAllMessagingMessages:3
-#: Misskey.Misskey.Misskey.i_readAllUnreadNotes:3
-#: Misskey.Misskey.Misskey.messaging_messages_delete:5
-#: Misskey.Misskey.Misskey.messaging_messages_read:5
-#: Misskey.Misskey.Misskey.mute_create:3 Misskey.Misskey.Misskey.mute_delete:3
-#: Misskey.Misskey.Misskey.notes_delete:5
-#: Misskey.Misskey.Misskey.notes_favorites_create:5
-#: Misskey.Misskey.Misskey.notes_favorites_delete:5
-#: Misskey.Misskey.Misskey.notes_polls_vote:7
-#: Misskey.Misskey.Misskey.notes_reactions_create:7
-#: Misskey.Misskey.Misskey.notes_reactions_delete:5
-#: Misskey.Misskey.Misskey.notes_unrenote:5
-#: Misskey.Misskey.Misskey.notifications_markAllAsRead:3
-#: Misskey.Misskey.Misskey.users_lists_delete:5
-#: Misskey.Misskey.Misskey.users_lists_pull:7
-#: Misskey.Misskey.Misskey.users_lists_push:7 of
-msgid "Returns `True` if the request is successful."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_create
-#: Misskey.Misskey.Misskey.blocking_delete
-#: Misskey.Misskey.Misskey.blocking_list Misskey.Misskey.Misskey.drive
-#: Misskey.Misskey.Misskey.drive_files
-#: Misskey.Misskey.Misskey.drive_files_attachedNotes
-#: Misskey.Misskey.Misskey.drive_files_checkExistence
-#: Misskey.Misskey.Misskey.drive_files_create
-#: Misskey.Misskey.Misskey.drive_files_delete
-#: Misskey.Misskey.Misskey.drive_files_find
-#: Misskey.Misskey.Misskey.drive_files_show
-#: Misskey.Misskey.Misskey.drive_files_update
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl
-#: Misskey.Misskey.Misskey.drive_folders
-#: Misskey.Misskey.Misskey.drive_folders_create
-#: Misskey.Misskey.Misskey.drive_folders_delete
-#: Misskey.Misskey.Misskey.drive_folders_find
-#: Misskey.Misskey.Misskey.drive_folders_show
-#: Misskey.Misskey.Misskey.drive_folders_update
-#: Misskey.Misskey.Misskey.drive_stream
-#: Misskey.Misskey.Misskey.following_create
-#: Misskey.Misskey.Misskey.following_delete Misskey.Misskey.Misskey.i
-#: Misskey.Misskey.Misskey.i_favorites Misskey.Misskey.Misskey.i_notifications
-#: Misskey.Misskey.Misskey.i_pin
-#: Misskey.Misskey.Misskey.i_readAllMessagingMessages
-#: Misskey.Misskey.Misskey.i_readAllUnreadNotes Misskey.Misskey.Misskey.i_unpin
-#: Misskey.Misskey.Misskey.i_update Misskey.Misskey.Misskey.messaging_history
-#: Misskey.Misskey.Misskey.messaging_messages
-#: Misskey.Misskey.Misskey.messaging_messages_create
-#: Misskey.Misskey.Misskey.messaging_messages_delete
-#: Misskey.Misskey.Misskey.messaging_messages_read Misskey.Misskey.Misskey.meta
-#: Misskey.Misskey.Misskey.mute_create Misskey.Misskey.Misskey.mute_delete
-#: Misskey.Misskey.Misskey.mute_list Misskey.Misskey.Misskey.notes
-#: Misskey.Misskey.Misskey.notes_create Misskey.Misskey.Misskey.notes_delete
-#: Misskey.Misskey.Misskey.notes_favorites_create
-#: Misskey.Misskey.Misskey.notes_favorites_delete
-#: Misskey.Misskey.Misskey.notes_globalTimeline
-#: Misskey.Misskey.Misskey.notes_hybridTimeline
-#: Misskey.Misskey.Misskey.notes_localTimeline
-#: Misskey.Misskey.Misskey.notes_polls_vote
-#: Misskey.Misskey.Misskey.notes_reactions_create
-#: Misskey.Misskey.Misskey.notes_reactions_delete
-#: Misskey.Misskey.Misskey.notes_renote Misskey.Misskey.Misskey.notes_renotes
-#: Misskey.Misskey.Misskey.notes_show Misskey.Misskey.Misskey.notes_unrenote
-#: Misskey.Misskey.Misskey.notes_userListTimeline
-#: Misskey.Misskey.Misskey.notifications_markAllAsRead
-#: Misskey.Misskey.Misskey.pinnedUsers Misskey.Misskey.Misskey.stats
-#: Misskey.Misskey.Misskey.users Misskey.Misskey.Misskey.users_followers
-#: Misskey.Misskey.Misskey.users_following
-#: Misskey.Misskey.Misskey.users_lists_create
-#: Misskey.Misskey.Misskey.users_lists_delete
-#: Misskey.Misskey.Misskey.users_lists_list
-#: Misskey.Misskey.Misskey.users_lists_pull
-#: Misskey.Misskey.Misskey.users_lists_push
-#: Misskey.Misskey.Misskey.users_lists_show
-#: Misskey.Misskey.Misskey.users_lists_update
-#: Misskey.Misskey.Misskey.users_notes Misskey.Misskey.Misskey.users_relation
-#: Misskey.Misskey.Misskey.users_show of
-msgid "Return type"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_delete:1 of
-msgid "Unblock a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_list:1 Misskey.Misskey.Misskey.mute_list:1
-#: of
-msgid "List blocked users."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_list:3
-#: Misskey.Misskey.Misskey.drive_files:3
-#: Misskey.Misskey.Misskey.drive_folders:3
-#: Misskey.Misskey.Misskey.drive_stream:3 Misskey.Misskey.Misskey.i_favorites:3
-#: Misskey.Misskey.Misskey.i_notifications:3
-#: Misskey.Misskey.Misskey.messaging_history:3
-#: Misskey.Misskey.Misskey.messaging_messages:4
-#: Misskey.Misskey.Misskey.mute_list:3 Misskey.Misskey.Misskey.notes:8
-#: Misskey.Misskey.Misskey.notes_globalTimeline:5
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:3
-#: Misskey.Misskey.Misskey.notes_localTimeline:8
-#: Misskey.Misskey.Misskey.notes_reactions:4
-#: Misskey.Misskey.Misskey.notes_renotes:4
-#: Misskey.Misskey.Misskey.notes_userListTimeline:3
-#: Misskey.Misskey.Misskey.users:3 Misskey.Misskey.Misskey.users_followers:8
-#: Misskey.Misskey.Misskey.users_following:8
-#: Misskey.Misskey.Misskey.users_notes:3 of
-msgid "Maximum number to get. You can specify from 1 to 100."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_list:4
-#: Misskey.Misskey.Misskey.drive_files:4
-#: Misskey.Misskey.Misskey.drive_folders:4
-#: Misskey.Misskey.Misskey.drive_stream:4 Misskey.Misskey.Misskey.i_favorites:4
-#: Misskey.Misskey.Misskey.i_notifications:4
-#: Misskey.Misskey.Misskey.messaging_messages:5
-#: Misskey.Misskey.Misskey.mute_list:4 Misskey.Misskey.Misskey.notes:9
-#: Misskey.Misskey.Misskey.notes_globalTimeline:6
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:4
-#: Misskey.Misskey.Misskey.notes_localTimeline:6
-#: Misskey.Misskey.Misskey.notes_reactions:6
-#: Misskey.Misskey.Misskey.notes_renotes:5
-#: Misskey.Misskey.Misskey.notes_userListTimeline:4
-#: Misskey.Misskey.Misskey.users_followers:6
-#: Misskey.Misskey.Misskey.users_following:6
-#: Misskey.Misskey.Misskey.users_notes:4 of
-msgid "Acquired from the specified ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.blocking_list:5
-#: Misskey.Misskey.Misskey.drive_files:5
-#: Misskey.Misskey.Misskey.drive_folders:5
-#: Misskey.Misskey.Misskey.drive_stream:5 Misskey.Misskey.Misskey.i_favorites:5
-#: Misskey.Misskey.Misskey.i_notifications:5
-#: Misskey.Misskey.Misskey.messaging_messages:6
-#: Misskey.Misskey.Misskey.mute_list:5 Misskey.Misskey.Misskey.notes:10
-#: Misskey.Misskey.Misskey.notes_globalTimeline:7
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:5
-#: Misskey.Misskey.Misskey.notes_localTimeline:7
-#: Misskey.Misskey.Misskey.notes_reactions:7
-#: Misskey.Misskey.Misskey.notes_renotes:6
-#: Misskey.Misskey.Misskey.notes_userListTimeline:5
-#: Misskey.Misskey.Misskey.users_followers:7
-#: Misskey.Misskey.Misskey.users_following:7
-#: Misskey.Misskey.Misskey.users_notes:5 of
-msgid "Get up to the specified ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive:1 of
-msgid "Show your capacity."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files:1 of
-msgid "Show a files in selected folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files:6
-#: Misskey.Misskey.Misskey.drive_folders:6
-#: Misskey.Misskey.Misskey.drive_stream:6 of
-msgid "You can specify a folder ID to refer to."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files:7 Misskey.Misskey.Misskey.drive_stream:7
-#: of
-msgid "Specifies the file type."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_attachedNotes:1 of
-msgid "You can check if the specified file is used for posting."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_attachedNotes:3 of
-msgid "Check the specified file ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_checkExistence:1 of
-msgid "You can check if the specified hash value exists on the drive."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_checkExistence:3 of
-msgid "Specifies the md5 hash value."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_create:1 of
-msgid "Upload a file."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_create:3 of
-msgid "Specify the path where the file is located."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_create:4
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl:4 of
-msgid "If specified, it will be uploaded to that folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_create:5
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl:5 of
-msgid "Specify whether to upload as browsing notice."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_create:6
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl:6 of
-msgid "Specify whether to force even if a file with the same hash is uploaded."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_create:10 of
-msgid "Raised if the file can not be found."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_delete:1 of
-msgid "Delete a file."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_delete:3 of
-msgid "Specify the file ID you want to delete."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_find:1 of
-msgid "Search for file name."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_find:3
-#: Misskey.Misskey.Misskey.drive_folders_find:3 of
-msgid "Specify the character you want to search for."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_find:4
-#: Misskey.Misskey.Misskey.drive_folders_find:4 of
-msgid "If specified, it will search in that folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_show:1 of
-msgid "Show a file from fileID or URL."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_show:3 of
-msgid "Specify the file ID for which you want to check the details"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_show:4 of
-msgid ""
-"Enter the URL uploaded to the drive of the instance for which you want to"
-" check the details. This is useful when you do not know the file ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_update:1 of
-msgid "Update a file."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_update:3 of
-msgid "Specify the file ID you want to change"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_update:4 of
-msgid "If specified, it will move to that folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_update:5 of
-msgid "Change to the file name entered in the argument."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_update:6 of
-msgid "You can change whether to set to reading attention."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl:1 of
-msgid "Upload a file from URL."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_files_uploadFromUrl:3 of
-msgid "Specify the URL to upload to the drive."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders:1 of
-msgid "List folders in specified directory."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_create:1 of
-msgid "Create a folder in specified directory."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_create:3 of
-msgid "Enter the folder ID you want to create"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_create:4 of
-msgid ""
-"Specify where to create the folder. If not specified, it will be created "
-"in the root folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_delete:1 of
-msgid "Delete a folder in specified directory."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_delete:3 of
-msgid "Enter the folder ID you want to delete"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_find:1 of
-msgid "Search for folder name."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_show:1 of
-msgid "Show a folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_show:3 of
-msgid "Enter the folder ID for which you want to check the details"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_update:1 of
-msgid "Update a folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_update:3 of
-msgid "Enter the folder ID you want to update"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_update:4 of
-msgid "Enter in this argument when you want to change it."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_folders_update:5 of
-msgid "Change this argument if you want to change the parent folder."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.drive_stream:1 of
-msgid "Display the file of the file uploaded so far."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.following_create:1 of
-msgid "Follow a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.following_create:3 of
-msgid "Specify the user ID to follow."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.following_delete:1 of
-msgid "Unfollow a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.following_delete:3 of
-msgid "Specify the user ID to unfollow."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i:1 of
-msgid "Show your credential."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_favorites:1 of
-msgid "Show your favorite notes."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_notifications:1 of
-msgid "Show your notifications."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_notifications:6 of
-msgid "Display notifications only for the people you are following."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_notifications:7 of
-msgid "You can specify whether notification is read when calling this API."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_notifications:8 of
-msgid "Specify the notification type you want to get."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_notifications:9 of
-msgid "Specify a notification type that you do not want to get."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_pin:1 of
-msgid "Pin a note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_pin:3 of
-msgid "Specify the post ID you want to pin."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_readAllMessagingMessages:1 of
-msgid "Mark as read to all messages."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_readAllUnreadNotes:1 of
-msgid "Mark as read to all notes."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_unpin:1 of
-msgid "Unpin a note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_unpin:3 of
-msgid "Specify the post ID you want to unpin."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:1 of
-msgid "Update your profile."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:3 of
-msgid "Change to the specified name. If you specify None, the name is deleted."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:4 of
-msgid ""
-"Enter the description to be displayed on your profile. Specify None to "
-"delete it."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:5 of
-msgid "Specifies the language. Specify None to delete it."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:6 of
-msgid "You can specify your place of residence. Specify None to delete it."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:7 of
-msgid ""
-"Specify your birthday. It must be in YYYY-MM-DD format. It is deleted "
-"with None."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:8 of
-msgid "Specify the file ID to be an icon. It is deleted with None."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:9 of
-msgid "Specify the file ID to be a banner. It is deleted with None."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:10 of
-msgid "Specifies whether to require approval when being followed."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:11 of
-msgid "Specify whether the user with Bot attribute is to be approved."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:12 of
-msgid ""
-"Specify whether to automatically approve the follow back from the user "
-"you are following."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:13 of
-msgid "This is mainly specified when operating as Bot."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:14 of
-msgid "Want to be a cat? Set this attribute to True."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:15 of
-msgid ""
-"Specify whether to automatically post posts that have a reaction, Renote,"
-" etc. in the watch list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.i_update:16 of
-msgid ""
-"Specify whether to always flag the image to be posted, etc. for viewing "
-"attention."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_history:1 of
-msgid "Show all messages what you received."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages:1 of
-msgid "Show messages."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages:3 of
-msgid "Display a message with the specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages:7 of
-msgid "You can choose to mark unread messages as read when you call this API."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_create:1 of
-msgid "Send a message to a specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_create:3 of
-msgid "Sends a message to the specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_create:4 of
-msgid "Insert the text to be sent."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_create:5 of
-msgid "If you want to attach a file, enter the file ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_delete:1 of
-msgid "Deletes the specified message."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_delete:3
-#: Misskey.Misskey.Misskey.messaging_messages_read:3 of
-msgid "Enter the unique ID of the sent message."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.messaging_messages_read:1 of
-msgid "Mark the specified message as read."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.meta:1 of
-msgid "Read a instance meta information."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.meta:3 of
-msgid "Choose whether to show details."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.mute_create:1 of
-msgid "Mute a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.mute_delete:1 of
-msgid "Unmute a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes:1 of
-msgid "Show notes."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes:3 of
-msgid "Specifies whether to limit to local only postings."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes:4 of
-msgid "Specify if you want to limit to posts only for replies."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes:5 of
-msgid "Specify whether to limit to Renote only posts."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes:6 of
-msgid "Specify whether to limit to posts with attachments only."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes:7 of
-msgid "Specify if you want to limit the post to surveys only."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:1 of
-msgid "Post a new note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:3 of
-msgid "It is an argument of the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:4 of
-msgid "If set, this argument will be displayed in the main on the timeline."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:5 of
-msgid "Specify the open range."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:6 of
-msgid ""
-"When \"specified\" is specified, if the user ID is put in this argument, "
-"the user can view the post."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:7 of
-msgid "Mark it as posted as mobile if you set it to True."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:8 of
-msgid "You can specify whether to post only locally."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:9 of
-msgid "Specify whether to not expand mentions from the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:10 of
-msgid "Specifies whether to not expand the hash tag from the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:11 of
-msgid "Specify whether to not extract custom pictograms from the text."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:12 of
-msgid "You can specify the file ID attached to the post."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:13 of
-msgid "Specify the noteID to reply."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:14 of
-msgid "Specify the note ID to be Renote."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:15 of
-msgid "Designate when voting. You can specify 2 to 10 items."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:16 of
-msgid "Specifies whether to allow multiple votes."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:17 of
-msgid ""
-"Specifies the time to expire. If pollExpiresAt and pollExpiresAfter are "
-"not specified, it will be a vote indefinitely."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_create:18 of
-msgid ""
-"Specify the specified period from the post. If pollExpiresAt and "
-"pollExpiresAfter are not specified, it will be a vote indefinitely."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_delete:1 of
-msgid "Delete a own note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_delete:3 of
-msgid "Specify the note ID you want to delete."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_favorites_create:1 of
-msgid "Mark as favorite to note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_favorites_create:3 of
-msgid "Specify the note ID to register the favorite."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_favorites_delete:1 of
-msgid "Remove mark favorite to note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_favorites_delete:3 of
-msgid "Specify noteID to remove the favorite."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_globalTimeline:1 of
-msgid "Show timeline from Global."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_globalTimeline:3
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:8
-#: Misskey.Misskey.Misskey.notes_localTimeline:3
-#: Misskey.Misskey.Misskey.notes_userListTimeline:11
-#: Misskey.Misskey.Misskey.users_notes:11 of
-msgid "If True, only posts attached to the file will be displayed."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_globalTimeline:4
-#: Misskey.Misskey.Misskey.notes_localTimeline:5
-#: Misskey.Misskey.Misskey.users_notes:13 of
-msgid "Set to True to exclude postings for reading attention."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_globalTimeline:8
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:6
-#: Misskey.Misskey.Misskey.notes_localTimeline:9
-#: Misskey.Misskey.Misskey.notes_userListTimeline:6
-#: Misskey.Misskey.Misskey.users_notes:6 of
-msgid "Get from the specified date."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_globalTimeline:9
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:7
-#: Misskey.Misskey.Misskey.notes_localTimeline:10
-#: Misskey.Misskey.Misskey.notes_userListTimeline:7
-#: Misskey.Misskey.Misskey.users_notes:7 of
-msgid "Gets until the specified date."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:1 of
-msgid "Show timeline from Hybrid(Social)."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:9
-#: Misskey.Misskey.Misskey.notes_userListTimeline:8
-#: Misskey.Misskey.Misskey.users_notes:8 of
-msgid "Specify if you want to include posts that you renote"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:10
-#: Misskey.Misskey.Misskey.notes_userListTimeline:9
-#: Misskey.Misskey.Misskey.users_notes:9 of
-msgid "Specifies whether your post includes a Renote post"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_hybridTimeline:11
-#: Misskey.Misskey.Misskey.notes_userListTimeline:10
-#: Misskey.Misskey.Misskey.users_notes:10 of
-msgid "Specifies whether to include reposted local posts"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_localTimeline:1 of
-msgid "Show timeline from Local."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_localTimeline:4
-#: Misskey.Misskey.Misskey.users_notes:12 of
-msgid "Use when acquiring only the specified file type."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_polls_vote:1 of
-msgid "Vote a note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_polls_vote:3 of
-msgid ""
-"Specify the note ID of the vote. The specified noteID must have a voting "
-"attribute."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_polls_vote:4 of
-msgid "Select the item to vote."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions:1 of
-msgid "Display the reaction list of the specified post."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions:3 of
-msgid "Specify a post ID for which you want to specify a reaction."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions:5 Misskey.Misskey.Misskey.users:4 of
-msgid "Specifies the offset to get."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions_create:1 of
-msgid "Give a reaction for note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions_create:3 of
-msgid "Specify the noteID to which you want a reaction."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions_create:4 of
-msgid "Specify the type of reaction."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions_delete:1 of
-msgid "Cancel a reaction for note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_reactions_delete:3 of
-msgid "Designate note ID for removing reaction."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_renote:1 of
-msgid ""
-"Support fucntion: Renote a note (If use quote renote, please use "
-"`notes_create`)"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_renote:3 of
-msgid "Specify the note ID you want to Renote."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_renotes:1 of
-msgid "Show renote lists from note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_renotes:3 of
-msgid "Specify the noteID for which you want to check the details."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_show:1 of
-msgid "Show a note."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_show:3 of
-msgid "Specify the noteID to display details."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_unrenote:1 of
-msgid "Cancel Renote."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_unrenote:3 of
-msgid "Specify the post ID you want to cancel Renote"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_userListTimeline:1 of
-msgid "Show timeline from specified list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_watching_create:1 of
-msgid "Monitor specified posts."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_watching_create:3 of
-msgid ""
-"::param noteId: Specify the post ID you want to watch a note :type "
-"noteId: str :return: Returns `True` if the request is successful. :rtype:"
-" bool"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_watching_delete:1 of
-msgid "Unmonitor the specified post."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notes_watching_delete:3 of
-msgid ""
-"::param noteId: Specify the post ID you want to unwatch a note :type "
-"noteId: str :return: Returns `True` if the request is successful. :rtype:"
-" bool"
-msgstr ""
-
-#: Misskey.Misskey.Misskey.notifications_markAllAsRead:1 of
-msgid "Mark as read to all notifications."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.pinnedUsers:1 of
-msgid "Show users pinned by instance."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.stats:1 of
-msgid "Read a instance stats information."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users:1 of
-msgid "Show user(s)."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users:5 of
-msgid "Sort by the specified type."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users:6 of
-msgid "Reduce the status of the account."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users:7 of
-msgid "Display local and remote users."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_followers:1 of
-msgid "Show followers from specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_followers:3 of
-msgid "Specify the user ID to display the follower list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_followers:4 of
-msgid ""
-"Specify the user name for displaying the follower list. This is useful "
-"when you do not know the user ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_followers:5
-#: Misskey.Misskey.Misskey.users_following:5 of
-msgid "Used to load the user of another instance."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_following:1 of
-msgid "Show following from specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_following:3 of
-msgid "Specify the user ID for displaying the follow list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_following:4 of
-msgid ""
-"Specify the user name for displaying the follow list. This is useful when"
-" you do not know the user ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_create:1 of
-msgid "Create a list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_create:3 of
-msgid "Specifies the name of the list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_delete:1 of
-msgid "Delete a list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_delete:3 of
-msgid "Specify the list ID you want to delete."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_list:1 of
-msgid "Show lists."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_pull:1 of
-msgid "Remove a user from specified list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_pull:3 of
-msgid "Specifies a list from which to remove the specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_pull:4
-#: Misskey.Misskey.Misskey.users_lists_push:4 of
-msgid "Specifies a user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_push:1 of
-msgid "Add a user from specified list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_push:3
-#: Misskey.Misskey.Misskey.users_lists_update:3 of
-msgid "Specifies a list from which to add the specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_show:1 of
-msgid "Show a list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_show:3 of
-msgid "Specify the list ID you want to get."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_update:1 of
-msgid "Update the specified list."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_lists_update:4 of
-msgid "Change to the specified name."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_notes:1 of
-msgid "Show timeline from specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_relation:1 of
-msgid "Acquires the relationship with the specified user."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_relation:3 of
-msgid "Specify a user. Multiple specification in list format is also possible."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_show:1 of
-msgid ""
-"Show user(s). If userIds specify a username, this function will return a "
-"`list` type."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_show:4 of
-msgid ""
-"It is an argument used when acquiring a single user. It can not be used "
-"in conjunction with userIds."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_show:5 of
-msgid ""
-"It is an argument used when acquiring multiple users. It can not be used "
-"in combination with userId."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_show:6 of
-msgid ""
-"It is an argument that can use the user name displayed in the instance. "
-"This is useful when you do not know the user ID."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.users_show:7 of
-msgid "Used to get the user of another instance."
-msgstr ""
-
-#: Misskey.Misskey.Misskey.version:1 of
-msgid "This is the version of the created instance. You can not change it."
-msgstr ""
-
-#: Misskey.Misskey.restrictVer:1 of
-msgid ""
-"Used as an internal decorator. If it is lower than the specified version,"
-" an exception is raised."
-msgstr ""
-
-#: Misskey.Misskey.restrictVer:3 of
-msgid "Raised if lower than the specified version."
-msgstr ""
-
diff --git a/docs/locales/ja/LC_MESSAGES/module_Util.po b/docs/locales/ja/LC_MESSAGES/module_Util.po
deleted file mode 100644
index 8147da2..0000000
--- a/docs/locales/ja/LC_MESSAGES/module_Util.po
+++ /dev/null
@@ -1,116 +0,0 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) 2019, YuzuRyo61
-# This file is distributed under the same license as the Misskey.py package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Misskey.py \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-06 17:07+0900\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 2.8.0\n"
-
-#: ../../docs/module_Util.rst:2
-msgid "MisskeyUtil module"
-msgstr ""
-
-#: Misskey.Util.MiAuth:1 of
-msgid "Bases: :class:`object`"
-msgstr ""
-
-#: Misskey.Util.MiAuth:1 of
-msgid "Misskey authentication class"
-msgstr ""
-
-#: Misskey.Util.create_app:1 of
-msgid ""
-"**Deprecated** Creates an application key with the specified instance "
-"address."
-msgstr ""
-
-#: Misskey.Util.create_app Misskey.Util.hash_apitoken
-#: Misskey.Util.session_generate Misskey.Util.session_userkey
-#: Misskey.Util.username_available of
-msgid "Parameters"
-msgstr ""
-
-#: Misskey.Util.create_app:4 Misskey.Util.session_generate:4
-#: Misskey.Util.session_userkey:4 Misskey.Util.username_available:3 of
-msgid "Specify the Misskey instance address."
-msgstr ""
-
-#: Misskey.Util.create_app:5 of
-msgid "Specifies the name of the app."
-msgstr ""
-
-#: Misskey.Util.create_app:6 of
-msgid "Specify the app description."
-msgstr ""
-
-#: Misskey.Util.create_app:7 of
-msgid "Specifies the app's permissions."
-msgstr ""
-
-#: Misskey.Util.create_app:8 of
-msgid "Specify if there is a URL to call back after user authentication."
-msgstr ""
-
-#: Misskey.Util.create_app Misskey.Util.hash_apitoken
-#: Misskey.Util.session_generate Misskey.Util.session_userkey
-#: Misskey.Util.username_available of
-msgid "Return type"
-msgstr ""
-
-#: Misskey.Util.deprecated:1 of
-msgid ""
-"This is a decorator which can be used to mark functions as deprecated. It"
-" will result in a warning being emitted when the function is used."
-msgstr ""
-
-#: Misskey.Util.hash_apitoken:1 of
-msgid ""
-"**Deprecated** The issued access token and app secret key are combined "
-"and hashed for use in API."
-msgstr ""
-
-#: Misskey.Util.hash_apitoken:4 of
-msgid "Token Specify the access token issued at the time of authentication."
-msgstr ""
-
-#: Misskey.Util.hash_apitoken:5 of
-msgid "Specify the app secret key."
-msgstr ""
-
-#: Misskey.Util.session_generate:1 of
-msgid "**Deprecated** Issue a token to authenticate the user."
-msgstr ""
-
-#: Misskey.Util.session_generate:5 Misskey.Util.session_userkey:5 of
-msgid "Specifies the secret key."
-msgstr ""
-
-#: Misskey.Util.session_userkey:1 of
-msgid ""
-"**Deprecated** It is a function to perform when the user authenticates "
-"with the browser."
-msgstr ""
-
-#: Misskey.Util.session_userkey:6 of
-msgid "Specify the token issued before authentication."
-msgstr ""
-
-#: Misskey.Util.username_available:1 of
-msgid "Checks if the specified user name can be used."
-msgstr ""
-
-#: Misskey.Util.username_available:4 of
-msgid "Specify the username you want to check."
-msgstr ""
-
diff --git a/docs/make.bat b/docs/make.bat
deleted file mode 100644
index 27f573b..0000000
--- a/docs/make.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-if "%1" == "" goto help
-
-%SPHINXBUILD% >NUL 2>NUL
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.http://sphinx-doc.org/
-	exit /b 1
-)
-
-%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
-goto end
-
-:help
-%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
-
-:end
-popd
diff --git a/docs/module_Exceptions.rst b/docs/module_Exceptions.rst
deleted file mode 100644
index 3710143..0000000
--- a/docs/module_Exceptions.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-Exceptions
--------------------------
-
-.. automodule:: Misskey.Exceptions
-    :members:
-    :undoc-members:
-    :show-inheritance:
diff --git a/docs/module_Misskey.rst b/docs/module_Misskey.rst
deleted file mode 100644
index 77e4227..0000000
--- a/docs/module_Misskey.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-Misskey Main Module
-----------------------
-
-.. automodule:: Misskey.Misskey
-    :members:
-    :undoc-members:
-    :show-inheritance:
diff --git a/docs/module_Util.rst b/docs/module_Util.rst
deleted file mode 100644
index 2f3d2e1..0000000
--- a/docs/module_Util.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-MisskeyUtil module
--------------------
-
-.. automodule:: Misskey.Util
-    :members:
-    :undoc-members:
-    :show-inheritance:
diff --git a/misskey/__init__.py b/misskey/__init__.py
new file mode 100644
index 0000000..11cdb62
--- /dev/null
+++ b/misskey/__init__.py
@@ -0,0 +1,27 @@
+"""
+Misskey.py
+
+:copyright: (C) 2019 YuzuRyo61.
+:license: MIT License, see LICENSE for more details.
+"""
+
+from .enum import (
+    NotificationsType,
+    NoteVisibility,
+    LangType,
+    Permissions
+)
+from .miauth import MiAuth
+from .misskey import Misskey
+
+__all__ = [
+    '__version__',
+    'Misskey',
+    'NoteVisibility',
+    'NotificationsType',
+    'LangType',
+    'Permissions',
+    'MiAuth',
+]
+
+__version__ = "4.0.0"
diff --git a/misskey/enum.py b/misskey/enum.py
new file mode 100644
index 0000000..a091383
--- /dev/null
+++ b/misskey/enum.py
@@ -0,0 +1,276 @@
+from enum import Enum, unique
+
+
+@unique
+class NoteVisibility(Enum):
+    PUBLIC = 'public'
+    HOME = 'home'
+    FOLLOWERS = 'followers'
+    SPECIFIED = 'specified'
+
+
+@unique
+class NotificationsType(Enum):
+    FOLLOW = 'follow'
+    MENTIONS = 'mention'
+    REPLY = 'reply'
+    RENOTE = 'renote'
+    QUOTE = 'quote'
+    REACTION = 'reaction'
+    POLL_VOTE = 'pollVote'
+    RECEIVE_FOLLOW_REQUEST = 'receiveFollowRequest'
+    FOLLOW_REQUEST_ACCEPTED = 'followRequestAccepted'
+    GROUP_INVITED = 'groupInvited'
+    APP = 'app'
+
+
+@unique
+class LangType(Enum):
+    ACH = 'ach'
+    ADY = 'ady'
+    AF = 'af'
+    AF_NA = 'af-NA'
+    AF_ZA = 'af-ZA'
+    AK = 'ak'
+    AR = 'ar'
+    AR_AR = 'ar-AR'
+    AR_MA = 'ar-MA'
+    AR_SA = 'ar-SA'
+    AY_BO = 'ay-BO'
+    AZ = 'az'
+    AZ_AZ = 'az-AZ'
+    BE_BY = 'be-BY'
+    BG = 'bg'
+    BG_BG = 'bg-BG'
+    BN = 'bn'
+    BN_IN = 'bn-IN'
+    BN_BD = 'bn-BD'
+    BS_BA = 'bs-BA'
+    CA = 'ca'
+    CA_ES = 'ca-ES'
+    CAK = 'cak'
+    CK_US = 'ck-US'
+    CS = 'cs'
+    CS_CZ = 'cs-CZ'
+    CY = 'cy'
+    CY_GB = 'cy-GB'
+    DA = 'da'
+    DA_DK = 'da-DK'
+    DE = 'de'
+    DE_AT = 'de-AT'
+    DE_DE = 'de-DE'
+    DE_CH = 'de-CH'
+    DSB = 'dsb'
+    EL = 'el'
+    EL_GR = 'el-GR'
+    EN = 'en'
+    EN_GB = 'en-GB'
+    EN_AU = 'en-AU'
+    EN_CA = 'en-CA'
+    EN_IE = 'en-IE'
+    EN_IN = 'en-IN'
+    EN_PI = 'en-PI'
+    EN_UD = 'en-UD'
+    EN_US = 'en-US'
+    EN_ZA = 'en-ZA'
+    EN_PIRATE = 'en@pirate'
+    EO = 'eo'
+    EO_EO = 'eo-EO'
+    ES = 'es'
+    ES_AR = 'es-AR'
+    ES_419 = 'es-419'
+    ES_CL = 'es-CL'
+    ES_CO = 'es-CO'
+    ES_EC = 'es-EC'
+    ES_ES = 'es-ES'
+    ES_LA = 'es-LA'
+    ES_NI = 'es-NI'
+    ES_MX = 'es-MX'
+    ES_US = 'es-US'
+    ES_VE = 'es-VE'
+    ET = 'et'
+    ET_EE = 'et-EE'
+    EU = 'eu'
+    EU_ES = 'eu-ES'
+    FA = 'fa'
+    FA_IR = 'fa-IR'
+    FB_LT = 'fb-LT'
+    FF = 'ff'
+    FI = 'fi'
+    FI_FI = 'fi-FI'
+    FO_FO = 'fo-FO'
+    FR = 'fr'
+    FR_CA = 'fr-CA'
+    FR_FR = 'fr-FR'
+    FR_BE = 'fr-BE'
+    FR_CH = 'fr-CH'
+    FY_NL = 'fy-NL'
+    GA = 'ga'
+    GA_IE = 'ga-IE'
+    GL = 'gl'
+    GL_ES = 'gl-ES'
+    GN_PY = 'gn-PY'
+    GU_IN = 'gu-IN'
+    GX_GR = 'gx-GR'
+    HE = 'he'
+    HE_IL = 'he-IL'
+    HI = 'hi'
+    HI_IN = 'hi-IN'
+    HR = 'hr'
+    HR_HR = 'hr-HR'
+    HSB = 'hsb'
+    HT = 'ht'
+    HU = 'hu'
+    HU_HU = 'hu-HU'
+    HY_AM = 'hy-AM'
+    ID = 'id'
+    ID_ID = 'id-ID'
+    IS = 'is'
+    IS_IS = 'is-IS'
+    IT = 'it'
+    IT_IT = 'it-IT'
+    JA = 'ja'
+    JA_JP = 'ja-JP'
+    JV_ID = 'jv-ID'
+    KA_GE = 'ka-GE'
+    KK_KZ = 'kk-KZ'
+    KM = 'km'
+    KM_KH = 'km-KH'
+    KAB = 'kab'
+    KN = 'kn'
+    KN_IN = 'kn-IN'
+    KO = 'ko'
+    KO_KR = 'ko-KR'
+    KU_TR = 'ku-TR'
+    LA = 'la'
+    LA_VA = 'la-VA'
+    LB = 'lb'
+    LI_NL = 'li-NL'
+    LT = 'lt'
+    LT_LT = 'lt-LT'
+    LV = 'lv'
+    LV_LV = 'lv-LV'
+    MAI = 'mai'
+    MG_MG = 'mg-MG'
+    MK = 'mk'
+    MK_MK = 'mk-MK'
+    ML = 'ml'
+    ML_IN = 'ml-IN'
+    MN_MN = 'mn-MN'
+    MR = 'mr'
+    MR_IN = 'mr-IN'
+    MS = 'ms'
+    MS_MY = 'ms-MY'
+    MT = 'mt'
+    MT_MT = 'mt-MT'
+    MY = 'my'
+    NO = 'no'
+    NB = 'nb'
+    NB_NO = 'nb-NO'
+    NE = 'ne'
+    NE_NP = 'ne-NP'
+    NL = 'nl'
+    NL_BE = 'nl-BE'
+    NL_NL = 'nl-NL'
+    NN_NO = 'nn-NO'
+    OC = 'oc'
+    OR_IN = 'or-IN'
+    PA = 'pa'
+    PA_IN = 'pa-IN'
+    PL = 'pl'
+    PL_PL = 'pl-PL'
+    PS_AF = 'ps-AF'
+    PT = 'pt'
+    PT_BR = 'pt-BR'
+    PT_PT = 'pt-PT'
+    QU_PE = 'qu-PE'
+    RM_CH = 'rm-CH'
+    RO = 'ro'
+    RO_RO = 'ro-RO'
+    RU = 'ru'
+    RU_RU = 'ru-RU'
+    SA_IN = 'sa-IN'
+    SE_NO = 'se-NO'
+    SI_LK = 'si-LK'
+    SK = 'sk'
+    SK_SK = 'sk-SK'
+    SL = 'sl'
+    SL_SI = 'sl-SI'
+    SO_SO = 'so-SO'
+    SQ = 'sq'
+    SQ_AL = 'sq-AL'
+    SR = 'sr'
+    SR_RS = 'sr-RS'
+    SU = 'su'
+    SV = 'sv'
+    SV_SE = 'sv-SE'
+    SW = 'sw'
+    SW_KE = 'sw-KE'
+    TA = 'ta'
+    TA_IN = 'ta-IN'
+    TE = 'te'
+    TE_IN = 'te-IN'
+    TG = 'tg'
+    TG_TJ = 'tg-TJ'
+    TH = 'th'
+    TH_TH = 'th-TH'
+    TL = 'tl'
+    TL_PH = 'tl-PH'
+    TLH = 'tlh'
+    TR = 'tr'
+    TR_TR = 'tr-TR'
+    TT_RU = 'tt-RU'
+    UK = 'uk'
+    UK_UA = 'uk-UA'
+    UR = 'ur'
+    UR_PK = 'ur-PK'
+    UZ = 'uz'
+    UZ_UZ = 'uz-UZ'
+    VI = 'vi'
+    VI_VN = 'vi-VN'
+    XH_ZA = 'xh-ZA'
+    YI = 'yi'
+    YI_DE = 'yi-DE'
+    ZH = 'zh'
+    ZH_HANS = 'zh-Hans'
+    ZH_HANT = 'zh-Hant'
+    ZH_CN = 'zh-CN'
+    ZH_HK = 'zh-HK'
+    ZH_SG = 'zh-SG'
+    ZH_TW = 'zh-TW'
+    ZU_ZA = 'zu-ZA'
+
+
+@unique
+class Permissions(Enum):
+    READ_ACCOUNT = 'read:account'
+    WRITE_ACCOUNT = 'write:account'
+    READ_BLOCKS = 'read:blocks'
+    WRITE_BLOCKS = 'write:blocks'
+    READ_DRIVE = 'read:drive'
+    WRITE_DRIVE = 'write:drive'
+    READ_FAVORITES = 'read:favorites'
+    READ_FOLLOWING = 'read:following'
+    WRITE_FOLLOWING = 'write:following'
+    READ_MESSAGING = 'read:messaging'
+    WRITE_MESSAGING = 'write:messaging'
+    READ_MUTES = 'read:mutes'
+    WRITE_MUTES = 'write:mutes'
+    WRITE_NOTES = 'write:notes'
+    READ_NOTIFICATIONS = 'read:notifications'
+    WRITE_NOTIFICATIONS = 'write:notifications'
+    READ_REACTIONS = 'read:reactions'
+    WRITE_REACTIONS = 'write:reactions'
+    WRITE_VOTES = 'write:votes'
+    READ_PAGES = 'read:pages'
+    WRITE_PAGES = 'write:pages'
+    WRITE_PAGE_LIKES = 'write:page-likes'
+    READ_PAGE_LIKES = 'read:page-likes'
+    READ_USER_GROUPS = 'read:user-groups'
+    WRITE_USER_GROUPS = 'write:user-groups'
+    READ_CHANNELS = 'read:channels'
+    WRITE_CHANNELS = 'write:channels'
+    READ_GALLERY = 'read:gallery'
+    WRITE_GALLERY = 'write:gallery'
+    READ_GALLERY_LIKES = 'read:gallery-likes'
+    WRITE_GALLERY_LIKES = 'write:gallery-likes'
diff --git a/misskey/exceptions.py b/misskey/exceptions.py
new file mode 100644
index 0000000..d42fabc
--- /dev/null
+++ b/misskey/exceptions.py
@@ -0,0 +1,44 @@
+import uuid
+from typing import Union
+
+
+class MisskeyAPIException(Exception):
+    __code: str
+    __id: Union[uuid.UUID, str]
+    __message: str
+
+    @property
+    def code(self) -> str:
+        return self.__code
+
+    @property
+    def id(self) -> Union[uuid.UUID, str]:
+        return self.__id
+
+    @property
+    def message(self) -> str:
+        return self.__message
+
+    def __init__(self, response_dict: dict):
+        if response_dict.get('error') is not None:
+            self.__code = response_dict['error']['code']
+            self.__message = response_dict['error']['message']
+            try:
+                self.__id = uuid.UUID(response_dict['error']['id'])
+            except (ValueError, TypeError):
+                self.__id = str(response_dict['error']['id'])
+        else:
+            self.__code = 'UNKNOWN'
+            self.__message = 'Unknown exception in Misskey.py'
+            self.__id = uuid.UUID(int=0)
+
+    def __str__(self) -> str:
+        return f'{self.__code}({self.__id}): {self.__message}'
+
+
+class MisskeyAuthorizeFailedException(Exception):
+    pass
+
+
+class MisskeyMiAuthFailedException(Exception):
+    pass
diff --git a/Misskey/Exceptions.py b/misskey/legacy/Exceptions.py
similarity index 98%
rename from Misskey/Exceptions.py
rename to misskey/legacy/Exceptions.py
index e996386..9c5b698 100644
--- a/Misskey/Exceptions.py
+++ b/misskey/legacy/Exceptions.py
@@ -70,4 +70,4 @@ class MisskeyNotImplementedVersionException(Exception): # pragma: no cover
     Exception displayed when trying to execute with a version that is not implemented.
     """
     def __str__(self):
-        return('This function (or class) can\'t run because your Misskey version is old.')
+        return('This function (or class) can\'t run because your misskey version is old.')
diff --git a/Misskey/Misskey.py b/misskey/legacy/Misskey.py
similarity index 98%
rename from Misskey/Misskey.py
rename to misskey/legacy/Misskey.py
index e6abc75..6846929 100644
--- a/Misskey/Misskey.py
+++ b/misskey/legacy/Misskey.py
@@ -1,13 +1,17 @@
 # -*- coding: utf-8 -*-
 
-from Misskey.Exceptions import MisskeyInitException, MisskeyAPIException, MisskeyAiException, MisskeyFileException, MisskeyAPITokenException, MisskeyNotImplementedVersionException
-
-import requests
 import json
-import os
 import mimetypes
+import os
+from distutils.version import LooseVersion  # pylint: disable=no-name-in-module,import-error
 from urllib.parse import urlparse
-from distutils.version import LooseVersion # pylint: disable=no-name-in-module,import-error
+
+import requests
+
+from misskey.legacy.Exceptions import MisskeyInitException, MisskeyAPIException, MisskeyAiException, \
+    MisskeyFileException, MisskeyAPITokenException, MisskeyNotImplementedVersionException
+from .Util import deprecated
+
 
 def restrictVer(minVer):
     """
@@ -15,20 +19,25 @@ def restrictVer(minVer):
 
     :raises MisskeyNotImplementedVersionException: Raised if lower than the specified version.
     """
+
     def deco(function):
         def inner(self, *args, **kwargs):
             if LooseVersion(getattr(self, 'version')) >= LooseVersion(minVer):
                 return function(self, *args, **kwargs)
-            else: # pragma: no cover
+            else:  # pragma: no cover
                 raise MisskeyNotImplementedVersionException
+
         return inner
+
     return deco
 
+
+@deprecated
 class Misskey:
     """
     Initialize the library.
-    
-    :param address: Instance address of Misskey. If leave a blank, library will use 'misskey.io'.
+
+    :param address: Instance address of misskey. If leave a blank, library will use 'misskey.io'.
     :param i: Use hashed keys or keys used on the web.
     :param skipChk: Skip instance valid check. It is not recommended to make it True.
     :raises MisskeyInitException: This exception is raised if an error occurs during class initialization. For example, it is raised if it can not connect to the specified address or if the token is invalid.
@@ -40,21 +49,21 @@ class Misskey:
 
     def __getApiToken(self):
         return self.__apiToken
-    
+
     def __setApiToken(self, val):
         if val != None:
             try:
                 res = requests.post(self.__instanceAddressApiUrl + 'i', data=json.dumps({'i': val}), headers={'content-type': 'application/json'}, allow_redirects=False)
             except: # pragma: no cover
                 raise MisskeyAPITokenException()
-            
+
             if res.status_code != 200:
                 raise MisskeyAPITokenException()
             else:
                 self.__apiToken = val
         else:
             self.__apiToken = None
-    
+
     def __delApiToken(self):
         self.__apiToken = None
 
@@ -101,7 +110,7 @@ def __API(self, apiName, includeI=False, expected=(200, 204), **payload):
                 payload['i'] = self.apiToken
             else:
                 raise MisskeyAiException()
-        
+
         res = requests.post(self.__instanceAddressApiUrl + apiName, data=json.dumps(payload), headers=self.headers, allow_redirects=False)
 
         if res.status_code in expected:
@@ -136,7 +145,7 @@ def __isUseCred(self): # pragma: no cover
     def meta(self, detail=True):
         """
         Read a instance meta information.
-        
+
         :param detail: Choose whether to show details.
         :type detail: bool
         :rtype: dict
@@ -183,15 +192,15 @@ def i_favorites(self, limit=10, sinceId=None, untilId=None):
         payload = {
             'limit': limit
         }
-        
+
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         return self.__API('i/favorites', True, 200, **payload)
-    
+
     def i_notifications(self, limit=10, sinceId=None, untilId=None, following=False, markAsRead=True, includeTypes=[], excludeTypes=[]):
         """
         Show your notifications.
@@ -221,12 +230,12 @@ def i_notifications(self, limit=10, sinceId=None, untilId=None, following=False,
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         return self.__API('i/notifications', True, 200, **payload)
-    
+
     def i_pin(self, noteId):
         """
         Pin a note.
@@ -264,7 +273,7 @@ def i_unpin(self, noteId):
         :rtype: dict
         """
         return self.__API('i/unpin', True, 200, noteId=noteId)
-    
+
     def i_update(self,
         name="",
         description="",
@@ -318,16 +327,16 @@ def i_update(self,
 
         if name != "": # pragma: no cover
             payload['name'] = name
-        
+
         if description != "": # pragma: no cover
             payload['description'] = description
-        
+
         if lang != "": # pragma: no cover
             payload['lang'] = lang
-        
+
         if location != "": # pragma: no cover
             payload['location'] = location
-        
+
         if birthday != "": # pragma: no cover
             payload['birthday'] = birthday
 
@@ -357,7 +366,7 @@ def i_update(self,
 
         if alwaysMarkNsfw != None: # pragma: no cover
             payload['alwaysMarkNsfw'] = alwaysMarkNsfw
-        
+
         return self.__API('i/update', True, 200, **payload)
 
     def notifications_markAllAsRead(self):
@@ -402,7 +411,7 @@ def notes(self, local=False, reply=False, renote=False, withFiles=False, poll=Fa
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
 
@@ -495,7 +504,7 @@ def notes_create(
                 payload['poll']['expiresAt'] = pollExpiresAt
             if pollExpiredAfter != None:
                 payload['poll']['expiredAfter'] = pollExpiredAfter
-        
+
         return self.__API('notes/create', True, 200, **payload)
 
     def notes_renote(self, noteId):
@@ -532,9 +541,9 @@ def notes_renotes(self, noteId, limit=10, sinceId=None, untilId=None):
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         return self.__API('notes/renotes', self.__isUseCred(), 200, **payload)
-    
+
     def notes_delete(self, noteId):
         """
         Delete a own note.
@@ -584,7 +593,7 @@ def notes_reactions(self, noteId, limit=10, offset=None, sinceId=None, untilId=N
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         return self.__API('notes/reactions', True, 200, **payload)
 
     def notes_reactions_create(self, noteId, reaction):
@@ -617,9 +626,9 @@ def notes_reactions_create(self, noteId, reaction):
             payload['reaction'] = reactionTemplate[reaction]
         else: # pragma: no cover
             payload['reaction'] = reaction
-        
+
         return self.__API('notes/reactions/create', True, 204, **payload)
-    
+
     def notes_reactions_delete(self, noteId):
         """
         Cancel a reaction for note.
@@ -630,7 +639,7 @@ def notes_reactions_delete(self, noteId):
         :rtype: bool
         """
         return self.__API('notes/reactions/delete', True, 204, noteId=noteId)
-    
+
     def notes_polls_vote(self, noteId, choice):
         """
         Vote a note.
@@ -696,7 +705,7 @@ def notes_globalTimeline(self, withFiles=False, limit=10, sinceId=None, untilId=
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if sinceDate != None: # pragma: no cover
             payload['sinceDate'] = sinceDate
 
@@ -752,7 +761,7 @@ def notes_hybridTimeline(
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if sinceDate != None: # pragma: no cover
             payload['sinceDate'] = sinceDate
 
@@ -797,7 +806,7 @@ def notes_localTimeline(self, withFiles=False, fileType=None, excludeNsfw=False,
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if sinceDate != None: # pragma: no cover
             payload['sinceDate'] = sinceDate
 
@@ -805,7 +814,7 @@ def notes_localTimeline(self, withFiles=False, fileType=None, excludeNsfw=False,
             payload['untilDate'] = untilDate
 
         return self.__API('notes/local-timeline', self.__isUseCred(), 200, **payload)
-    
+
     def notes_userListTimeline(self, listId, limit=10, sinceId=None, untilId=None, sinceDate=None, untilDate=None, includeMyRenotes=True, includeRenotedMyNotes=True, includeLocalRenotes=True, withFiles=False):
         """
         Show timeline from specified list.
@@ -844,7 +853,7 @@ def notes_userListTimeline(self, listId, limit=10, sinceId=None, untilId=None, s
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if sinceDate != None: # pragma: no cover
             payload['sinceDate'] = sinceDate
 
@@ -871,7 +880,7 @@ def notes_watching_create(self, noteId):
         ::param noteId: Specify the post ID you want to watch a note
         :type noteId: str
         :return: Returns `True` if the request is successful.
-        :rtype: bool 
+        :rtype: bool
         """
         return self.__API('notes/watching/create', True, 204, noteId=noteId)
 
@@ -882,7 +891,7 @@ def notes_watching_delete(self, noteId):
         ::param noteId: Specify the post ID you want to unwatch a note
         :type noteId: str
         :return: Returns `True` if the request is successful.
-        :rtype: bool 
+        :rtype: bool
         """
         return self.__API('notes/watching/delete', True, 204, noteId=noteId)
 
@@ -932,10 +941,10 @@ def users_show(self, userId=None, userIds=None, username=None, host=None):
         :rtype: dict, list
         """
         payload = {}
-        
+
         if userId != None: # pragma: no cover
             payload['userId'] = userId
-        
+
         if userIds != None and type(userIds) == list: # pragma: no cover
             payload['userIds'] = userIds
 
@@ -944,9 +953,9 @@ def users_show(self, userId=None, userIds=None, username=None, host=None):
 
         if host != None: # pragma: no cover
             payload['host'] = host
-        
+
         return self.__API('users/show', self.__isUseCred(), 200, **payload)
-    
+
     def users_notes(self, userId, includeReplies=True, limit=10, sinceId=None, untilId=None, sinceDate=None, untilDate=None, includeMyRenotes=True, includeRenotedMyNotes=True, includeLocalRenotes=True, withFiles=False, fileType=None, excludeNsfw=False):
         """
         Show timeline from specified user.
@@ -988,7 +997,7 @@ def users_notes(self, userId, includeReplies=True, limit=10, sinceId=None, until
 
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if sinceDate != None: # pragma: no cover
             payload['sinceDate'] = sinceDate
 
@@ -1026,7 +1035,7 @@ def users_followers(self, userId=None, username=None, host=None, sinceId=None, u
 
         if userId != None: # pragma: no cover
             payload['userId'] = userId
-        
+
         if username != None: # pragma: no cover
             payload['username'] = username
 
@@ -1035,12 +1044,12 @@ def users_followers(self, userId=None, username=None, host=None, sinceId=None, u
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
 
         return self.__API('users/followers', self.__isUseCred(), 200, **payload)
-    
+
     def users_following(self, userId=None, username=None, host=None, sinceId=None, untilId=None, limit=10):
         """
         Show following from specified user.
@@ -1065,7 +1074,7 @@ def users_following(self, userId=None, username=None, host=None, sinceId=None, u
 
         if userId != None: # pragma: no cover
             payload['userId'] = userId
-        
+
         if username != None: # pragma: no cover
             payload['username'] = username
 
@@ -1074,7 +1083,7 @@ def users_following(self, userId=None, username=None, host=None, sinceId=None, u
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
 
@@ -1176,7 +1185,7 @@ def following_create(self, userId):
         :rtype: dict
         """
         return self.__API('following/create', True, 200, userId=userId)
-    
+
     def following_delete(self, userId):
         """
         Unfollow a user.
@@ -1214,7 +1223,7 @@ def mute_list(self, limit=30, sinceId=None, untilId=None):
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
 
@@ -1256,7 +1265,7 @@ def blocking_list(self, limit=30, sinceId=None, untilId=None):
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
 
@@ -1274,7 +1283,7 @@ def blocking_delete(self, userId):
     def drive(self):
         """
         Show your capacity.
-        
+
         :rtype: dict
         """
         return self.__API('drive', True)
@@ -1300,10 +1309,10 @@ def drive_files(self, limit=10, sinceId=None, untilId=None, folderId="", type=No
         }
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if folderId != "": # pragma: no cover
             payload['folderId'] = folderId
 
@@ -1328,7 +1337,7 @@ def drive_files_create(self, filePath, folderId=None, isSensitive=False, force=F
         """
         if not os.path.isfile(filePath):
             raise MisskeyFileException(filePath)
-        
+
         fileName = os.path.basename(filePath)
         fileAbs = os.path.abspath(filePath)
         fileBin = open(fileAbs, 'rb')
@@ -1377,7 +1386,7 @@ def drive_files_find(self, name, folderId=""):
 
         if folderId != "": # pragma: no cover
             payload['folderId'] = folderId
-        
+
         return self.__API('drive/files/find', True, 200, **payload)
 
     def drive_files_attachedNotes(self, fileId):
@@ -1389,7 +1398,7 @@ def drive_files_attachedNotes(self, fileId):
         :rtype: list
         """
         return self.__API('drive/files/attached-notes', True, 200, fileId=fileId)
-    
+
     def drive_files_checkExistence(self, md5):
         """
         You can check if the specified hash value exists on the drive.
@@ -1417,9 +1426,9 @@ def drive_files_show(self, fileId=None, url=None):
 
         if url != None: # pragma: no cover
             payload['url'] = url
-        
+
         return self.__API('drive/files/show', True, 200, **payload)
-    
+
     def drive_files_update(self, fileId, folderId="", name=None, isSensitive=None):
         """
         Update a file.
@@ -1446,7 +1455,7 @@ def drive_files_update(self, fileId, folderId="", name=None, isSensitive=None):
 
         if isSensitive != None: # pragma: no cover
             payload['isSensitive'] = isSensitive
-        
+
         return self.__API('drive/files/update', True, 200, **payload)
 
     def drive_files_delete(self, fileId):
@@ -1459,7 +1468,7 @@ def drive_files_delete(self, fileId):
         :rtype: bool
         """
         return self.__API('drive/files/delete', True, 204, fileId=fileId)
-    
+
     def drive_folders(self, limit=10, sinceId=None, untilId=None, folderId=None):
         """
         List folders in specified directory.
@@ -1478,13 +1487,13 @@ def drive_folders(self, limit=10, sinceId=None, untilId=None, folderId=None):
             'limit': limit,
             'folderId': folderId
         }
-        
+
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         return self.__API('drive/folders', True, 200, **payload)
 
     def drive_folders_create(self, name="Untitled", parentId=None):
@@ -1515,7 +1524,7 @@ def drive_folders_find(self, name, parentId=""):
 
         if parentId != "": # pragma: no cover
             payload['parentId'] = parentId
-        
+
         return self.__API('drive/folders/find', True, 200, **payload)
 
 
@@ -1550,7 +1559,7 @@ def drive_folders_update(self, folderId, name=None, parentId=""):
 
         if parentId != "": # pragma: no cover
             payload['parentId'] = parentId
-        
+
         return self.__API('drive/folders/update', True, 200, **payload)
 
     def drive_folders_delete(self, folderId):
@@ -1563,7 +1572,7 @@ def drive_folders_delete(self, folderId):
         :rtype: bool
         """
         return self.__API('drive/folders/delete', True, 204, folderId=folderId)
-    
+
     def drive_stream(self, limit=10, sinceId=None, untilId=None, type=None):
         """
         Display the file of the file uploaded so far.
@@ -1586,13 +1595,13 @@ def drive_stream(self, limit=10, sinceId=None, untilId=None, type=None):
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         if type != None: # pragma: no cover
             payload['type'] = type
-        
+
         return self.__API('drive/stream', True, 200, **payload)
 
     def messaging_history(self, limit=10):
@@ -1629,10 +1638,10 @@ def messaging_messages(self, userId, limit=10, sinceId=None, untilId=None, markA
 
         if sinceId != None: # pragma: no cover
             payload['sinceId'] = sinceId
-        
+
         if untilId != None: # pragma: no cover
             payload['untilId'] = untilId
-        
+
         return self.__API('messaging/messages', True, 200, **payload)
 
     def messaging_messages_create(self, userId, text=None, fileId=None):
@@ -1653,10 +1662,10 @@ def messaging_messages_create(self, userId, text=None, fileId=None):
 
         if text != None: # pragma: no cover
             payload['text'] = text
-        
+
         if fileId != None: # pragma: no cover
             payload['fileId'] = fileId
-        
+
         return self.__API('messaging/messages/create', True, 200, **payload)
 
     def messaging_messages_delete(self, messageId):
diff --git a/Misskey/Util.py b/misskey/legacy/Util.py
similarity index 93%
rename from Misskey/Util.py
rename to misskey/legacy/Util.py
index ac45445..b913c75 100644
--- a/Misskey/Util.py
+++ b/misskey/legacy/Util.py
@@ -1,28 +1,29 @@
+import functools
 import hashlib
 import json
-import requests
-import warnings
-import functools
 import uuid
-
+import warnings
 from urllib.parse import urlparse, urlencode
 
-from Misskey.Exceptions import (
+import requests
+
+from misskey import __version__
+from misskey.legacy.Exceptions import (
     MisskeyAPIException,
     MisskeyInitException,
     MisskeyNotImplementedVersionException,
     MisskeyMiAuthCheckException
 )
-from Misskey import __version__
 
-def deprecated(func): # pragma: no cover
+
+def deprecated(func):  # pragma: no cover
     """This is a decorator which can be used to mark functions
     as deprecated. It will result in a warning being emitted
     when the function is used."""
     @functools.wraps(func)
     def new_func(*args, **kwargs):
         warnings.simplefilter('always', DeprecationWarning)  # turn off filter
-        warnings.warn("Call to deprecated function {}.".format(func.__name__),
+        warnings.warn("Called deprecated function or class: {}.".format(func.__name__),
                       category=DeprecationWarning,
                       stacklevel=2)
         warnings.simplefilter('default', DeprecationWarning)  # reset filter
@@ -71,7 +72,7 @@ def create_app(instanceAddress, appName, description, permission=[
     **Deprecated**
     Creates an application key with the specified instance address.
 
-    :param instanceAddress: Specify the Misskey instance address.
+    :param instanceAddress: Specify the misskey instance address.
     :param appName: Specifies the name of the app.
     :param description: Specify the app description.
     :param permission: Specifies the app's permissions.
@@ -96,7 +97,7 @@ def session_generate(instanceAddress, appSecret): # pragma: no cover
     **Deprecated**
     Issue a token to authenticate the user.
 
-    :param instanceAddress: Specify the Misskey instance address.
+    :param instanceAddress: Specify the misskey instance address.
     :param appSecret: Specifies the secret key.
     :type instanceAddress: str
     :type appSecret: str
@@ -115,7 +116,7 @@ def session_userkey(instanceAddress, appSecret, token): # pragma: no cover
     **Deprecated**
     It is a function to perform when the user authenticates with the browser.
 
-    :param instanceAddress: Specify the Misskey instance address.
+    :param instanceAddress: Specify the misskey instance address.
     :param appSecret: Specifies the secret key.
     :param token: Specify the token issued before authentication.
     :type instanceAddress: str
@@ -134,7 +135,7 @@ def username_available(instanceAddress, username):
     """
     Checks if the specified user name can be used.
 
-    :param instanceAddress: Specify the Misskey instance address.
+    :param instanceAddress: Specify the misskey instance address.
     :param username: Specify the username you want to check.
     :type instanceAddress: str
     :type username: str
@@ -147,9 +148,11 @@ def username_available(instanceAddress, username):
     else:
         return res.json()
 
+
+@deprecated
 class MiAuth: # pragma: no cover
     """
-    Misskey authentication class
+    misskey authentication class
     """
     headers = {'content-type': 'application/json'}
     __token = None
@@ -159,7 +162,7 @@ def __init__(
         self,
         instanceAddress="misskey.io",
         sessionId=uuid.uuid4,
-        name=f"Misskey.py v{__version__}",
+        name=f"misskey.py v{__version__}",
         icon=None,
         callback=None,
         permission=(
@@ -214,7 +217,7 @@ def __init__(
     @property
     def instanceAddress(self):
         return self.__instanceAddress
-    
+
     @property
     def sessionId(self):
         return self.__sessionId
@@ -222,23 +225,23 @@ def sessionId(self):
     @property
     def name(self):
         return self.__name
-    
+
     @property
     def icon(self):
         return self.__icon
-    
+
     @property
     def callback(self):
         return self.__callback
-    
+
     @property
     def permission(self):
         return self.__permission
-    
+
     @property
     def token(self):
         return self.__token
-    
+
     @property
     def user(self):
         return self.__user
@@ -251,7 +254,7 @@ def getUrl(self):
 
         if self.__icon != None:
             payload["icon"] == self.__icon
-        
+
         if self.__callback != None:
             payload["callback"] == self.__callback
 
diff --git a/Misskey/__init__.py b/misskey/legacy/__init__.py
similarity index 73%
rename from Misskey/__init__.py
rename to misskey/legacy/__init__.py
index 1fa8d62..187828f 100644
--- a/Misskey/__init__.py
+++ b/misskey/legacy/__init__.py
@@ -1,13 +1,12 @@
-# -*- coding: utf-8 -*-
 """
-Misskey.py
+misskey.py
 
 :copyright: (C) 2019 YuzuRyo61.
 :license: MIT License, see LICENSE for more details.
 """
 
-from Misskey.Misskey import Misskey
-from Misskey.Exceptions import *
+from .Exceptions import *
+from .Misskey import Misskey
 
 __all__ = [
     'Misskey',
@@ -19,5 +18,3 @@
     'MisskeyNotImplementedVersionException',
     'MisskeyMiAuthCheckException'
 ]
-
-__version__ = "3.0.0"
diff --git a/misskey/miauth.py b/misskey/miauth.py
new file mode 100644
index 0000000..6eb8179
--- /dev/null
+++ b/misskey/miauth.py
@@ -0,0 +1,187 @@
+import uuid
+from typing import (
+    Optional,
+    Any,
+    Union,
+    List,
+    Tuple,
+    Set,
+)
+from urllib.parse import urlparse, urlencode
+
+import requests
+
+from .enum import Permissions
+from .exceptions import MisskeyMiAuthFailedException
+
+
+class MiAuth:
+    __DEFAULT_ADDRESS: str = 'https://misskey.io'
+
+    __address: str
+    __scheme: str
+    __session_id: Union[uuid.UUID, str]
+    __session: requests.Session
+
+    __name: str
+    __icon: Optional[str] = None
+    __callback: Optional[str] = None
+    __token: Optional[str] = None
+    __permission: Union[
+            List[Union[Permissions, str]],
+            Tuple[Union[Permissions, None]],
+            Set[Permissions],
+            None,
+    ] = None
+    timeout: Optional[Any] = 15.0
+
+    @property
+    def address(self) -> str:
+        return self.__address
+
+    @property
+    def name(self) -> str:
+        return self.__name
+
+    @name.setter
+    def name(self, val: str):
+        self.__name = val
+
+    @property
+    def icon(self) -> Optional[str]:
+        return self.__icon
+
+    @icon.setter
+    def icon(self, val: str):
+        self.__icon = val
+
+    @icon.deleter
+    def icon(self):
+        self.__icon = None
+
+    @property
+    def callback(self) -> Optional[str]:
+        return self.__callback
+
+    @callback.setter
+    def callback(self, val: str):
+        self.__callback = val
+
+    @callback.deleter
+    def callback(self):
+        self.__callback = None
+
+    @property
+    def session_id(self) -> Union[
+        uuid.UUID,
+        str,
+    ]:
+        return self.__session_id
+
+    @property
+    def permission(self) -> Union[
+        List[Union[Permissions, str, None]],
+        Tuple[Union[Permissions, None]],
+        Set[Permissions],
+        None,
+    ]:
+        return self.__permission
+
+    @permission.setter
+    def permission(self, val: Union[
+        List[Union[Permissions, str, None]],
+        Tuple[Union[Permissions, None]],
+        Set[Permissions],
+        None,
+    ]):
+        if type(val) is list:
+            for index, v in enumerate(val):
+                if type(v) is str:
+                    self.__permission[index] = Permissions(v)
+        else:
+            self.__permission = val
+
+    @property
+    def token(self) -> Optional[str]:
+        return self.__token
+
+    @property
+    def __endpoint(self):
+        return f'{self.__scheme}://{self.__address}'
+
+    def __init__(
+        self,
+        address: str = __DEFAULT_ADDRESS,
+        session_id: Union[uuid.UUID, str, None] = None,
+        name: str = 'Misskey.py',
+        icon: Optional[str] = None,
+        callback: Optional[str] = None,
+        permission: Union[
+            List[Union[Permissions, str, None]],
+            Tuple[Union[Permissions, None]],
+            Set[Union[Permissions, None]],
+            None,
+        ] = None,
+        session: Optional[requests.Session] = None,
+    ):
+        parse_res = urlparse(address)
+
+        if parse_res.scheme == '':
+            parse_res = urlparse(f'https://{address}')
+
+        self.__address = str(parse_res.netloc)
+        self.__scheme = str(parse_res.scheme)
+
+        if session is None:
+            session = requests.Session()
+        self.__session = session
+
+        if permission is None:
+            self.__permission = [pe.value for pe in Permissions]
+        else:
+            self.__permission = permission
+
+        if type(self.__permission) is list:
+            for index, val in enumerate(self.__permission):
+                if type(val) is str:
+                    self.__permission[index] = Permissions(val)
+
+        if session_id is None:
+            self.__session_id = uuid.uuid4()
+        else:
+            self.__session_id = session_id
+
+        self.__name = name
+        self.__icon = icon
+        self.__callback = callback
+
+    def generate_url(self) -> str:
+        url_params = {
+            'name': self.__name,
+            'permission': ','.join(
+                str(perm.value) for perm in self.__permission
+            ),
+        }
+        if self.__icon is not None:
+            url_params['icon'] = self.__icon
+        if self.__callback is not None:
+            url_params['callback'] = self.__callback
+
+        return (
+            f'{self.__endpoint}/miauth/{str(self.__session_id)}'
+            f'?{urlencode(url_params)}'
+        )
+
+    def check(self) -> str:
+        res = self.__session.post(
+            f'{self.__endpoint}/api/miauth/{str(self.__session_id)}/check',
+            allow_redirects=False,
+            timeout=self.timeout,
+        )
+        res.raise_for_status()
+        res_json: dict = res.json()
+        if not res_json.get('ok', False):
+            raise MisskeyMiAuthFailedException()
+
+        self.__token = res_json['token']
+        return self.__token
diff --git a/misskey/misskey.py b/misskey/misskey.py
new file mode 100644
index 0000000..52207fc
--- /dev/null
+++ b/misskey/misskey.py
@@ -0,0 +1,950 @@
+import datetime
+import math
+import re
+from enum import Enum
+from typing import (
+    Optional,
+    Union,
+    List,
+    Tuple,
+    Set,
+    Any,
+    IO as IOTypes,
+)
+from urllib.parse import urlparse
+
+import requests
+
+from .enum import (
+    NoteVisibility,
+    NotificationsType,
+    LangType,
+)
+from .exceptions import (
+    MisskeyAuthorizeFailedException,
+    MisskeyAPIException,
+)
+
+
+class Misskey:
+    __DEFAULT_ADDRESS: str = 'https://misskey.io'
+
+    __address: str
+    __scheme: str
+    __session: requests.Session
+
+    __token: Optional[str] = None
+    timeout: Optional[Any] = 15.0
+
+    @property
+    def address(self):
+        return self.__address
+
+    @property
+    def __api_url(self):
+        return f'{self.__scheme}://{self.__address}/api'
+
+    @property
+    def token(self):
+        return self.__token
+
+    @token.setter
+    def token(self, new_token: str):
+        credential_res = self.__session.post(
+            f'{self.__api_url}/i',
+            json={
+                'i': new_token,
+            },
+            allow_redirects=False,
+            timeout=self.timeout
+        )
+        if credential_res.status_code == 403 or \
+           credential_res.status_code == 401:
+            raise MisskeyAuthorizeFailedException()
+
+        self.__token = new_token
+        return
+
+    @token.deleter
+    def token(self):
+        self.__token = None
+
+    def __init__(
+        self,
+        address: str = __DEFAULT_ADDRESS,
+        i: Optional[str] = None,
+        session: Optional[requests.Session] = None
+    ):
+        parse_res = urlparse(address)
+
+        if parse_res.scheme == '':
+            parse_res = urlparse(f'https://{address}')
+
+        self.__address = str(parse_res.netloc)
+        self.__scheme = str(parse_res.scheme)
+
+        if session is None:
+            session = requests.Session()
+        self.__session = session
+
+        body = {}
+        if i is not None:
+            self.__token = i
+            body['i'] = i
+
+        meta_res = self.__session.post(
+            f'{self.__api_url}/meta',
+            json=body,
+            allow_redirects=False
+        )
+
+        if meta_res.status_code == 403 or \
+           meta_res.status_code == 401:
+            raise MisskeyAuthorizeFailedException()
+
+    def __request_api(
+        self,
+        endpoint_name: str,
+        **payload
+    ) -> Union[dict, bool, List[dict]]:
+        if self.__token is not None:
+            payload['i'] = self.__token
+
+        response = self.__session.post(
+            f'{self.__api_url}/{endpoint_name}',
+            json=payload,
+            allow_redirects=False,
+            timeout=self.timeout,
+        )
+        if response.status_code >= 400:
+            raise MisskeyAPIException(response.json())
+
+        if response.status_code == 204:
+            return True
+        else:
+            return response.json()
+
+    @staticmethod
+    def __params(
+        params: dict,
+        exclude_keys: Union[
+            Set[str],
+            Tuple[str],
+            List[str],
+            None
+        ] = None,
+        custom_rename: Optional[dict] = None,
+    ) -> dict:
+        if exclude_keys is None:
+            exclude_keys = tuple()
+
+        if 'self' in params:
+            del params['self']
+
+        param_keys = list(params.keys())
+        for key in param_keys:
+            if params[key] is None or key in exclude_keys:
+                del params[key]
+
+        param_camel = {}
+        for key, val in params.items():
+            if isinstance(val, Enum):
+                val = val.value
+            if type(val) is set:
+                val = list(val)
+            if type(val) is list:
+                for index, val_list in enumerate(val):
+                    if isinstance(val_list, Enum):
+                        val[index] = val_list.value
+
+            if type(custom_rename) is dict and key in custom_rename.keys():
+                rename_to = custom_rename[key]
+                param_camel[rename_to] = val
+            else:
+                key_camel = re.sub(r'_(.)', lambda x: x.group(1).upper(), key)
+                param_camel[key_camel] = val
+
+        return param_camel
+
+    def i(self) -> dict:
+        return self.__request_api('i')
+
+    def meta(
+        self,
+        detail: bool = True,
+    ) -> dict:
+        return self.__request_api('meta', detail=detail)
+
+    def stats(self) -> dict:
+        return self.__request_api('stats')
+
+    def announcements(
+        self,
+        limit: int = 10,
+        with_unreads: bool = True,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('announcements', **params)
+
+    def i_favorites(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        param = self.__params(locals())
+
+        return self.__request_api('i/favorites', **param)
+
+    def i_pin(
+        self,
+        note_id: str,
+    ) -> dict:
+        return self.__request_api('i/pin', noteId=note_id)
+
+    def i_unpin(
+        self,
+        note_id: str,
+    ) -> dict:
+        return self.__request_api('i/unpin', noteId=note_id)
+
+    def i_notifications(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        following: bool = False,
+        mark_as_read: bool = True,
+        include_types: Union[
+            List[Union[NotificationsType, str]],
+            Tuple[NotificationsType],
+            Set[NotificationsType],
+            None,
+        ] = None,
+        exclude_types: Union[
+            List[Union[NotificationsType, str]],
+            Tuple[NotificationsType],
+            Set[NotificationsType],
+            None,
+        ] = None,
+    ) -> List[dict]:
+        if type(include_types) is list:
+            for index, val in enumerate(include_types):
+                if type(val) is str:
+                    include_types[index] = NotificationsType(val)
+
+        if type(exclude_types) is list:
+            for index, val in enumerate(exclude_types):
+                if type(val) is str:
+                    exclude_types[index] = NotificationsType(val)
+
+        params = self.__params(locals())
+        return self.__request_api('i/notifications', **params)
+
+    def notifications_mark_all_as_read(self) -> bool:
+        return self.__request_api(
+            'notifications/mark-all-as-read'
+        )
+
+    def i_update(
+        self,
+        name: Optional[str] = None,
+        description: Optional[str] = None,
+        lang: Union[LangType, str, None] = None,
+        location: Optional[str] = None,
+        birthday: Union[
+            datetime.date,
+            datetime.datetime,
+            str,
+            None,
+        ] = None,
+        avatar_id: Optional[str] = None,
+        banner_id: Optional[str] = None,
+        fields: Optional[List[dict]] = None,
+        is_locked: Optional[bool] = None,
+        is_explorable: Optional[bool] = None,
+        hide_online_status: Optional[bool] = None,
+        careful_bot: Optional[bool] = None,
+        auto_accept_followed: Optional[bool] = None,
+        no_crawle: Optional[bool] = None,
+        is_bot: Optional[bool] = None,
+        is_cat: Optional[bool] = None,
+        inject_featured_note: Optional[bool] = None,
+        receive_announcement_email: Optional[bool] = None,
+        always_mark_nsfw: Optional[bool] = None,
+        pinned_page_id: Optional[str] = None,
+        muted_words: Optional[List[List[str]]] = None,
+        muting_notification_types: Union[
+            List[Union[NotificationsType, str]],
+            Tuple[NotificationsType],
+            Set[NotificationsType],
+            None,
+        ] = None,
+        email_notification_types: Optional[List[str]] = None,
+    ) -> dict:
+        if type(lang) is str:
+            lang = LangType(lang)
+
+        if isinstance(birthday, datetime.date) or \
+           isinstance(birthday, datetime.datetime):
+            birthday = birthday.strftime('%Y-%m-%d')
+
+        if type(muting_notification_types) is list:
+            for index, val in enumerate(muting_notification_types):
+                if type(val) is str:
+                    muting_notification_types[index] = NotificationsType(val)
+
+        params = self.__params(locals())
+        return self.__request_api('i/update', **params)
+
+    def notes_create(
+        self,
+        text: Optional[str] = None,
+        cw: Optional[str] = None,
+        visibility: Union[NoteVisibility, str] = NoteVisibility.PUBLIC,
+        visible_user_ids: Optional[List[str]] = None,
+        via_mobile: bool = False,
+        local_only: bool = False,
+        no_extract_mentions: bool = False,
+        no_extract_hashtags: bool = False,
+        no_extract_emojis: bool = False,
+        file_ids: Optional[List[str]] = None,
+        reply_id: Optional[str] = None,
+        renote_id: Optional[str] = None,
+        poll_choices: Optional[Union[List[str], Tuple[str]]] = None,
+        poll_multiple: bool = False,
+        poll_expires_at: Optional[Union[int, datetime.datetime]] = None,
+        poll_expired_after: Optional[Union[int, datetime.timedelta]] = None,
+    ) -> dict:
+        if type(visibility) is str:
+            visibility = NoteVisibility(visibility)
+
+        if (type(poll_choices) == list or type(poll_choices) == tuple) and \
+           10 >= len(poll_choices) >= 2:
+            if isinstance(poll_expires_at, datetime.datetime):
+                poll_expires_at = math.floor(
+                    poll_expires_at.timestamp() * 1000)
+            if isinstance(poll_expired_after, datetime.timedelta):
+                poll_expired_after = poll_expired_after.seconds * 1000
+
+            poll = {
+                'choices': poll_choices,
+                'expiresAt': poll_expires_at,
+                'expiredAfter': poll_expired_after,
+            }
+
+        params = self.__params(
+            locals(),
+            {
+                'poll_choices',
+                'poll_multiple',
+                'poll_expires_at',
+                'poll_expired_after'
+            }
+        )
+
+        return self.__request_api('notes/create', **params)
+
+    def notes_show(
+        self,
+        note_id: str,
+    ) -> dict:
+        return self.__request_api('notes/show', noteId=note_id)
+
+    def notes_conversation(
+        self,
+        note_id: str,
+        limit: int = 10,
+        offset: Optional[int] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('notes/conversation', **params)
+
+    def notes_children(
+        self,
+        note_id: str,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('notes/children', **params)
+
+    def notes_replies(
+        self,
+        note_id: str,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        limit: int = 10,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('notes/replies', **params)
+
+    def notes_renotes(
+        self,
+        note_id: str,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('notes/renotes', **params)
+
+    def notes_unrenote(
+        self,
+        note_id: str
+    ) -> bool:
+        return self.__request_api('notes/unrenote', noteId=note_id)
+
+    def notes_reactions(
+        self,
+        note_id: str,
+        reaction_type: Optional[str] = None,
+        limit: int = 10,
+        offset: Optional[int] = None,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(
+            locals(),
+            custom_rename={
+                'reaction_type': 'type',
+            }
+        )
+        return self.__request_api('notes/reactions', **params)
+
+    def notes_reactions_create(
+        self,
+        note_id: str,
+        reaction: str,
+    ) -> bool:
+        params = self.__params(locals())
+        return self.__request_api('notes/reactions/create', **params)
+
+    def notes_reactions_delete(
+        self,
+        note_id: str,
+    ) -> bool:
+        params = self.__params(locals())
+        return self.__request_api('notes/reactions/delete', **params)
+
+    def notes_polls_vote(
+        self,
+        note_id: str,
+        choice: int,
+    ) -> bool:
+        return self.__request_api(
+            'notes/polls/vote',
+            noteId=note_id,
+            choice=choice,
+        )
+
+    def notes_state(
+        self,
+        note_id: str,
+    ) -> dict:
+        return self.__request_api(
+            'notes/state',
+            noteId=note_id,
+        )
+
+    def notes_favorites_create(
+        self,
+        note_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'notes/favorites/create',
+            noteId=note_id,
+        )
+
+    def notes_favorites_delete(
+        self,
+        note_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'notes/favorites/delete',
+            noteId=note_id,
+        )
+
+    def notes_watching_create(
+        self,
+        note_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'notes/watching/create',
+            noteId=note_id,
+        )
+
+    def notes_watching_delete(
+        self,
+        note_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'notes/watching/delete',
+            noteId=note_id,
+        )
+
+    def notes_delete(
+        self,
+        note_id: str,
+    ) -> bool:
+        return self.__request_api('notes/delete', noteId=note_id)
+
+    def notes_timeline(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        since_date: Union[int, datetime.datetime, None] = None,
+        until_date: Union[int, datetime.datetime, None] = None,
+        include_my_renotes: bool = True,
+        include_renoted_my_notes: bool = True,
+        include_local_renotes: bool = True,
+        with_files: bool = True,
+    ) -> List[dict]:
+        if isinstance(since_date, datetime.datetime):
+            since_date = math.floor(
+                since_date.timestamp() * 1000)
+        if isinstance(until_date, datetime.datetime):
+            until_date = math.floor(
+                until_date.timestamp() * 1000)
+        params = self.__params(locals())
+        return self.__request_api('notes/timeline', **params)
+
+    def notes_local_timeline(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        since_date: Union[int, datetime.datetime, None] = None,
+        until_date: Union[int, datetime.datetime, None] = None,
+        with_files: bool = True,
+        file_type: Optional[List[str]] = None,
+        exclude_nsfw: bool = False,
+    ) -> List[dict]:
+        if isinstance(since_date, datetime.datetime):
+            since_date = math.floor(
+                since_date.timestamp() * 1000)
+        if isinstance(until_date, datetime.datetime):
+            until_date = math.floor(
+                until_date.timestamp() * 1000)
+        params = self.__params(locals())
+        return self.__request_api('notes/local-timeline', **params)
+
+    def notes_hybrid_timeline(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        since_date: Union[int, datetime.datetime, None] = None,
+        until_date: Union[int, datetime.datetime, None] = None,
+        include_my_renotes: bool = True,
+        include_renoted_my_notes: bool = True,
+        include_local_renotes: bool = True,
+        with_files: bool = True,
+    ) -> List[dict]:
+        if isinstance(since_date, datetime.datetime):
+            since_date = math.floor(
+                since_date.timestamp() * 1000)
+        if isinstance(until_date, datetime.datetime):
+            until_date = math.floor(
+                until_date.timestamp() * 1000)
+        params = self.__params(locals())
+        return self.__request_api('notes/hybrid-timeline', **params)
+
+    def notes_global_timeline(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        since_date: Union[int, datetime.datetime, None] = None,
+        until_date: Union[int, datetime.datetime, None] = None,
+        with_files: bool = True,
+    ) -> List[dict]:
+        if isinstance(since_date, datetime.datetime):
+            since_date = math.floor(
+                since_date.timestamp() * 1000)
+        if isinstance(until_date, datetime.datetime):
+            until_date = math.floor(
+                until_date.timestamp() * 1000)
+        params = self.__params(locals())
+        return self.__request_api('notes/global-timeline', **params)
+
+    def users_show(
+        self,
+        user_id: Optional[str] = None,
+        user_ids: Optional[List[str]] = None,
+        username: Optional[str] = None,
+        host: Optional[str] = None,
+    ) -> Union[dict, List[dict]]:
+        params = self.__params(locals())
+        return self.__request_api('users/show', **params)
+
+    def users_following(
+        self,
+        user_id: Optional[str] = None,
+        username: Optional[str] = None,
+        host: Optional[str] = None,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        limit: int = 10,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('users/following', **params)
+
+    def users_followers(
+        self,
+        user_id: Optional[str] = None,
+        username: Optional[str] = None,
+        host: Optional[str] = None,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        limit: int = 10,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('users/followers', **params)
+
+    def users_notes(
+        self,
+        user_id: str,
+        include_replies: bool = True,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        since_date: Union[
+            datetime.datetime,
+            int,
+            None,
+        ] = None,
+        until_date: Union[
+            datetime.datetime,
+            int,
+            None,
+        ] = None,
+        include_my_renotes: bool = True,
+        with_files: bool = True,
+        file_type: Optional[List[str]] = None,
+        exclude_nsfw: bool = False,
+    ) -> List[dict]:
+        if isinstance(since_date, datetime.datetime):
+            since_date = math.floor(since_date.timestamp() * 1000)
+        if isinstance(until_date, datetime.datetime):
+            until_date = math.floor(until_date.timestamp() * 1000)
+
+        params = self.__params(locals())
+        return self.__request_api('users/notes', **params)
+
+    def users_stats(
+        self,
+        user_id: str,
+    ) -> dict:
+        return self.__request_api('users/stats', userId=user_id)
+
+    def users_relation(
+        self,
+        user_id: Union[str, List[str]],
+    ) -> Union[dict, List[dict]]:
+        return self.__request_api('users/relation', userId=user_id)
+
+    def users_lists_create(
+        self,
+        name: str,
+    ) -> dict:
+        return self.__request_api('users/lists/create', name=name)
+
+    def users_lists_list(self) -> List[dict]:
+        return self.__request_api('users/lists/list')
+
+    def users_lists_show(
+        self,
+        list_id: str,
+    ) -> dict:
+        return self.__request_api('users/lists/show', listId=list_id)
+
+    def users_lists_push(
+        self,
+        list_id: str,
+        user_id: str,
+    ) -> bool:
+        params = self.__params(locals())
+        return self.__request_api('users/lists/push', **params)
+
+    def users_lists_pull(
+        self,
+        list_id: str,
+        user_id: str,
+    ) -> bool:
+        params = self.__params(locals())
+        return self.__request_api('users/lists/pull', **params)
+
+    def users_lists_update(
+        self,
+        list_id: str,
+        name: str,
+    ) -> dict:
+        params = self.__params(locals())
+        return self.__request_api('users/lists/update', **params)
+
+    def users_lists_delete(
+        self,
+        list_id: str,
+    ) -> bool:
+        return self.__request_api('users/lists/delete', listId=list_id)
+
+    def users_report_abuse(
+        self,
+        user_id: str,
+        comment: str,
+    ) -> bool:
+        params = self.__params(locals())
+        return self.__request_api('users/report-abuse', **params)
+
+    def following_create(
+        self,
+        user_id: str,
+    ) -> dict:
+        return self.__request_api('following/create', userId=user_id)
+
+    def following_delete(
+        self,
+        user_id: str,
+    ) -> dict:
+        return self.__request_api('following/delete', userId=user_id)
+
+    def mute_create(
+        self,
+        user_id: str,
+    ) -> bool:
+        return self.__request_api('mute/create', userId=user_id)
+
+    def mute_list(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('mute/list', **params)
+
+    def mute_delete(
+        self,
+        user_id: str,
+    ) -> bool:
+        return self.__request_api('mute/delete', userId=user_id)
+
+    def blocking_create(
+        self,
+        user_id: str,
+    ) -> dict:
+        return self.__request_api('blocking/create', userId=user_id)
+
+    def blocking_list(
+        self,
+        limit: int = 30,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('blocking/list', **params)
+
+    def blocking_delete(
+        self,
+        user_id: str,
+    ) -> dict:
+        return self.__request_api('blocking/delete', userId=user_id)
+
+    def following_requests_accept(
+        self,
+        user_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'following/requests/accept',
+            userId=user_id
+        )
+
+    def following_requests_reject(
+        self,
+        user_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'following/requests/reject',
+            userId=user_id,
+        )
+
+    def following_requests_cancel(
+        self,
+        user_id: str,
+    ) -> dict:
+        return self.__request_api(
+            'following/requests/cancel',
+            userId=user_id,
+        )
+
+    def following_requests_list(
+        self,
+    ) -> List[dict]:
+        return self.__request_api('following/requests/list')
+
+    def drive(self) -> dict:
+        return self.__request_api('drive')
+
+    def drive_stream(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        file_type: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(
+            locals(),
+            custom_rename={
+                'file_type': 'type',
+            },
+        )
+        return self.__request_api('drive/stream', **params)
+
+    def drive_files(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        folder_id: Optional[str] = None,
+        file_type: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(
+            locals(),
+            custom_rename={
+                'file_type': 'type',
+            },
+        )
+        return self.__request_api('drive/files', **params)
+
+    def drive_files_create(
+        self,
+        file: IOTypes,
+        folder_id: Optional[str] = None,
+        name: Optional[str] = None,
+        is_sensitive: bool = False,
+        force: bool = False,
+    ) -> dict:
+        params = self.__params(locals(), {'file'})
+        params.update(i=self.__token)
+        response = self.__session.post(
+            f'{self.__api_url}/drive/files/create',
+            data=params,
+            files={
+                'file': file,
+            },
+            allow_redirects=False,
+            timeout=self.timeout,
+        )
+        if response.status_code >= 400:
+            raise MisskeyAPIException(response.json())
+
+        return response.json()
+
+    def drive_files_check_existence(
+        self,
+        md5: str,
+    ) -> bool:
+        return self.__request_api('drive/files/check-existence', md5=md5)
+
+    def drive_files_attached_notes(
+        self,
+        file_id: str,
+    ) -> List[dict]:
+        return self.__request_api(
+            'drive/files/attached-notes',
+            fileId=file_id
+        )
+
+    def drive_files_find_by_hash(
+        self,
+        md5: str,
+    ) -> List[dict]:
+        return self.__request_api(
+            'drive/files/find-by-hash',
+            md5=md5,
+        )
+
+    def drive_files_show(
+        self,
+        file_id: Optional[str] = None,
+        url: Optional[str] = None,
+    ) -> dict:
+        params = self.__params(locals())
+        return self.__request_api(
+            'drive/files/show',
+            **params
+        )
+
+    def drive_files_update(
+        self,
+        file_id: str,
+        folder_id: Union[str, None] = '',
+        name: Optional[str] = None,
+        is_sensitive: Optional[bool] = None,
+        comment: Union[str, None] = '',
+    ) -> dict:
+        params = self.__params(locals(), {'folder_id', 'comment'})
+        if folder_id != '':
+            params['folderId'] = folder_id
+        if comment != '':
+            params['comment'] = comment
+
+        return self.__request_api('drive/files/update', **params)
+
+    def drive_files_delete(
+        self,
+        file_id: str,
+    ) -> bool:
+        return self.__request_api('drive/files/delete', fileId=file_id)
+
+    def drive_folders(
+        self,
+        limit: int = 10,
+        since_id: Optional[str] = None,
+        until_id: Optional[str] = None,
+        folder_id: Optional[str] = None,
+    ) -> List[dict]:
+        params = self.__params(locals())
+        return self.__request_api('drive/folders', **params)
+
+    def drive_folders_create(
+        self,
+        name: str = 'Untitled',
+        parent_id: Optional[str] = None,
+    ) -> dict:
+        params = self.__params(locals())
+        return self.__request_api('drive/folders/create', **params)
+
+    def drive_folders_show(
+        self,
+        folder_id: str,
+    ) -> dict:
+        return self.__request_api(
+            'drive/folders/show',
+            folderId=folder_id
+        )
+
+    def drive_folders_update(
+        self,
+        folder_id: str,
+        name: Optional[str] = None,
+        parent_id: Union[str, None] = '',
+    ) -> dict:
+        params = self.__params(locals(), {'parent_id'})
+        if parent_id != '':
+            params['parentId'] = parent_id
+        return self.__request_api('drive/folders/update', **params)
+
+    def drive_folders_delete(
+        self,
+        folder_id: str,
+    ) -> bool:
+        return self.__request_api(
+            'drive/folders/delete',
+            folderId=folder_id
+        )
diff --git a/requirements.docs.txt b/requirements.docs.txt
deleted file mode 100644
index 43c4cbf..0000000
--- a/requirements.docs.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-alabaster==0.7.12
-appdirs==1.4.4     
-astroid==2.4.1     
-atomicwrites==1.4.0
-attrs==19.3.0      
-Babel==2.8.0       
-certifi==2020.4.5.1
-chardet==3.0.4     
-click==7.1.2       
-colorama==0.4.3    
-coverage==5.1
-coveralls==2.0.0
-distlib==0.3.0
-docopt==0.6.2
-docutils==0.16
-filelock==3.0.12
-idna==2.9
-imagesize==1.2.0
-isort==4.3.21
-Jinja2==2.11.2
-lazy-object-proxy==1.4.3
-m2r==0.2.1
-MarkupSafe==1.1.1
-mccabe==0.6.1
-mistune==0.8.4
-more-itertools==8.3.0
-packaging==20.4
-pluggy==0.13.1
-py==1.8.1
-Pygments==2.6.1
-pylint==2.5.2
-pyparsing==2.4.7
-pytest==5.4.3
-pytz==2020.1
-PyYAML==5.3.1
-requests==2.23.0
-rstcheck==3.3.1
-six==1.15.0
-snowballstemmer==2.0.0
-Sphinx==3.0.4
-sphinx-intl==2.0.1
-sphinx-rtd-theme==0.4.3
-sphinxcontrib-applehelp==1.0.2
-sphinxcontrib-devhelp==1.0.2
-sphinxcontrib-htmlhelp==1.0.3
-sphinxcontrib-jsmath==1.0.1
-sphinxcontrib-qthelp==1.0.3
-sphinxcontrib-serializinghtml==1.1.4
-toml==0.10.1
-tox==3.15.1
-urllib3==1.25.9
-virtualenv==20.0.21
-wcwidth==0.2.3
-wrapt==1.12.1
diff --git a/setup.py b/setup.py
index 9f50406..aa9a7e9 100755
--- a/setup.py
+++ b/setup.py
@@ -1,41 +1,53 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-from setuptools import setup, find_packages
-import sys
+
+from setuptools import setup
 
 try:
-	from m2r import parse_from_file
+    # noinspection PyUnresolvedReferences
+    from m2r import parse_from_file
 except ImportError:
-	ld = ":code:`Could not load m2r module.`"
+    ld = ':code:`Could not load m2r module.`'
 else:
-	ld = parse_from_file('README.md')
+    ld = parse_from_file('README.md')
 
-from Misskey import __version__ as MKVER
+from misskey import __version__ as mkp_version
 
 setup(
     name='Misskey.py',
-    version=MKVER,
-    description='The Misskey library for Python. Misskey is made by syuilo.',
-	long_description=ld,
-	keywords="Misskey API syuilo",
+    version=mkp_version,
+    description='The misskey library for Python. misskey is made by syuilo.',
+    long_description=ld,
+    keywords=[
+        'misskey',
+        'API',
+        'library',
+        'syuilo',
+        'SNS',
+        'Social Networking Service',
+    ],
     author='YuzuRyo61',
     url='https://github.com/YuzuRyo61/Misskey.py',
     license='MIT',
     install_requires=[
         'requests'
     ],
-    packages=['Misskey'],
-	classifiers=[
-		'License :: OSI Approved :: MIT License',
-		'Natural Language :: Japanese',
-		'Programming Language :: Python :: 3 :: Only',
-		'Programming Language :: Python :: 3',
-		'Programming Language :: Python :: 3.6',
-		'Programming Language :: Python :: 3.7',
-		'Topic :: Software Development :: Libraries :: Python Modules',
-		'Topic :: Software Development :: Libraries',
-		'Development Status :: 5 - Production/Stable',
-		'Topic :: Internet :: WWW/HTTP',
-		'Topic :: Internet'
-	]
+    packages=['misskey'],
+    classifiers=[
+        'License :: OSI Approved :: MIT License',
+        'Development Status :: 4 - Beta',
+        'Natural Language :: English',
+        'Natural Language :: Japanese',
+        'Programming Language :: Python :: 3 :: Only',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
+        'Programming Language :: Python :: 3.10',
+        'Topic :: Software Development :: Libraries :: Python Modules',
+        'Topic :: Software Development :: Libraries',
+        'Topic :: Internet :: WWW/HTTP',
+        'Topic :: Internet',
+        'Topic :: Communications',
+    ]
 )
diff --git a/tox.ini b/tox.ini
deleted file mode 100644
index 6646fff..0000000
--- a/tox.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-[tox]
-envlist = py37
-skipsdist = true
-
-[testenv]
-deps = pipenv
-commands=
-    coverage run --source=Misskey -m pytest


Test patch:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..745c9d1
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,32 @@
+name: Python test
+
+on: [ push, pull_request ]
+
+jobs:
+  test:
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout@v2
+    - name: Set up Misskey server
+      run: |
+        docker-compose up -d
+    - name: Set up Python 3.9
+      uses: actions/setup-python@v2
+      with:
+        python-version: 3.9
+    - name: Install dependencies (with pipenv)
+      run: |
+        python -m pip install --upgrade pip
+        pip install --upgrade pipenv
+        pipenv sync --dev --bare
+    - name: flake8 lint test (via pipenv)
+      run: |
+        pipenv run flake8
+    - name: Test with pytest (via pipenv)
+      run: |
+        pipenv run pytest --cov --cov-report=xml
+    - name: Upload coverage to Codecov
+      uses: codecov/codecov-action@v2
+      with:
+        token: ${{ secrets.CODECOV_TOKEN }}
+        fail_ci_if_error: true
diff --git a/tests/__init__.py b/tests/__init__.py
index e69de29..46a9183 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -0,0 +1,14 @@
+import os.path
+import sys
+
+sys.path.append(
+    os.path.join(
+        os.path.abspath(
+            os.path.dirname(
+                os.path.abspath(__file__)
+            )
+        ),
+        '..',
+        'misskey'
+    )
+)
diff --git a/tests/cassettes/get_test_account2_token b/tests/cassettes/get_test_account2_token
deleted file mode 100644
index 5b81764..0000000
--- a/tests/cassettes/get_test_account2_token
+++ /dev/null
@@ -1,71 +0,0 @@
-interactions:
-- request:
-    body: '{"username": "MPTU2_itQXOCwX", "password": "W64oHkJV"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '54'
-      Content-Type:
-      - application/json
-      User-Agent:
-      - python-requests/2.24.0
-    method: POST
-    uri: https://demo.misskey.io/api/signup
-  response:
-    body:
-      string: !!binary |
-        H4sIAAAAAAAAA2xTXW8aMRD8L34mcKVBSu6N0CJVgZSSUNJWVbXYC+fgs6/+4ESj/PfuxRx3JLx5
-        x+Pdndn1M5OCpexqZfOPmIl/fdZhGnJkqQ5KdVhwaGPMprOHRf+P9N8ev47KR+JlxvmaBzvwYBdW
-        ETHzvnBprycwN91cOrfFfVeaXuT0TmpF7EYFm4HLTrONjDK2hqQbilxqlq5BOaziqRFowVeUI3Zj
-        fCsaQRNRL0/SsfTXbxJVtRnTcovgUQyJyPpJP7lIri+Sy4fkOr1M0g+D7iAZ/KQ2QyFqWny3Aq0x
-        6m0Db4VE9I2QieFbFK0+76VCzU+h4ArUooUJdNzKwkuj61TKcGjHK2l9JmBfx2uJShw0r41SpkTr
-        RiZokpHUkNSbBtLGY4tRSGpf3BH4pc7TQCfADDbEqQs3WI340oyB07A+a1iplixasBk4VxorJujI
-        m01ryA55sNLvb3HvjmBcjqZY9LiJIXizBM+zxk79hNyPadLBxt5Z6m2ocqkS9m4Kdnvn1uXxAQeL
-        66Da21RlHXKOhR9HJ0Wdg+a90LRG4r5ALsnz2p3Dy+P9FHU1rTM3Q63Jc445an/u1qPW8P5ilFXS
-        1blKzgEZuYkHfM+gFqnVen2a2xktHb2bI0e5QxG1zvFvQNf6WdTQxsJBzPNLh+WBfseSZnhYCqm5
-        ClWidp2HfVHZcvh4SpLYTzTKmAFzkMfP9Bp8R/vq5tltmMiqn6qUN1skCWw2nc7mV8tyeftjAnZn
-        2ct/AAAA//8DALffDx7cBAAA
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf77aeddef51-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Encoding:
-      - gzip
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:15 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dec8cc81d5b992e182e9ce833eb8a145c1599212414; expires=Sun, 04-Oct-20
-        09:40:14 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fec80000ef5170211200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/get_test_account_token b/tests/cassettes/get_test_account_token
deleted file mode 100644
index e1295aa..0000000
--- a/tests/cassettes/get_test_account_token
+++ /dev/null
@@ -1,71 +0,0 @@
-interactions:
-- request:
-    body: '{"username": "MPTU_xfWQ5RAi", "password": "nl0JIJGs"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '53'
-      Content-Type:
-      - application/json
-      User-Agent:
-      - python-requests/2.24.0
-    method: POST
-    uri: https://demo.misskey.io/api/signup
-  response:
-    body:
-      string: !!binary |
-        H4sIAAAAAAAAA2xT21IiMRD9lzyjjJetknlDXKytFZdFkCq3traapGEimWTMRRwt/317DMMMylv6
-        5KS7z+nOG5OCpexiYfMzHtTrCeswDTmyVAelOiw4tDFmo/F09u9lOf/9bdKXRMuM8zUNnsGDnVlF
-        vMz7wqXdrsDcHOfSuTWWx9J0I6e7VypilyrYDFy2n21glLE1JF1f5FKzdAnKYRWPjEALvqLssEvj
-        W9EAmoh6eZSOpX/+kqaqzZiWWwSPok9EdpqcJkdJ7yg5nya99DxJT86Ozy56D9RmKERNi+8WoDVG
-        vW3gs5CIfhJyY/gaRavPO6lQ830ouAK1aGECHbey8NLoOpUyHNrxQlqfCSjreClRia3mpVHKbNC6
-        gQmaZCQ1JPWqgbTx2GIUktoXtwT+qPM00B4whhVx6sINViN+Y4bAaVjfNSxUSxbt1xic2xgrbtCR
-        N6vWkB3yYKUvf2LpdmBcjqZY9LiJIXgzB8+zxk79iNwPadLBxt5Z6m2ocqkNlG4Edn3rlpvdAw4W
-        l0G1t6nK2uccCz+MToo6B817pmmNxF2BXJLntTvbl7v7EepqWgdu+lqT5xxz1P7QrUet4evFIKuk
-        q0OVnAMychUP+JVBLVKr9fo0t2NaOno3QY7yGUXUOsGngK71s6ihlYWtmLf3DssD/Y45zXC7FFJz
-        FapE7TrTsqhs2X48JUnsFY0yZsAc5O4zfQT3aD/cPLgNN7LqpyrlzRpJAvt18TQrHzb35vXq+sVf
-        r9n7fwAAAP//AwB7A4Gt2wQAAA==
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf66ebe3ef51-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Encoding:
-      - gzip
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:13 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dc2d7927db4a6a4550723f2fc0808a8521599212411; expires=Sun, 04-Oct-20
-        09:40:11 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15f44c0000ef5170180200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_call.yaml b/tests/cassettes/test_call.yaml
deleted file mode 100644
index d5cedcd..0000000
--- a/tests/cassettes/test_call.yaml
+++ /dev/null
@@ -1,231 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf723ff51d9f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:13 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d60d23381c210e7b5a8f821f664518dba1599212413; expires=Sun, 04-Oct-20
-        09:40:13 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fb6700001d9fb29fb200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":null,"username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf72f965a516-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:13 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dd2524710ee40ff8402713f8a6b3b7c521599212413; expires=Sun, 04-Oct-20
-        09:40:13 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fbd60000a5160e05e200000001
-      content-length:
-      - '1216'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf73cf1da5b8-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:14 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d167d1f4eeeffe48ddcb5924959421f1f1599212414; expires=Sun, 04-Oct-20
-        09:40:14 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fc5e0000a5b8d7106200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/not_exists
-  response:
-    body:
-      string: Not Found
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf74b810ef81-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '9'
-      Content-Type:
-      - text/plain; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:14 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d1013eda2ec49dab7734f3bbee209ea561599212414; expires=Sun, 04-Oct-20
-        09:40:14 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fcf20000ef819f1e7200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 404
-      message: Not Found
-version: 1
diff --git a/tests/cassettes/test_constructor.yaml b/tests/cassettes/test_constructor.yaml
deleted file mode 100644
index 9436c87..0000000
--- a/tests/cassettes/test_constructor.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf5e6aa6ef55-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:10 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d50ffdaf40a3456b50104476f489d74de1599212410; expires=Sun, 04-Oct-20
-        09:40:10 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15eefc0000ef551e851200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_constructor_error.yaml b/tests/cassettes/test_constructor_error.yaml
deleted file mode 100644
index 2e80455..0000000
--- a/tests/cassettes/test_constructor_error.yaml
+++ /dev/null
@@ -1,42 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://example.com/api/meta
-  response:
-    body:
-      string: "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!DOCTYPE html PUBLIC
-        \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n         \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html
-        xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n\t<head>\n\t\t<title>404
-        - Not Found</title>\n\t</head>\n\t<body>\n\t\t<h1>404 - Not Found</h1>\n\t\t<script
-        type=\"text/javascript\" src=\"//wpc.75674.betacdn.net/0075674/www/ec_tpm_bcon.js\"></script>\n\t</body>\n</html>\n"
-    headers:
-      Cache-Control:
-      - max-age=604800
-      Content-Length:
-      - '445'
-      Content-Type:
-      - text/html; charset=UTF-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:11 GMT
-      Expires:
-      - Fri, 11 Sep 2020 09:40:11 GMT
-      Server:
-      - EOS (vny/044F)
-    status:
-      code: 404
-      message: Not Found
-version: 1
diff --git a/tests/cassettes/test_delete_apiToken.yaml b/tests/cassettes/test_delete_apiToken.yaml
deleted file mode 100644
index 5d7bd93..0000000
--- a/tests/cassettes/test_delete_apiToken.yaml
+++ /dev/null
@@ -1,118 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf7089161d73-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:13 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d938172d006258544f196104c4e10ba8a1599212413; expires=Sun, 04-Oct-20
-        09:40:13 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fa5200001d73e39f5200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":null,"username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf714c17d649-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:13 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da9e9207a486f6027b72672e8f8cbd0ad1599212413; expires=Sun, 04-Oct-20
-        09:40:13 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fad00000d649e7229200000001
-      content-length:
-      - '1216'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_get_address.yaml b/tests/cassettes/test_get_address.yaml
deleted file mode 100644
index 91fb707..0000000
--- a/tests/cassettes/test_get_address.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf641be6f8db-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:11 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d60b192e7754d30f82a54b56f3c5ee3721599212411; expires=Sun, 04-Oct-20
-        09:40:11 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15f28b0000f8db74a41200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_get_version.yaml b/tests/cassettes/test_get_version.yaml
deleted file mode 100644
index 191d28d..0000000
--- a/tests/cassettes/test_get_version.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf651da20b8b-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:11 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d9fcdc8fa8d0a7fc1f4ff8377f9280ee21599212411; expires=Sun, 04-Oct-20
-        09:40:11 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15f32f00000b8bd8252200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_i.yaml b/tests/cassettes/test_i.yaml
deleted file mode 100644
index e935efe..0000000
--- a/tests/cassettes/test_i.yaml
+++ /dev/null
@@ -1,350 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf75ba24ef8e-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:14 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dd60045d9fe2bab546134ccb6f22684701599212414; expires=Sun, 04-Oct-20
-        09:40:14 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fd970000ef8ea9997200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":null,"username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf767e8ad649-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:14 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d32cda3233dcaa440f924e01e58b7430a1599212414; expires=Sun, 04-Oct-20
-        09:40:14 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15fe0d0000d649ee9a8200000001
-      content-length:
-      - '1216'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf7d9d07a594-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:15 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d64b0f215e8a214e58e907b12005e095d1599212415; expires=Sun, 04-Oct-20
-        09:40:15 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1602800000a5940f21f200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":null,"username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf7e7a79a546-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:15 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d261d05ff017914680f98e415dff710601599212415; expires=Sun, 04-Oct-20
-        09:40:15 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1603080000a546a50f4200000001
-      content-length:
-      - '1217'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":null,"username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf7f8ced94b5-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:16 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da1b7b1104aba4a80ee692bdea39c1dd61599212415; expires=Sun, 04-Oct-20
-        09:40:15 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1603b8000094b547989200000001
-      content-length:
-      - '1216'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":null,"username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf806c19a5ac-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:16 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=de08673d48f26e2aa4b743b008ea01c251599212416; expires=Sun, 04-Oct-20
-        09:40:16 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1604420000a5ac3e905200000001
-      content-length:
-      - '1217'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_i_favorites.yaml b/tests/cassettes/test_i_favorites.yaml
deleted file mode 100644
index acc0181..0000000
--- a/tests/cassettes/test_i_favorites.yaml
+++ /dev/null
@@ -1,174 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf882c380aa0-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d752ff2d8eb7141a548762923b6916b571599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16091c00000aa048ab9200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf88da0a0acc-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=df1a831d475f550967455bfa589b573cd1599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16098a00000acc750ab200000001
-      content-length:
-      - '1304'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"limit": 10, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '38'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/favorites
-  response:
-    body:
-      string: '[]'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf89b85aa57c-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da2802fc94b6cc9abdae595dd4d100c141599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160a170000a57cbc03e200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_i_notifications.yaml b/tests/cassettes/test_i_notifications.yaml
deleted file mode 100644
index eebcada..0000000
--- a/tests/cassettes/test_i_notifications.yaml
+++ /dev/null
@@ -1,175 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8ac83ed639-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=df8baed13c13918058e3ecaa8b9d5799b1599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160abc0000d639ba0ac200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8b7bddf8d7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d9e60a5386253068575590f8300ea8e0a1599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160b2e0000f8d75b915200000001
-      content-length:
-      - '1304'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"limit": 10, "following": false, "markAsRead": true, "includeTypes": [],
-      "excludeTypes": [], "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '118'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/notifications
-  response:
-    body:
-      string: '[]'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8c4c020aec-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d4c6bf1954e95c27ecb3fb6e29870472f1599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160bae00000aec2c1b4200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_i_pin.yaml b/tests/cassettes/test_i_pin.yaml
deleted file mode 100644
index 969e69c..0000000
--- a/tests/cassettes/test_i_pin.yaml
+++ /dev/null
@@ -1,354 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8d4c9f953f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d80430999e810e9a4f9fbae0547818b471599212418; expires=Sun, 04-Oct-20
-        09:40:18 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160c4b0000953fd1263200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8e0b260b93-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d99e04bddfbe1ca51a6c632194c66c28b1599212418; expires=Sun, 04-Oct-20
-        09:40:18 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160cc800000b93af8e9200000001
-      content-length:
-      - '1304'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "Now testing Note tests", "cw": null,
-      "viaMobile": false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '217'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm3gr1z3","createdAt":"2020-09-04T09:40:18.445Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8eeebe0b8b-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d6ae9da2d07853466a8c8dfd8b75395271599212418; expires=Sun, 04-Oct-20
-        09:40:18 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160d4c00000b8baa94a200000001
-      content-length:
-      - '495'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3gr1z3", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/pin
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:18.454Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":1,"pinnedNoteIds":["8brm3gr1z3"],"pinnedNotes":[{"id":"8brm3gr1z3","createdAt":"2020-09-04T09:40:18.445Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf8fee560e72-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d75e292b3128479ca82b6373d61bf1d101599212418; expires=Sun, 04-Oct-20
-        09:40:18 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160df300000e72d9aee200000001
-      content-length:
-      - '1744'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3gr1z3", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/unpin
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:18.454Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":1,"pinnedNoteIds":["8brm3gr1z3"],"pinnedNotes":[{"id":"8brm3gr1z3","createdAt":"2020-09-04T09:40:18.445Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf90f8f9d649-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d69626b8eabe654c236f2b9313d8241521599212418; expires=Sun, 04-Oct-20
-        09:40:18 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160e9d0000d649f8015200000001
-      content-length:
-      - '1744'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3gr1z3", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf91ddb51d6f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:18 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d53cd5e94b6200d260905313231afadcf1599212418; expires=Sun, 04-Oct-20
-        09:40:18 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160f2900001d6f1d90a200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_i_readAllUnreadNotes.yaml b/tests/cassettes/test_i_readAllUnreadNotes.yaml
deleted file mode 100644
index 37ff6a2..0000000
--- a/tests/cassettes/test_i_readAllUnreadNotes.yaml
+++ /dev/null
@@ -1,170 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf932f74f8ab-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:19 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d59ab58a906238045351fcbea6ce64c071599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa160ffd0000f8ab96af4200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:18.454Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":1,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf93fb040acc-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:19 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d771525e213fd269644e32f966ecc492d1599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16107e00000acc57023200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/read-all-unread-notes
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf94c9116ef7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:19 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dc0c5e42364d491b20d2b19ab811564981599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1610fe00006ef7d499e200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_i_update.yaml b/tests/cassettes/test_i_update.yaml
deleted file mode 100644
index 41a1019..0000000
--- a/tests/cassettes/test_i_update.yaml
+++ /dev/null
@@ -1,355 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf81fcabef92-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:16 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d0b3b11a6d491b0c6eb67b5caf4af72a11599212416; expires=Sun, 04-Oct-20
-        09:40:16 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16053a0000ef92e496b200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":null,"username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf830bfc1d5f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:16 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d10094e64a956f8ea1e7708576e47a3051599212416; expires=Sun, 04-Oct-20
-        09:40:16 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1605e200001d5f19156200000001
-      content-length:
-      - '1216'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf841c8e1d93-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:16 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dd7a9da12ca24e9199d10de8e4297cb2c1599212416; expires=Sun, 04-Oct-20
-        09:40:16 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16069100001d9336a3c200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":null,"username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":false,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":null,"location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf84f8a81d77-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:16 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d6d61f22e75613ab2e4588dee44082c361599212416; expires=Sun, 04-Oct-20
-        09:40:16 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16071e00001d77a6bbd200000001
-      content-length:
-      - '1217'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"name": "Misskey.py Unit tester", "description": "This account is a Misskey.py
-      unit test account. It works automatically.", "isBot": true, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '164'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/update
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf85ecb994e5-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dec8757894bac66d391ab6972c58806b31599212416; expires=Sun, 04-Oct-20
-        09:40:16 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1607ad000094e58c1d9200000001
-      content-length:
-      - '1304'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"name": "Misskey.py Unit tester 2", "description": "This account is a
-      Misskey.py unit test account. It works automatically.", "isBot": true, "i":
-      "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '166'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i/update
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":"Misskey.py Unit tester 2","username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf871899ef51-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:17 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d03f0dac901e7b11e9f6258f7f5880ea11599212417; expires=Sun, 04-Oct-20
-        09:40:17 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16086e0000ef5182bc4200000001
-      content-length:
-      - '1307'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_meta.yaml b/tests/cassettes/test_meta.yaml
deleted file mode 100644
index 11ea4a8..0000000
--- a/tests/cassettes/test_meta.yaml
+++ /dev/null
@@ -1,118 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf98aa7a9479-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da601781b0013018df2adb6ad276b5bbf1599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16136700009479d2bc2200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"detail": true}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '16'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf99ab4d0b9b-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d82f38378b55604ed0dff59846e6b76bc1599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16140400000b9baa929200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_note.yaml b/tests/cassettes/test_note.yaml
deleted file mode 100644
index 8fe0a28..0000000
--- a/tests/cassettes/test_note.yaml
+++ /dev/null
@@ -1,292 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9e58fdef8e-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d9d62930daf9da45035ab23e811b74e671599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1616f70000ef8eaf356200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:18.454Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":1,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9f2f5cf907-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d365e2aa47df47bcf0caca0a31773fac21599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16177d0000f9077c1e5200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "Now testing Note tests", "cw": null,
-      "viaMobile": false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '217'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm3iut9c","createdAt":"2020-09-04T09:40:21.173Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9ffe839521-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d9db3c8929e1d1951565b04854efd3c5c1599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1617fb00009521762ba200000001
-      content-length:
-      - '495'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3iut9c", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/show
-  response:
-    body:
-      string: '{"id":"8brm3iut9c","createdAt":"2020-09-04T09:40:21.173Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa118f2f8e7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d95ab219117000d90b18b40579b4110d81599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1618b30000f8e71d130200000001
-      content-length:
-      - '479'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3iut9c", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa1dc18f8d7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da896c2543a0d9d47925b1ee29575d1f21599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1619220000f8d7661b6200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_notes.yaml b/tests/cassettes/test_notes.yaml
deleted file mode 100644
index e9fca22..0000000
--- a/tests/cassettes/test_notes.yaml
+++ /dev/null
@@ -1,116 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfafbe78d641-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:23 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d7b42a77a518f4e65e0ef68303b0855041599212423; expires=Sun, 04-Oct-20
-        09:40:23 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1621d50000d641628ff200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"local": false, "reply": false, "renote": false, "withFiles": false, "poll":
-      false, "limit": 10}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '97'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes
-  response:
-    body:
-      string: '[]'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfb0a813d625-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:23 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d2df0e1f234e5c57d1e01975f3fa5cda61599212423; expires=Sun, 04-Oct-20
-        09:40:23 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1622640000d625afb87200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_notes_polls_vote.yaml b/tests/cassettes/test_notes_polls_vote.yaml
deleted file mode 100644
index 8ff892c..0000000
--- a/tests/cassettes/test_notes_polls_vote.yaml
+++ /dev/null
@@ -1,288 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c494885ef8af-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:44 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d5482e52b035aa7875a521f3c7a6f4fee1599212624; expires=Sun, 04-Oct-20
-        09:43:44 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1930d00000f8af48b59200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:43:43.408Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":9,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c4953ce2ef81-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:44 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=daff7bb1f64943f5b4bd202433bdc4a0a1599212624; expires=Sun, 04-Oct-20
-        09:43:44 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1931460000ef81faa33200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "This is polls test!", "cw": null, "viaMobile":
-      false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "poll": {"choices": ["1", "2"], "multiple":
-      false}, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '266'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm7vo9ze","createdAt":"2020-09-04T09:43:44.409Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"This
-        is polls test!","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null,"poll":{"multiple":false,"expiresAt":null,"choices":[{"text":"1","votes":0,"isVoted":false},{"text":"2","votes":0,"isVoted":false}]}}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c4962fe99455-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:44 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d231b375997f0f3b08ff755a477b95e901599212624; expires=Sun, 04-Oct-20
-        09:43:44 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1931d900009455c8180200000001
-      content-length:
-      - '625'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm7vo9ze", "choice": 0, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '62'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/polls/vote
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c4973fa80e7a-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:43:44 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d9ccfc493680e8fc63819b599bce6a1361599212624; expires=Sun, 04-Oct-20
-        09:43:44 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa19327e00000e7a582b6200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-- request:
-    body: '{"noteId": "8brm7vo9ze", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: '{"error":{"message":"Rate limit exceeded. Please try again later.","code":"RATE_LIMIT_EXCEEDED","id":"d5826d14-3982-4d2e-8011-b9e9f02499ef","kind":"client"}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c49839b79557-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '157'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:44 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d322047e6c847d47975c263b05dc0f7a61599212624; expires=Sun, 04-Oct-20
-        09:43:44 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa19332200009557e23aa200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 429
-      message: Too Many Requests
-version: 1
diff --git a/tests/cassettes/test_notes_renote.yaml b/tests/cassettes/test_notes_renote.yaml
deleted file mode 100644
index a2c6ed2..0000000
--- a/tests/cassettes/test_notes_renote.yaml
+++ /dev/null
@@ -1,410 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c4874e080abc-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dad66984189575357c24788b8817322ce1599212621; expires=Sun, 04-Oct-20
-        09:43:41 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa19288900000abc1e062200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:25.772Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":7,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c487d9911da7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dd8645d8d60fbea67b8c4e199ec4bc0101599212622; expires=Sun, 04-Oct-20
-        09:43:42 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1928eb00001da777055200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "Now testing Note tests", "cw": null,
-      "viaMobile": false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '217'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm7u0v9q","createdAt":"2020-09-04T09:43:42.271Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c488dbf81d87-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da98a923fd132c31e463291e7cbb8ed991599212622; expires=Sun, 04-Oct-20
-        09:43:42 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa19298b00001d8791a92200000001
-      content-length:
-      - '495'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c489df4cf8b7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=db12565e0d28933edd5ee3c1ce95a87ef1599212622; expires=Sun, 04-Oct-20
-        09:43:42 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192a260000f8b70892c200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":"Misskey.py Unit tester 2","username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":"2020-09-04T09:40:21.843Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":1,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c48a9a710aac-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=de2029e8acf80991c773bbc0d6f3e16c51599212622; expires=Sun, 04-Oct-20
-        09:43:42 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192a9f00000aac7eb81200000001
-      content-length:
-      - '1329'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"renoteId": "8brm7u0v9q", "i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '51'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm7ucq9r","createdAt":"2020-09-04T09:43:42.698Z","userId":"8brm3ehdz2","user":{"id":"8brm3ehdz2","name":"Misskey.py
-        Unit tester 2","username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":null,"cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":"8brm7u0v9q","renote":{"id":"8brm7u0v9q","createdAt":"2020-09-04T09:43:42.271Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c48b9e170ac0-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dc3c9d395ef048ee5addc4b5255126fda1599212622; expires=Sun, 04-Oct-20
-        09:43:42 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192b3a00000ac080012200000001
-      content-length:
-      - '975'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm7u0v9q", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c48c886a0af0-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:43:42 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d4d30958fef3f3e23e61cccbbb157a95b1599212622; expires=Sun, 04-Oct-20
-        09:43:42 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192bd900000af0c2948200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_notes_renotes.yaml b/tests/cassettes/test_notes_renotes.yaml
deleted file mode 100644
index 5763162..0000000
--- a/tests/cassettes/test_notes_renotes.yaml
+++ /dev/null
@@ -1,404 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c48dcdcb0e72-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:43 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d1436064a33471c825dfd92c71458355f1599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192c9f00000e72d711f200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:43:42.280Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":8,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c48ec8e0a5ee-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:43 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d6298847cbf0c55695fba76c7b43de20a1599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192d380000a5eeaebee200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "Now testing Note tests", "cw": null,
-      "viaMobile": false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '217'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm7uw3zd","createdAt":"2020-09-04T09:43:43.395Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c48fba8defa6-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:43 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d2a7ab652fb1f1d1a88e670d1b0cb9f5d1599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192dd20000efa69325b200000001
-      content-length:
-      - '495'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c490fffef90f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:43 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d501053f5437061145e6839372456abd01599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192e9f0000f90f04986200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":"Misskey.py Unit tester 2","username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":"2020-09-04T09:43:42.706Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":2,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c491dcbe0ac0-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:43 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d03ee5e79583b04909bcb29fa9092c7031599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192f2500000ac0793ce200000001
-      content-length:
-      - '1329'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm7uw3zd", "limit": 10, "i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '62'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/renotes
-  response:
-    body:
-      string: '[]'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c492ad640ae4-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:43:43 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d56f90d8fc8033e2a7d006f36f13d08841599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa192fac00000ae43532a200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm7uw3zd", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6c4937fa3efaa-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:43:44 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d13695f47196b023993830962942e6c2b1599212623; expires=Sun, 04-Oct-20
-        09:43:43 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa19302e0000efaa3ba25200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_notifications_markAllAsRead.yaml b/tests/cassettes/test_notifications_markAllAsRead.yaml
deleted file mode 100644
index c120dba..0000000
--- a/tests/cassettes/test_notifications_markAllAsRead.yaml
+++ /dev/null
@@ -1,170 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf95af630b9f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:19 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d2f95a7c046994ef753dc303a2d2b897f1599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16118d00000b9f9d211200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:18.454Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":1,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf967e2e1d63-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:19 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d0f6ca641c360214455e724c036dbbdc61599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16120a00001d63fcb74200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notifications/mark-all-as-read
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf978bb4f8bb-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:19 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d1ec7224b80583ae1eabaa2c8016753b01599212419; expires=Sun, 04-Oct-20
-        09:40:19 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1612b10000f8bbec8c4200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_pinnedUsers.yaml b/tests/cassettes/test_pinnedUsers.yaml
deleted file mode 100644
index c7a0a2c..0000000
--- a/tests/cassettes/test_pinnedUsers.yaml
+++ /dev/null
@@ -1,115 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9c8a170af8-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=db6a60a30cdeb56a6b5bd040651073bad1599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1615d200000af8ab0d1200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/pinned-users
-  response:
-    body:
-      string: '[]'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9d48efefa6-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=de3757a350286b410293f4e4c71e0323c1599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa16164d0000efa6a9270200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_reaction.yaml b/tests/cassettes/test_reaction.yaml
deleted file mode 100644
index 6dce4bb..0000000
--- a/tests/cassettes/test_reaction.yaml
+++ /dev/null
@@ -1,451 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa2ebc5941f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da37bcb9925ad0b103ce723aae147a95a1599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1619d30000941f37874200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3ehdz2","name":"Misskey.py Unit tester 2","username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:15.505Z","updatedAt":null,"bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":0,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa3abcb1d9f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=db0a5446067efaf2d5083d845222d79241599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161a4d00001d9fb50eb200000001
-      content-length:
-      - '1307'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "Now testing Note tests 2!", "cw": null,
-      "viaMobile": false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '220'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm3jd89d","createdAt":"2020-09-04T09:40:21.836Z","userId":"8brm3ehdz2","user":{"id":"8brm3ehdz2","name":"Misskey.py
-        Unit tester 2","username":"MPTU2_itQXOCwX","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3ehdz2","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests 2!","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa43a220ab4-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:21 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dfbe33fdabe7512515ff25309b07727661599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161aa400000ab4b88e6200000001
-      content-length:
-      - '501'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa53cff941f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da37bcb9925ad0b103ce723aae147a95a1599212421; expires=Sun, 04-Oct-20
-        09:40:21 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161b420000941f35393200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:21.188Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":2,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa62ade1d8f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d0a0e1d7781e8098dc95ad5b0b30f3cd71599212422; expires=Sun, 04-Oct-20
-        09:40:22 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161bdb00001d8f83b6d200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3jd89d", "reaction": "like", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '69'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/reactions/create
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa719356ef7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d45eec0bc75ca6f3eb843755b77b26caf1599212422; expires=Sun, 04-Oct-20
-        09:40:22 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161c7100006ef7d78d7200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-- request:
-    body: '{"noteId": "8brm3jd89d", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/reactions/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa81c10944f-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d1156c27e5573ef232bf91a8a75bebd371599212422; expires=Sun, 04-Oct-20
-        09:40:22 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161d0d0000944f34177200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-- request:
-    body: '{"noteId": "8brm3jd89d", "i": "PMMPR8WwWKYLarvr"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa8ce5b9527-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d4438a49e1cd4b6808cf9c0220caeec721599212422; expires=Sun, 04-Oct-20
-        09:40:22 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161d7c00009527d0bf1200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_reactions.yaml b/tests/cassettes/test_reactions.yaml
deleted file mode 100644
index b119307..0000000
--- a/tests/cassettes/test_reactions.yaml
+++ /dev/null
@@ -1,287 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfa9f81af8c3-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d089e7d96c7fa2e07a12e247f07b083be1599212422; expires=Sun, 04-Oct-20
-        09:40:22 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161e3e0000f8c36e3c7200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:21.188Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":2,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfaabe55ef69-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:22 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d10ec995c8ca4d000d0c400ae6fabc5681599212422; expires=Sun, 04-Oct-20
-        09:40:22 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161eb20000ef69530a2200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"visibility": "public", "text": "Now testing Note tests", "cw": null,
-      "viaMobile": false, "localOnly": false, "noExtractMentions": false, "noExtractHashtags":
-      false, "noExtractEmojis": false, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '217'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/create
-  response:
-    body:
-      string: '{"createdNote":{"id":"8brm3kg4z9","createdAt":"2020-09-04T09:40:23.236Z","userId":"8brm3culz1","user":{"id":"8brm3culz1","name":"Misskey.py
-        Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isBot":true,"emojis":[]},"text":"Now
-        testing Note tests","cw":null,"visibility":"public","renoteCount":0,"repliesCount":0,"reactions":{},"emojis":[],"fileIds":[],"files":[],"replyId":null,"renoteId":null}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bface9b814d4-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:23 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d966035fe0aed0045b60aa9d5f049a11e1599212423; expires=Sun, 04-Oct-20
-        09:40:23 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa162011000014d42b8ed200000001
-      content-length:
-      - '495'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3kg4z9", "limit": 10, "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '62'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/reactions
-  response:
-    body:
-      string: '[]'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfae0fb31da7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:23 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d42cc05754e016427c67fa5a1ac5349c51599212423; expires=Sun, 04-Oct-20
-        09:40:23 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1620c800001da77cb19200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"noteId": "8brm3kg4z9", "i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '49'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/notes/delete
-  response:
-    body:
-      string: ''
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfaedc7eefa2-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Date:
-      - Fri, 04 Sep 2020 09:40:23 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d83d4e3b77988437b6d541fdc3a51d6e21599212423; expires=Sun, 04-Oct-20
-        09:40:23 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1621440000efa2331be200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 204
-      message: No Content
-version: 1
diff --git a/tests/cassettes/test_set_apikey_error.yaml b/tests/cassettes/test_set_apikey_error.yaml
deleted file mode 100644
index f574b9a..0000000
--- a/tests/cassettes/test_set_apikey_error.yaml
+++ /dev/null
@@ -1,118 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf625c590aa8-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:11 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d2807d1d901036f04ab87ac7dd6898dff1599212411; expires=Sun, 04-Oct-20
-        09:40:11 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15f17700000aa8f734c200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "invalid"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '16'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"error":{"message":"Authentication failed. Please ensure your token
-        is correct.","code":"AUTHENTICATION_FAILED","id":"b0a7f5f8-dc2f-4171-b91f-de88ad238e14","kind":"client"}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf632e6cef4d-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:11 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dddc6263d0fc0d3cf9b0dcb5515ba7db51599212411; expires=Sun, 04-Oct-20
-        09:40:11 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15f1f70000ef4d29a76200000001
-      content-length:
-      - '174'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 403
-      message: Forbidden
-version: 1
diff --git a/tests/cassettes/test_should_not_access_credentials.yaml b/tests/cassettes/test_should_not_access_credentials.yaml
deleted file mode 100644
index 100ced2..0000000
--- a/tests/cassettes/test_should_not_access_credentials.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf6619c5efaa-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:11 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dcee703fbfb6343dda1d973a19e2e7d991599212411; expires=Sun, 04-Oct-20
-        09:40:11 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa15f3d00000efaa2f9d2200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_stats.yaml b/tests/cassettes/test_stats.yaml
deleted file mode 100644
index 0c5b6a2..0000000
--- a/tests/cassettes/test_stats.yaml
+++ /dev/null
@@ -1,117 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9abd35a522-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=df41435d5b2bf80aec73999c21ba621a51599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa1614b00000a5229428b200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '2'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/stats
-  response:
-    body:
-      string: '{"notesCount":0,"originalNotesCount":0,"usersCount":2,"originalUsersCount":2,"instances":0,"driveUsageLocal":0,"driveUsageRemote":0}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bf9bad5594d9-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:20 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d432bd4880afeafcfb2ee1158dbf4e8361599212420; expires=Sun, 04-Oct-20
-        09:40:20 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa161547000094d9ab17b200000001
-      content-length:
-      - '132'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/cassettes/test_username_available.yaml b/tests/cassettes/test_username_available.yaml
deleted file mode 100644
index 6bfb13e..0000000
--- a/tests/cassettes/test_username_available.yaml
+++ /dev/null
@@ -1,288 +0,0 @@
-interactions:
-- request:
-    body: null
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '0'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/meta
-  response:
-    body:
-      string: '{"maintainerName":null,"maintainerEmail":null,"version":"12.47.1","name":null,"uri":"https://demo.misskey.io","description":null,"langs":[],"tosUrl":null,"repositoryUrl":"https://github.com/syuilo/misskey","feedbackUrl":"https://github.com/syuilo/misskey/issues/new","secure":false,"disableRegistration":false,"disableLocalTimeline":false,"disableGlobalTimeline":false,"driveCapacityPerLocalUserMb":1024,"driveCapacityPerRemoteUserMb":32,"cacheRemoteFiles":true,"proxyRemoteFiles":false,"enableHcaptcha":false,"hcaptchaSiteKey":null,"enableRecaptcha":false,"recaptchaSiteKey":null,"swPublickey":null,"mascotImageUrl":"/assets/ai.png","bannerUrl":null,"errorImageUrl":"https://xn--931a.moe/aiart/yubitun.png","iconUrl":null,"maxNoteTextLength":500,"emojis":[],"requireSetup":false,"enableEmail":false,"enableTwitterIntegration":false,"enableGithubIntegration":false,"enableDiscordIntegration":false,"enableServiceWorker":false,"features":{"registration":true,"localTimeLine":true,"globalTimeLine":true,"elasticsearch":false,"hcaptcha":false,"recaptcha":false,"objectStorage":false,"twitter":false,"github":false,"discord":false,"serviceWorker":false,"miauth":true}}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfbf8e03f8d7-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:26 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=da73005fa020cbc38bd291fe7bb0c5ce11599212426; expires=Sun, 04-Oct-20
-        09:40:26 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa162bb60000f8d767b11200000001
-      content-length:
-      - '1164'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:25.772Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":7,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfc05b58ef5d-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:26 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d344dbb73a2c22bd9cce0429c592ef4851599212426; expires=Sun, 04-Oct-20
-        09:40:26 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa162c330000ef5dba3bd200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"username": "MKPU_Vjw8L5em"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '29'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/username/available
-  response:
-    body:
-      string: '{"available":true}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfc11d0d0aa4-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '18'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:26 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=dd4468bfbd14b789027a336196bc2e6591599212426; expires=Sun, 04-Oct-20
-        09:40:26 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa162cb300000aa43d2eb200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"i": "O8qUyZwVozDGxtGk"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '25'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/i
-  response:
-    body:
-      string: '{"id":"8brm3culz1","name":"Misskey.py Unit tester","username":"MPTU_xfWQ5RAi","host":null,"avatarUrl":"https://demo.misskey.io/avatar/8brm3culz1","avatarBlurhash":null,"avatarColor":null,"isAdmin":false,"isModerator":false,"isBot":true,"isCat":false,"emojis":[],"url":null,"createdAt":"2020-09-04T09:40:13.389Z","updatedAt":"2020-09-04T09:40:25.772Z","bannerUrl":null,"bannerBlurhash":null,"bannerColor":null,"isLocked":false,"isSilenced":false,"isSuspended":false,"description":"This
-        account is a Misskey.py unit test account. It works automatically.","location":null,"birthday":null,"fields":[],"followersCount":0,"followingCount":0,"notesCount":7,"pinnedNoteIds":[],"pinnedNotes":[],"pinnedPageId":null,"pinnedPage":null,"twoFactorEnabled":false,"usePasswordLessLogin":false,"securityKeys":false,"avatarId":null,"bannerId":null,"autoWatch":false,"injectFeaturedNote":true,"alwaysMarkNsfw":false,"carefulBot":false,"autoAcceptFollowed":true,"hasUnreadSpecifiedNotes":false,"hasUnreadMentions":false,"hasUnreadAnnouncement":false,"hasUnreadAntenna":false,"hasUnreadChannel":false,"hasUnreadMessagingMessage":false,"hasUnreadNotification":false,"hasPendingReceivedFollowRequest":false,"integrations":{},"mutedWords":[],"includingNotificationTypes":null,"clientData":{},"email":null,"emailVerified":false,"securityKeysList":[]}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfc1d8059545-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:26 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d16d73ad664b99c63cc2a660195c59cb71599212426; expires=Sun, 04-Oct-20
-        09:40:26 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Transfer-Encoding:
-      - chunked
-      Vary:
-      - Accept-Encoding
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa162d250000954550845200000001
-      content-length:
-      - '1326'
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-- request:
-    body: '{"username": "MPTU_xfWQ5RAi"}'
-    headers:
-      Accept:
-      - '*/*'
-      Accept-Encoding:
-      - gzip, deflate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '29'
-      User-Agent:
-      - python-requests/2.24.0
-      content-type:
-      - application/json
-    method: POST
-    uri: https://demo.misskey.io/api/username/available
-  response:
-    body:
-      string: '{"available":false}'
-    headers:
-      CF-Cache-Status:
-      - DYNAMIC
-      CF-RAY:
-      - 5cd6bfc29a1df8d3-NRT
-      Cache-Control:
-      - private, max-age=0, must-revalidate
-      Connection:
-      - keep-alive
-      Content-Length:
-      - '19'
-      Content-Type:
-      - application/json; charset=utf-8
-      Date:
-      - Fri, 04 Sep 2020 09:40:26 GMT
-      Expect-CT:
-      - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
-      Server:
-      - cloudflare
-      Set-Cookie:
-      - __cfduid=d81cf54f01c8e1059060e3696431f6d531599212426; expires=Sun, 04-Oct-20
-        09:40:26 GMT; path=/; domain=.misskey.io; HttpOnly; SameSite=Lax; Secure
-      Vary:
-      - Origin
-      X-Content-Type-Options:
-      - nosniff
-      alt-svc:
-      - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400
-      cf-request-id:
-      - 04fa162d9f0000f8d3f2848200000001
-      strict-transport-security:
-      - max-age=0; includeSubDomains; preload
-    status:
-      code: 200
-      message: OK
-version: 1
diff --git a/tests/conftest.py b/tests/conftest.py
index ddce275..75914d6 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,95 +1,100 @@
-import random
-import string
 import pytest
-import vcr
 import requests
 
-from Misskey.Misskey import Misskey
+from misskey import Misskey
 
-my_vcr = vcr.VCR(
-    serializer='yaml',
-    cassette_library_dir='tests/cassettes',
-    record_mode='once',
-    match_on=['method', 'query'],
-)
+TEST_HOST = 'http://localhost:3000'
 
 
-def make_rc():
-    return "".join(random.choices(string.ascii_letters + string.digits, k=8))
-
-
-@my_vcr.use_cassette()
-def get_test_account_token():
-    res = requests.post("https://demo.misskey.io/api/signup",
-                        json={
-                            "username": f"MPTU_{make_rc()}",
-                            "password": make_rc()
-                        })
-    res.raise_for_status()
-    return res.json()["token"]
+@pytest.fixture(scope='session', autouse=True)
+def fixture_session():
+    admin_cred = {
+        'username': 'administrator',
+        'password': 'administrator_pass',
+    }
+    user_cred = {
+        'username': 'user',
+        'password': 'user_pass',
+    }
 
+    res_admin = requests.post(
+        f'{TEST_HOST}/api/admin/accounts/create',
+        json=admin_cred,
+    )
+    try:
+        res_admin.raise_for_status()
+    except requests.HTTPError:
+        res_admin_signin = requests.post(
+            f'{TEST_HOST}/api/signin',
+            json=admin_cred,
+        )
+        res_admin_signin.raise_for_status()
+        token_admin = res_admin_signin.json()['i']
+    else:
+        token_admin = res_admin.json()['token']
+
+    res_user = requests.post(
+        f'{TEST_HOST}/api/signup',
+        json=user_cred,
+    )
+    try:
+        res_user.raise_for_status()
+    except requests.HTTPError:
+        res_user_signin = requests.post(
+            f'{TEST_HOST}/api/signin',
+            json=user_cred,
+        )
+        res_user_signin.raise_for_status()
+        token_user = res_user_signin.json()['i']
+    else:
+        token_user = res_user.json()['token']
 
-@my_vcr.use_cassette()
-def get_test_account2_token():
-    res = requests.post("https://demo.misskey.io/api/signup",
-                        json={
-                            "username": f"MPTU2_{make_rc()}",
-                            "password": make_rc()
-                        })
-    res.raise_for_status()
-    return res.json()["token"]
+    yield token_admin, token_user
 
 
-@pytest.fixture
-def api():
-    return Misskey("demo.misskey.io", i=get_test_account_token())
+@pytest.fixture(scope='session')
+def mk_cli_anon() -> Misskey:
+    return Misskey(TEST_HOST)
 
 
-@pytest.fixture
-def api2():
-    return Misskey("demo.misskey.io", i=get_test_account2_token())
+@pytest.fixture(scope='session')
+def mk_cli_admin(fixture_session: tuple) -> Misskey:
+    return Misskey(TEST_HOST, i=fixture_session[0])
 
 
-@pytest.fixture
-def api_anonymous():
-    return Misskey("demo.misskey.io")
+@pytest.fixture(scope='session')
+def mk_cli_user(fixture_session: tuple) -> Misskey:
+    return Misskey(TEST_HOST, i=fixture_session[1])
 
 
-@pytest.fixture
-def note(api):
-    _note = api.notes_create("Now testing Note tests")
-    yield _note
-    api.notes_delete(_note["createdNote"]["id"])
+@pytest.fixture(scope='session')
+def mk_admin_token(fixture_session: tuple) -> str:
+    return fixture_session[0]
 
 
-@pytest.fixture
-def note2(api2):
-    _note = api2.notes_create("Now testing Note tests 2!")
-    yield _note
-    api2.notes_delete(_note["createdNote"]["id"])
+@pytest.fixture(scope='session')
+def mk_user_token(fixture_session: tuple) -> str:
+    return fixture_session[1]
 
 
-@pytest.fixture
-def note_polls(api):
-    _note = api.notes_create("This is polls test!",
-                             poll=[
-                                 "1",
-                                 "2"
-                             ])
-    yield _note
-    api.notes_delete(_note["createdNote"]["id"])
+@pytest.fixture(scope='session')
+def mk_admin_id(mk_cli_admin: Misskey) -> str:
+    return mk_cli_admin.i()['id']
 
 
-@pytest.fixture
-def note_reaction(note2, api):
-    _reaction = api.notes_reactions_create(note2["createdNote"]["id"], "like")
-    yield _reaction
-    api.notes_reactions_delete(note2["createdNote"]["id"])
+@pytest.fixture(scope='session')
+def mk_user_id(mk_cli_user: Misskey) -> str:
+    return mk_cli_user.i()['id']
 
 
-@pytest.fixture(scope="module")
-def vcr_config():
-    return dict(
-        match_on=['method', 'query'],
-        decode_compressed_response=True
+@pytest.fixture()
+def mk_admin_new_note(mk_cli_admin: Misskey):
+    new_note = mk_cli_admin.notes_create(
+        text='Unit test message'
     )
+    assert type(new_note) == dict
+    yield new_note['createdNote']['id']
+
+    is_deleted = mk_cli_admin.notes_delete(new_note['createdNote']['id'])
+    assert type(is_deleted) == bool
+    assert is_deleted
diff --git a/tests/misskey_config/default.yml b/tests/misskey_config/default.yml
new file mode 100644
index 0000000..afbf20a
--- /dev/null
+++ b/tests/misskey_config/default.yml
@@ -0,0 +1,20 @@
+# for misskey server. see below:
+# https://github.com/misskey-dev/misskey/blob/develop/.config/example.yml
+
+url: http://misskey-web/
+
+port: 3000
+
+db:
+  host: db
+  port: 5432
+  db: misskey
+  user: example-misskey-user
+  pass: example-misskey-pass
+
+redis:
+  host: redis
+  port: 6379
+
+id: 'aid'
+disableHsts: true
diff --git a/tests/testImage.png b/tests/testImage.png
deleted file mode 100644
index f2c9b98..0000000
Binary files a/tests/testImage.png and /dev/null differ
diff --git a/tests/test_constructor.py b/tests/test_constructor.py
deleted file mode 100644
index d1495a7..0000000
--- a/tests/test_constructor.py
+++ /dev/null
@@ -1,52 +0,0 @@
-import pytest
-from Misskey.Misskey import Misskey
-from Misskey.Exceptions import MisskeyInitException, MisskeyAPITokenException, MisskeyAiException, MisskeyAPIException
-
-
-@pytest.mark.vcr()
-def test_constructor():
-    Misskey("demo.misskey.io")
-
-
-@pytest.mark.vcr()
-def test_constructor_error():
-    with pytest.raises(MisskeyInitException):
-        Misskey("example.com")
-
-
-@pytest.mark.vcr()
-def test_set_apikey_error():
-    with pytest.raises(MisskeyAPITokenException):
-        api = Misskey("demo.misskey.io")
-        api.apiToken = "invalid"
-
-
-@pytest.mark.vcr()
-def test_get_address(api_anonymous):
-    assert isinstance(api_anonymous.address, str)
-    assert api_anonymous.address == "demo.misskey.io"
-
-
-@pytest.mark.vcr()
-def test_get_version(api_anonymous):
-    assert isinstance(api_anonymous.version, str)
-
-
-@pytest.mark.vcr()
-def test_should_not_access_credentials(api_anonymous):
-    with pytest.raises(MisskeyAiException):
-        api_anonymous.i()
-
-
-@pytest.mark.vcr()
-def test_delete_apiToken(api):
-    _api = api
-    del _api.apiToken
-    assert _api.apiToken is None
-
-
-@pytest.mark.vcr()
-def test_call(api):
-    assert isinstance(api("meta"), dict)
-    with pytest.raises(MisskeyAPIException):
-        api("not_exists")
diff --git a/tests/test_exception.py b/tests/test_exception.py
new file mode 100644
index 0000000..e662c6b
--- /dev/null
+++ b/tests/test_exception.py
@@ -0,0 +1,38 @@
+import uuid
+
+import pytest
+
+from misskey.exceptions import MisskeyAPIException
+
+
+def test_should_be_unknown_api_exception():
+    mk_ae = MisskeyAPIException({})
+
+    assert mk_ae.code == 'UNKNOWN'
+    assert mk_ae.message == 'Unknown exception in Misskey.py'
+    assert type(mk_ae.id) == uuid.UUID and mk_ae.id == uuid.UUID(int=0)
+
+
+@pytest.mark.parametrize('res_dict', [
+    {
+        'error': {
+            'code': 'I_AM_AI',
+            'message': 'You sent a request to Ai-chan, '
+                       'Misskey\'s showgirl, instead of the server.',
+            'id': '60c46cd1-f23a-46b1-bebe-5d2b73951a84',
+        }
+    },
+    {
+        'error': {
+            'code': 'TEST',
+            'message': 'This message is test for Misskey.py',
+            'id': 'this is invalid uuid test'
+        }
+    }
+])
+def test_api_exception(res_dict: dict):
+    mk_ae = MisskeyAPIException(res_dict)
+    assert type(mk_ae.code) == str
+    assert type(mk_ae.id) == str or type(mk_ae.id) == uuid.UUID
+    assert type(mk_ae.message) == str
+    assert type(str(mk_ae)) == str
diff --git a/tests/test_i.py b/tests/test_i.py
deleted file mode 100644
index 338d9ba..0000000
--- a/tests/test_i.py
+++ /dev/null
@@ -1,73 +0,0 @@
-import pytest
-
-
-@pytest.mark.vcr()
-def test_i(api, api2):
-    i = api.i()
-    i2 = api2.i()
-    assert isinstance(i, dict)
-    assert isinstance(i2, dict)
-
-
-@pytest.mark.vcr()
-def test_i_update(api, api2):
-    __I_UPDATE_NAME = "Misskey.py Unit tester"
-    __I2_UPDATE_NAME = "Misskey.py Unit tester 2"
-    __I_UPDATE_DESC = "This account is a Misskey.py unit test account. It works automatically."
-    i = api.i_update(
-        name=__I_UPDATE_NAME,
-        description=__I_UPDATE_DESC,
-        isBot=True
-    )
-    i2 = api2.i_update(
-        name=__I2_UPDATE_NAME,
-        description=__I_UPDATE_DESC,
-        isBot=True
-    )
-    assert i["name"] == __I_UPDATE_NAME
-    assert i2["name"] == __I2_UPDATE_NAME
-    assert i["description"] == __I_UPDATE_DESC
-    assert i2["description"] == __I_UPDATE_DESC
-    assert i["isBot"]
-    assert i2["isBot"]
-
-
-@pytest.mark.vcr()
-def test_i_favorites(api):
-    favorites = api.i_favorites()
-    assert isinstance(favorites, list)
-
-
-@pytest.mark.vcr()
-def test_i_notifications(api):
-    notifications = api.i_notifications()
-    assert isinstance(notifications, list)
-
-
-@pytest.mark.vcr()
-def test_i_pin(note, api):
-    pinned = api.i_pin(note["createdNote"]["id"])
-    assert isinstance(pinned, dict)
-    unpin = api.i_unpin(note["createdNote"]["id"])
-    assert isinstance(unpin, dict)
-
-
-@pytest.mark.vcr()
-def test_i_readAllUnreadNotes(api):
-    res = api.i_readAllMessagingMessages()
-    assert isinstance(res, bool)
-    assert res is True
-
-
-@pytest.mark.vcr()
-def test_i_readAllUnreadNotes(api):
-    res = api.i_readAllUnreadNotes()
-    assert isinstance(res, bool)
-    assert res is True
-
-
-@pytest.mark.vcr()
-def test_notifications_markAllAsRead(api):
-    res = api.notifications_markAllAsRead()
-    assert isinstance(res, bool)
-    assert res is True
diff --git a/tests/test_image.png b/tests/test_image.png
new file mode 100644
index 0000000..83c2e37
Binary files /dev/null and b/tests/test_image.png differ
diff --git a/tests/test_meta.py b/tests/test_meta.py
deleted file mode 100644
index 84f5696..0000000
--- a/tests/test_meta.py
+++ /dev/null
@@ -1,19 +0,0 @@
-import pytest
-
-
-@pytest.mark.vcr()
-def test_meta(api_anonymous):
-    meta = api_anonymous.meta()
-    assert isinstance(meta, dict)
-
-
-@pytest.mark.vcr()
-def test_stats(api_anonymous):
-    stats = api_anonymous.stats()
-    assert isinstance(stats, dict)
-
-
-@pytest.mark.vcr()
-def test_pinnedUsers(api_anonymous):
-    pinnedUsers = api_anonymous.pinnedUsers()
-    assert isinstance(pinnedUsers, list)
diff --git a/tests/test_miauth.py b/tests/test_miauth.py
new file mode 100644
index 0000000..4c76021
--- /dev/null
+++ b/tests/test_miauth.py
@@ -0,0 +1,162 @@
+import uuid
+from urllib.parse import (
+    urlparse,
+    parse_qs,
+)
+
+import pytest
+import requests
+
+from misskey import MiAuth
+from misskey.enum import Permissions
+from misskey.exceptions import MisskeyMiAuthFailedException
+from .conftest import TEST_HOST
+
+
+def test_address_parse():
+    ma = MiAuth(
+        address='example.com'
+    )
+    assert type(ma.address) == str
+    assert ma.address == 'example.com'
+
+
+def test_init_no_permission():
+    ma = MiAuth(
+        address=TEST_HOST,
+        permission=[],
+    )
+    assert type(ma.permission) == list
+    assert len(ma.permission) == 0
+
+
+def test_custom_session_id():
+    ma = MiAuth(
+        address=TEST_HOST,
+        session_id=str(uuid.uuid4())
+    )
+    assert type(ma.session_id) == str
+
+
+def test_gen_url_with_optional_params():
+    callback_url = 'https://example.com/callback'
+    icon_url = 'https://example.com/icon.png'
+
+    ma = MiAuth(
+        address=TEST_HOST,
+        callback=callback_url,
+        icon=icon_url,
+    )
+    auth_url = ma.generate_url()
+    assert type(auth_url) == str
+
+    auth_url_parse = urlparse(auth_url)
+    auth_url_parse_query = parse_qs(auth_url_parse.query)
+    assert auth_url_parse_query.get('icon') is not None
+    assert auth_url_parse_query['icon'][0] == icon_url
+
+    assert auth_url_parse_query.get('callback') is not None
+    assert auth_url_parse_query['callback'][0] == callback_url
+
+
+def test_miauth_invalid_permission():
+    with pytest.raises(ValueError):
+        MiAuth(
+            permission=[
+                'invalid_permission'
+            ]
+        )
+
+
+def test_miauth_valid_permission():
+    MiAuth(
+        permission={
+            Permissions.READ_ACCOUNT,
+        },
+    )
+
+
+def test_attr_name():
+    test_name = 'test'
+    ma = MiAuth(
+        address=TEST_HOST,
+        name=test_name,
+    )
+    assert type(ma.name) == str
+    assert ma.name == test_name
+
+    test_name = 'new-test'
+    ma.name = test_name
+
+    assert type(ma.name) == str
+    assert ma.name == test_name
+
+
+def test_attr_icon():
+    ma = MiAuth(
+        address=TEST_HOST,
+    )
+    assert ma.icon is None
+
+    test_icon_url = 'https://example.com/icon.png'
+    ma.icon = test_icon_url
+
+    assert type(ma.icon) == str
+    assert ma.icon == test_icon_url
+
+    del ma.icon
+    assert ma.icon is None
+
+
+def test_attr_callback():
+    ma = MiAuth(
+        address=TEST_HOST,
+    )
+    assert ma.callback is None
+
+    test_callback_url = 'https://example.com/callback'
+    ma.callback = test_callback_url
+
+    assert type(ma.callback) == str
+    assert ma.callback == test_callback_url
+
+    del ma.callback
+    assert ma.callback is None
+
+
+def test_permission_setter():
+    ma = MiAuth(
+        address=TEST_HOST,
+    )
+    with pytest.raises(ValueError):
+        ma.permission = ['invalid_permission']
+
+    ma.permission = (Permissions.READ_ACCOUNT, )
+    assert type(ma.permission) == tuple
+
+
+def test_miauth_check(
+    mk_admin_token: str,
+):
+    ma = MiAuth(
+        address=TEST_HOST,
+        permission=[],
+        name='test-auth'
+    )
+    with pytest.raises(MisskeyMiAuthFailedException):
+        ma.check()
+
+    res = requests.post(
+        f'{TEST_HOST}/api/miauth/gen-token',
+        json={
+            'i': mk_admin_token,
+            'name': ma.name,
+            'permission': [],
+            'session': str(ma.session_id),
+        }
+    )
+    res.raise_for_status()
+    res_json = res.json()
+
+    token = ma.check()
+    assert token == ma.token == res_json['token']
diff --git a/tests/test_misskey.py b/tests/test_misskey.py
new file mode 100644
index 0000000..2651a60
--- /dev/null
+++ b/tests/test_misskey.py
@@ -0,0 +1,740 @@
+import datetime
+import uuid
+from urllib.parse import urlparse
+
+import pytest
+import requests
+
+from misskey import (
+    Misskey,
+    NotificationsType
+)
+from misskey.exceptions import (
+    MisskeyAuthorizeFailedException,
+    MisskeyAPIException,
+)
+from .conftest import TEST_HOST
+
+
+@pytest.mark.parametrize('host', [
+    'http://unknown-host',
+    'unknown-host',
+])
+def test_should_connect_error_in_init(host: str):
+    with pytest.raises(requests.exceptions.ConnectionError):
+        Misskey(host)
+
+
+@pytest.mark.parametrize('host, token', [
+    (TEST_HOST, 'this_is_invalid'),
+    (TEST_HOST, '')
+])
+def test_should_token_error_in_init(host: str, token: str):
+    with pytest.raises(MisskeyAuthorizeFailedException):
+        Misskey(host, i=TEST_HOST)
+
+
+@pytest.mark.parametrize('host, token', [
+    (TEST_HOST, 'this_is_invalid'),
+    (TEST_HOST, ''),
+])
+def test_should_token_error_in_setter(host: str, token: str):
+    with pytest.raises(MisskeyAuthorizeFailedException):
+        mk = Misskey(host)
+        mk.token = token
+
+
+def test_address_should_be_same(mk_cli_anon: Misskey):
+    host_url = urlparse(TEST_HOST)
+    assert mk_cli_anon.address == host_url.netloc
+
+
+def test_token_should_be_valid(
+    mk_cli_user: Misskey,
+    mk_user_token: str
+):
+    assert mk_cli_user.token == mk_user_token
+
+
+def test_token_should_be_settable_and_deletable(mk_user_token: str):
+    mk = Misskey(TEST_HOST)
+    mk.token = mk_user_token
+    assert type(mk.token) == str
+    del mk.token
+    assert mk.token is None
+
+
+def test_should_success_i(mk_cli_user: Misskey):
+    res = mk_cli_user.i()
+    assert type(res) == dict
+
+
+def test_should_fail_i(mk_cli_anon: Misskey):
+    with pytest.raises(MisskeyAPIException) as e:
+        mk_cli_anon.i()
+
+    assert type(e.value.code) == str
+    assert type(e.value.message) == str
+    assert type(e.value.id) == uuid.UUID or type(e.value.id) == str
+
+
+def test_meta(mk_cli_anon: Misskey):
+    res = mk_cli_anon.meta()
+    assert type(res) == dict
+
+
+def test_stats(mk_cli_anon: Misskey):
+    res = mk_cli_anon.stats()
+    assert type(res) == dict
+
+
+def test_i_favorites(mk_cli_admin: Misskey):
+    res = mk_cli_admin.i_favorites()
+    assert type(res) == list
+
+
+def test_should_be_viewable_note(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str
+):
+    res = mk_cli_admin.notes_show(mk_admin_new_note)
+    assert type(res) == dict
+
+
+def test_note_poll_expires_at(
+    mk_cli_admin: Misskey,
+    mk_cli_user: Misskey,
+):
+    res = mk_cli_admin.notes_create(
+        text='poll test (expires_at)',
+        poll_choices=[
+            'test 1',
+            'test 2',
+        ],
+        poll_expires_at=(
+            datetime.datetime.now() +
+            datetime.timedelta(minutes=1)
+        ),
+    )
+    assert type(res) == dict
+
+    vote_res = mk_cli_user.notes_polls_vote(
+        res['createdNote']['id'],
+        0,
+    )
+    assert type(vote_res) == bool
+    assert vote_res
+
+    is_deleted = mk_cli_admin.notes_delete(res['createdNote']['id'])
+    assert type(is_deleted) == bool
+    assert is_deleted
+
+
+def test_note_poll_expired_after(
+    mk_cli_admin: Misskey,
+    mk_cli_user: Misskey,
+):
+    res = mk_cli_admin.notes_create(
+        text='poll test (expired_after)',
+        poll_choices=[
+            'test 1',
+            'test 2',
+        ],
+        poll_expired_after=datetime.timedelta(minutes=1),
+    )
+    assert type(res) == dict
+
+    vote_res = mk_cli_user.notes_polls_vote(
+        res['createdNote']['id'],
+        0,
+    )
+    assert type(vote_res) == bool
+    assert vote_res
+
+    is_deleted = mk_cli_admin.notes_delete(res['createdNote']['id'])
+    assert type(is_deleted) == bool
+    assert is_deleted
+
+
+def test_should_be_error_in_create_note_visibility(
+    mk_cli_admin: Misskey,
+):
+    with pytest.raises(ValueError):
+        mk_cli_admin.notes_create(visibility='not valid visibility')
+
+
+def test_i_notifications(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.i_notifications(
+        include_types={
+            NotificationsType.REACTION
+        },
+    )
+    assert type(res) == list
+
+
+def test_notifications_mark_all_as_read(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.notifications_mark_all_as_read()
+    assert type(res) == bool
+    assert res
+
+
+def test_should_be_error_in_i_notifications(
+    mk_cli_admin: Misskey,
+):
+    with pytest.raises(ValueError):
+        mk_cli_admin.i_notifications(
+            include_types=[
+                'unknown_type'
+            ]
+        )
+
+    with pytest.raises(ValueError):
+        mk_cli_admin.i_notifications(
+            exclude_types=[
+                'unknown_type'
+            ]
+        )
+
+
+def test_should_can_be_pin_and_unpin_note(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res_pin = mk_cli_admin.i_pin(mk_admin_new_note)
+    assert type(res_pin) == dict
+    res_unpin = mk_cli_admin.i_unpin(mk_admin_new_note)
+    assert type(res_unpin) == dict
+
+
+def test_should_ok_show_replies(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_renotes(mk_admin_new_note)
+    assert type(res) == list
+
+
+def test_should_ok_show_reactions(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_reactions(
+        mk_admin_new_note,
+        reaction_type='✅',
+    )
+    assert type(res) == list
+
+
+def test_should_can_be_reaction_to_notes(
+    mk_cli_user: Misskey,
+    mk_admin_new_note: str,
+):
+    res_reaction = mk_cli_user.notes_reactions_create(
+        mk_admin_new_note,
+        '✅',
+    )
+    assert type(res_reaction) == bool
+    assert res_reaction
+    res_del_reaction = mk_cli_user.notes_reactions_delete(
+        mk_admin_new_note,
+    )
+    assert type(res_del_reaction) == bool
+    assert res_del_reaction
+
+
+def test_notes_timeline(
+    mk_cli_admin: Misskey,
+):
+    timeline = mk_cli_admin.notes_timeline(
+        since_date=(
+            datetime.datetime.now() -
+            datetime.timedelta(days=1)
+        ),
+        until_date=(
+            datetime.datetime.now() +
+            datetime.timedelta(hours=3)
+        )
+    )
+    assert type(timeline) == list
+
+
+def test_notes_local_timeline(
+    mk_cli_admin: Misskey,
+):
+    timeline_local = mk_cli_admin.notes_local_timeline(
+        since_date=(
+            datetime.datetime.now() -
+            datetime.timedelta(days=1)
+        ),
+        until_date=(
+            datetime.datetime.now() +
+            datetime.timedelta(hours=3)
+        )
+    )
+    assert type(timeline_local) == list
+
+
+def test_notes_hybrid_timeline(
+    mk_cli_admin: Misskey,
+):
+    timeline_hybrid = mk_cli_admin.notes_hybrid_timeline(
+        since_date=(
+            datetime.datetime.now() -
+            datetime.timedelta(days=1)
+        ),
+        until_date=(
+            datetime.datetime.now() +
+            datetime.timedelta(hours=3)
+        )
+    )
+    assert type(timeline_hybrid) == list
+
+
+def test_notes_global_timeline(
+    mk_cli_admin: Misskey,
+):
+    timeline_global = mk_cli_admin.notes_global_timeline(
+        since_date=(
+            datetime.datetime.now() -
+            datetime.timedelta(days=1)
+        ),
+        until_date=(
+            datetime.datetime.now() +
+            datetime.timedelta(hours=3)
+        )
+    )
+    assert type(timeline_global) == list
+
+
+def test_notes_replies(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_replies(mk_admin_new_note)
+    assert type(res) == list
+
+
+def test_renote_note(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_create(
+        renote_id=mk_admin_new_note,
+    )
+    assert type(res) == dict
+
+    res_unrenote = mk_cli_admin.notes_unrenote(
+        mk_admin_new_note,
+    )
+    assert type(res_unrenote) == bool
+    assert res_unrenote
+
+
+def test_favorite_note(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res_favorite = mk_cli_admin.notes_favorites_create(
+        mk_admin_new_note,
+    )
+    assert type(res_favorite) == bool
+    assert res_favorite
+
+    res_unfav = mk_cli_admin.notes_favorites_delete(
+        mk_admin_new_note,
+    )
+    assert type(res_unfav) == bool
+    assert res_unfav
+
+
+def test_notes_conversation(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_conversation(
+        mk_admin_new_note,
+    )
+    assert type(res) == list
+
+
+def test_notes_children(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_children(
+        mk_admin_new_note,
+    )
+    assert type(res) == list
+
+
+def test_announcements(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.announcements()
+    assert type(res) == list
+
+
+def test_notes_watching(
+    mk_cli_user: Misskey,
+    mk_admin_new_note: str,
+):
+    res_watch = mk_cli_user.notes_watching_create(
+        mk_admin_new_note,
+    )
+    assert type(res_watch) == bool
+    assert res_watch
+    res_unwatch = mk_cli_user.notes_watching_delete(
+        mk_admin_new_note,
+    )
+    assert type(res_unwatch) == bool
+    assert res_unwatch
+
+
+def test_notes_state(
+    mk_cli_admin: Misskey,
+    mk_admin_new_note: str,
+):
+    res = mk_cli_admin.notes_state(
+        mk_admin_new_note,
+    )
+    assert type(res) == dict
+
+
+def test_i_update(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.i_update(
+        name='Unit test user admin',
+        birthday=datetime.date.today(),
+        lang='ja-JP',
+        muting_notification_types=[
+            'app',
+        ],
+    )
+    assert type(res) == dict
+
+
+def test_users_show(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.users_show(
+        username='user',
+    )
+    assert type(res) == dict
+
+
+def test_users_following(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.users_following(
+        username='user'
+    )
+    assert type(res) == list
+
+
+def test_users_followers(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.users_followers(
+        username='user'
+    )
+    assert type(res) == list
+
+
+def test_user_notes(
+    mk_cli_admin: Misskey,
+    mk_admin_id: str,
+):
+    res = mk_cli_admin.users_notes(
+        mk_admin_id,
+        since_date=(
+            datetime.datetime.now() -
+            datetime.timedelta(days=1)
+        ),
+        until_date=(
+            datetime.datetime.now()
+        ),
+    )
+    assert type(res) == list
+
+
+def test_users_stats(
+    mk_cli_admin: Misskey,
+    mk_admin_id: str,
+):
+    res = mk_cli_admin.users_stats(
+        mk_admin_id,
+    )
+    assert type(res) == dict
+
+
+def test_user_relation(
+    mk_cli_admin: Misskey,
+    mk_user_id: str,
+):
+    res_single = mk_cli_admin.users_relation(
+        mk_user_id,
+    )
+    assert type(res_single) == dict
+    res_multiple = mk_cli_admin.users_relation(
+        [mk_user_id],
+    )
+    assert type(res_multiple) == list
+
+
+def test_following(
+    mk_cli_admin: Misskey,
+    mk_user_id: str,
+):
+    res_follow = mk_cli_admin.following_create(
+        mk_user_id,
+    )
+    assert type(res_follow) == dict
+    res_unfollow = mk_cli_admin.following_delete(
+        mk_user_id,
+    )
+    assert type(res_unfollow) == dict
+
+
+def test_follow_request(
+    mk_cli_admin: Misskey,
+    mk_cli_user: Misskey,
+    mk_user_id: str,
+    mk_admin_id: str,
+):
+    mk_cli_user.i_update(
+        is_locked=True,
+    )
+    mk_cli_admin.following_create(
+        mk_user_id,
+    )
+    res_follow_cancel = mk_cli_admin.following_requests_cancel(
+        mk_user_id,
+    )
+    assert type(res_follow_cancel) == dict
+
+    mk_cli_admin.following_create(
+        mk_user_id,
+    )
+    res_follow_list = mk_cli_user.following_requests_list()
+    assert type(res_follow_list) == list
+    res_follow_reject = mk_cli_user.following_requests_reject(
+        mk_admin_id,
+    )
+    assert type(res_follow_reject) == bool
+    assert res_follow_reject
+
+    mk_cli_admin.following_create(
+        mk_user_id,
+    )
+    res_follow_accept = mk_cli_user.following_requests_accept(
+        mk_admin_id,
+    )
+    assert type(res_follow_accept) == bool
+    assert res_follow_accept
+
+    mk_cli_user.i_update(
+        is_locked=False,
+    )
+    mk_cli_admin.following_delete(
+        mk_user_id,
+    )
+
+
+def test_should_fail_in_drives_files_create(
+    mk_cli_anon: Misskey
+):
+    with pytest.raises(MisskeyAPIException):
+        with open('tests/test_image.png', mode='rb') as f:
+            mk_cli_anon.drive_files_create(
+                f,
+            )
+
+
+def test_drive(
+    mk_cli_admin: Misskey,
+):
+    res = mk_cli_admin.drive()
+    assert type(res) == dict
+
+
+def test_drive_stream(
+    mk_cli_admin: Misskey,
+):
+    res_stream = mk_cli_admin.drive_stream()
+    assert type(res_stream) == list
+
+    res_files = mk_cli_admin.drive_files()
+    assert type(res_files) == list
+
+    res_folders = mk_cli_admin.drive_folders()
+    assert type(res_folders) == list
+
+
+def test_drive_files(
+    mk_cli_admin: Misskey
+):
+    with open('tests/test_image.png', mode='rb') as f:
+        res_create = mk_cli_admin.drive_files_create(
+            f,
+        )
+        assert type(res_create) == dict
+
+        res_file_check = mk_cli_admin.drive_files_check_existence(
+            res_create['md5'],
+        )
+        assert type(res_file_check) == bool
+        assert res_file_check
+
+        res_find_hash = mk_cli_admin.drive_files_find_by_hash(
+            res_create['md5'],
+        )
+        assert type(res_find_hash) == list
+
+        res_attached_notes = mk_cli_admin.drive_files_attached_notes(
+            res_create['id'],
+        )
+        assert type(res_attached_notes) == list
+
+        res_files_show = mk_cli_admin.drive_files_show(
+            res_create['id'],
+        )
+        assert type(res_files_show) == dict
+
+        res_files_update = mk_cli_admin.drive_files_update(
+            res_create['id'],
+            folder_id=None,
+            comment='test file',
+        )
+        assert type(res_files_update) == dict
+
+        res_delete = mk_cli_admin.drive_files_delete(
+            res_create['id'],
+        )
+        assert type(res_delete) == bool
+        assert res_delete
+
+
+def test_drive_folders(
+    mk_cli_admin: Misskey,
+):
+    res_create = mk_cli_admin.drive_folders_create(
+        name='test-folder',
+    )
+    assert type(res_create) == dict
+
+    res_show = mk_cli_admin.drive_folders_show(
+        res_create['id'],
+    )
+    assert type(res_show) == dict
+
+    res_update = mk_cli_admin.drive_folders_update(
+        folder_id=res_create['id'],
+        name='renamed-folder',
+        parent_id=None,
+    )
+    assert type(res_update) == dict
+
+    res_delete = mk_cli_admin.drive_folders_delete(
+        res_create['id'],
+    )
+    assert type(res_delete) == bool
+    assert res_delete
+
+
+def test_users_report_abuse(
+    mk_cli_admin: Misskey,
+    mk_user_id: str,
+):
+    res = mk_cli_admin.users_report_abuse(
+        user_id=mk_user_id,
+        comment='this is test report abuse',
+    )
+    assert type(res) == bool
+    assert res
+
+
+def test_mute(
+    mk_cli_admin: Misskey,
+    mk_user_id: str,
+):
+    res_mute = mk_cli_admin.mute_create(
+        mk_user_id,
+    )
+    assert type(res_mute) == bool
+    assert res_mute
+
+    res_mute_list = mk_cli_admin.mute_list()
+    assert type(res_mute_list) == list
+
+    res_unmute = mk_cli_admin.mute_delete(
+        mk_user_id,
+    )
+    assert type(res_unmute) == bool
+    assert res_unmute
+
+
+def test_blocking(
+    mk_cli_admin: Misskey,
+    mk_user_id: str,
+):
+    res_block = mk_cli_admin.blocking_create(
+        mk_user_id,
+    )
+    assert type(res_block) == dict
+
+    res_block_list = mk_cli_admin.blocking_list()
+    assert type(res_block_list) == list
+
+    res_unblock = mk_cli_admin.blocking_delete(
+        mk_user_id,
+    )
+    assert type(res_unblock) == dict
+
+
+def test_users_lists(
+    mk_cli_admin: Misskey,
+    mk_user_id: str,
+):
+    res_create = mk_cli_admin.users_lists_create(
+        'test-list',
+    )
+    assert type(res_create) == dict
+
+    res_show = mk_cli_admin.users_lists_show(
+        res_create['id'],
+    )
+    assert type(res_show) == dict
+
+    res_list = mk_cli_admin.users_lists_list()
+    assert type(res_list) == list
+
+    res_push = mk_cli_admin.users_lists_push(
+        list_id=res_create['id'],
+        user_id=mk_user_id,
+    )
+    assert type(res_push) == bool
+    assert res_push
+
+    res_pull = mk_cli_admin.users_lists_pull(
+        list_id=res_create['id'],
+        user_id=mk_user_id,
+    )
+    assert type(res_pull) == bool
+    assert res_pull
+
+    res_update = mk_cli_admin.users_lists_update(
+        list_id=res_create['id'],
+        name='test-list-renamed',
+    )
+    assert type(res_update) == dict
+
+    res_delete = mk_cli_admin.users_lists_delete(
+        res_create['id'],
+    )
+    assert type(res_delete) == bool
+    assert res_delete
diff --git a/tests/test_notes.py b/tests/test_notes.py
deleted file mode 100644
index de76e26..0000000
--- a/tests/test_notes.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import pytest
-
-
-@pytest.mark.vcr()
-def test_note(note, api):
-    assert isinstance(note, dict)
-    note_get = api.notes_show(note["createdNote"]["id"])
-    assert isinstance(note_get, dict)
-    assert note_get["id"] == note["createdNote"]["id"]
-
-
-@pytest.mark.vcr()
-def test_reaction(note_reaction):
-    assert note_reaction is True
-
-
-@pytest.mark.vcr()
-def test_reactions(note, api):
-    reactions = api.notes_reactions(note["createdNote"]["id"])
-    assert isinstance(reactions, list)
-
-
-@pytest.mark.vcr()
-def test_notes(api_anonymous):
-    notes = api_anonymous.notes()
-    assert isinstance(notes, list)
-
-
-@pytest.mark.vcr()
-def test_notes_renote(note, api2):
-    renoted_note = api2.notes_renote(note["createdNote"]["id"])
-    assert isinstance(renoted_note, dict)
-
-
-@pytest.mark.vcr()
-def test_notes_renotes(note, api2):
-    renotes = api2.notes_renotes(note["createdNote"]["id"])
-    assert isinstance(renotes, list)
-
-
-@pytest.mark.vcr()
-def test_notes_polls_vote(api, note_polls):
-    res = api.notes_polls_vote(note_polls["createdNote"]["id"], 0)
-    assert isinstance(res, bool)
-    assert res is True
diff --git a/tests/test_utils.py b/tests/test_utils.py
deleted file mode 100644
index 36f6c9c..0000000
--- a/tests/test_utils.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import pytest
-from Misskey.Util import username_available
-from .conftest import make_rc
-
-
-@pytest.mark.vcr()
-def test_username_available(api):
-    res_available = username_available("demo.misskey.io", f"MKPU_{make_rc()}")
-    assert res_available["available"] is True
-    exists_username = api.i()["username"]
-    res_unavailable = username_available("demo.misskey.io", exists_username)
-    assert res_unavailable["available"] is False