From a5338c91d1cc0ec61f3f79eff39d79319329f976 Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 12:26:41 +0300 Subject: [PATCH 01/10] lab-5 is over --- .idea/.gitignore | 3 + .idea/Waycoolers.iml | 12 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 4 + .idea/modules.xml | 8 ++ .idea/vcs.xml | 6 ++ homework05/research/age.py | 23 +++++- homework05/research/network.py | 18 +++-- homework05/vkapi/__init__.py | 4 +- homework05/vkapi/config.py | 2 +- homework05/vkapi/friends.py | 53 ++++++++++--- homework05/vkapi/session.py | 36 ++++++--- homework05/vkapi/wall.py | 78 ++++++++++++++----- 13 files changed, 200 insertions(+), 53 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/Waycoolers.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/Waycoolers.iml b/.idea/Waycoolers.iml new file mode 100644 index 0000000..4c883db --- /dev/null +++ b/.idea/Waycoolers.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1260ee9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..67df6a8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/homework05/research/age.py b/homework05/research/age.py index 492ae28..fa66e7d 100644 --- a/homework05/research/age.py +++ b/homework05/research/age.py @@ -2,7 +2,7 @@ import statistics import typing as tp -from vkapi.friends import get_friends +from homework05.vkapi.friends import get_friends def age_predict(user_id: int) -> tp.Optional[float]: @@ -14,4 +14,23 @@ def age_predict(user_id: int) -> tp.Optional[float]: :param user_id: Идентификатор пользователя. :return: Медианный возраст пользователя. """ - pass + list_friends = get_friends(user_id=user_id, fields=["bdate"]) + ret = [] + year = dt.datetime.now().year + month = dt.datetime.now().month + day = dt.datetime.now().day + for i in list_friends.items: + if "bdate" in i: + date = list(map(int, i["bdate"].split("."))) + if len(date) != 3: + continue + age = ( + -date[2] + + year + - (1 if (date[1] < month or (date[1] == month and day < date[0])) else 0) + ) + ret.append(age) + if not len(ret): + return None + + return statistics.median(ret) diff --git a/homework05/research/network.py b/homework05/research/network.py index 6b6db7c..98f498e 100644 --- a/homework05/research/network.py +++ b/homework05/research/network.py @@ -6,11 +6,11 @@ import networkx as nx import pandas as pd -from vkapi.friends import get_friends, get_mutual +from homework05.vkapi.friends import get_friends, get_mutual def ego_network( - user_id: tp.Optional[int] = None, friends: tp.Optional[tp.List[int]] = None + user_id: tp.Optional[int] = None, friends: tp.Optional[tp.List[int]] = None ) -> tp.List[tp.Tuple[int, int]]: """ Построить эгоцентричный граф друзей. @@ -18,7 +18,13 @@ def ego_network( :param user_id: Идентификатор пользователя, для которого строится граф друзей. :param friends: Идентификаторы друзей, между которыми устанавливаются связи. """ - pass + ret = [] + mutual_friends = get_mutual(source_uid=user_id, target_uids=friends) + for person in mutual_friends: + if person is not None: + for i in person["common_friends"]: + ret.append((person["id"], i)) + return ret def plot_ego_network(net: tp.List[tp.Tuple[int, int]]) -> None: @@ -51,9 +57,9 @@ def get_communities(net: tp.List[tp.Tuple[int, int]]) -> tp.Dict[int, tp.List[in def describe_communities( - clusters: tp.Dict[int, tp.List[int]], - friends: tp.List[tp.Dict[str, tp.Any]], - fields: tp.Optional[tp.List[str]] = None, + clusters: tp.Dict[int, tp.List[int]], + friends: tp.List[tp.Dict[str, tp.Any]], + fields: tp.Optional[tp.List[str]] = None, ) -> pd.DataFrame: if fields is None: fields = ["first_name", "last_name"] diff --git a/homework05/vkapi/__init__.py b/homework05/vkapi/__init__.py index c353552..31354a8 100644 --- a/homework05/vkapi/__init__.py +++ b/homework05/vkapi/__init__.py @@ -1,4 +1,4 @@ -from vkapi import config -from vkapi.session import Session +from homework05.vkapi import config +from homework05.vkapi.session import Session session = Session(config.VK_CONFIG["domain"]) diff --git a/homework05/vkapi/config.py b/homework05/vkapi/config.py index 8459497..313c62a 100644 --- a/homework05/vkapi/config.py +++ b/homework05/vkapi/config.py @@ -2,6 +2,6 @@ VK_CONFIG = { "domain": "https://api.vk.com/method", - "access_token": "", + "access_token": "https://oauth.vk.com/blank.html#access_token=vk1.a.MQmRX7cHcqF_La-YErIO8ZhRfpsltLJS2bOj0TYaYgULRj6a79mRo685eQUe0hTZNrnZYuufUHvCqsg09jTvbXSYddaWawXpf5RjtFi0GU7lPCTmfOeqlo4xuqZfb-w-hX4zOfulVhDzOqB4ttzSNBY1aM5FPSdA-AT-EY3_7ykzjhPIfUtZYAQ5VcnysL5q&expires_in=86400&user_id=203091488", "version": "5.126", } diff --git a/homework05/vkapi/friends.py b/homework05/vkapi/friends.py index dad6a5c..fc1d63b 100644 --- a/homework05/vkapi/friends.py +++ b/homework05/vkapi/friends.py @@ -3,8 +3,8 @@ import time import typing as tp -from vkapi import config, session -from vkapi.exceptions import APIError +from homework05.vkapi import config, session +from homework05.vkapi.exceptions import APIError QueryParams = tp.Optional[tp.Dict[str, tp.Union[str, int]]] @@ -16,7 +16,7 @@ class FriendsResponse: def get_friends( - user_id: int, count: int = 5000, offset: int = 0, fields: tp.Optional[tp.List[str]] = None + user_id: int, count: int = 5000, offset: int = 0, fields: tp.Optional[tp.List[str]] = None ) -> FriendsResponse: """ Получить список идентификаторов друзей пользователя или расширенную информацию @@ -28,7 +28,16 @@ def get_friends( :param fields: Список полей, которые нужно получить для каждого пользователя. :return: Список идентификаторов друзей пользователя или список пользователей. """ - pass + list_of_friends = session.get( + "friends.get", + user_id=user_id, + count=count, + offset=offset, + fields=fields, + version=config.VK_CONFIG["version"], + access_token=config.VK_CONFIG, + ).json()["response"] + return FriendsResponse(count=list_of_friends["count"], items=list_of_friends["items"]) class MutualFriends(tp.TypedDict): @@ -38,13 +47,13 @@ class MutualFriends(tp.TypedDict): def get_mutual( - source_uid: tp.Optional[int] = None, - target_uid: tp.Optional[int] = None, - target_uids: tp.Optional[tp.List[int]] = None, - order: str = "", - count: tp.Optional[int] = None, - offset: int = 0, - progress=None, + source_uid: tp.Optional[int] = None, + target_uid: tp.Optional[int] = None, + target_uids: tp.Optional[tp.List[int]] = None, + order: str = "", + count: tp.Optional[int] = None, + offset: int = 0, + progress=None, ) -> tp.Union[tp.List[int], tp.List[MutualFriends]]: """ Получить список идентификаторов общих друзей между парой пользователей. @@ -57,4 +66,24 @@ def get_mutual( :param offset: Смещение, необходимое для выборки определенного подмножества общих друзей. :param progress: Callback для отображения прогресса. """ - pass + ret = [] + ln = 1 + if target_uids is not None: + ln = (int(len(target_uids)) + 99) // 100 + + for i in range(0, ln): + ret += session.get( + "friends.getMutual", + source_uid=source_uid, + target_uid=target_uid, + target_uids=target_uids, + order=order, + count=count, + offset=i * 100, + version=config.VK_CONFIG["version"], + access_token=config.VK_CONFIG["access_token"], + ).json()["response"] + if i % 3 == 2: + time.sleep(1) + + return ret diff --git a/homework05/vkapi/session.py b/homework05/vkapi/session.py index 0643389..9a79849 100644 --- a/homework05/vkapi/session.py +++ b/homework05/vkapi/session.py @@ -16,16 +16,32 @@ class Session: """ def __init__( - self, - base_url: str, - timeout: float = 5.0, - max_retries: int = 3, - backoff_factor: float = 0.3, + self, + base_url: str = "https://", + timeout: float = 5.0, + max_retries: int = 3, + backoff_factor: float = 0.3, ) -> None: - pass + self.current_session = requests.session() + retry_strategy = Retry( + total=max_retries, + backoff_factor=backoff_factor, + status_forcelist=[429, 500, 502, 503, 504], + method_whitelist=["HEAD", "GET", "OPTIONS"] + ) + adapter = HTTPAdapter(max_retries=retry_strategy) # повторяет попытку соединения в случае неудачи + self.current_session.mount(base_url, adapter=adapter) # регистрируем экземпляр адаптера в префиксе + self.base_url = base_url + self.timeout = timeout - def get(self, url: str, *args: tp.Any, **kwargs: tp.Any) -> requests.Response: - pass + def get(self, url: str, *args: tp.Any, + **kwargs: tp.Any) -> requests.Response: # запрос содержимого с определенного ресурса + return self.current_session.get( + self.base_url + "/" + url, params=kwargs, timeout=self.timeout + ) - def post(self, url: str, *args: tp.Any, **kwargs: tp.Any) -> requests.Response: - pass + def post(self, url: str, *args: tp.Any, + **kwargs: tp.Any) -> requests.Response: # передача пользовательских данных заданному ресурсу + return self.current_session.post( + self.base_url + "/" + url, data=kwargs + ) diff --git a/homework05/vkapi/wall.py b/homework05/vkapi/wall.py index a045c6c..fa8477f 100644 --- a/homework05/vkapi/wall.py +++ b/homework05/vkapi/wall.py @@ -6,33 +6,33 @@ import pandas as pd from pandas import json_normalize -from vkapi import config, session -from vkapi.exceptions import APIError +from homework05.vkapi import config, session +from homework05.vkapi.exceptions import APIError def get_posts_2500( - owner_id: str = "", - domain: str = "", - offset: int = 0, - count: int = 10, - max_count: int = 2500, - filter: str = "owner", - extended: int = 0, - fields: tp.Optional[tp.List[str]] = None, + owner_id: str = "", + domain: str = "", + offset: int = 0, + count: int = 10, + max_count: int = 2500, + filter: str = "owner", + extended: int = 0, + fields: tp.Optional[tp.List[str]] = None, ) -> tp.Dict[str, tp.Any]: pass def get_wall_execute( - owner_id: str = "", - domain: str = "", - offset: int = 0, - count: int = 10, - max_count: int = 2500, - filter: str = "owner", - extended: int = 0, - fields: tp.Optional[tp.List[str]] = None, - progress=None, + owner_id: str = "", + domain: str = "", + offset: int = 0, + count: int = 10, + max_count: int = 2500, + filter: str = "owner", + extended: int = 0, + fields: tp.Optional[tp.List[str]] = None, + progress=None, ) -> pd.DataFrame: """ Возвращает список записей со стены пользователя или сообщества. @@ -49,4 +49,42 @@ def get_wall_execute( :param fields: Список дополнительных полей для профилей и сообществ, которые необходимо вернуть. :param progress: Callback для отображения прогресса. """ - pass + code = f""" + if({count} < 100): + retVal = API.wall.get( + {{ + "owner_id":{owner_id}, + "domain":{domain}, + "offset":{offset}, + "count":"{count}", + "filter":{filter}, + "extended":{extended}, + "fields": {fields} + "v":{config.VK_CONFIG["version"]} + }} + ) + else : + retVal =[] + for i in range(0, Math.floor({count} / 100) - 1, 100): + answer=API.wall.get({{ + "owner_id": str = {owner_id}, + "domain": str = {domain}, + "offset": int = {offset} + i * 100, + "count": int = 100, + "filter": str = {filter}, + "extended": str = {extended}, + "fields": str = {fields}, + "v":{config.VK_CONFIG["version"]} + }}) + retVal.push(...answer) + return retVal + """ + time.sleep(2) + response = session.post( + "execute", + code=code, + access_token=config.VK_CONFIG["access_token"], + version=config.VK_CONFIG["version"], + ).json()["response"]["items"] + + return json_normalize(response) From cb4c4bd28cee1426030f589e64cbf2ac7fdf6c36 Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 12:29:23 +0300 Subject: [PATCH 02/10] lab-5 is over --- .github/workflows/cs102.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cs102.yml b/.github/workflows/cs102.yml index 4509ac4..2df86e7 100644 --- a/.github/workflows/cs102.yml +++ b/.github/workflows/cs102.yml @@ -7,10 +7,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - name: Set up Python 3.8.6 + - name: Set up Python 3.9 uses: actions/setup-python@v2 with: - python-version: '3.8.6' + python-version: '3.9' - name: Install dependencies run: | python -m pip install --upgrade pip From b36e66f20ccfeb42000bee7761343496ef6408e0 Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 15:18:29 +0300 Subject: [PATCH 03/10] lab-5 is over --- homework05/research/age.py | 2 +- homework05/research/network.py | 2 +- homework05/vkapi/__init__.py | 4 ++-- homework05/vkapi/friends.py | 4 ++-- homework05/vkapi/wall.py | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/homework05/research/age.py b/homework05/research/age.py index fa66e7d..75e9be4 100644 --- a/homework05/research/age.py +++ b/homework05/research/age.py @@ -2,7 +2,7 @@ import statistics import typing as tp -from homework05.vkapi.friends import get_friends +from vkapi.friends import get_friends def age_predict(user_id: int) -> tp.Optional[float]: diff --git a/homework05/research/network.py b/homework05/research/network.py index 98f498e..d16c966 100644 --- a/homework05/research/network.py +++ b/homework05/research/network.py @@ -6,7 +6,7 @@ import networkx as nx import pandas as pd -from homework05.vkapi.friends import get_friends, get_mutual +from vkapi.friends import get_friends, get_mutual def ego_network( diff --git a/homework05/vkapi/__init__.py b/homework05/vkapi/__init__.py index 31354a8..c353552 100644 --- a/homework05/vkapi/__init__.py +++ b/homework05/vkapi/__init__.py @@ -1,4 +1,4 @@ -from homework05.vkapi import config -from homework05.vkapi.session import Session +from vkapi import config +from vkapi.session import Session session = Session(config.VK_CONFIG["domain"]) diff --git a/homework05/vkapi/friends.py b/homework05/vkapi/friends.py index fc1d63b..58f175f 100644 --- a/homework05/vkapi/friends.py +++ b/homework05/vkapi/friends.py @@ -3,8 +3,8 @@ import time import typing as tp -from homework05.vkapi import config, session -from homework05.vkapi.exceptions import APIError +from vkapi import config, session +from vkapi.exceptions import APIError QueryParams = tp.Optional[tp.Dict[str, tp.Union[str, int]]] diff --git a/homework05/vkapi/wall.py b/homework05/vkapi/wall.py index fa8477f..a93b5cf 100644 --- a/homework05/vkapi/wall.py +++ b/homework05/vkapi/wall.py @@ -6,8 +6,8 @@ import pandas as pd from pandas import json_normalize -from homework05.vkapi import config, session -from homework05.vkapi.exceptions import APIError +from vkapi import config, session +from vkapi.exceptions import APIError def get_posts_2500( From 614764135a77208035bd57e1e2ec4ff51048d63d Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 15:43:15 +0300 Subject: [PATCH 04/10] lab-5 is over --- homework05/research/network.py | 1 - homework05/research/topic_modeling.py | 1 - homework05/tests/tests_api/test_friends.py | 1 - homework05/tests/tests_api/test_session.py | 1 - homework05/tests/tests_api/test_wall.py | 1 - homework05/tests/tests_research/test_age.py | 1 - homework05/tests/tests_research/test_network.py | 1 - homework05/vkapi/wall.py | 1 - 8 files changed, 8 deletions(-) diff --git a/homework05/research/network.py b/homework05/research/network.py index d16c966..ce299bb 100644 --- a/homework05/research/network.py +++ b/homework05/research/network.py @@ -5,7 +5,6 @@ import matplotlib.pyplot as plt import networkx as nx import pandas as pd - from vkapi.friends import get_friends, get_mutual diff --git a/homework05/research/topic_modeling.py b/homework05/research/topic_modeling.py index 7be95e5..d46c011 100644 --- a/homework05/research/topic_modeling.py +++ b/homework05/research/topic_modeling.py @@ -3,7 +3,6 @@ from gensim.corpora import Dictionary from textacy import preprocessing from tqdm import tqdm - from vkapi.wall import get_wall_execute diff --git a/homework05/tests/tests_api/test_friends.py b/homework05/tests/tests_api/test_friends.py index d5493aa..96133f2 100644 --- a/homework05/tests/tests_api/test_friends.py +++ b/homework05/tests/tests_api/test_friends.py @@ -3,7 +3,6 @@ import unittest import responses - from vkapi.friends import FriendsResponse, get_friends, get_mutual diff --git a/homework05/tests/tests_api/test_session.py b/homework05/tests/tests_api/test_session.py index 895028b..9eebccb 100644 --- a/homework05/tests/tests_api/test_session.py +++ b/homework05/tests/tests_api/test_session.py @@ -4,7 +4,6 @@ import httpretty import responses from requests.exceptions import ConnectionError, HTTPError, ReadTimeout, RetryError - from vkapi.session import Session diff --git a/homework05/tests/tests_api/test_wall.py b/homework05/tests/tests_api/test_wall.py index 6a56a8d..8ab2c26 100644 --- a/homework05/tests/tests_api/test_wall.py +++ b/homework05/tests/tests_api/test_wall.py @@ -5,7 +5,6 @@ import pandas as pd import responses - from vkapi.wall import get_wall_execute diff --git a/homework05/tests/tests_research/test_age.py b/homework05/tests/tests_research/test_age.py index 404fd0a..53b941c 100644 --- a/homework05/tests/tests_research/test_age.py +++ b/homework05/tests/tests_research/test_age.py @@ -2,7 +2,6 @@ import unittest import responses - from research.age import age_predict diff --git a/homework05/tests/tests_research/test_network.py b/homework05/tests/tests_research/test_network.py index 3608565..e375473 100644 --- a/homework05/tests/tests_research/test_network.py +++ b/homework05/tests/tests_research/test_network.py @@ -2,7 +2,6 @@ import unittest import responses - from research.network import ego_network diff --git a/homework05/vkapi/wall.py b/homework05/vkapi/wall.py index a93b5cf..32bb1be 100644 --- a/homework05/vkapi/wall.py +++ b/homework05/vkapi/wall.py @@ -5,7 +5,6 @@ import pandas as pd from pandas import json_normalize - from vkapi import config, session from vkapi.exceptions import APIError From a6ee074fe54e7a50b3829654013e4ad06da7006d Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 16:05:10 +0300 Subject: [PATCH 05/10] lab-5 is over --- homework05/research/age.py | 6 +++--- homework05/research/network.py | 8 ++++---- homework05/vkapi/friends.py | 16 ++++++++-------- homework05/vkapi/session.py | 31 +++++++++++++++++++------------ homework05/vkapi/wall.py | 34 +++++++++++++++++----------------- 5 files changed, 51 insertions(+), 44 deletions(-) diff --git a/homework05/research/age.py b/homework05/research/age.py index 75e9be4..c66bbfd 100644 --- a/homework05/research/age.py +++ b/homework05/research/age.py @@ -25,9 +25,9 @@ def age_predict(user_id: int) -> tp.Optional[float]: if len(date) != 3: continue age = ( - -date[2] - + year - - (1 if (date[1] < month or (date[1] == month and day < date[0])) else 0) + -date[2] + + year + - (1 if (date[1] < month or (date[1] == month and day < date[0])) else 0) ) ret.append(age) if not len(ret): diff --git a/homework05/research/network.py b/homework05/research/network.py index ce299bb..a885a81 100644 --- a/homework05/research/network.py +++ b/homework05/research/network.py @@ -9,7 +9,7 @@ def ego_network( - user_id: tp.Optional[int] = None, friends: tp.Optional[tp.List[int]] = None + user_id: tp.Optional[int] = None, friends: tp.Optional[tp.List[int]] = None ) -> tp.List[tp.Tuple[int, int]]: """ Построить эгоцентричный граф друзей. @@ -56,9 +56,9 @@ def get_communities(net: tp.List[tp.Tuple[int, int]]) -> tp.Dict[int, tp.List[in def describe_communities( - clusters: tp.Dict[int, tp.List[int]], - friends: tp.List[tp.Dict[str, tp.Any]], - fields: tp.Optional[tp.List[str]] = None, + clusters: tp.Dict[int, tp.List[int]], + friends: tp.List[tp.Dict[str, tp.Any]], + fields: tp.Optional[tp.List[str]] = None, ) -> pd.DataFrame: if fields is None: fields = ["first_name", "last_name"] diff --git a/homework05/vkapi/friends.py b/homework05/vkapi/friends.py index 58f175f..826b4b7 100644 --- a/homework05/vkapi/friends.py +++ b/homework05/vkapi/friends.py @@ -16,7 +16,7 @@ class FriendsResponse: def get_friends( - user_id: int, count: int = 5000, offset: int = 0, fields: tp.Optional[tp.List[str]] = None + user_id: int, count: int = 5000, offset: int = 0, fields: tp.Optional[tp.List[str]] = None ) -> FriendsResponse: """ Получить список идентификаторов друзей пользователя или расширенную информацию @@ -47,13 +47,13 @@ class MutualFriends(tp.TypedDict): def get_mutual( - source_uid: tp.Optional[int] = None, - target_uid: tp.Optional[int] = None, - target_uids: tp.Optional[tp.List[int]] = None, - order: str = "", - count: tp.Optional[int] = None, - offset: int = 0, - progress=None, + source_uid: tp.Optional[int] = None, + target_uid: tp.Optional[int] = None, + target_uids: tp.Optional[tp.List[int]] = None, + order: str = "", + count: tp.Optional[int] = None, + offset: int = 0, + progress=None, ) -> tp.Union[tp.List[int], tp.List[MutualFriends]]: """ Получить список идентификаторов общих друзей между парой пользователей. diff --git a/homework05/vkapi/session.py b/homework05/vkapi/session.py index 9a79849..c65ef26 100644 --- a/homework05/vkapi/session.py +++ b/homework05/vkapi/session.py @@ -16,32 +16,39 @@ class Session: """ def __init__( - self, - base_url: str = "https://", - timeout: float = 5.0, - max_retries: int = 3, - backoff_factor: float = 0.3, + self, + base_url: str = "https://", + timeout: float = 5.0, + max_retries: int = 3, + backoff_factor: float = 0.3, ) -> None: self.current_session = requests.session() retry_strategy = Retry( total=max_retries, backoff_factor=backoff_factor, status_forcelist=[429, 500, 502, 503, 504], - method_whitelist=["HEAD", "GET", "OPTIONS"] + method_whitelist=["HEAD", "GET", "OPTIONS"], ) - adapter = HTTPAdapter(max_retries=retry_strategy) # повторяет попытку соединения в случае неудачи - self.current_session.mount(base_url, adapter=adapter) # регистрируем экземпляр адаптера в префиксе + adapter = HTTPAdapter( + max_retries=retry_strategy + ) # повторяет попытку соединения в случае неудачи + self.current_session.mount( + base_url, + adapter=adapter + ) # регистрируем экземпляр адаптера в префиксе self.base_url = base_url self.timeout = timeout - def get(self, url: str, *args: tp.Any, - **kwargs: tp.Any) -> requests.Response: # запрос содержимого с определенного ресурса + def get( + self, url: str, *args: tp.Any, **kwargs: tp.Any + ) -> requests.Response: # запрос содержимого с определенного ресурса return self.current_session.get( self.base_url + "/" + url, params=kwargs, timeout=self.timeout ) - def post(self, url: str, *args: tp.Any, - **kwargs: tp.Any) -> requests.Response: # передача пользовательских данных заданному ресурсу + def post( + self, url: str, *args: tp.Any, **kwargs: tp.Any + ) -> requests.Response: # передача пользовательских данных заданному ресурсу return self.current_session.post( self.base_url + "/" + url, data=kwargs ) diff --git a/homework05/vkapi/wall.py b/homework05/vkapi/wall.py index 32bb1be..9f0852a 100644 --- a/homework05/vkapi/wall.py +++ b/homework05/vkapi/wall.py @@ -10,28 +10,28 @@ def get_posts_2500( - owner_id: str = "", - domain: str = "", - offset: int = 0, - count: int = 10, - max_count: int = 2500, - filter: str = "owner", - extended: int = 0, - fields: tp.Optional[tp.List[str]] = None, + owner_id: str = "", + domain: str = "", + offset: int = 0, + count: int = 10, + max_count: int = 2500, + filter: str = "owner", + extended: int = 0, + fields: tp.Optional[tp.List[str]] = None, ) -> tp.Dict[str, tp.Any]: pass def get_wall_execute( - owner_id: str = "", - domain: str = "", - offset: int = 0, - count: int = 10, - max_count: int = 2500, - filter: str = "owner", - extended: int = 0, - fields: tp.Optional[tp.List[str]] = None, - progress=None, + owner_id: str = "", + domain: str = "", + offset: int = 0, + count: int = 10, + max_count: int = 2500, + filter: str = "owner", + extended: int = 0, + fields: tp.Optional[tp.List[str]] = None, + progress=None, ) -> pd.DataFrame: """ Возвращает список записей со стены пользователя или сообщества. From b43df987fca195ad8bcddb97cc0efd97b937cae4 Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 16:17:20 +0300 Subject: [PATCH 06/10] lab-5 is over --- homework05/vkapi/session.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/homework05/vkapi/session.py b/homework05/vkapi/session.py index c65ef26..e581a02 100644 --- a/homework05/vkapi/session.py +++ b/homework05/vkapi/session.py @@ -33,8 +33,7 @@ def __init__( max_retries=retry_strategy ) # повторяет попытку соединения в случае неудачи self.current_session.mount( - base_url, - adapter=adapter + base_url, adapter=adapter ) # регистрируем экземпляр адаптера в префиксе self.base_url = base_url self.timeout = timeout @@ -49,6 +48,4 @@ def get( def post( self, url: str, *args: tp.Any, **kwargs: tp.Any ) -> requests.Response: # передача пользовательских данных заданному ресурсу - return self.current_session.post( - self.base_url + "/" + url, data=kwargs - ) + return self.current_session.post(self.base_url + "/" + url, data=kwargs) From 8c7bc2e6a93826ffcc06a00667998c3bb38075d4 Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 16:44:08 +0300 Subject: [PATCH 07/10] lab-5 is over --- homework05/research/age.py | 4 ++-- homework05/research/network.py | 4 ++-- homework05/vkapi/wall.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homework05/research/age.py b/homework05/research/age.py index c66bbfd..ecd3edc 100644 --- a/homework05/research/age.py +++ b/homework05/research/age.py @@ -20,8 +20,8 @@ def age_predict(user_id: int) -> tp.Optional[float]: month = dt.datetime.now().month day = dt.datetime.now().day for i in list_friends.items: - if "bdate" in i: - date = list(map(int, i["bdate"].split("."))) + if "bdate" in i: # type: ignore + date = list(map(int, i["bdate"].split("."))) # type: ignore if len(date) != 3: continue age = ( diff --git a/homework05/research/network.py b/homework05/research/network.py index a885a81..8e46ab9 100644 --- a/homework05/research/network.py +++ b/homework05/research/network.py @@ -21,8 +21,8 @@ def ego_network( mutual_friends = get_mutual(source_uid=user_id, target_uids=friends) for person in mutual_friends: if person is not None: - for i in person["common_friends"]: - ret.append((person["id"], i)) + for j in person["common_friends"]: # type: ignore + ret.append((person["id"], j)) # type: ignore return ret diff --git a/homework05/vkapi/wall.py b/homework05/vkapi/wall.py index 9f0852a..8e39969 100644 --- a/homework05/vkapi/wall.py +++ b/homework05/vkapi/wall.py @@ -19,7 +19,7 @@ def get_posts_2500( extended: int = 0, fields: tp.Optional[tp.List[str]] = None, ) -> tp.Dict[str, tp.Any]: - pass + return {} def get_wall_execute( From ae3c82d0a1e8787c82d04cea57d23741182e7cfa Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 17:21:38 +0300 Subject: [PATCH 08/10] lab-5 is over --- homework05/tests/tests_api/test_session.py | 2 +- homework05/vkapi/session.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homework05/tests/tests_api/test_session.py b/homework05/tests/tests_api/test_session.py index 9eebccb..051dbcf 100644 --- a/homework05/tests/tests_api/test_session.py +++ b/homework05/tests/tests_api/test_session.py @@ -3,7 +3,7 @@ import httpretty import responses -from requests.exceptions import ConnectionError, HTTPError, ReadTimeout, RetryError +from requests.exceptions import ConnectionError, HTTPError, ReadTimeout, RetryError # mypy: ignore-errors from vkapi.session import Session diff --git a/homework05/vkapi/session.py b/homework05/vkapi/session.py index e581a02..5532de4 100644 --- a/homework05/vkapi/session.py +++ b/homework05/vkapi/session.py @@ -1,8 +1,8 @@ import typing as tp -import requests -from requests.adapters import HTTPAdapter -from requests.packages.urllib3.util.retry import Retry +import requests # mypy: ignore-errors +from requests.adapters import HTTPAdapter # mypy: ignore-errors +from requests.packages.urllib3.util.retry import Retry # mypy: ignore-errors class Session: From 79957ee73ad7c3dbb05f26324ceb1a9e58ee0d87 Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 17:34:40 +0300 Subject: [PATCH 09/10] lab-5 is over --- homework05/tests/tests_api/test_session.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/homework05/tests/tests_api/test_session.py b/homework05/tests/tests_api/test_session.py index 051dbcf..c399906 100644 --- a/homework05/tests/tests_api/test_session.py +++ b/homework05/tests/tests_api/test_session.py @@ -3,7 +3,12 @@ import httpretty import responses -from requests.exceptions import ConnectionError, HTTPError, ReadTimeout, RetryError # mypy: ignore-errors +from requests.exceptions import ( # mypy: ignore-errors + ConnectionError, + HTTPError, + ReadTimeout, + RetryError, +) from vkapi.session import Session From 7f695eb7df024231e29551df181bbbbcddbbb42c Mon Sep 17 00:00:00 2001 From: Waycoolers Date: Thu, 2 Mar 2023 17:47:49 +0300 Subject: [PATCH 10/10] lab-5 is over --- homework05/vkapi/session.py | 6 +++--- requirements.txt | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/homework05/vkapi/session.py b/homework05/vkapi/session.py index 5532de4..e581a02 100644 --- a/homework05/vkapi/session.py +++ b/homework05/vkapi/session.py @@ -1,8 +1,8 @@ import typing as tp -import requests # mypy: ignore-errors -from requests.adapters import HTTPAdapter # mypy: ignore-errors -from requests.packages.urllib3.util.retry import Retry # mypy: ignore-errors +import requests +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.retry import Retry class Session: diff --git a/requirements.txt b/requirements.txt index 868f6a2..e0e2794 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,17 @@ isort==5.4.2 mypy==0.782 pylint==2.6.0 pytest==6.0.1 + +setuptools~=49.2.1 +pandas~=1.5.3 +responses~=0.22.0 +vkapi~=1.1 +httpretty~=1.1.4 +requests~=2.28.2 +community~=1.0.0b1 +matplotlib~=3.7.0 +networkx~=3.0 +gensim~=4.3.0 +pyLDAvis~=3.4.0 +textacy~=0.12.0 +tqdm~=4.64.1 \ No newline at end of file