linkedin2/routers/jobs.py

107 lines
3.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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}