컴퓨터
[n8n] Converting Google News URLs to Source URLs
Hikasiru
2024. 12. 20. 15:49
구글 뉴스 검색을 하면 기본적으로 Source URL(origin URL)이 아닌 구글을 통해(리다이렉션) 넘어가는 URL이 나옴
문제는 n8n에서 뉴스 컨텐츠를 가져오고 싶으면 HTTP Request 혹은 Puppeteer 를 사용해야 하는데 테스트 결과 가끔 컨텐츠를 못가져오는 상황이 발생한다.
그래서 n8n으로 뉴스 스크랩을 하고, 1차 적으로 google news URL을 Source(Origin) URL로 바꾸는 방법이다.
python package가 있는데 n8n에서 js와 python을 실행할 순 있지만 외부 라이브러리 설치는 불가한 상황.
https://github.com/SSujitX/google-news-url-decoder/tree/main
GitHub - SSujitX/google-news-url-decoder: A Python script to decode Google News article URLs.
A Python script to decode Google News article URLs. - SSujitX/google-news-url-decoder
github.com
1. FastAPI, uvicorn, googlenewsdecoder 설치
pip install fastapi uvicorn googlenewsdecoder
2. API 사용을 위한 코드 구현
인증은 간단하게 내부에서만 접근할 수 있도록 IP 설정.
만약 접근이 안되면 서버에서
sudo ufw allow 5000 # 방화벽 설정
hostname -I # 서버 IP들 확인
from fastapi import FastAPI, Request, HTTPException
from pydantic import BaseModel
from googlenewsdecoder import new_decoderv1
class DecodeRequest(BaseModel):
source_url: str
interval_time: int = 5
app = FastAPI()
ALLOWED_IPS = {"127.0.0.1"} # 여기에 IP 추가
@app.middleware("http")
async def ip_filter_middleware(request: Request, call_next):
client_ip = request.client.host
print("client ip:", client_ip);
if client_ip not in ALLOWED_IPS:
raise HTTPException(status_code=403, detail="Access forbidden: Your IP address is not allowed.")
response = await call_next(request)
return response
@app.post("/decode_org/")
async def decode_url(request: DecodeRequest):
try:
decoded_url = new_decoderv1(request.source_url, interval=request.interval_time)
if decoded_url.get("status"):
return {"decoded_url": decoded_url["decoded_url"]}
else:
raise HTTPException(status_code=400, detail=decoded_url["message"])
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.post("/decode/")
async def decode_url(request: DecodeRequest):
try:
print(f"Source URL: {request.source_url}, Interval: {request.interval_time}")
decoded_url = new_decoderv1(request.source_url, interval=request.interval_time)
if decoded_url.get("status"):
return {"decoded_url": decoded_url["decoded_url"]}
else:
raise HTTPException(status_code=400, detail=decoded_url["message"])
except Exception as e:
print(f"Error: {e}")
raise HTTPException(status_code=500, detail=str(e))
3. 실행 및 테스트
서버 실행
uvicorn your_fastapi_app:app --host 0.0.0.0 --port 5000
curl 테스트
curl -X POST "http://127.0.0.1:5000/decode/" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"source_url": "https://news.google.com/---", #CHANGE HERE
"interval_time": 5
}'
잘 된다면 systemd로 등록하자.
4. systemd 등록 및 시작
sudo vi /etc/systemd/system/uvicorn_app.service
[Unit]
Description=Uvicorn FastAPI App
After=network.target
[Service]
User=n8n #Change user
WorkingDirectory=/home/n8n/google_decoder #Change your working directory
ExecStart=/home/n8n/.local/bin/uvicorn main:app --host 0.0.0.0 --port 5000
Restart=always
[Install]
WantedBy=multi-user.target
# systemd 리로드 및 재시작
sudo systemctl daemon-reload
sudo systemctl restart uvicorn_app
# 상태 확인
sudo systemctl status uvicorn_app
5. n8n HTTP Request 등록
n8n HTTP Request에 위 test했던 curl을 import 하면 된다. ip는 바꿔서.
끝.