-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinsta_unfollow.py
102 lines (84 loc) · 4.45 KB
/
insta_unfollow.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from InstagramAPI import InstagramAPI
class InstagramUnfollowers:
def __init__(self, username: str, password: str):
self.username = username
self.password = password
self.api = InstagramAPI(username, password)
self.api.login()
self.user_id = self.api.username_id # свой user_id
self.followers = self.get_total_followers(self.api, self.user_id)
self.followings = self.get_total_followings(self.api, self.user_id)
non_follow = self.non_followers(self.followers, self.followings)
# число не подписаных взаимно
self.total_non_followed = len(non_follow)
print(self.results())
if self.total_non_followed == 0:
print("Вы отписались от всех")
exit()
else:
for i in range(self.total_non_followed):
if i >= self.total_non_followed:
break
# Удаляет последнего юзера по никнейму
user = list(non_follow.keys())[len(non_follow) - 1]
# Отписывается и удаляет юзера pop() методом
self.api.unfollow(non_follow[user])
non_follow.pop(user)
print("Вы отписались от всех")
def results(self) -> str:
results = [
f"Колличество подписчиков: {len(self.followers)}",
f"Колличество подписок: {len(self.followings)}",
f"Колличество неподписаных: {self.total_non_followed}",
]
return "\n".join(results)
def get_total_followers(self, api, user_id) -> list:
# Список кто подписан
followers = list()
next_max_id = True
while next_max_id:
if next_max_id is True:
next_max_id = ""
# Получаем список подписчиков. Сохраняется в новом запросе
_ = self.api.getUserFollowers(self.user_id, maxid=next_max_id)
"""
1) followers.extend() - Разширяет список добавляя в конец все елементы
2) LastJson - загружает текст полученой страницы в питоновский словарь
3) Метод get() возвращает значение по указанному ключу
Если его нет, вернется пустой список
*функция loads() - превращает данные JSON в объекты Python
"""
followers.extend(self.api.LastJson.get("users", []))
next_max_id = self.api.LastJson.get("next_max_id", "")
# Возвращает список подписчиков
return followers
def get_total_followings(self, api, user_id) -> list:
# Список на кого подписан(а)
# Те самые операции что и с подписчиками
followings = list()
next_max_id = True
while next_max_id:
if next_max_id is True:
next_max_id = ""
_ = self.api.getUserFollowings(self.user_id, maxid=next_max_id)
followings.extend(self.api.LastJson.get("users", []))
next_max_id = self.api.LastJson.get("next_max_id", "")
return followings
def non_followers(self, followers: list, followings: list) -> dict:
non_followers = dict()
dict_followers = dict()
for follower in followers:
# username: pk (user id в базе данных инстаграмма)
# 'glebglebovskii': 8118073631
dict_followers[follower["username"]] = follower["pk"]
for followed_user in followings:
# Если юзер(из тех на кого подписан) не подписан на тебя
# Добавляется в словарь non_followers
if followed_user["username"] not in dict_followers:
non_followers[followed_user["username"]] = followed_user["pk"]
return non_followers
if __name__ == "__main__":
print("------- Введите ваши данные --------")
USERNAME = input("Введите ваш логин: ")
PASSWORD = input("Введите ваш пароль: ")
InstagramUnfollowers(USERNAME, PASSWORD)