from passrotate.provider import Provider, ProviderOption, PromptType, register_provider from passrotate.forms import get_form import requests from urllib.parse import urlparse class Twitter(Provider): """ [twitter.com] username=Your Twitter username """ name = "Twitter" domains = [ "twitter.com", "m.twitter.com" ] options = { "username": ProviderOption(str, "Your Twitter username") } def __init__(self, options): self.username = options["username"] def prepare(self, old_password): self._session = requests.Session() r = self._session.get("https://mobile.twitter.com/login") tk = self._session.cookies.get("_mb_tk") if not tk or r.status_code != 200: return False r = self._session.post("https://mobile.twitter.com/sessions", data={ "authenticity_token": tk, "session[username_or_email]": self.username, "session[password]": old_password, "remember_me": 0, "wfa": 1, "redirect_after_login": "/home" }) url = urlparse(r.url) if url.path == "/login/error": raise Exception("Current password for Twitter is incorrect") if url.path == "/account/locked": raise Exception("Twitter has locked us out of further login attempts. Wait 60 minutes and try again.") while url.path == "/account/login_verification": data = get_form(r.text) challenge_type = data.get("challenge_type") if challenge_type == "Sms": response = self.prompt("Enter your SMS authorization code", PromptType.sms) else: raise Exception("Unsupported two-factor method '{}'".format(challenge_type)) data.update({ "challenge_response": response }) r = self._session.post( "https://mobile.twitter.com/account/login_verification", data=data) url = urlparse(r.url) r = self._session.get("https://twitter.com") r = self._session.get("https://twitter.com/settings/password") self._form = get_form(r.text, id="password-form") def execute(self, old_password, new_password): self._form.update({ "current_password": old_password, "user_password": new_password, "user_password_confirmation": new_password, }) r = self._session.post("https://twitter.com/settings/passwords/update", data=self._form, headers={ "origin": "https://twitter.com", "referer": "https://twitter.com/settings/password" }) register_provider(Twitter)