165 lines
5.5 KiB
Python
165 lines
5.5 KiB
Python
import os
|
|
import json
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
import html2text
|
|
import urllib3
|
|
import warnings
|
|
|
|
api_url = ""
|
|
images_folder = ""
|
|
|
|
print("SSL waring ist okay, kann ignoriert werden.")
|
|
|
|
def load_config(config_file):
|
|
with open(config_file, 'r') as file:
|
|
return json.load(file)
|
|
|
|
def login(session, api_url, username, password):
|
|
params = {
|
|
"action": "query",
|
|
"meta": "tokens",
|
|
"type": "login",
|
|
"format": "json"
|
|
}
|
|
response = session.get(api_url, params=params)
|
|
login_token = response.json()['query']['tokens']['logintoken']
|
|
|
|
login_payload = {
|
|
"action": "login",
|
|
"lgname": username,
|
|
"lgpassword": password,
|
|
"lgtoken": login_token,
|
|
"format": "json"
|
|
}
|
|
response = session.post(api_url, data=login_payload)
|
|
if response.status_code == 200:
|
|
print("Login successful")
|
|
else:
|
|
print("Login failed")
|
|
response.raise_for_status()
|
|
|
|
def download_all_pages(session, api_url):
|
|
all_pages = []
|
|
params = {
|
|
'action': 'query',
|
|
'format': 'json',
|
|
'list': 'allpages',
|
|
'aplimit' : 'max'
|
|
}
|
|
while True:
|
|
response = session.get(api_url, params=params)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
all_pages.extend(data['query']['allpages'])
|
|
if 'continue' in data:
|
|
params['apcontinue'] = data['continue']['apcontinue']
|
|
else:
|
|
break
|
|
else:
|
|
print(f"Failed to download pages from {api_url}")
|
|
break
|
|
return all_pages
|
|
|
|
def save_content_to_file(content, download_folder, page_name, extension='md'):
|
|
file_path = os.path.join(download_folder, f"{page_name}.{extension}")
|
|
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
|
with open(file_path, 'w', encoding='utf-8') as file:
|
|
file.write(content)
|
|
print(f"Downloaded {page_name} to {file_path}")
|
|
|
|
def GenerateMetadataJson(data):
|
|
metadata = {
|
|
'metadata' : {
|
|
'categories' : data['parse']['categories'],
|
|
'internallinks' : data['parse']['links'],
|
|
'externallinks' : data['parse']['externallinks'],
|
|
'images' : data['parse']['images'],
|
|
'showtoc' : data['parse']['showtoc']
|
|
}
|
|
}
|
|
return "\n\n " + json.dumps(metadata, indent=4)
|
|
|
|
def StoreImages(session, images_list, json_string):
|
|
for image in images_list:
|
|
params = {
|
|
'action': 'query',
|
|
'format': 'json',
|
|
'titles': f'File:{image}',
|
|
'prop': 'imageinfo',
|
|
'iiprop': 'url'
|
|
}
|
|
response = session.get(api_url, params=params)
|
|
if response.status_code != 200:
|
|
print(f"Failed to download image {image}")
|
|
continue
|
|
data = response.json()
|
|
pages = data['query']['pages']
|
|
page_id = list(pages.keys())[0]
|
|
image_info = pages[page_id].get('imageinfo', [{}])[0]
|
|
image_url = image_info.get('url')
|
|
if not image_url:
|
|
print(f"No image info found for {image}")
|
|
continue
|
|
image_name = image_url.split('/')[-1]
|
|
response = session.get(image_url)
|
|
if response.status_code != 200:
|
|
print(f"Failed to download image {image_name}")
|
|
continue
|
|
image_path = os.path.join(images_folder, image_name)
|
|
with open(image_path, 'wb') as file:
|
|
file.write(response.content)
|
|
print(f"Downloaded {image_name}")
|
|
json_string = ReplaceImagePath(json_string, image_name, image_path)
|
|
return json_string
|
|
|
|
def ReplaceImagePath(str, image_name, image_path):
|
|
return str.replace(f'"{image_name}"', f'"./{image_path}"')
|
|
|
|
def main():
|
|
global api_url
|
|
global images_folder
|
|
config = load_config('config.json')
|
|
api_url = config['api_url'].rstrip('/') # Entferne den abschließenden Schrägstrich, falls vorhanden
|
|
pages_folder = config['pages']
|
|
images_folder = config['images']
|
|
username = config['username']
|
|
password = config['password']
|
|
maxfiles = config['maxfiles']
|
|
|
|
if not os.path.exists(pages_folder):
|
|
os.makedirs(pages_folder)
|
|
if not os.path.exists(images_folder):
|
|
os.makedirs(images_folder)
|
|
|
|
with requests.Session() as session:
|
|
login(session, api_url, username, password)
|
|
all_pages = download_all_pages(session, api_url)
|
|
print(f"Downloading {len(all_pages)} pages")
|
|
for page in all_pages:
|
|
if maxfiles == 0:
|
|
break
|
|
maxfiles -= 1
|
|
page_title = page['title']
|
|
params = {
|
|
'formatversion': 2,
|
|
'action': 'parse',
|
|
'page': page_title,
|
|
'format': 'json'
|
|
}
|
|
response = session.get(api_url, params=params)
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
if 'parse' in data:
|
|
markdown_content = html2text.html2text(data['parse']['text'])
|
|
markdown_content += GenerateMetadataJson(data)
|
|
markdown_content = StoreImages(session, data['parse']['images'], markdown_content)
|
|
if markdown_content:
|
|
save_content_to_file(markdown_content, pages_folder, page_title, extension='md')
|
|
else:
|
|
print(f"Failed to parse page {page_title}")
|
|
else:
|
|
print(f"Failed to download page {page_title}")
|
|
|
|
if __name__ == "__main__":
|
|
main() |