{"id":19846208,"url":"https://github.com/l422y/autopostbot","last_synced_at":"2025-02-28T20:18:21.445Z","repository":{"id":190986901,"uuid":"683197535","full_name":"L422Y/AutoPostBot","owner":"L422Y","description":"AutoPostBot is a highly configurable automated posting bot. It pulls content from various sources (configurable) and sends posts to multiple platforms (also configurable).","archived":false,"fork":false,"pushed_at":"2023-08-28T13:52:01.000Z","size":124,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-01-11T12:36:08.219Z","etag":null,"topics":["bot","openai","twitter","twitter-api"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/L422Y.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2023-08-25T20:43:11.000Z","updated_at":"2025-01-02T11:32:58.000Z","dependencies_parsed_at":"2024-11-12T13:11:02.583Z","dependency_job_id":"7c6453a4-986c-4b07-bb4e-096a7998f2a6","html_url":"https://github.com/L422Y/AutoPostBot","commit_stats":null,"previous_names":["l422y/autopostbot"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L422Y%2FAutoPostBot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L422Y%2FAutoPostBot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L422Y%2FAutoPostBot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/L422Y%2FAutoPostBot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/L422Y","download_url":"https://codeload.github.com/L422Y/AutoPostBot/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241225172,"owners_count":19930107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bot","openai","twitter","twitter-api"],"created_at":"2024-11-12T13:10:52.144Z","updated_at":"2025-02-28T20:18:21.425Z","avatar_url":"https://github.com/L422Y.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e\n\u003ch1 align=\"center\"\u003e\n\u003cbr\u003eAutoPostBot\n\u003c/h1\u003e\n\u003ch3\u003e\u003c/h3\u003eAutomate, Innovate, Postulate!\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Axios-5A29E4.svg?style\u0026logo=Axios\u0026logoColor=white\" alt=\"Axios\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/Electron-47848F.svg?style\u0026logo=Electron\u0026logoColor=white\" alt=\"Electron\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/Puppeteer-40B5A4.svg?style\u0026logo=Puppeteer\u0026logoColor=white\" alt=\"Puppeteer\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/tsnode-3178C6.svg?style\u0026logo=ts-node\u0026logoColor=white\" alt=\"tsnode\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/TypeScript-3178C6.svg?style\u0026logo=TypeScript\u0026logoColor=white\" alt=\"TypeScript\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/Markdown-000000.svg?style\u0026logo=Markdown\u0026logoColor=white\" alt=\"Markdown\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/JSON-000000.svg?style\u0026logo=JSON\u0026logoColor=white\" alt=\"JSON\" /\u003e\n\u003c/p\u003e\n\u003cimg src=\"https://img.shields.io/github/languages/top/l422y/AutoPostBot?style\u0026color=5D6D7E\" alt=\"GitHub top language\" /\u003e\n\u003cimg src=\"https://img.shields.io/github/languages/code-size/l422y/AutoPostBot?style\u0026color=5D6D7E\" alt=\"GitHub code size in bytes\" /\u003e\n\u003cimg src=\"https://img.shields.io/github/commit-activity/m/l422y/AutoPostBot?style\u0026color=5D6D7E\" alt=\"GitHub commit activity\" /\u003e\n\u003cimg src=\"https://img.shields.io/badge/license-CC_BY--NC_4.0-blue\" alt=\"GitHub license\" /\u003e\n\u003c/div\u003e\n\n\n\n## 📍 Overview\n\nAutoPostBot is designed to automate the process of generating and posting content to different social media platforms. It achieves this by providing a framework for integrating generator and destination plugins. Generator plugins handle the generation of content, while destination plugins handle posting to specific platforms. The project's value proposition lies in its ability to streamline the content creation and posting process, saving time and effort for social media managers and individuals looking to automate their content strategy.\n\n---\n\n## ✨ Features\n\n### ⚙️ Architecture\n- Follows a modular architecture with generator and destination plugins.\n- Abstracts the logic for generating and sending posts, allowing for easy extensibility and customization.\n\n### 🔗 Dependencies\n- Relies on external libraries such as OpenAI, Puppeteer, and Twitter API.\n- Adds additional functionality and integration capabilities to the system.\n\n### 🧩 Modularity\n- Adopts a modular approach by implementing generator and destination plugins.\n- Enables flexibility in adding new sources for post generation and destinations for posting.\n- Promotes code reusability through the use of composables.\n\n### 🔌 Integrations\n- Integrates with multiple external systems like OpenAI, Puppeteer (for Twitter automation), and Twitter APIv2.\n- Enhances the system's capabilities, allowing it to interact with various platforms.\n\n### 📶 Scalability\n- Has the potential for scalability due to its modular architecture.\n- Easily accommodates growth and handles increased requirements by adding new generator and destination plugins.\n\n---\n\n## 🧩 Modules\n\n\u003cdetails closed\u003e\u003csummary\u003eRoot\u003c/summary\u003e\n\n| File                                                              | Summary                                                                                                                                                                                             |\n| ---                                                               | ---                                                                                                                                                                                                 |\n| [main.ts](https://github.com/l422y/AutoPostBot/blob/main/main.ts) | The code sets up an AutoPostBot that can be used to automate posting tasks. It listens for app readiness and initializes the bot. It also handles SIGINT and SIGTERM signals for graceful shutdown. |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003eComposables\u003c/summary\u003e\n\n| File                                                                                              | Summary                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n| ---                                                                                               | ---                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |\n| [useOpenAI.ts](https://github.com/l422y/AutoPostBot/blob/main/composables/useOpenAI.ts)           | This code snippet is responsible for generating a social media post using an AI language model from OpenAI. It retrieves an initial prompt from the environment variables and validates the OpenAI API key. It then sends a request to the OpenAI API to generate the content of the post based on the provided input. The generated content is limited to 200 characters, and if it exceeds 280 characters, it is condensed further. The generated post is then returned. There is also a commented-out function for generating images using the OpenAI API. |\n| [useRandomDelay.ts](https://github.com/l422y/AutoPostBot/blob/main/composables/useRandomDelay.ts) | The code snippet defines a function that generates a random delay between a specified minimum and maximum value. The function uses Math.random() to generate a random number within the provided range and returns the value.                                                                                                                                                                                                                                                                                                                                 |\n| [useWikipedia.ts](https://github.com/l422y/AutoPostBot/blob/main/composables/useWikipedia.ts)     | The provided code snippet includes functionalities to fetch a random Wikipedia article based on specified categories. The code selects a random category from the given list, retrieves a list of pages from that category, filters out non-article pages, and randomly selects an article URL. It then fetches the article body by parsing the HTML content of the article page and filtering out unwanted elements and references. The final result includes the article body, URL, category, and title.                                                    |\n| [useMouseHelper.ts](https://github.com/l422y/AutoPostBot/blob/main/composables/useMouseHelper.ts) | This code snippet provides a mouse helper functionality for debugging purposes. It injects a box into the page that moves with the mouse cursor. It exposes functions to get and set the mouse position. It also captures mouse events and updates the position of the box accordingly. The box's appearance changes based on the mouse button pressed.                                                                                                                                                                                                       |\n| [useMoveToClick.ts](https://github.com/l422y/AutoPostBot/blob/main/composables/useMoveToClick.ts) | The code snippet defines a function called useMoveToClick that moves the mouse pointer to a specified element on a web page and clicks on it. It calculates the start and end coordinates for the movement, divides it into multiple small steps, and then performs the movement with a small delay between each step. Finally, it triggers a click event on the element's coordinates. The getRandom function is a helper function that generates a random number within a specified range.                                                                  |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003ePosts\u003c/summary\u003e\n\n| File                                                                                                          | Summary                                                                                                                                                                                                           |\n| ---                                                                                                           | ---                                                                                                                                                                                                               |\n| [example-posts.json.example](https://github.com/l422y/AutoPostBot/blob/main/posts/example-posts.json.example) | The provided code snippet contains a JSON object with key-value pairs representing humorous programming-related quotes. Each key represents the quote number, while the value represents the actual quote itself. |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003eTypes\u003c/summary\u003e\n\n| File                                                                                                | Summary                                                                                                                                                                                                                                                                                                                                     |\n| ---                                                                                                 | ---                                                                                                                                                                                                                                                                                                                                         |\n| [IGeneratorPlugin.ts](https://github.com/l422y/AutoPostBot/blob/main/types/IGeneratorPlugin.ts)     | The code snippet defines an interface \"IGeneratorPlugin\" with properties \"chance\" and \"name\" representing chances of occurrence and name respectively. It also includes methods \"generatePost()\" and \"confirmPostSent()\" which return promises for generating posts and confirming their delivery. The \"log()\" method logs given arguments. |\n| [IDestinationPlugin.ts](https://github.com/l422y/AutoPostBot/blob/main/types/IDestinationPlugin.ts) | The code snippet defines an interface called IDestinationPlugin with a set of core functionalities including initializing the plugin, sending a post, and logging information.                                                                                                                                                              |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003eGenerators\u003c/summary\u003e\n\n| File                                                                                           | Summary                                                                                                                                                                                                                                                                                                                                                                          |\n| ---                                                                                            | ---                                                                                                                                                                                                                                                                                                                                                                              |\n| [RSSFeed.ts](https://github.com/l422y/AutoPostBot/blob/main/plugins/generators/RSSFeed.ts)     | The provided code snippet is an RSSFeed class that extends a BaseGeneratorPlugin class. Its core functionality includes parsing an RSS feed, retrieving and storing post data, generating a random unsent post, confirming sent posts, and refreshing the list of available posts.                                                                                               |\n| [FileBased.ts](https://github.com/l422y/AutoPostBot/blob/main/plugins/generators/FileBased.ts) | The provided code snippet is for a class called \"FileBased\" that extends the \"BaseGeneratorPlugin\" class. It represents a plugin that generates posts based on data stored in files. The code loads posts from a directory, selects a random post that hasn't been sent before, and keeps track of sent posts. The plugin also writes sent posts to a file for future reference. |\n| [Wikipedia.ts](https://github.com/l422y/AutoPostBot/blob/main/plugins/generators/Wikipedia.ts) | The code snippet defines a class called Wikipedia that extends a BaseGeneratorPlugin. It provides a method to generate a random Wikipedia article and then uses another function to generate a post based on the article's content. The generated post is then returned as a string.                                                                                             |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003eDestinations\u003c/summary\u003e\n\n| File                                                                                                           | Summary                                                                                                                                                                                                                                                                                                                                                          |\n| ---                                                                                                            | ---                                                                                                                                                                                                                                                                                                                                                              |\n| [TwitterPuppeteer.ts](https://github.com/l422y/AutoPostBot/blob/main/plugins/destinations/TwitterPuppeteer.ts) | The provided code snippet is implementing the TwitterPuppeteer class, which is a plugin used for automating interactions with the Twitter website using Puppeteer. It includes functionalities such as initializing Puppeteer with specific options, logging in to a Twitter account, deleting singleton files, sending posts, and simulating human-like typing. |\n| [TwitterAPIv2.ts](https://github.com/l422y/AutoPostBot/blob/main/plugins/destinations/TwitterAPIv2.ts)         | The code snippet is a TypeScript class that extends a base destination plugin. It creates a Twitter v2 API client and provides a method to send a post. It uses environment variables for app key, app secret, access token, and access secret.                                                                                                                  |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003eLib\u003c/summary\u003e\n\n| File                                                                                                    | Summary                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n| ---                                                                                                     | ---                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n| [BaseGeneratorPlugin.ts](https://github.com/l422y/AutoPostBot/blob/main/lib/BaseGeneratorPlugin.ts)     | The provided code snippet defines a class called BaseGeneratorPlugin, which implements the IGeneratorPlugin interface. The class has properties like chance and name, and it can be initialized with an optional options object. It also has methods for generating a post, confirming that a post has been sent, and logging messages.                                                                                                         |\n| [AutoPostBot.ts](https://github.com/l422y/AutoPostBot/blob/main/lib/AutoPostBot.ts)                     | This code snippet defines a class called AutoPostBot that automates the process of generating and posting content to different destinations (e.g., social media platforms). It loads generator and destination plugins based on configuration, randomly selects a generator plugin, generates a post using that plugin, sends the post to the configured destinations, and repeats the process at a random time within a specified delay range. |\n| [BaseDestinationPlugin.ts](https://github.com/l422y/AutoPostBot/blob/main/lib/BaseDestinationPlugin.ts) | The code snippet defines a base class for destination plugins. It implements the IDestinationPlugin interface and provides core functionalities such as initialization, sending post content, confirming post sent, and logging.                                                                                                                                                                                                                |\n\n\u003c/details\u003e\n\n\u003cdetails closed\u003e\u003csummary\u003eVariables\u003c/summary\u003e\n\n| File                                                                                          | Summary                                                                                                                                                                                                                              \n| ---                                                                                           |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n| [.env.example](.env.example)                                                                 | The provided code snippet is an example of an environment file. It contains environment variables for enabling generator and destination plugins, setting up the Twitter and OpenAI API keys, configuring the Wikipedia plugin, etc. |\n\n\u003c/details\u003e\n\n---\n\n\n\n## Requirements\n\n- Node.js (I use `ts-node` to run the bot, but you can compile it to JavaScript if you want)\n- pnpm, yarn or npm\n- OpenAI API key if you want to use the Wikipedia plugin\n- Twitter API keys (with read and write access) if you want to use the TwitterAPIv2 plugin\n- If you want to run the bot with puppeteered destinations: Xvfb/Chromium/Electron\n\n\n### Notes for running with puppeteered destinations\n\n#### macOS\n\u003eIf you are using a puppeteer plugin, You will need to install chromium using `brew install chromium` and set the `PUPPETEER_EXEC_PATH` environment variable to the path of the chromium executable, on an M1 Mac this will\nbe:\n`PUPPETEER_EXEC_PATH=\"/opt/homebrew/bin/chromium\"`\n\n#### Linux (headless w/ Xvfb) (tested on Ubuntu Desktop on OrangePi 5+)\n\n\u003eYou will need to install chromium:\n`sudo apt install chromium-browser` and set the `PUPPETEER_EXEC_PATH` environment variable to the path of the chromium executable: `PUPPETEER_EXEC_PATH=\"/usr/bin/chromium-browser\"` \n\u003e\n\u003e You will also need to install Xvfb:\n\u003e\n\u003e```bash\n\u003esudo apt install xvfb\n\u003e``` \n\u003e\n\u003eRun the bot using the following command (this is already done in the `start-electron` script in `package.json`):\n\u003e\n\u003e```bash\n\u003exvfb-run electron -r ts-node/register main.ts\n\u003e```\n\n## 📝 Setup\n\n1. Clone the repository.\n\n   ```bash\n   git clone https://github.com/l422y/AutoPostBot.git\n   ```\n   \n2. Install dependencies:\n\n   ```bash\n   cd AutoPostBot\n   pnpm i\n   ```\n\n3. Copy `.env.example` to `.env` and set up the environment variables\n\n\n### 💾 Environment Variables\n\n\n#### Global Settings\n- `POST_MIN_DELAY_HOURS` and `POST_MAX_DELAY_HOURS`: Time delay in hours between posts.\n- `ENABLED_DESTINATIONS`: Platforms where the posts will be published. For example, `TwitterAPIv2`.\n- `ENABLED_GENERATORS`: Comma-separated list of content generators and their probabilities. For example, `FileBased:0.1,Wikipedia:0.9`.\n\n```env\nPOST_MIN_DELAY_HOURS=0.5\nPOST_MAX_DELAY_HOURS=5\nENABLED_DESTINATIONS=\"TwitterAPIv2\"\nENABLED_GENERATORS=\"FileBased:0.1,Wikipedia:0.9\"\n```\n\n#### RSS Plugin\n- `RSS_FEED_URL`: URL of the RSS feed to use with the content generator.\n\n```env\nRSS_FEED_URL=https://website.com/feed/\n```\n\n#### TwitterPuppeteer Plugin\n- `TWITTER_USERNAME` and `TWITTER_PASSWORD`: Twitter login details.\n- `PUPPETEER_EXEC_PATH`: Path to the Chromium executable. On macOS, it's `/opt/homebrew/bin/chromium`, and on Linux, it's `/usr/bin/chromium-browser`.\n\n```env\nTWITTER_USERNAME=username\nTWITTER_PASSWORD=pw\nPUPPETEER_EXEC_PATH=\"/opt/homebrew/bin/chromium\"\n#PUPPETEER_EXEC_PATH=\"/usr/bin/chromium-browser\" // on linux\n```\n\n#### TwitterAPIv2 Plugin\n- `TWITTER_APP_KEY`, `TWITTER_APP_SECRET`, `TWITTER_ACCESS_TOKEN`, `TWITTER_ACCESS_TOKEN_SECRET`: Twitter API keys and tokens for OAuth. These can be generated by creating a Twitter developer account and creating an app with read and write access.\n\n```env\nTWITTER_APP_KEY=__TWITTER_APP_KEY__\nTWITTER_APP_SECRET=__TWITTER_APP_SECRET__\nTWITTER_ACCESS_TOKEN=__TWITTER_ACCESS_TOKEN__\nTWITTER_ACCESS_TOKEN_SECRET=__TWITTER_ACCESS_TOKEN_SECRET__\n```\n\n#### Wikipedia Plugin with OpenAI\n- `WIKIPEDIA_LANG` and `WIKIPEDIA_CATEGORIES`: Wikipedia language and category preferences.\n- `OPENAI_KEY`: API key for OpenAI.\n- `OPENAI_INITIAL_PROMPT`: Initial prompt for generating posts via OpenAI, along with specific guidelines.\n\n\n```env\nWIKIPEDIA_LANG=en\nWIKIPEDIA_CATEGORIES=\"Technology,Science,Philosophy,Mythology,Mathematics,Music,Computing,Engineering,Communication,Education,Weather,Energy,Materials,Chemistry,Physics,Biology,Earth,Space,Universe\"\nOPENAI_KEY=sk-eoirgheorihgoiwerhgoiehwrgoihwreoghj\nOPENAI_INITIAL_PROMPT=\"Generate a 200 character Post like one of these:\n\n`New electronic waste from discarded gadgets makes up for 70% of all toxic waste. Let's consider recycling and upcycling our tech to create a healthier environment for us all.`\n`In the realm of technology, the first alarm clock could only ring at 4am! Created by Levi Hutchins in 1787, its sole purpose was to wake him for his pre-dawn job. Truly an early bird that transformed the way we start our days.`\n`The first computer mouse was made of wood! Created by Douglas Engelbart in 1964, it was a simple wooden shell with two metal wheels. It was later patented in 1970.`\n\nDo not make it a question, avoid using or featuring gender or politics, do not use phrases like `Did you know`. The simple Post should include a single interesting fact about the following:\"\n\n```\n\n\n## 🚦 Running the Bot\n\nRun the bot using the following command:\n\n```bash\npnpm start\n```\nor, if using a puppeteer plugin:\n```bash\npnpm start-electron\n```\n\n\nIf you make updates to plugins, you will need to rebuild the project:\n\n```bash\npnpm build\n```\nor watch the project for changes:\n```bash\npnpm watch\n```\n\n\n\n\n## 🔌 Generator Plugins\n\nGenerator plugins are used to generate Posts. You can enable/disable generator plugins via the `ENABLED_GENERATORS`\n\n### \\\u003e FileBased\n\nPost from a list of predefined Posts. You can add new Posts by adding a new JSON file to the\n`Posts` directory. The JSON file should contain an object of the following format:\n\n```json\n{\n  \"1\": \"This is a Post.\",\n  \"2\": \"This is another Post.\"\n}\n```\n\nThe keys are used to reference the Posts in the bot's internal database. You can add as many Posts as you like to a\nsingle JSON file, and you can add as many JSON files as you like to the `Posts` directory. The bot will pick a random\nPost from the database and Post it. The bot will not Post the same Post twice, unless you delete\nthe `sent-Posts.txt` file in the root directory.\n\n### \\\u003e Wikipedia\n\nPost a random article from Wikipedia. You can control the language and categories of the articles via the environment.\nOpenAI will be used to generate a Post based on the article's content.\n\n### \\\u003e RSSFeed\n\nPost a random article from an RSS feed. You can control the URL of the RSS feed via the environment.\nPosted posts will be saved in the `sent-posts.txt` file in the root directory, so they will not be Posted again.\n\n## 🔌 Destinations Plugins\n\nDestination plugins are used to Post content to a destination. You can enable/disable destination plugins via the `ENABLED_DESTINATIONS` environment variable.\n\nYou can also control the chance of a destination plugin being used by adding a colon and a number after the plugin name. For example, `TwitterAPIv2:0.5` will enable the `TwitterAPIv2` plugin and give it a 50% chance of being used.\n\n### \\\u003e TwitterAPIv2\n\nPost content to Twitter using the Twitter API v2. You will need to set up a Twitter developer account and create an app to get the required keys.\n\n### \\\u003e TwitterPuppeteer\n\nPost content to Twitter using Puppeteer. This plugin will open a browser window and log in to Twitter using your username and password. It will then Post the content and close the browser window. This plugin is not recommended for use in production, as it is not very reliable and may be detected by Twitter as a bot. Use at your own risk.\n\n## 📝 Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for more information.\n\n## 🤝 Contributing\nContributions are always welcome! Please follow these steps:\n1. Fork the project repository. This creates a copy of the project on your account that you can modify without affecting the original project.\n2. Clone the forked repository to your local machine using a Git client like Git or GitHub Desktop.\n3. Create a new branch with a descriptive name (e.g., `new-feature-branch` or `bugfix-issue-123`).\n```sh\ngit checkout -b new-feature-branch\n```\n4. Make changes to the project's codebase.\n5. Commit your changes to your local branch with a clear commit message that explains the changes you've made.\n```sh\ngit commit -m 'Implemented new feature.'\n```\n6. Push your changes to your forked repository on GitHub using the following command\n```sh\ngit push origin new-feature-branch\n```\n7. Create a new pull request to the original project repository. In the pull request, describe the changes you've made and why they're necessary.\n   The project maintainers will review your changes and provide feedback or merge them into the main branch.\n\n---\n## 📜 License\n\nThis project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License (CC BY-NC 4.0).\n\n- **Attribution**: You must give appropriate credit, provide a link to the license, and indicate if changes were made.\n- **NonCommercial**: You may not use the material for commercial purposes.\n\nFor more details, refer to the [`LICENSE`](./LICENSE) file in this repository, or check the [Creative Commons CC BY-NC 4.0 page](https://creativecommons.org/licenses/by-nc/4.0/).\n\n### Commercial Use\n\nFor commercial licensing options, please contact the author.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fl422y%2Fautopostbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fl422y%2Fautopostbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fl422y%2Fautopostbot/lists"}