{ "info": { "author": "Kirk Strauser", "author_email": "kirk@strauser.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# mastools - Tools for interacting directly with a Mastodon instance's database\n\n## Installation\n\nIf you just want to use mastools and not work on the project itself: `pip install mastools`.\n\nIf you want to help develop mastools and have [poetry](https://poetry.eustace.io) installed, clone this repo and run `poetry install`.\n\nIf you want to develop mastools but don't have poetry, use `pip` to install the dependencies mentioned in the `[tool.poetry.dependencies]` section of `pyproject.toml`.\n\n## Configuration\n\nMake a file named `~/.mastools/config.json` like:\n\n```json\n{\n \"host\": \"localhost\",\n \"database\": \"mastodon\",\n \"user\": \"mastodon\",\n \"password\": \"0xdeadbeef\"\n}\n```\n\nAll mastools components will use this database configuration.\n\n# The tool\n\nStarting with version 0.2.0, there's only one main `mastools` command which has\nmultiple subcommands. `show-user-changes` is still a functioning command for\ntemporary backward compatibility, but it will be removed soon.\n\n`mastools` subcommands:\n\n## show-unconfirmed-users\n\nShow users who haven't confirmed their email yet, ordered by their creation date\nfrom oldest to newest.\n\nThis is useful for detection a flood of newly created junk accounts.\n\n```\n$ mastools show-unconfired-users\ncrqcrujofa was created at 2019-10-25 10:10:18.406158\nlkjmadf was created at 2019-10-25 13:06:04.175580\n```\n\n## show-user-changes\n\nShow any new, changed, or deleted accounts that mention URLs in their account\ninfo.\n\nThis is super common for spammers, who like to stuff their crummy website's info\ninto every single field possible. Suppose you run this hourly and email yourself\nthe results (which will usually be empty unless your instance is *very* busy).\nNow you can catch those \"https://support-foo-corp/\" spammers before they have a\nchance to post!\n\nFor example I run this from a cron job on my instance like:\n\n```\n10 * * * * /home/me/mastools/.venv/bin/mastools show-user-changes\n```\n\nto get an hourly update of changes. This gives a report like:\n\n```\nChanged user: tek\n fields:\n - 'Avatar': 'Me, at night, with tunes'\n 'Website': 'https://honeypot.net'\n + 'Avatar': 'Me, at night, with music'\n note:\n \n\nNew user: new_spammer\n fields:\n + 'website': 'https://example.com/foo-corp-tech-support'\n note:\n + 'ALL UR FRAUD^WSUPPORT NEEDS'\n\nDeleted user: old_spammer\n fields:\n - 'website': 'https://example.com/bar-inc-tech-support'\n note:\n - 'SEND ME YOUR IP ADDRESS AND CREDIT CARD'\n```\n\n# License\n\nDistributed under the terms of the MIT license, mastools is free and open source software.\n\n# History\n\n- v0.2.0 - 2019-10-27: Added `mastools` command and `show_unconfirmed_users` subcommand\n- v0.1.3 - 2019-09-25: Productionizing\n- v0.1.2 - 2019-09-25: Prettier show-user-changes output\n- v0.1.1 - 2019-09-24: Same code, but pushing new metadata to pypi\n- v0.1.0 - 2019-09-24: First release\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/freeradical-dot-zone/mastools", "keywords": "", "license": "MIT", "maintainer": "Kirk Strauser", "maintainer_email": "kirk@strauser.com", "name": "mastools", "package_url": "https://pypi.org/project/mastools/", "platform": "", "project_url": "https://pypi.org/project/mastools/", "project_urls": { "Homepage": "https://github.com/freeradical-dot-zone/mastools" }, "release_url": "https://pypi.org/project/mastools/0.2.0/", "requires_dist": [ "psycopg2 (>=2.8,<3.0)", "sqlalchemy (>=1.3,<2.0)" ], "requires_python": ">=3.6,<4.0", "summary": "Tools for interacting directly with a Mastodon instance's database", "version": "0.2.0", "yanked": false, "yanked_reason": null }, "last_serial": 6038470, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "10b65af203b820755d7e72f398e7d7e3", "sha256": "28ffa26e13df0bfb5d3eb105fc62496cff2e0cabfd480992a8b9b82931b7ac00" }, "downloads": -1, "filename": "mastools-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "10b65af203b820755d7e72f398e7d7e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7,<4.0", "size": 11091, "upload_time": "2019-09-25T06:19:14", "upload_time_iso_8601": "2019-09-25T06:19:14.558128Z", "url": "https://files.pythonhosted.org/packages/eb/c0/0f3195325439ab8ccf7323a72c70269ff6abcfdfcbe100daee9ad4f6014f/mastools-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1ea6deefc70f5e23403422a95a1a8431", "sha256": "a2058b7fcf26457fa7649808812cb9e071a27d509c09226206d3b53bc88624f6" }, "downloads": -1, "filename": "mastools-0.1.0.tar.gz", "has_sig": false, "md5_digest": "1ea6deefc70f5e23403422a95a1a8431", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<4.0", "size": 3845, "upload_time": "2019-09-25T06:21:04", "upload_time_iso_8601": "2019-09-25T06:21:04.343412Z", "url": "https://files.pythonhosted.org/packages/48/75/ae8c0b4ee2e3936bdc55136bb057f0b1d735b7277d6677824e47398f8974/mastools-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "48eee0a47bf3e2fdb093c4936c47db07", "sha256": "435d659761155216e661f1f1fb066551bfebe9a04e0850372e90a6006862d3d4" }, "downloads": -1, "filename": "mastools-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "48eee0a47bf3e2fdb093c4936c47db07", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 11858, "upload_time": "2019-09-25T06:31:08", "upload_time_iso_8601": "2019-09-25T06:31:08.521204Z", "url": "https://files.pythonhosted.org/packages/54/4f/37d8b3979553c93ec0d70ea015b287e83907d71a66b48b5f25be288381e5/mastools-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f499a528d3573c89a54c8d5fef30482e", "sha256": "bc9e0f63c55bdc3044a20e79701111fba84643dfb842a702cb70aad498834551" }, "downloads": -1, "filename": "mastools-0.1.1.tar.gz", "has_sig": false, "md5_digest": "f499a528d3573c89a54c8d5fef30482e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 4584, "upload_time": "2019-09-25T06:31:10", "upload_time_iso_8601": "2019-09-25T06:31:10.085844Z", "url": "https://files.pythonhosted.org/packages/a5/b3/cbac930cdddf9ee84a45835d1483819167177cbc61f8d29ed500dd76be6b/mastools-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7b94fc74e8c48366c8a3ffc2a8fe86c3", "sha256": "d5d65c36ca393bd3885877c6909187b9b15f378ec81aac539604c858baa4b39c" }, "downloads": -1, "filename": "mastools-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7b94fc74e8c48366c8a3ffc2a8fe86c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 13740, "upload_time": "2019-09-25T16:19:55", "upload_time_iso_8601": "2019-09-25T16:19:55.704850Z", "url": "https://files.pythonhosted.org/packages/dd/bc/6055f248058e02b36371b29d8378982fb1a294cbe30fa56fa3cff4451a83/mastools-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "464170b222195781ef95e8835cb7325e", "sha256": "0b2d593df2f2743b289c39a0019c9962f8a12f91ad9d6b8a28f04bf937e42cee" }, "downloads": -1, "filename": "mastools-0.1.2.tar.gz", "has_sig": false, "md5_digest": "464170b222195781ef95e8835cb7325e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 5222, "upload_time": "2019-09-25T16:19:57", "upload_time_iso_8601": "2019-09-25T16:19:57.265650Z", "url": "https://files.pythonhosted.org/packages/06/14/9104f62ab1e4901854e4b7555e9a60b599039b099ff843f2f5f6d4f65590/mastools-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "16cfdb6ef40703c76e65998fea070e51", "sha256": "58c01aae99f5e710c9cd87841295eb2333e442c41259a182ec94fc94a78d6a77" }, "downloads": -1, "filename": "mastools-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "16cfdb6ef40703c76e65998fea070e51", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 15667, "upload_time": "2019-09-25T22:37:26", "upload_time_iso_8601": "2019-09-25T22:37:26.421767Z", "url": "https://files.pythonhosted.org/packages/b1/05/28ab42ca49e264bf8a3a7d31e90788381a8aaf57e6ec9cf6b992be357a45/mastools-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "39fa90ea66818d582c649bb3b547ad1e", "sha256": "bf7d1e88ebe80c8efe3cfb705478e29f9112eddbf355f39c847b9bd6a5bb235c" }, "downloads": -1, "filename": "mastools-0.1.3.tar.gz", "has_sig": false, "md5_digest": "39fa90ea66818d582c649bb3b547ad1e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 6095, "upload_time": "2019-09-25T22:37:28", "upload_time_iso_8601": "2019-09-25T22:37:28.111858Z", "url": "https://files.pythonhosted.org/packages/6b/fb/b9c81cf7f2a7ef6a9a6a03c96c4d39fa610a6c563f84fbda342c38635ea1/mastools-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c20bd48e05c0ebf922ef80899fa0c882", "sha256": "dc05f1bc8aab57f06dad623e07339cebc0e0b857d8ad21fef7063ac1ebe305e7" }, "downloads": -1, "filename": "mastools-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c20bd48e05c0ebf922ef80899fa0c882", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10617, "upload_time": "2019-10-27T21:37:42", "upload_time_iso_8601": "2019-10-27T21:37:42.012203Z", "url": "https://files.pythonhosted.org/packages/2a/97/a5b5256e138634da3829685cdfe4cf5a7be94e0e53875bd48cd56b552268/mastools-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "82229b4ad6b38b0513725044ad53e900", "sha256": "89a208d0da0c6985c6f697c909bd93fdcd8c099df93e9b3a3347052e0f7ead28" }, "downloads": -1, "filename": "mastools-0.2.0.tar.gz", "has_sig": false, "md5_digest": "82229b4ad6b38b0513725044ad53e900", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 9241, "upload_time": "2019-10-27T21:37:43", "upload_time_iso_8601": "2019-10-27T21:37:43.198781Z", "url": "https://files.pythonhosted.org/packages/48/ca/67403d22ac2ad89066065e36403c6f84b93631b07f7644c59bb7dcc49b54/mastools-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c20bd48e05c0ebf922ef80899fa0c882", "sha256": "dc05f1bc8aab57f06dad623e07339cebc0e0b857d8ad21fef7063ac1ebe305e7" }, "downloads": -1, "filename": "mastools-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c20bd48e05c0ebf922ef80899fa0c882", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6,<4.0", "size": 10617, "upload_time": "2019-10-27T21:37:42", "upload_time_iso_8601": "2019-10-27T21:37:42.012203Z", "url": "https://files.pythonhosted.org/packages/2a/97/a5b5256e138634da3829685cdfe4cf5a7be94e0e53875bd48cd56b552268/mastools-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "82229b4ad6b38b0513725044ad53e900", "sha256": "89a208d0da0c6985c6f697c909bd93fdcd8c099df93e9b3a3347052e0f7ead28" }, "downloads": -1, "filename": "mastools-0.2.0.tar.gz", "has_sig": false, "md5_digest": "82229b4ad6b38b0513725044ad53e900", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6,<4.0", "size": 9241, "upload_time": "2019-10-27T21:37:43", "upload_time_iso_8601": "2019-10-27T21:37:43.198781Z", "url": "https://files.pythonhosted.org/packages/48/ca/67403d22ac2ad89066065e36403c6f84b93631b07f7644c59bb7dcc49b54/mastools-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }