tweepy-self 1.10.0b5__py3-none-any.whl → 1.10.0b7__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
@@ -10,7 +10,7 @@ twitter/account.py,sha256=joAB5Zw-Le5E3kOZ-1nb4DPGlTqWYv2Vs6gJ3cwu7is,3175
|
|
10
10
|
twitter/base/__init__.py,sha256=Q2ko0HeOS5tiBnDVKxxaZYetwRR3YXJ67ujL3oThGd4,141
|
11
11
|
twitter/base/client.py,sha256=J_iL4ZGfwTbZ2gpjtFCbBxNgt7weJ55EeMGzYsLtjf4,500
|
12
12
|
twitter/base/session.py,sha256=JFPS-9Qae1iY3NfNcywxvWWmRDijaU_Rjs3WaQ00iFA,2071
|
13
|
-
twitter/client.py,sha256=
|
13
|
+
twitter/client.py,sha256=69QQb-ZnbjqpIhhozxsboruuy3MeJDUGM7nPEH-cBdg,73559
|
14
14
|
twitter/enums.py,sha256=-OH6Ibxarq5qt4E2AhkProVawcEyIf5YG_h_G5xiV9Y,270
|
15
15
|
twitter/errors.py,sha256=oNa0Neos80ZK4-0FBzqgxXonH564qFnoN-kavHalfR4,5274
|
16
16
|
twitter/models.py,sha256=7yObMPUUEwJEbraHzFwmUKd91UhR2-zyfJTm4xIqrSQ,4834
|
@@ -18,6 +18,6 @@ twitter/utils/__init__.py,sha256=usxpfcRQ7zxTTgZ-i425tT7hIz73Pwh9FDj4t6O3dYg,663
|
|
18
18
|
twitter/utils/file.py,sha256=Sz2KEF9DnL04aOP1XabuMYMMF4VR8dJ_KWMEVvQ666Y,1120
|
19
19
|
twitter/utils/html.py,sha256=nrOJw0vUKfBaHgFaQSQIdXfvfZ8mdu84MU_s46kJTJ4,2087
|
20
20
|
twitter/utils/other.py,sha256=9RIYF2AMdmNKIwClG3jBP7zlvxZPEgYfuHaIiOhURzM,1061
|
21
|
-
tweepy_self-1.10.
|
22
|
-
tweepy_self-1.10.
|
23
|
-
tweepy_self-1.10.
|
21
|
+
tweepy_self-1.10.0b7.dist-info/METADATA,sha256=NpC2w-frRkmdX851z52xcAnsXX33NJ49pNuo21TIFUY,13153
|
22
|
+
tweepy_self-1.10.0b7.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
23
|
+
tweepy_self-1.10.0b7.dist-info/RECORD,,
|
twitter/client.py
CHANGED
@@ -190,7 +190,6 @@ class Client(BaseHTTPClient):
|
|
190
190
|
raise Locked(exc, self.account)
|
191
191
|
raise exc
|
192
192
|
|
193
|
-
self.account.status = AccountStatus.GOOD
|
194
193
|
return response, data
|
195
194
|
|
196
195
|
if response.status_code == 400:
|
@@ -296,6 +295,7 @@ class Client(BaseHTTPClient):
|
|
296
295
|
async def on_startup(self):
|
297
296
|
if self._update_account_info_on_startup:
|
298
297
|
await self.update_account_info()
|
298
|
+
await self.establish_status()
|
299
299
|
|
300
300
|
async def _request_oauth2_auth_code(
|
301
301
|
self,
|
@@ -1183,6 +1183,7 @@ class Client(BaseHTTPClient):
|
|
1183
1183
|
url = "https://twitter.com/i/api/1.1/account/update_profile.json"
|
1184
1184
|
try:
|
1185
1185
|
await self.request("POST", url, auto_unlock=False, auto_relogin=False)
|
1186
|
+
self.account.status = AccountStatus.GOOD
|
1186
1187
|
except BadAccount:
|
1187
1188
|
pass
|
1188
1189
|
|
@@ -1421,6 +1422,11 @@ class Client(BaseHTTPClient):
|
|
1421
1422
|
|
1422
1423
|
await self.establish_status()
|
1423
1424
|
|
1425
|
+
async def update_backup_code(self):
|
1426
|
+
url = "https://api.twitter.com/1.1/account/backup_code.json"
|
1427
|
+
response, response_json = await self.request("GET", url)
|
1428
|
+
self.account.backup_code = response_json["codes"][0]
|
1429
|
+
|
1424
1430
|
async def _task(self, **kwargs):
|
1425
1431
|
"""
|
1426
1432
|
:return: flow_token, subtasks
|
@@ -1516,8 +1522,8 @@ class Client(BaseHTTPClient):
|
|
1516
1522
|
"key": "user_identifier",
|
1517
1523
|
"response_data": {
|
1518
1524
|
"text_data": {
|
1519
|
-
"result": self.account.
|
1520
|
-
or self.account.
|
1525
|
+
"result": self.account.username
|
1526
|
+
or self.account.email
|
1521
1527
|
}
|
1522
1528
|
},
|
1523
1529
|
}
|
@@ -1549,18 +1555,27 @@ class Client(BaseHTTPClient):
|
|
1549
1555
|
]
|
1550
1556
|
return await self._send_task(flow_token, subtask_inputs, auth=False)
|
1551
1557
|
|
1552
|
-
async def _login_two_factor_auth_challenge(self, flow_token):
|
1553
|
-
if not self.account.totp_secret:
|
1554
|
-
raise TwitterException(
|
1555
|
-
f"Failed to login. Task id: LoginTwoFactorAuthChallenge"
|
1556
|
-
)
|
1557
|
-
|
1558
|
+
async def _login_two_factor_auth_challenge(self, flow_token, value: str):
|
1558
1559
|
subtask_inputs = [
|
1559
1560
|
{
|
1560
1561
|
"subtask_id": "LoginTwoFactorAuthChallenge",
|
1561
1562
|
"enter_text": {
|
1562
|
-
"text":
|
1563
|
+
"text": value,
|
1564
|
+
"link": "next_link",
|
1565
|
+
},
|
1566
|
+
}
|
1567
|
+
]
|
1568
|
+
return await self._send_task(flow_token, subtask_inputs, auth=False)
|
1569
|
+
|
1570
|
+
async def _login_two_factor_auth_choose_method(
|
1571
|
+
self, flow_token: str, choices: Iterable[int] = (0,)
|
1572
|
+
):
|
1573
|
+
subtask_inputs = [
|
1574
|
+
{
|
1575
|
+
"subtask_id": "LoginTwoFactorAuthChooseMethod",
|
1576
|
+
"choice_selection": {
|
1563
1577
|
"link": "next_link",
|
1578
|
+
"selected_choices": [str(choice) for choice in choices],
|
1564
1579
|
},
|
1565
1580
|
}
|
1566
1581
|
]
|
@@ -1600,7 +1615,9 @@ class Client(BaseHTTPClient):
|
|
1600
1615
|
guest_token = re.search(r"gt\s?=\s?\d+", response.text)[0].split("=")[1]
|
1601
1616
|
return guest_token
|
1602
1617
|
|
1603
|
-
async def _login(self):
|
1618
|
+
async def _login(self) -> bool:
|
1619
|
+
update_backup_code = False
|
1620
|
+
|
1604
1621
|
guest_token = await self._request_guest_token()
|
1605
1622
|
self._session.headers["X-Guest-Token"] = guest_token
|
1606
1623
|
|
@@ -1610,6 +1627,13 @@ class Client(BaseHTTPClient):
|
|
1610
1627
|
flow_token, subtasks = await self._request_login_tasks()
|
1611
1628
|
for _ in range(2):
|
1612
1629
|
flow_token, subtasks = await self._login_enter_user_identifier(flow_token)
|
1630
|
+
|
1631
|
+
subtask_ids = [subtask["subtask_id"] for subtask in subtasks]
|
1632
|
+
|
1633
|
+
if "LoginEnterAlternateIdentifierSubtask" in subtask_ids:
|
1634
|
+
if not self.account.username:
|
1635
|
+
raise TwitterException("Failed to login: no username to relogin")
|
1636
|
+
|
1613
1637
|
flow_token, subtasks = await self._login_enter_password(flow_token)
|
1614
1638
|
flow_token, subtasks = await self._account_duplication_check(flow_token)
|
1615
1639
|
|
@@ -1620,21 +1644,75 @@ class Client(BaseHTTPClient):
|
|
1620
1644
|
raise TwitterException(f"Failed to login: email verification!")
|
1621
1645
|
|
1622
1646
|
if "LoginTwoFactorAuthChallenge" in subtask_ids:
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1647
|
+
if not self.account.totp_secret:
|
1648
|
+
raise TwitterException(
|
1649
|
+
f"Failed to login. Task id: LoginTwoFactorAuthChallenge. No totp_secret!"
|
1650
|
+
)
|
1651
|
+
|
1652
|
+
try:
|
1653
|
+
# fmt: off
|
1654
|
+
flow_token, subtasks = await self._login_two_factor_auth_challenge(flow_token, self.account.get_totp_code())
|
1655
|
+
# fmt: on
|
1656
|
+
except HTTPException as exc:
|
1657
|
+
if 399 in exc.api_codes:
|
1658
|
+
logger.warning(
|
1659
|
+
f"(auth_token={self.account.hidden_auth_token}, id={self.account.id}, username={self.account.username})"
|
1660
|
+
f" Bad TOTP secret!"
|
1661
|
+
)
|
1662
|
+
if not self.account.backup_code:
|
1663
|
+
raise TwitterException(
|
1664
|
+
f"Failed to login. Task id: LoginTwoFactorAuthChallenge. No backup code!"
|
1665
|
+
)
|
1666
|
+
|
1667
|
+
# Enter backup code
|
1668
|
+
# fmt: off
|
1669
|
+
flow_token, subtasks = await self._login_two_factor_auth_choose_method(flow_token)
|
1670
|
+
try:
|
1671
|
+
flow_token, subtasks = await self._login_two_factor_auth_challenge(flow_token, self.account.backup_code)
|
1672
|
+
except HTTPException as exc:
|
1673
|
+
if 399 in exc.api_codes:
|
1674
|
+
logger.warning(
|
1675
|
+
f"(auth_token={self.account.hidden_auth_token}, id={self.account.id}, username={self.account.username})"
|
1676
|
+
f" Bad backup code!"
|
1677
|
+
)
|
1678
|
+
raise TwitterException(
|
1679
|
+
f"Failed to login. Task id: LoginTwoFactorAuthChallenge. Bad backup_code!"
|
1680
|
+
)
|
1681
|
+
else:
|
1682
|
+
raise
|
1683
|
+
|
1684
|
+
update_backup_code = True
|
1685
|
+
# fmt: on
|
1686
|
+
else:
|
1687
|
+
raise
|
1626
1688
|
|
1627
1689
|
await self._finish_task(flow_token)
|
1690
|
+
return update_backup_code
|
1628
1691
|
|
1629
1692
|
async def relogin(self):
|
1693
|
+
"""
|
1694
|
+
Может вызвать следующую ошибку:
|
1695
|
+
twitter.errors.BadRequest: (response status: 400)
|
1696
|
+
(code 398) Can't complete your signup right now.
|
1697
|
+
Причина возникновения ошибки неизвестна. Не забудьте обработать ее.
|
1698
|
+
"""
|
1630
1699
|
if not self.account.email and not self.account.username:
|
1631
1700
|
raise ValueError("No email or username")
|
1632
1701
|
|
1633
1702
|
if not self.account.password:
|
1634
1703
|
raise ValueError("No password")
|
1635
1704
|
|
1636
|
-
await self._login()
|
1705
|
+
update_backup_code = await self._login()
|
1637
1706
|
await self._viewer()
|
1707
|
+
|
1708
|
+
if update_backup_code:
|
1709
|
+
await self.update_backup_code()
|
1710
|
+
logger.warning(
|
1711
|
+
f"(auth_token={self.account.hidden_auth_token}, id={self.account.id}, username={self.account.username})"
|
1712
|
+
f" Requested new backup code!"
|
1713
|
+
)
|
1714
|
+
# TODO Также обновлять totp_secret
|
1715
|
+
|
1638
1716
|
await self.establish_status()
|
1639
1717
|
|
1640
1718
|
async def login(self):
|
File without changes
|