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} |