https://github.com/ruarxive/apibackuper
Python library and cmd tool to backup API calls
https://github.com/ruarxive/apibackuper
api archival backup preservation
Last synced: 4 months ago
JSON representation
Python library and cmd tool to backup API calls
- Host: GitHub
- URL: https://github.com/ruarxive/apibackuper
- Owner: ruarxive
- License: mit
- Created: 2020-08-14T07:53:07.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-07-16T07:22:56.000Z (almost 2 years ago)
- Last Synced: 2024-10-11T19:48:38.820Z (over 1 year ago)
- Topics: api, archival, backup, preservation
- Language: Python
- Homepage:
- Size: 89.8 KB
- Stars: 14
- Watchers: 5
- Forks: 2
- Open Issues: 14
-
Metadata Files:
- Readme: README.md
- Changelog: HISTORY.rst
- License: LICENSE
- Authors: AUTHORS.rst
Awesome Lists containing this project
- awesome-digital-preservation - apibackuper - Backs up API calls with a Python library and CLI. (Other Digital Objects / Public Data API)
README
---
title: apibackuper \-- a command-line tool to archive/backup API calls
---
apibackuper is a command line tool to archive/backup API calls. It\'s
goal to download all data behind REST API and to archive it to local
storage. This tool designed to backup API data, so simple as possible.
::: contents
:::
::: section-numbering
:::
# History
This tool was developed optimize backup/archival procedures for Russian
government information from E-Budget portal budget.gov.ru and some other
government IT systems too. Examples of tool usage could be found in
\"examples\" directory
# Main features
- Any GET/POST iterative API supported
- Allows to estimate time required to backup API
- Stores data inside ZIP container
- Supports export of backup data as JSON lines, gzip, or parquet files
- **YAML and INI configuration formats** - choose the format that works best for you
- Authentication support (Basic, Bearer, API Key, OAuth2)
- Rate limiting to prevent API throttling
- Retry mechanisms for handling errors
- SSL certificate verification control
- Python scripts support for custom data extraction
- Comprehensive error handling with helpful messages
- Documentation
- Test coverage
# Installation
## Linux
Most Linux distributions provide a package that can be installed using
the system package manager, for example:
``` bash
# Debian, Ubuntu, etc.
$ apt install apibackuper
```
``` bash
# Fedora
$ dnf install apibackuper
```
``` bash
# CentOS, RHEL, ...
$ yum install apibackuper
```
``` bash
# Arch Linux
$ pacman -S apibackuper
```
## Windows, etc.
A universal installation method (that works on Windows, Mac OS X, Linux,
…, and always provides the latest version) is to use pip:
``` bash
# Make sure we have an up-to-date version of pip and setuptools:
$ pip install --upgrade pip setuptools
$ pip install --upgrade apibackuper
```
(If `pip` installation fails for some reason, you can try
`easy_install apibackuper` as a fallback.)
## Python version
Python version 3.6 or greater is required.
# Quickstart
This example is about backup of Russian certificate authorities. List of
them published at e-trust.gosuslugi.ru and available via undocumented
API.
``` bash
$ apibackuper create etrust
$ cd etrust
```
Edit `apibackuper.yaml` (or `apibackuper.cfg` for INI format) as:
**YAML format (recommended):**
``` yaml
settings:
initialized: true
name: etrust
project:
description: E-Trust UC list
url: https://e-trust.gosuslugi.ru/app/scc/portal/api/v1/portal/ca/list
http_mode: POST
work_modes: full,incremental,update
iterate_by: page
params:
page_size_param: recordsOnPage
page_size_limit: 100
page_number_param: page
data:
total_number_key: total
data_key: data
item_key: РеестровыйНомер
change_key: СтатусАккредитации.ДействуетС
storage:
storage_type: zip
```
**INI format (alternative):**
``` ini
[settings]
initialized = True
name = etrust
[project]
description = E-Trust UC list
url = https://e-trust.gosuslugi.ru/app/scc/portal/api/v1/portal/ca/list
http_mode = POST
work_modes = full,incremental,update
iterate_by = page
[params]
page_size_param = recordsOnPage
page_size_limit = 100
page_number_param = page
[data]
total_number_key = total
data_key = data
item_key = РеестровыйНомер
change_key = СтатусАккредитации.ДействуетС
[storage]
storage_type = zip
```
Add file `params.json` with parameters used with POST requests:
``` json
{"page":1,"orderBy":"id","ascending":false,"recordsOnPage":100,"searchString":null,"cities":null,"software":null,"cryptToolClasses":null,"statuses":null}
```
Execute command \"estimate\" to see how long data will be collected and
how much space needed
``` bash
$ apibackuper estimate full
```
Output:
``` bash
Total records: 502
Records per request: 100
Total requests: 6
Average record size 32277.96 bytes
Estimated size (json lines) 16.20 MB
Avg request time, seconds 66.9260
Estimated all requests time, seconds 402.8947
```
Execute command \"run\" to collect the data. Result stored in
\"storage.zip\"
``` bash
$ apibackuper run full
```
Export data from storage. The format is automatically detected from the file extension, or you can specify it explicitly:
``` bash
# Export as JSON lines (auto-detected from .jsonl extension)
$ apibackuper export etrust.jsonl
# Export as gzip-compressed JSON lines
$ apibackuper export etrust.jsonl.gz
# Export as Parquet format (requires pandas and pyarrow)
$ apibackuper export etrust.parquet
# Explicitly specify format
$ apibackuper export --format jsonl etrust.jsonl
```
# Configuration
apibackuper supports both **YAML** and **INI** configuration formats. YAML is recommended for better readability and structure. The tool automatically detects `apibackuper.yaml` or `apibackuper.yml` files first, then falls back to `apibackuper.cfg` if no YAML file is found.
## Configuration Format
### YAML Format (Recommended)
``` yaml
settings:
initialized: true
name:
splitter: .
project:
description:
url:
http_mode: GET # or POST
work_modes: full,incremental,update
iterate_by: page # or skip
params:
page_size_param:
page_size_limit:
page_number_param:
count_skip_param:
data:
total_number_key:
data_key:
item_key:
change_key:
follow:
follow_mode:
follow_pattern:
follow_data_key:
follow_param:
follow_item_key:
files:
fetch_mode:
root_url:
keys:
storage_mode:
storage:
storage_type: zip
compression: true
auth:
type: basic # or bearer, apikey, oauth2
username:
password:
# Alternative: password_file:
rate_limit:
enabled: true
requests_per_second:
requests_per_minute:
requests_per_hour:
burst_size: 5
request:
timeout: 120
connect_timeout: 30
read_timeout: 120
verify_ssl: true # Set to false to disable SSL certificate verification
user_agent: "apibackuper/1.0.11"
max_redirects: 5
allow_redirects: true
```
### INI Format (Alternative)
``` ini
[settings]
initialized = True
name =
splitter = .
[project]
description =
url =
http_mode =
work_modes =
iterate_by =
[params]
page_size_param =
page_size_limit =
page_number_param =
count_skip_param =
[data]
total_number_key =
data_key =
item_key =
change_key =
[follow]
follow_mode =
follow_pattern =
follow_data_key =
follow_param =
follow_item_key =
[files]
fetch_mode =
root_url =
keys =
storage_mode =
[storage]
storage_type = zip
compression = True
[auth]
type = basic
username =
password =
# Alternative: password_file =
# For Bearer token:
# type = bearer
# token =
# Alternative: token_file =
# For API Key:
# type = apikey
# api_key =
# api_key_header = X-API-Key
# For OAuth2:
# type = oauth2
# token =
# auth_url =
# refresh_token =
[rate_limit]
requests_per_second =
requests_per_minute =
requests_per_hour =
burst_size = 5
[request]
timeout = 120
connect_timeout = 30
read_timeout = 120
verify_ssl = True
user_agent = apibackuper/1.0.11
max_redirects = 5
allow_redirects = True
```
## settings
- name - short name of the project
- splitter - value of field splitter. Needed for rare cases when \'.\'
is part of field name. For example for OData requests and
\'@odata.count\' field
## project
- description - text that explains what for is this project
- url - API endpoint url
- http_mode - one of HTTP modes: GET or POST
- work_modes - type of operations: full - archive everything,
incremental - add new records only, update - collect changed data
only
- iterate_by - type of iteration of records. By \'page\' - default,
page by page or by \'skip\' if skip value provided
## params
- page_size_param - parameter with page size
- page_size_limit - limit of records provided by API
- page_number_param = parameter with page number
- count_skip_param - parameter for \'skip\' type of iteration
## data
- total_number_key - key in data with total number of records
- data_key - key in data with list of records
- item_key - key in data with unique identifier of the record. Could
be group of keys separated with comma
- change_key - key in data that indicates that record changed. Could
be group of keys separated with comma
## follow
- follow_mode - mode to follow objects. Could be \'url\' or \'item\'.
If mode is \'url\' than follow_pattern not used
- follow_pattern - url pattern / url prefix for followed objects. Only
for mode \'item\'\'
- follow_data_key - if object/objects are inside array, key of this
array
- follow_param - parameter used in \'item\' mode
- follow_item_key - item key
## files
- fetch_mode - file fetch mode. Could be \'prefix\' or \'id\'. Prefix
- root_url - root url / prefix for files
- keys - list of keys with urls/file id\'s to search for files to save
- storage_mode - a way how files stored in storage/files.zip. By
default \'filepath\' and files storaged same way as they presented
in url
## storage
- storage_type - type of local storage. \'zip\' is local zip file is
default one
- compression - if True than compressed ZIP file used, less space
used, more CPU time processing data
## auth
Authentication configuration for protected APIs. Supports multiple authentication methods:
- type - authentication type: \'basic\', \'bearer\', \'apikey\', or \'oauth2\'
- For Basic Auth:
- username - username for basic authentication
- password - password (or use password_file to read from file)
- For Bearer Token:
- token - bearer token (or use token_file to read from file)
- For API Key:
- api_key - API key value
- api_key_header - header name for API key (default: \'X-API-Key\')
- For OAuth2:
- token - access token (or use token_file to read from file)
- auth_url - OAuth2 token endpoint URL
- refresh_token - refresh token for automatic token renewal
## rate_limit
Rate limiting configuration to prevent API throttling:
- enabled - enable/disable rate limiting (default: true)
- requests_per_second - maximum requests per second
- requests_per_minute - maximum requests per minute
- requests_per_hour - maximum requests per hour
- burst_size - burst capacity for token bucket algorithm (default: 5)
## request
HTTP request configuration:
- timeout - total request timeout in seconds (default: 120)
- connect_timeout - connection timeout in seconds (default: 30)
- read_timeout - read timeout in seconds (default: 120)
- verify_ssl - verify SSL certificates (default: true). Set to false if you encounter SSL certificate verification errors. The tool will provide helpful error messages if SSL verification fails.
- user_agent - custom user agent string (default: "apibackuper/1.0.11")
- max_redirects - maximum number of redirects to follow (default: 5)
- allow_redirects - whether to follow redirects (default: true)
- proxies - proxy configuration (format: "http=http://proxy:8080,https=https://proxy:8080")
# Usage
Synopsis:
``` bash
$ apibackuper [flags] [command] inputfile
```
See also `apibackuper --help`.
## Examples
### Basic Usage
Create a new project:
``` bash
$ apibackuper create budgettofk
```
Estimate execution time and data size. Should be called in project dir or project dir provided via -p parameter:
``` bash
$ apibackuper estimate full -p budgettofk
```
Output:
``` bash
Total records: 12282
Records per request: 500
Total requests: 25
Average record size 1293.60 bytes
Estimated size (json lines) 15.89 MB
Avg request time, seconds 1.8015
Estimated all requests time, seconds 46.0536
```
Run the backup. Should be called in project dir or project dir provided via -p parameter:
``` bash
$ apibackuper run full
```
Export data from project:
``` bash
# Auto-detect format from extension
$ apibackuper export hhemployers.jsonl -p hhemployers
# Export as Parquet
$ apibackuper export data.parquet -p hhemployers
# Explicitly specify format
$ apibackuper export --format jsonl output.jsonl -p hhemployers
```
Get project information:
``` bash
# Text format
$ apibackuper info -p hhemployers
# JSON format
$ apibackuper info --json -p hhemployers
```
Follow each object of downloaded data and make additional requests:
``` bash
$ apibackuper follow continue
```
Download all files associated with API objects:
``` bash
$ apibackuper getfiles
```
Validate project configuration:
``` bash
$ apibackuper validate-config -p hhemployers
```
### Example Projects
The `examples/` directory contains several working examples:
- **budgetreg** - Registry of budget organizations from budget.gov.ru
- **budgetrgz** - Registry of budget tasks from budget.gov.ru
- **budgettofk** - List of Federal treasury branches from budget.gov.ru
- **budgetsclassif** - Budget classification codes from budget.gov.ru
- **etrust** - Russian certificate authorities from e-trust.gosuslugi.ru (POST API)
- **esklp** - ESKLP registration data (with SSL verification disabled)
- **fpreceivers** - Receivers of subsidies and contracts from spending.gov.ru
- **hhemployers** - Russian companies employers from hh.ru
- **subsidies** - Registry of government subsidies from budget.gov.ru
- **sozd** - Russian State Duma bills extractor with custom Python scripts
### Example: Handling SSL Certificate Issues
If you encounter SSL certificate verification errors, you'll see a helpful error message:
```
Error: SSL certificate verification failed for URL https://example.com/api.
Update the project configuration [request] section to set 'verify_ssl = False'
or provide a path to a trusted certificate bundle.
```
To fix this, add a `request` section to your config:
**YAML:**
``` yaml
request:
verify_ssl: false
```
**INI:**
``` ini
[request]
verify_ssl = False
```
### Example: Using Authentication
**YAML format:**
``` yaml
auth:
type: bearer
token: your_token_here
# Or use a file for security:
# token_file: /path/to/token.txt
```
**INI format:**
``` ini
[auth]
type = bearer
token = your_token_here
# Or use a file:
# token_file = /path/to/token.txt
```
### Example: Rate Limiting
**YAML format:**
``` yaml
rate_limit:
enabled: true
requests_per_second: 10
requests_per_minute: 600
requests_per_hour: 36000
burst_size: 5
```
**INI format:**
``` ini
[rate_limit]
requests_per_second = 10
requests_per_minute = 600
requests_per_hour = 36000
burst_size = 5
```
# Advanced
## Authentication
apibackuper supports multiple authentication methods to work with protected APIs:
### Basic Authentication
```ini
[auth]
type = basic
username = myuser
password = mypassword
# Or use a file for security:
# password_file = /path/to/password.txt
```
### Bearer Token
```ini
[auth]
type = bearer
token = your_bearer_token_here
# Or use a file:
# token_file = /path/to/token.txt
```
### API Key
```ini
[auth]
type = apikey
api_key = your_api_key_here
api_key_header = X-API-Key # Optional, default is X-API-Key
```
### OAuth2
```ini
[auth]
type = oauth2
token = your_access_token
auth_url = https://api.example.com/oauth/token
refresh_token = your_refresh_token
```
## Rate Limiting
Configure rate limiting to avoid API throttling and respect API limits:
```ini
[rate_limit]
requests_per_second = 10
requests_per_minute = 100
requests_per_hour = 1000
burst_size = 5
```
The rate limiter uses a token bucket algorithm for per-second limits and sliding windows for per-minute and per-hour limits.
## Latest Updates
See [HISTORY.md](HISTORY.md) for detailed changelog. Recent updates include:
- **Version 1.0.11**:
- Added **YAML configuration format support** alongside existing INI format
- Added authentication support (Basic, Bearer, API Key, OAuth2)
- Added rate limiting functionality to prevent API throttling
- Added request configuration section (timeouts, SSL verification, proxies)
- Improved SSL error handling with helpful error messages
- Enhanced export functionality with Parquet format support
- Improved error handling and retry mechanisms
- **Version 1.0.8**: Added Python scripts support for HTML data extraction
- **Version 1.0.7**: Improved continue mode support for both "run" and "follow" commands
- **Version 1.0.6**: Added retry mechanisms with configurable delays and retry counts