scraper_assistant / features /api_calls.py
qsocialnow's picture
first_commit
7579319
Raw
History Blame Contribute Delete
16.9 kB
import requests
import json
def scraping_instagram(ambiente, json_query):
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
if ambiente == 'testing':
url = "https://test.scrapper.qsocialnow.com/meta/api/v1/scrapings/instagram"
else:
url = "https://scrapper.qsocialnow.com/meta/api/v1/scrapings/instagram"
# Cabeceras (ajustá si tu API requiere otro nombre de header)
headers = {
"api-key": api_key,
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
# Mostrar resultado
if response.status_code == 200 or response.status_code == 201:
print("Scraping iniciado correctamente.")
print(response.json())
else:
print(f"Error {response.status_code}: {response.text}")
def scraping_tiktok(ambiente, json_query):
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
if ambiente == 'testing':
url = "https://test.scrapper.qsocialnow.com/meta/api/v1/scrapings/tiktok"
else:
url = "https://scrapper.qsocialnow.com/meta/api/v1/scrapings/tiktok"
# Cabeceras (ajustá si tu API requiere otro nombre de header)
headers = {
"api-key": api_key,
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
# Mostrar resultado
if response.status_code == 200 or response.status_code == 201:
print("Scraping iniciado correctamente.")
print(response.json())
else:
print(f"Error {response.status_code}: {response.text}")
def scraping_youtube(ambiente, json_query):
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
if ambiente == 'testing':
url = "https://test.scrapper.qsocialnow.com/meta/api/v1/scrapings/youtube"
else:
url = "https://scrapper.qsocialnow.com/meta/api/v1/scrapings/youtube"
# Cabeceras (ajustá si tu API requiere otro nombre de header)
headers = {
"api-key": api_key,
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
# Mostrar resultado
if response.status_code == 200 or response.status_code == 201:
print("Scraping iniciado correctamente.")
print(response.json())
else:
print(f"Error {response.status_code}: {response.text}")
def scraping_facebook(ambiente, json_query):
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
if ambiente == 'testing':
url = "https://test.scrapper.qsocialnow.com/meta/api/v1/scrapings/facebook"
else:
url = "https://scrapper.qsocialnow.com/meta/api/v1/scrapings/facebook"
# Cabeceras (ajustá si tu API requiere otro nombre de header)
headers = {
"api-key": api_key,
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
# Mostrar resultado
if response.status_code == 200 or response.status_code == 201:
print("Scraping iniciado correctamente.")
print(response.json())
else:
print(f"Error {response.status_code}: {response.text}")
def scraping_twitter(ambiente, json_query):
import json
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
url = (
"https://test.scrapper.qsocialnow.com/twitter/api/v1/scrapings"
if ambiente == 'testing'
else "https://scrapper.qsocialnow.com/twitter/api/v1/scrapings"
)
headers = {
"api-key": api_key,
"Content-Type": "application/json"
}
# Enviar el request usando json= (como debe ser)
response = requests.post(url, json=json_query, headers=headers)
if response.status_code in [200, 201]:
print("✅ Scraping de Twitter iniciado con éxito.")
print(response.json())
else:
print(f"❌ Error {response.status_code}: {response.text}")
def list_scraping(ambiente, red, status):
import requests
import pandas as pd
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
headers = {
"api-key": api_key,
"Content-Type": "application/json"
}
if red.upper() == "TWITTER":
url = (
"https://test.scrapper.qsocialnow.com/twitter/api/v1/scrapings"
if ambiente == "test"
else "https://scrapper.qsocialnow.com/twitter/api/v1/scrapings"
)
params = {
"status": status,
"page": 1,
"pageSize": 1000
}
else:
url = (
"https://test.scrapper.qsocialnow.com/meta/api/v1/scrapings"
if ambiente == "test"
else "https://scrapper.qsocialnow.com/meta/api/v1/scrapings"
)
params = {
"socialNetwork": red.upper(),
"status": status,
"page": 1,
"pageSize": 1000
}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
print(f"✅ Datos obtenidos correctamente para {red} ({status})")
data = response.json()
df = pd.DataFrame(data['data']['data'])
df["red"] = red.upper()
df["status"] = status
return df
else:
print(f"❌ Error {response.status_code} en {red} ({status}): {response.text}")
return pd.DataFrame() # vacío en caso de error
def scraper_base(ambiente, uri):
from pymongo import MongoClient
import pandas as pd
client = MongoClient(uri)
db = client[ambiente]
collection = db['scrapings']
documentos = collection.find()
documentos_lista_scrapings = list(documentos)
df_scrapings = pd.DataFrame(documentos_lista_scrapings)
return df_scrapings
def auth(ambiente):
import ast
import requests
import os
from dotenv import load_dotenv
# API key y URL del endpoint
api_key = os.getenv('api_key')
load_dotenv()
headers = {"Content-Type": "application/json"}
if ambiente == 'testing':
url = "https://test.listening.api.qsocialnow.com/auth/api/v1/login"
payload = {
"user": os.getenv("auth_test_user"),
"password": os.getenv("auth_test_password")
}
elif ambiente == 'production':
url = "https://listening.api.qsocialnow.com/auth/api/v1/login"
payload = {
"user": os.getenv("auth_prod_user"),
"password": os.getenv("auth_prod_password")
}
# print("🔐 Enviando payload:", payload)
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
token = response.json().get("data", {}).get("token")
return token
else:
print(f"❌ Error {response.status_code}: {response.text}")
return None
def series_api(ambiente, red):
from features.api_calls import auth # o desde donde definas auth
import requests
import pandas as pd
token = auth(ambiente)
if not token:
return None
red = red.upper()
# URL base según ambiente
if ambiente == 'testing':
base_url = "https://test.listening.api.qsocialnow.com"
elif ambiente == 'production':
base_url = "https://listening.api.qsocialnow.com"
else:
raise ValueError("Ambiente inválido")
# Armar URL completa con red en el path
url = f"{base_url}/products/api/v1/{red}/series"
# Headers autorizados
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# GET request
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json().get("data", [])
print(f"📦 Se encontraron {len(data)} series para {red}.")
return pd.DataFrame(data) if data else pd.DataFrame()
else:
print(f"❌ Error al obtener series ({response.status_code}): {response.text}")
return None
def series_base(ambiente, uri):
from pymongo import MongoClient
import pandas as pd
client = MongoClient(uri)
db = client[ambiente]
collection = db['series']
documentos = collection.find()
documentos_lista_series = list(documentos)
df_series = pd.DataFrame(documentos_lista_series)
return df_series
def create_series(ambiente, red,json_query):
from features.api_calls import auth
import requests
import pandas as pd
token = auth(ambiente)
if not token:
return None
red = red.upper()
# URL base según ambiente
if ambiente == 'testing':
base_url = "https://test.listening.api.qsocialnow.com"
elif ambiente == 'production':
base_url = "https://listening.api.qsocialnow.com"
else:
raise ValueError("Ambiente inválido")
# Armar URL completa con red en el path
url = f"{base_url}/products/api/v1/{red}/series"
# Headers autorizados
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
data = response.json().get("data", [])
print(f"📦 Se creo la serie para {red}.")
return data#pd.DataFrame(data) if data else pd.DataFrame()
else:
print(f"❌ Error al obtener series ({response.status_code}): {response.text}")
return None
def create_client(ambiente, json_query):
from features.api_calls import auth
import requests
import pandas as pd
token = auth(ambiente)
if not token:
return None
# URL base según ambiente
if ambiente == 'testing':
base_url = "https://test.listening.api.qsocialnow.com"
elif ambiente == 'production':
base_url = "https://listening.api.qsocialnow.com"
else:
raise ValueError("Ambiente inválido")
# Armar URL completa con red en el path
url = f"{base_url}/products/api/v1/clients"
# Headers autorizados
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
data = response.json().get("data", [])
print(f"📦 Se creo el cliente.")
return data#pd.DataFrame(data) if data else pd.DataFrame()
else:
print(f"❌ Error al obtener series ({response.status_code}): {response.text}")
return None
def clients(ambiente):
import requests
import pandas as pd
from features.api_calls import auth
token = auth(ambiente)
if not token:
return pd.DataFrame() # vacío si falla la autenticación
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
base_url = "https://test.listening.api.qsocialnow.com" if ambiente == 'testing' else "https://listening.api.qsocialnow.com"
url = f"{base_url}/products/api/v1/clients"
response = requests.get(url, headers=headers)
print("estoy obteniendo cliente")
if response.status_code == 200:
print("✅ Datos obtenidos correctamente")
data = response.json().get("data", [])
filtrado = [{"name": item["name"], "_id": item["_id"]} for item in data]
return pd.DataFrame(filtrado)
else:
print(f"❌ Error {response.status_code}: {response.text}")
print("no pude obtener cliente")
return pd.DataFrame()
def create_user(ambiente, json_query):
import requests
from features.api_calls import auth
# Obtener token
token = auth(ambiente)
if not token:
return None
# Definir URL base por ambiente (sin barra al final)
if ambiente == 'testing':
base_url = "https://test.listening.api.qsocialnow.com"
elif ambiente == 'production':
base_url = "https://listening.api.qsocialnow.com"
else:
raise ValueError("Ambiente inválido")
# Armar URL final para registro
url = f"{base_url}/auth/api-docs/#/CRUD%20Users/post_register"
# print(f"➡️ URL destino: {url}")
# Headers HTTP
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Verificar payload antes de enviar
print("📦 Payload a enviar:")
print(json_query)
# Hacer POST
try:
response = requests.post(url, json=json_query, headers=headers)
except Exception as e:
print(f"❌ Error de conexión: {e}")
return None
# Procesar respuesta
if response.status_code in (200, 201):
print("✅ Usuario registrado correctamente.")
print("📥 Respuesta:")
print(response.json())
return response.json()
else:
try:
print(f"❌ Error al registrar usuario ({response.status_code}): {response.json()}")
except Exception:
print(f"❌ Error al registrar usuario ({response.status_code}): {response.text}")
return None
def user_base(ambiente, uri): #arreglar
from pymongo import MongoClient
import pandas as pd
client = MongoClient(uri)
db = client[ambiente]
collection = db['series']
documentos = collection.find()
documentos_lista_series = list(documentos)
df_series = pd.DataFrame(documentos_lista_series)
return df_series
def product_asignation(ambiente,action,id,json_query):
from features.api_calls import auth # o desde donde definas auth
import requests
import pandas as pd
token = auth(ambiente)
if not token:
return None
red = red.upper()
# URL base según ambiente
if ambiente == 'testing':
base_url = "https://test.listening.api.qsocialnow.com/products/api-docs/#/Clients"
elif ambiente == 'production':
base_url = "https://test.listening.api.qsocialnow.com/products/api-docs/#/Clients"
else:
raise ValueError("Ambiente inválido")
# Armar URL completa con red en el path
url = f"{base_url}/update-client-with-product/api/v1/{id}/products/{action}"
# Headers autorizados
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Cuerpo de la solicitud
payload = json_query
# Enviar solicitud POST
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
data = response.json().get("data", [])
print(f"📦 Cambio realizado.")
return data#pd.DataFrame(data) if data else pd.DataFrame()
else:
print(f"❌ Error al obtener series ({response.status_code}): {response.text}")
return None
def asignar_producto_a_cliente(ambiente, client_id, action, json_query):
import json
"""
Asigna o remueve productos y tableros a un cliente.
Parámetros:
- ambiente: 'testing' o 'production'
- client_id: string, ID del cliente
- action: 'ADD' o 'REMOVE'
- products_ids: lista de strings
- boards_ids: lista de strings
"""
# Definir el endpoint según ambiente
base_url = "https://test.listening.api.qsocialnow.com" if ambiente == "testing" \
else "https://listening.api.qsocialnow.com"
url = f"{base_url}/products/api-docs/#/Clients/update-client-with-product/{client_id}/products/{action}"#/auth/api-docs/#/CRUD%20Users/post_register"
# Token desde auth (ajustá esta parte según cómo lo obtengas)
from features.api_calls import auth
token = auth(ambiente)
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
payload = json.loads(json_query)
# payload = json_query
# print(type(payload))
response = requests.patch(url, headers=headers, json=payload)
if response.status_code in [200, 204]:
print("✅ Acción ejecutada correctamente.")
return response.json() if response.content else {"status": "No content"}
else:
print(f"❌ Error {response.status_code}: {response.text}")
return None