API:Artikel-Ideen-Generator
Diese Seite ist Teil der Dokumentation der MediaWiki action API. |
Überblick
In dieser Anleitung wirst du eine Demo einer Artikel-Ideen-Generator-App erhalten, die Artikel aus unterschiedlichen Kategorien vorschlägt, die in der englischsprachigen Wikipedia noch nicht existieren.
In diesem Lernprogramm lernst du, wie du dies tun kannst:
- Python- und Flask-Framework, und die Requests-Bibliothek
- Parsing- und Link-Module der MediaWiki Action API
Eine Schritt-für-Schritt-Anleitung, um diese Anwendung zu erstellen:
Schritt 1: Python- und Flask-Entwicklungsumgebung aufsetzen
Um die Python-Entwicklungsumgebung für eine Flask-Anwendung aufzusetzen, musst du Python installieren, eine virtuelle Umgebung erstellen und Flask und Requests installieren.
Lerne hier mehr über die Unterschiede zwischen Python2 und Python3. Um Python3 auf deiner lokalen Maschine zu installieren, befolge die Schritt-für-Schritt-Anleitung aus dem Installations-Leitfaden.
Die Entwicklungsumgebung, um die Anwendung aufzubauen, wird wie folgt aufgesetzt:
$ mkdir article-ideas-generator
$ cd article-ideas-generator/
Dadurch wird ein neues Verzeichnis erstellt und dorthin gewechselt
$ python3 --version #Python 3.6.5
Dieser Befehl prüft deine Python-Version
$ python3 -m venv venv
Dieser Befehl erstellt eine virtuelle Umgebung mit dem Namen 'venv'
$ source venv/bin/activate
Dies aktiviert die virtuelle Umgebung
$ pip install Flask requests
Dieser Befehl installiert die Flask- und Request-Pakete mit all deren Abhängigkeiten
|
Schritt 2: Eine einfache Flask-Anwendung erstellen
Eine einfache statische Seite rendern
Setze den folgenden Code in $HOME/article-ideas-generator/articles.py
ein
#!/usr/bin/python3
"""
articles.py1
MediaWiki-Action-API-Code-Beispiele
Artikel-Ideen-Generator-App:Schlägt Artikel aus unterschiedlichen Kategorien vor, die in der englischsprachigen Wikipedia noch nicht existieren.
Die App nutzt action=parse- und prop=links-Module als Generator.
MIT-Lizenz
"""
from flask import Flask, request, render_template
import requests
APP = Flask(__name__)
@APP.route('/')
def index():
""" Zeigt die auf '/' verfügbare Indexseite an
"""
return render_template('articles.html')
if __name__ == '__main__':
APP.run()
|
Setze die Code-Zeile <h1>Article ideas generator</h1>
in eine HTML-Datei im Ordner templates
ein:
$article-ideas-generator/templates/articles.html
render_template
, die die Vorlage mit dem Namen articles.html
aus dem Verzeichnis templates
rendert.Führe deine Flask-App mit dem Befehl python articles.py
aus und öffne http://127.0.0.1:5000/
, um dir deine App im Browser anzusehen.
Du solltest "Article ideas generator" in deinem Browser-Fenster sehen können.
Gestalte deine App
Lass uns die App gestalten.
Um dies zu tun, füge Link-Markierungen hinzu, um externe und interne Stylesheets zu laden.
Externe Stylesheets sind in diesem Fall die URL einer CSS-Datei für die Schriftart Amatic
.
Ersetze den vorhandenen Code in $article-ideas-generator/templates/articles.html
durch folgendes:
<link rel="stylesheet" href="//tools-static.wmflabs.org/fontcdn/css?family=Amatic+SC:700">
<link rel="stylesheet" href="//tools-static.wmflabs.org/fontcdn/css?family=Josefin+Sans">
<link rel="stylesheet" href="/static/style.css">
<h1>Article ideas generator</h1>
<p>Some ideas for topics to write articles on:</p>
Setze den folgenden Code in $HOME/article-ideas-generator/static/style.css
ein
h1 {
color: black;
font-family: 'Amatic SC', cursive;
font-size: 4.5em;
font-weight: normal;
}
p {
font-family: 'Josefin Sans', sans-serif;
font-size: 1.4em;
}
|
Anwendungslayout
$HOME/article-ideas-generator ├── templates/ │ └── articles.html ├── static/ │ └── style.css ├── articles.py └── venv/
Schritt 3: Erhalte Seitenabschnitte aus Wikipedia:Requested articles
Lass uns Code in einer get_page_sections()
-Funktion in $HOME/article-ideas-generator/articles.py
schreiben, um Seitenabschnitte aus Wikipedia:Requested articles zu erhalten.
Diese Funktion nutzt den Seitennamen als Argument und stellt eine GET
-Abfrage an die Action API, um Abschnitte der Seite zu parsen.
Der API-Anruf besteht aus einem Endpunkt https://en.wikipedia.org/w/api.php
und Parametern der Abfrage-Zeichenkette.
Einige der Schlüsselparameter sind:
action=parse
- Modul, um Inhalt einer Seite zu parsenpage=page
- Zu parsender Seitentitelprop=sections
- Legt fest, welcher Informationsteil erhalten werden soll, in diesem Beispiel sind es Abschnitte
def get_page_sections(page):
""" Erhalte Seitenabschnitte
"""
params = {
"action": "parse",
"page": page,
"prop": "sections",
"format": "json"
}
res = SESSION.get(url=API_ENDPOINT, params=params)
data = res.json()
if 'error' in data:
return
parsed_sections = data and data['parse'] and data['parse']['sections']
sections = []
for section in parsed_sections:
if section['toclevel'] == 1:
sections.append(section['line'])
return sections
Erweitere als nächstes die Python-Flask-Route /
in $HOME/article-ideas-generator/articles.py
, um die oben definierte Funktion anzurufen und die von der Funktion ausgegebenen Ergebnisse an render_template
zu übergeben.
APP = Flask(__name__)
SESSION = requests.Session()
API_ENDPOINT = 'https://en.wikipedia.org/w/api.php'
PAGE = {}
@APP.route('/')
def index():
""" Zeigt die auf '/' verfügbare Indexseite an
"""
global PAGE
results = []
PAGE = {'name': 'Wikipedia:Requested_articles', 'type': 'category'}
results = get_page_sections(PAGE['name'])
return render_template(
"articles.html",
results=results,
pagetype=PAGE['type'])
Setze den folgenden Jinja-Vorlagencode in $HOME/article-ideas-generator/templates/articles.html
ein.
Er rendert mithilfe der Daten zu Seitenabschnitten als Kategorien, die oben über die API erhalten wurden, dynamisch eine Reihe von Schaltflächen.
{% if results %}
<p>Choose a {{ pagetype }}</p>
<form method="POST">
{% for pagename in results %}
<button name="{{ pagetype }}" class="{{ pagetype }}" value="{{ pagename }}">{{ pagename }}</button>
{% endfor %}
{% else %}
<p>Ooooops! We couldn't find any results.</p>
<button onclick="location.href='/'">Start over</button>
</form>
{% endif %}
Platziere den folgenden Code in $HOME/article-ideas-generator/static/style.css
, um die Schaltflächen zu gestalten.
div {
left: 10%;
position: absolute;
right: 10%;
text-align: center;
top: 5%;
}
button {
background-color: #06b6c9;
border: none;
border-radius: 5px;
color: white;
font-size: 1.2em;
margin: 5px;
padding: 20px;
}
|
Schritt 4: Weitere Abschnitte anhand der Auswahl des Benutzers erhalten
Erhalte aus Wikipedia:Requested articles Unterabschnitte, basierend auf der Kategorie oder dem Abschnitt, den der Benutzer im vorherigen Schritt ausgewählt hat.
Erweitere die Python-Flask-Route /
in $HOME/article-ideas-generator/articles.py
, um POST-Abfragen zu nutzen.
Du kannst dies tun, indem du GET
und POST
zur methods
-Argumentliste im Route-Decorator hinzufügst.
Du kannst dann die in einem dictionary
-Format verfügbare Kategorien-Auswahl aus dem request
-Objekt erhalten, das zur weiteren Verarbeitung an die get_page_sections()
-Funktion übergeben wird.
# Modifiziere die APP-Route, um sowohl GET- als auch POST-Abfragen zu unterstützen.
@APP.route('/', methods=['GET', 'POST'])
# Füge diese Zeilen zur index()-Funktion hinzu
if request.method == 'POST':
PAGE['name'] = PAGE['name'] + '/' + \
request.form.to_dict()['category']
PAGE['type'] = 'subcategory'
|
Schritt 5: Sammle Artikel mit fehlenden Links und zeige sie an
Lass uns Code in einer get_red_links()
-Funktion in $HOME/article-ideas-generator/articles.py
schreiben, um 20 Artikel mit fehlenden Links auf eine Seite zu erhalten.
Diese Funktion nutzt den Seitennamen als Argument und stellt eine GET
-Abfrage an die Action API, um alle Links auszugeben, die auf der angegebenen Seite eingebunden sind.
Durch weitere Extraktion kannst du die Links erhalten, die fehlen und noch nicht in der englischsprachigen Wikipedia existieren.
Der API-Anruf besteht aus einem Endpunkt https://en.wikipedia.org/w/api.php
und Parametern der Abfrage-Zeichenkette.
Einige der Schlüsselparameter sind:
action=query
- Modul zur Informationsabfragetitles=title
- Seitentitel, um Links zu sammelngenerator=links
- Das Submodullinks
des Anfrage-Moduls wird als Generator-Modul genutzt, um eine Reihe von Links zu erhalten, die auf einer Seite eingebunden sindgpllimit=20
- Anzahl der zu erhaltenden Links
def get_red_links(title):
""" Erhalte fehlende Links auf eine Seite
"""
params = {
"action": "query",
"titles": title,
"generator": "links",
"gpllimit": 20,
"format": "json"
}
res = SESSION.get(url=API_ENDPOINT, params=params)
data = res.json()
pages = data and data['query'] and data['query']['pages']
links = []
for page in pages.values():
if 'missing' in page:
links.append(page['title'])
return links
Erweitere als nächstes den if
-Block, der die POST
-Methode in der /
-Route in $HOME/article-ideas-generator/articles.py
betrifft, um die get_red_links()
-Funktion anzurufen, wenn die Seite, von der die Abfrage erhalten wird, ein subcategory
-Typ ist.
if request.method == 'POST':
if 'category' in request.form:
PAGE['name'] = PAGE['name'] + '/' + request.form.to_dict()['category']
PAGE['type'] = 'subcategory'
results = get_page_sections(PAGE['name'])
elif 'subcategory' in request.form:
PAGE['name'] = PAGE['name'] + '#' + request.form.to_dict()['subcategory']
PAGE['type'] = 'links'
results = get_red_links(PAGE['name'])
Setze den folgenden Jinja-Vorlagencode in $HOME/article-ideas-generator/templates/articles.html
ein.
Er rendert mithilfe der Daten, die oben über die API erhalten wurden, dynamisch eine Liste von Links.
{% if 'links' in pagetype %}
<p>Some ideas for topics to write articles on:</p>
{% for link in results %}
<a href="//en.wikipedia.org/w/index.php?title={{ link }}&action=edit&redlink=1">{{ link }}</a><br>
{% endfor %}
<button onclick="location.href='/'">Take me to the homepage</button>
{% endif %}
|
Sieh dir den vollständigen Python-, CSS- und HTML-Code an.
$HOME/article-ideas-generator/articles.py |
---|
#!/usr/bin/python3
"""
articles.py
MediaWiki-Action-API-Code-Beispiele
Artikel-Ideen-Generator-App: Schlägt Artikel aus verschiedenen Kategorien vor, die noch nicht in der englischen Wikipedia existieren. Die App nutzt action=parse- und prop=links-Module als Generator.
MIT-Lizenz
"""
from flask import Flask, request, render_template
import requests
APP = Flask(__name__)
SESSION = requests.Session()
API_ENDPOINT = 'https://en.wikipedia.org/w/api.php'
PAGE = {}
@APP.route('/', methods=['GET', 'POST'])
def index():
""" Zeigt die auf '/' verfügbare Indexseite an
"""
global PAGE
results = []
if request.method == 'POST':
if 'category' in request.form:
PAGE['name'] = PAGE['name'] + '/' + \
request.form.to_dict()['category']
PAGE['type'] = 'subcategory'
results = get_page_sections(PAGE['name'])
elif 'subcategory' in request.form:
PAGE['name'] = PAGE['name'] + '#' + \
request.form.to_dict()['subcategory']
PAGE['type'] = 'links'
results = get_red_links(PAGE['name'])
else:
PAGE = {'name': 'Wikipedia:Requested_articles', 'type': 'category'}
results = get_page_sections(PAGE['name'])
return render_template(
"articles.html",
results=results,
pagetype=PAGE['type'])
def get_page_sections(page):
""" Erhalte Seitenabschnitte
"""
params = {
"action": "parse",
"page": page,
"prop": "sections",
"format": "json"
}
res = SESSION.get(url=API_ENDPOINT, params=params)
data = res.json()
if 'error' in data:
return
parsed_sections = data and data['parse'] and data['parse']['sections']
sections = []
for section in parsed_sections:
if section['toclevel'] == 1:
sections.append(section['line'])
return sections
def get_red_links(title):
""" Erhalte fehlende Links auf eine Seite
"""
params = {
"action": "query",
"titles": title,
"generator": "links",
"gpllimit": 20,
"format": "json"
}
res = SESSION.get(url=API_ENDPOINT, params=params)
data = res.json()
pages = data and data['query'] and data['query']['pages']
links = []
for page in pages.values():
if 'missing' in page:
links.append(page['title'])
return links
if __name__ == '__main__':
APP.run()
|
$HOME/article-ideas-generator/static/style.css |
---|
h1 {
color: black;
font-family: 'Amatic SC', cursive;
font-size: 4.5em;
font-weight: normal;
}
div {
left: 10%;
position: absolute;
right: 10%;
text-align: center;
top: 5%;
}
p {
font-family: 'Josefin Sans', sans-serif;
font-size: 1.4em;
}
button {
background-color: #06b6c9;
border: none;
border-radius: 5px;
color: white;
font-size: 1.2em;
margin: 5px;
padding: 20px;
}
.subcategory {
background-color: #EE6352;
}
a {
color: red;
font-size: 1.2em;
line-height: 1.4em;
}
|
$HOME/article-ideas-generator/templates/articles.html |
---|
<title>Article ideas generator</title>
<link rel="stylesheet" href="//tools-static.wmflabs.org/fontcdn/css?family=Amatic+SC:700">
<link rel="stylesheet" href="//tools-static.wmflabs.org/fontcdn/css?family=Josefin+Sans">
<link rel="stylesheet" href="/static/style.css">
<div>
<h1>Article ideas generator</h1>
{% if 'links' in pagetype %}
<p>Some ideas for topics to write articles on:</p>
{% for link in results %}
<a href="//en.wikipedia.org/w/index.php?title={{ link }}&action=edit&redlink=1">{{ link }}
</a>
<br>
{% endfor %}
<button onclick="location.href='/'">Take me to the homepage</button>
{% else %}
{% if results %}
<p>Choose a {{ pagetype }}</p>
<form method="POST">
{% for pagename in results %}
<button name="{{ pagetype }}" class="{{ pagetype }}" value="{{ pagename }}">{{ pagename }}</button>
{% endfor %}
{% else %}
<p>Ooooops! We couldn't find any results.</p>
<button onclick="location.href='/'">Start over</button>
</form>
{% endif %}
{% endif %}
</div>
|
Nächste Schritte
- Trage eine Demo-App, die du mithilfe der MediaWiki API entwickelt hast, zu dem Code-Beispiel-Repositorium bei.