Starts the Twitter Bot. Args: text (str): The text to post Returns: None
(self, text: Optional[str] = None)
| 71 | self.wait: WebDriverWait = WebDriverWait(self.browser, 30) |
| 72 | |
| 73 | def post(self, text: Optional[str] = None) -> None: |
| 74 | """ |
| 75 | Starts the Twitter Bot. |
| 76 | |
| 77 | Args: |
| 78 | text (str): The text to post |
| 79 | |
| 80 | Returns: |
| 81 | None |
| 82 | """ |
| 83 | bot: webdriver.Firefox = self.browser |
| 84 | verbose: bool = get_verbose() |
| 85 | |
| 86 | bot.get("https://x.com/compose/post") |
| 87 | |
| 88 | post_content: str = text if text is not None else self.generate_post() |
| 89 | now: datetime = datetime.now() |
| 90 | |
| 91 | print(colored(" => Posting to Twitter:", "blue"), post_content[:30] + "...") |
| 92 | body = post_content |
| 93 | |
| 94 | text_box = None |
| 95 | text_box_selectors = [ |
| 96 | (By.CSS_SELECTOR, "div[data-testid='tweetTextarea_0'][role='textbox']"), |
| 97 | (By.XPATH, "//div[@data-testid='tweetTextarea_0']//div[@role='textbox']"), |
| 98 | (By.XPATH, "//div[@role='textbox']"), |
| 99 | ] |
| 100 | |
| 101 | for selector in text_box_selectors: |
| 102 | try: |
| 103 | text_box = self.wait.until(EC.element_to_be_clickable(selector)) |
| 104 | text_box.click() |
| 105 | text_box.send_keys(body) |
| 106 | break |
| 107 | except Exception: |
| 108 | continue |
| 109 | |
| 110 | if text_box is None: |
| 111 | raise RuntimeError( |
| 112 | "Could not find tweet text box. Ensure you are logged into X in this Firefox profile." |
| 113 | ) |
| 114 | |
| 115 | |
| 116 | post_button = None |
| 117 | post_button_selectors = [ |
| 118 | (By.XPATH, "//button[@data-testid='tweetButtonInline']"), |
| 119 | (By.XPATH, "//button[@data-testid='tweetButton']"), |
| 120 | (By.XPATH, "//span[text()='Post']/ancestor::button"), |
| 121 | ] |
| 122 | |
| 123 | for selector in post_button_selectors: |
| 124 | try: |
| 125 | post_button = self.wait.until(EC.element_to_be_clickable(selector)) |
| 126 | post_button.click() |
| 127 | break |
| 128 | except Exception: |
| 129 | continue |
| 130 |
no test coverage detected