11import re
2- import requests
32import time
43from fastapi import HTTPException , APIRouter , Depends
5- from utils import get_vinted_headers
4+ from utils import execute_request , get_vinted_headers
65from constants import API_URL
76from sqlmodel import Session , select , delete
87from config .models import FollowedUser , User , get_session
@@ -24,9 +23,10 @@ async def backup_followed_users(
2423):
2524 user = session .exec (select (User ).where (User .id == 1 )).first ()
2625 page = 1
27- response = requests .get (
26+ response = execute_request (
27+ "get" ,
2828 f"{ API_URL } users/{ user .userId } /followed_users?page={ page } &per_page=20" ,
29- headers = headers ,
29+ headers ,
3030 )
3131
3232 if not response .status_code == 200 :
@@ -38,9 +38,10 @@ async def backup_followed_users(
3838 nb_pages = pagination ["total_pages" ]
3939
4040 while page <= nb_pages :
41- response = requests .get (
41+ response = execute_request (
42+ "get" ,
4243 f"{ API_URL } users/{ user .userId } /followed_users?page={ page } &per_page=20" ,
43- headers = headers ,
44+ headers ,
4445 )
4546 for user_followed in response .json ()["users" ]:
4647 followed_user = session .exec (
@@ -60,31 +61,82 @@ async def backup_followed_users(
6061 return {"message" : "Users followed backuped" }
6162
6263
63- def toggle_follow (user_id : int , headers : dict ):
64+ def toggle_follow (user_id : int , headers : dict ) -> int :
6465 url = f"{ API_URL } followed_users/toggle"
6566 data = {"user_id" : user_id }
66- response = requests .post (url , headers = headers , json = data )
67- return response .json ()
67+ response = execute_request ("post" , url , headers , data )
68+ print (
69+ f"[RESULT] user_id: { user_id } CODE: { response .status_code } | REASON: { response .reason } | text: { response .text } "
70+ )
71+ return response .status_code
6872
6973
7074@router .get ("/recover-followed-users" )
7175async def recover_followed_users (
7276 headers : dict = Depends (get_vinted_headers ), session : Session = Depends (get_session )
7377):
7478 user = session .exec (select (User ).where (User .id == 1 )).first ()
79+
80+ nb_users_unfollowed = unfollow_all_users (user .userId , headers )
81+ nb_users_recovered = follow_all_users (user .userId , session , headers )
82+
83+ return {
84+ "message" : "Users followed recovered" ,
85+ "nbUsersUnfollowed" : nb_users_unfollowed ,
86+ "nbUsersRecovered" : nb_users_recovered ,
87+ }
88+
89+
90+ def unfollow_all_users (user_id : int , headers : dict ) -> int :
91+ nb_users_unfollowed = 0
92+ page = 1
93+ long_pause = 0
94+ short_pause = 0
95+
96+ response = execute_request (
97+ "get" ,
98+ f"{ API_URL } users/{ user_id } /following?page={ page } &per_page=20" ,
99+ headers = headers ,
100+ )
101+ nb_pages = response .json ()["pagination" ]["total_pages" ]
102+
103+ while page <= nb_pages :
104+
105+ if long_pause == 100 :
106+ time .sleep (60 )
107+ long_pause = 0
108+ if short_pause == 30 :
109+ time .sleep (10 )
110+ short_pause = 0
111+
112+ response = execute_request (
113+ "get" ,
114+ f"{ API_URL } users/{ user_id } /following?page={ page } &per_page=20" ,
115+ headers = headers ,
116+ )
117+
118+ for user in response .json ()["users" ]:
119+ status_code = toggle_follow (user ["id" ], headers )
120+
121+ if status_code == 200 :
122+ nb_users_unfollowed += 1
123+
124+ long_pause += 1
125+ short_pause += 1
126+
127+ page += 1
128+
129+ return nb_users_unfollowed
130+
131+
132+ def follow_all_users (user_id : int , session : Session , headers : dict ) -> int :
75133 followed_users = session .exec (
76- select (FollowedUser ).where (FollowedUser .userId == user . userId )
134+ select (FollowedUser ).where (FollowedUser .userId == user_id )
77135 ).all ()
78136
79137 long_pause = 0
80138 short_pause = 0
81-
82- if long_pause == 100 :
83- time .sleep (60 )
84- long_pause = 0
85- if short_pause == 30 :
86- time .sleep (10 )
87- short_pause = 0
139+ nb_users_recovered = 0
88140
89141 for followed_user in followed_users :
90142 if long_pause == 10 :
@@ -93,21 +145,50 @@ async def recover_followed_users(
93145 if short_pause == 5 :
94146 time .sleep (10 )
95147 short_pause = 0
96- toggle_follow (followed_user .followedUserId , headers )
148+
149+ status_code = toggle_follow (followed_user .followedUserId , headers )
150+
151+ if status_code == 200 :
152+ nb_users_recovered += 1
153+
97154 long_pause += 1
98155 short_pause += 1
99156
100- return {"message" : "Users followed recovered" }
101157
158+ @router .post ("/scrap-vinted-user" )
159+ async def scrap_vinted_user (
160+ scrap_vinted_user : ScrapVintedUser , headers : dict = Depends (get_vinted_headers )
161+ ):
162+ id = re .search ("\d+" , scrap_vinted_user .urlSeller ).group (0 )
163+ page = 1
164+ nb_users_scraped = 0
165+ mode = "followers" if scrap_vinted_user .mode == "followers" else "following"
102166
103- @router .get ("/scrap-vinted-user" )
104- async def scrap_vinted_user (scrap_vinted_user : ScrapVintedUser ):
105- id = re .search ("\d+" , scrap_vinted_user .url_seller ).group (0 )
167+ response = execute_request (
168+ "get" ,
169+ f"{ API_URL } users/{ id } /{ mode } ?page={ page } &per_page=20" ,
170+ headers = headers ,
171+ )
172+ nb_pages = response .json ()["pagination" ]["total_pages" ]
106173
107- if scrap_vinted_user .mode == "followers" :
108- ...
174+ while page <= nb_pages :
175+ response = execute_request (
176+ "get" ,
177+ f"{ API_URL } users/{ id } /{ mode } ?page={ page } &per_page=20" ,
178+ headers = headers ,
179+ )
180+
181+ for user in response .json ()["users" ]:
182+ print (f"Scraping user: { user ['login' ]} | id: { user ['id' ]} " )
109183
110- if scrap_vinted_user .mode == "following" :
111- ...
184+ if user ["is_favourite" ] == False and user ["id" ] != id :
185+ status_code = toggle_follow (user ["id" ], headers )
186+ if status_code == 200 :
187+ nb_users_scraped += 1
188+
189+ page += 1
112190
113- return {"message" : "Users scraped from vinted user" }
191+ return {
192+ "message" : "Users scraped from vinted user" ,
193+ "nbUsersScraped" : nb_users_scraped ,
194+ }
0 commit comments