diff --git a/TwitterFrontendFlow/TwitterFrontendFlow.py b/TwitterFrontendFlow/TwitterFrontendFlow.py index 4182024..f3998ee 100644 --- a/TwitterFrontendFlow/TwitterFrontendFlow.py +++ b/TwitterFrontendFlow/TwitterFrontendFlow.py @@ -63,9 +63,9 @@ def __flow_token_check(self): if self.flow_token == None: raise Exception("not found token") - def __error_check(self): - if self.content.get("errors"): - raise Exception(self.content["errors"][0]["message"]) + def __error_check(self, content): + if content.get("errors"): + raise Exception(content["errors"][0]["message"]) def __method_check(self, method_name): if self.method_check_bypass: @@ -135,9 +135,9 @@ def login_flow(self): params=params, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def LoginJsInstrumentationSubtask(self): @@ -171,9 +171,9 @@ def LoginJsInstrumentationSubtask(self): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def LoginEnterUserIdentifierSSO(self, user_id): @@ -202,9 +202,9 @@ def LoginEnterUserIdentifierSSO(self, user_id): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def AccountDuplicationCheck(self): @@ -227,9 +227,9 @@ def AccountDuplicationCheck(self): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def LoginEnterAlternateIdentifierSubtask(self, text): @@ -250,9 +250,9 @@ def LoginEnterAlternateIdentifierSubtask(self, text): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def LoginEnterPassword(self, password): @@ -273,9 +273,9 @@ def LoginEnterPassword(self, password): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def LoginTwoFactorAuthChallenge(self, TwoFactorCode): @@ -296,9 +296,32 @@ def LoginTwoFactorAuthChallenge(self, TwoFactorCode): json=data, proxies=self.proxies, ).json() + self.__error_check(response) + self.flow_token = response.get("flow_token") + self.content = response + return self + + def LoginAcid(self, acid): + self.__flow_token_check() + self.__method_check("LoginAcid") + data = { + "flow_token": self.flow_token, + "subtask_inputs": [ + { + "subtask_id": "LoginAcid", + "enter_text": {"text": acid, "link": "next_link"}, + } + ], + } + response = self.session.post( + "https://twitter.com/i/api/1.1/onboarding/task.json", + headers=self.__get_headers(), + json=data, + proxies=self.proxies, + ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def LoginAcid(self, acid): @@ -339,8 +362,8 @@ def get_att(self): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.content = response - self.__error_check() return self # ct0の更新 無くても動くっぽい @@ -360,9 +383,8 @@ def Viewer(self): headers=self.__get_headers(), params=params, ) - + self.__error_check(response) self.content = response - self.__error_check() return self def RedirectToPasswordReset(self): @@ -396,9 +418,9 @@ def password_reset_flow(self): params=params, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PwrJsInstrumentationSubtask(self): @@ -432,9 +454,9 @@ def PwrJsInstrumentationSubtask(self): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PasswordResetBegin(self, user_id): @@ -455,9 +477,9 @@ def PasswordResetBegin(self, user_id): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PasswordResetChooseChallenge(self, choices="0"): @@ -481,9 +503,9 @@ def PasswordResetChooseChallenge(self, choices="0"): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PwrKnowledgeChallenge(self, text): @@ -504,9 +526,9 @@ def PwrKnowledgeChallenge(self, text): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PasswordResetConfirmChallenge(self, code): @@ -527,9 +549,9 @@ def PasswordResetConfirmChallenge(self, code): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PasswordResetNewPassword(self, password): @@ -550,9 +572,9 @@ def PasswordResetNewPassword(self, password): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self def PasswordResetSurvey(self, choices="0"): @@ -576,9 +598,9 @@ def PasswordResetSurvey(self, choices="0"): json=data, proxies=self.proxies, ).json() + self.__error_check(response) self.flow_token = response.get("flow_token") self.content = response - self.__error_check() return self # ログイン後 @@ -606,8 +628,8 @@ def CreateTweet(self, tweet_text): headers=self.__get_headers(), json=data, ).json() + self.__error_check(response) self.content = response - self.__error_check() return self def FavoriteTweet(self, tweet_id): @@ -624,8 +646,8 @@ def FavoriteTweet(self, tweet_id): headers=self.__get_headers(), json=data, ).json() + self.__error_check(response) self.content = response - self.__error_check() return self def UnfavoriteTweet(self, tweet_id): @@ -642,8 +664,8 @@ def UnfavoriteTweet(self, tweet_id): headers=self.__get_headers(), json=data, ).json() + self.__error_check(response) self.content = response - self.__error_check() return self def CreateRetweet(self, tweet_id): @@ -661,8 +683,8 @@ def CreateRetweet(self, tweet_id): headers=self.__get_headers(), json=data, ).json() + self.__error_check(response) self.content = response - self.__error_check() return self def DeleteRetweet(self, tweet_id): @@ -680,11 +702,10 @@ def DeleteRetweet(self, tweet_id): headers=self.__get_headers(), json=data, ).json() + self.__error_check(response) self.content = response - self.__error_check() return self - # Legacy API v1.1 def friendships_create(self, tweet_id): diff --git a/sample2.py b/sample2.py new file mode 100644 index 0000000..9c653ea --- /dev/null +++ b/sample2.py @@ -0,0 +1,40 @@ +from TwitterFrontendFlow.TwitterFrontendFlow import TwitterFrontendFlow + +flow = TwitterFrontendFlow() + +flow.login_flow() +flow.LoginJsInstrumentationSubtask() + +while "LoginSuccessSubtask" not in flow.get_subtask_ids(): + try: + if "LoginEnterUserIdentifierSSO" in flow.get_subtask_ids(): + print("Telephone number / Email address / User name") + flow.LoginEnterUserIdentifierSSO(input()) + elif "LoginEnterAlternateIdentifierSubtask" in flow.get_subtask_ids(): + print(flow.content["subtasks"][0]["enter_text"]["primary_text"]["text"]) + flow.LoginEnterAlternateIdentifierSubtask(input()) + elif "LoginEnterPassword" in flow.get_subtask_ids(): + print(flow.content["subtasks"][0]["enter_password"]["primary_text"]["text"]) + flow.LoginEnterPassword(input()) + elif "AccountDuplicationCheck" in flow.get_subtask_ids(): + print("AccountDuplicationCheck") + flow.AccountDuplicationCheck() + elif "LoginTwoFactorAuthChallenge" in flow.get_subtask_ids(): + header = flow.content["subtasks"][0]["enter_text"]["header"] + print(header["primary_text"]["text"]) + flow.LoginTwoFactorAuthChallenge(input()) + elif "LoginAcid" in flow.get_subtask_ids(): + header = flow.content["subtasks"][0]["enter_text"]["header"] + print(header["secondary_text"]["text"]) + flow.LoginAcid(input()) + elif "SuccessExit" in flow.get_subtask_ids(): + break + else: + print("Non-supported login methods: " + flow.get_subtask_ids()) + exit(1) + + except: + print("Error") + +print("Success") +flow.SaveCookies("cookie.json")