{"id":50614342,"url":"https://github.com/pcazzaniga/parrot","last_synced_at":"2026-06-06T07:01:32.396Z","repository":{"id":362291015,"uuid":"1255819123","full_name":"PCazzaniga/PARROT","owner":"PCazzaniga","description":"Twitch chatbot that modifies and repeats messages","archived":false,"fork":false,"pushed_at":"2026-06-03T13:48:04.000Z","size":51,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-03T14:15:47.267Z","etag":null,"topics":["chatbot","entertainment","python","streaming","twitch","twitch-bot","twitch-chat","twitch-chatbot","word-replacer"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PCazzaniga.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T07:44:26.000Z","updated_at":"2026-06-01T08:09:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/PCazzaniga/PARROT","commit_stats":null,"previous_names":["pcazzaniga/parrot"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/PCazzaniga/PARROT","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PCazzaniga%2FPARROT","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PCazzaniga%2FPARROT/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PCazzaniga%2FPARROT/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PCazzaniga%2FPARROT/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PCazzaniga","download_url":"https://codeload.github.com/PCazzaniga/PARROT/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PCazzaniga%2FPARROT/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33972398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chatbot","entertainment","python","streaming","twitch","twitch-bot","twitch-chat","twitch-chatbot","word-replacer"],"created_at":"2026-06-06T07:01:29.985Z","updated_at":"2026-06-06T07:01:32.389Z","avatar_url":"https://github.com/PCazzaniga.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PARROT\r\n**P**hrase **A**ltering \u0026 **R**epeating **R**obot **O**n **T**witch\r\n\r\n## About\r\nPARROT is a Twitch chatbot that can randomly repeat messages while smartly replacing grammatical subjects and objects for humour and entertainment, inspired by the late [buttsbot](http://www.twitch.tv/buttsbot).\r\n\r\n## Installation\r\n\r\n### Requirements\r\n- Python 3.10 or higher.\r\n- A Twitch account for the chatbot.\r\n- A Twitch application registered at [dev.twitch.tv](https://dev.twitch.tv).\r\n- **Consent from the owner of the channel the chatbot will operate in.**\r\n\r\n### 1. Clone the repository\r\n```bash\r\n\u003e git clone https://github.com/PCazzaniga/PARROT.git\r\n\u003e cd repo\r\n```\r\nAlternatively, manually download the files from this repository.\r\n\r\n### 2. Install dependencies\r\n```bash\r\n\u003e pip install -r requirements.txt\r\n\u003e python -m spacy download en_core_web_sm\r\n```\r\nAlternatively, run `setup.bat` (Windows) or `setup.sh` (Mac/Linux).\r\n\r\n### 3. Configure the chatbot\r\nChange the following values in `parrot_bot\\PRIVATE_config.json`:  \r\n - BOT_ACCOUNT_ID: numeric User ID of the chatbot's Twitch account (you can get it using online tools like [this](https://streamcharts.com/tools/convert-username)).  \r\n - APP_CLIENT_ID: alphanumeric Client ID of the registered Twitch application.  \r\n - APP_CLIENT_SECRET: alphanumeric Client Secret of the registered Twitch application.\r\n - CHANNEL_ACCOUNT_ID: numeric User ID of the Twitch channel the chatbot will operate in.\r\n\r\n(Please note that `PRIVATE_config.json` will contain sensitive information of your application and should never be disclosed !)\r\n\r\nOptionally, you can also manually change the default values in `parrot_bot\\bot_settings.json` but that can be done later directly using the application.\r\n\r\n### 4. Run the chatbot\r\n```bash\r\n\u003e python -m parrot_bot\r\n```\r\nAlternatively, run `launch.bat` (Windows) or `launch.sh` (Mac/Linux).\r\n\r\n### 5. Authorize the chatbot\r\nOn the very first run, the application will need to get a token from Twitch and will print a URL in the console.  \r\nOpen it in a browser while logged in as the chatbot account and complete the authorization.  \r\nThe token will then be saved automatically to the configuration file.\r\n\r\n## Usage\r\n\r\nOnce the chatbot is running it will listen to the stream chat and occasionally select a message to modify and repeat.  \r\nFor example, an user may send:\r\n```\r\nI love this videogame !!!\r\n```\r\nand the chatbot might then repeat:\r\n```\r\nI love this stream !!!\r\n```\r\n---\r\nFrom the chat itself the channel owner, its moderators and selected users can customize the chatbot's behaviour by @ing the chatbot and sending one of the following commands:  \r\n - **!commands**, to see the list of available commands.  \r\n - **!help**, to see the meaning and syntax of a specific command.  \r\n - !advanced, to select the behaviour when the keyword and the original sentence don't match plurality (for example, if the the keyword is \"banana**s**\" the message \"I want an apple\" will become \"I want a banana\" or \"I want some bananas\" depending on the selected mode).  \r\n - !ignore and !unignore, to make or not a user untargetable by the chatbot. By default the chatbot ignores only messages from itself and those that begin with a command (even for other chatbots) or contain any @mention.  \r\n - !intensity, to set how much the chatbot can alter the messages it selects.  \r\n - !interval, to set the minimum number of messages the chatbot has to wait between activations.  \r\n - **!keyword**, to set the word used to alter messages.  \r\n - !length, to set the chatbot to ignore messages above a certain number of characters.  \r\n - !notarget, to prevent or not the chatbot from modifying consecutive messages from the same user.  \r\n - !timer, to set the minimum cooldown the chatbot has to wait between activations.  \r\n - !try, to test the chatbot with a provided message.  \r\n - !turnoff, to remotely shutdown the chatbot.  \r\n - !vip and !unvip to allow or not a user to use these commands even if they're not a moderator.  \r\n\r\n All of these settings are automatically saved in `bot_settings.json` to persist when the chatbot goes offline.  \r\n\r\n ---\r\n Additionally, there are some settings that can only be customized by manually modifying `bot_settings.json`, namely special hardcoded, case-sensitive, replacements that will always be performed if found in a selected message:\r\n - RECURSIVE to set the replacement text for when the current keyword itself is found in a sentence.\r\n - PATTERNS to set any \"original\" - \"replacement\" pairs of text.  \r\n \r\n In the replacement texts the notation `\u003cWORD\u003e` can be used as a placeholder for whatever the keyword will be when that special replacement is used (for example, \"my \\\u003cWORD\u003e\" will be automatically output as \"my banana\" if the current keyword is \"banana\" and \"my apple\" if it's \"apple\").\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcazzaniga%2Fparrot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpcazzaniga%2Fparrot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcazzaniga%2Fparrot/lists"}