192 lines
4.1 KiB
Markdown
Raw 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.

# Article Server
A Flask-based HTTP server that provides access to news articles stored in a directory structure, with time-based filtering and outlet-specific querying capabilities.
## Overview
This server allows you to query news articles from various sources based on:
- Time range (last hour, day, week, month)
- Specific news outlets
- Direct content retrieval by file path
Articles are organized in a nested directory structure where each news outlet has its own subdirectory containing the respective articles.
## Directory Structure
The server expects the following directory structure:
```
scraper/
└── articles/
├── Reuters Business News/
│ ├── article1.txt
│ ├── article2.txt
│ └── ...
├── Associated Press Business/
│ ├── article1.txt
│ └── ...
└── ...
```
## Endpoints
### 1. Get Articles (`/articles`)
Retrieve articles within a specified time range.
**Method:** `GET`
**Parameters:**
- `time_range` (optional): hour, day, week, month (default: hour)
- `outlets` (optional): comma-separated list of news outlet names
**Example:**
```bash
# Get articles from last day for specific outlets
curl "http://localhost:5008/articles?time_range=day&outlets=Reuters Business News,Associated Press Business"
# Get all articles from the last hour
curl "http://localhost:5008/articles"
```
**Response:**
```json
{
"articles": [
{
"path": "/path/to/article.txt",
"name": "article.txt",
"outlet": "Reuters Business News",
"created_at": "2023-10-17T14:30:00"
}
],
"count": 5,
"time_range": "hour",
"outlets": ["Reuters Business News"]
}
```
### 2. Get Article Content (`/article/content`)
Retrieve the full content of a specific article by file path.
**Method:** `GET`
**Parameters:**
- `path` (required): Absolute path to the article file
**Example:**
```bash
# Get full content of an article
curl "http://localhost:5008/article/content?path=/full/path/to/article.txt"
```
**Response:**
```json
{
"path": "/full/path/to/article.txt",
"name": "article.txt",
"outlet": "Reuters Business News",
"content": "Full article content here..."
}
```
### 3. Get Available Outlets (`/outlets`)
List all available news outlets.
**Method:** `GET`
**Example:**
```bash
curl "http://localhost:5008/outlets"
```
**Response:**
```json
{
"news_outlets": [
"Reuters Business News",
"Associated Press Business",
"Financial Times",
...
],
"count": 60
}
```
### 4. Health Check (`/health`)
Simple health check endpoint.
**Method:** `GET`
**Example:**
```bash
curl "http://localhost:5008/health"
```
**Response:**
```json
{
"status": "healthy"
}
```
## Configuration
### Environment Variables
- `ARTICLE_DIR` (optional): Path to the article directory. Defaults to `scraper/articles` if not set.
## Installation
1. Install dependencies:
```bash
pip install -r requirements.txt
```
2. Set the article directory path (optional):
```bash
export ARTICLE_DIR="/path/to/your/articles"
```
3. Run the server:
```bash
python run_server.py
```
Or with Docker:
```bash
docker build -t article-server .
docker run -p 5008:5008 article-server
```
## Usage Examples
### Get recent articles from all outlets:
```bash
curl "http://localhost:5008/articles?time_range=hour"
```
### Get articles from the last day for specific outlets:
```bash
curl "http://localhost:5008/articles?time_range=day&outlets=Reuters Business News,Associated Press Business"
```
### Get all available news outlets:
```bash
curl "http://localhost:5008/outlets"
```
### Retrieve full content of a specific article:
```bash
curl "http://localhost:5008/article/content?path=/absolute/path/to/your/article.txt"
```
## Security Notes
- The server validates that all requested file paths are within the configured article directory to prevent directory traversal attacks
- All file paths must be absolute and within the allowed directory structure
- Path parameters are URL decoded for proper handling of special characters
## Requirements
- Python 3.6+
- Flask 2.3.3
## License
This project is licensed under the MIT License.