107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
|
from fastapi import FastAPI, APIRouter, Depends, Request, HTTPException, Form
|
|||
|
from datetime import datetime
|
|||
|
from dotenv import load_dotenv
|
|||
|
import os
|
|||
|
|
|||
|
|
|||
|
from fastapi.responses import HTMLResponse
|
|||
|
from fastapi.responses import JSONResponse
|
|||
|
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
|||
|
from sqlalchemy.orm import sessionmaker
|
|||
|
from sqlalchemy import create_engine
|
|||
|
from sqlalchemy.orm import Session
|
|||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|||
|
from sqlalchemy.future import select
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
from pydantic import BaseModel, HttpUrl
|
|||
|
from urllib.parse import urlparse, parse_qs
|
|||
|
from linkedin_api import Linkedin
|
|||
|
import logging
|
|||
|
from utils.logging_setup import configure_global_logging
|
|||
|
|
|||
|
load_dotenv()
|
|||
|
# # Ваши учетные данные LinkedIn
|
|||
|
|
|||
|
|
|||
|
configure_global_logging()
|
|||
|
|
|||
|
router = APIRouter()
|
|||
|
|
|||
|
|
|||
|
username = os.getenv('USERNAME')
|
|||
|
password = os.getenv('PASSWD')
|
|||
|
api = Linkedin(username, password)
|
|||
|
|
|||
|
|
|||
|
DATABASE_URL = os.getenv('DATABASE_URL') # Ваши параметры подключения
|
|||
|
engine = create_engine(DATABASE_URL)
|
|||
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class UrlModel(BaseModel):
|
|||
|
link_profile: HttpUrl # Используем HttpUrl для проверки валидности URL
|
|||
|
|
|||
|
|
|||
|
async def get_session() -> AsyncSession:
|
|||
|
async with async_session() as session:
|
|||
|
yield session
|
|||
|
|
|||
|
|
|||
|
|
|||
|
@router.post("/link_vacancy")
|
|||
|
async def vacancy_url(data: UrlModel):
|
|||
|
if not str(data.link_profile).startswith("https://www.linkedin.com/"):
|
|||
|
# Возвращаем исключение с кодом 400 и сообщением об ошибке
|
|||
|
raise HTTPException(status_code=400, detail="Неправильная ссылка")
|
|||
|
|
|||
|
query_params = parse_qs(urlparse(str(data.link_profile)).query)
|
|||
|
current_job_id = query_params.get("currentJobId", [None])[0]
|
|||
|
|
|||
|
jobs = api.get_job(current_job_id)
|
|||
|
location = jobs['formattedLocation']
|
|||
|
title = jobs['title']
|
|||
|
listedAt = jobs['listedAt']
|
|||
|
|
|||
|
# Преобразование из миллисекунд в секунды и конвертация
|
|||
|
future_date = datetime.fromtimestamp(listedAt / 1000)
|
|||
|
|
|||
|
# Текущая дата
|
|||
|
current_date = datetime.now()
|
|||
|
|
|||
|
# Разница в днях
|
|||
|
difference = abs((future_date - current_date).days)
|
|||
|
|
|||
|
# print(f"Разница в днях: {difference}")
|
|||
|
|
|||
|
|
|||
|
jobPostingId = jobs['jobPostingId']
|
|||
|
# workplaceTypesResolutionResults = jobs['workplaceTypesResolutionResults']
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# Извлекаем все localizedName
|
|||
|
# localized_names = [value['localizedName'] for value in workplaceTypesResolutionResults.values()]
|
|||
|
|
|||
|
# print(localized_names)
|
|||
|
|
|||
|
# localized_name = workplaceTypesResolutionResults['urn:li:fs_workplaceType:2']['localizedName']
|
|||
|
link = f'https://www.linkedin.com/jobs/view/{current_job_id}/'
|
|||
|
|
|||
|
|
|||
|
return {"job_id": current_job_id,
|
|||
|
"job_title": title,
|
|||
|
"minimum_annual_salary": f"minimum_annual_salary",
|
|||
|
"salary_currency": 'salary_currency',
|
|||
|
'location_type': "location_type",
|
|||
|
'location': location,
|
|||
|
"job_level": "job_level",
|
|||
|
"job_type": 'job_type',
|
|||
|
"days_posted": difference,
|
|||
|
"hourly_rate": "hourly_rate",
|
|||
|
"link": link}
|