API:Artikel-Ideen-Generator

From mediawiki.org
Jump to navigation Jump to search
This page is a translated version of the page API:Article ideas generator and the translation is 100% complete.

Ü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.

Laden den Code von GitHub herunter Durchsuche die App auf Toolforge

In diesem Lernprogramm lernst du, wie du dies tun kannst:

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 installieren.

Diese Anwendung nutzt Python3, die empfohlene Version für neue Python-Projekte.

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
Dieser Befehl installiert das Flask-Paket mit all seinen 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, render_template

app = Flask(__name__)

@app.route('/')
def index():
    """ Zeigt die auf '/' verfügbare Indexseite an
    """
    return render_template('places.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

Bei dieser einfachen Anwendung nutzen wir die Methode 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 einen Google-Font Amatic.

Ersetze den vorhandenen Code in $article-ideas-generator/templates/articles.html durch folgendes:

<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Amatic+SC:700">
<link rel="stylesheet" href="//fonts.googleapis.com/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/static.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;
}
Artikel-Ideen-Generator-Demo-App

Anwendungslayout

$HOME/article-ideas-generator
├── templates/
│   └── articles.html
├── static/
│   └── static.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 parsen
  • page=page - Zu parsender Seitentitel
  • prop=sections - Legt fest, welcher Informationsteil erhalten werden soll, in diesem Beispiel sind es Abschnitte
Für weitere Informationen zum Parsing-Modul siehe API:Wikitext parsen .
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.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/static.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;
}
Choose a category-Seite in der Demo-App

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'
Choose a subcategory-Seite in der Demo-App. Zeigt Unterkategorien für Kategorie Natural Sciences an (siehe Bildschirmfoto oben)

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 Informationsabfrage
  • titles=title - Seitentitel, um Links zu sammeln
  • generator=links - Das Submodul links des Anfrage-Moduls wird als Generator-Modul genutzt, um eine Reihe von Links zu erhalten, die auf einer Seite eingebunden sind
  • gpllimit=20 - Anzahl der zu erhaltenden Links
Für weitere Informationen zum Parsing-Modul siehe API: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 %}
Missing links-Seite in der Demo-App

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 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__)
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="//fonts.googleapis.com/css?family=Amatic+SC:700">
<link rel="stylesheet" href="//fonts.googleapis.com/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

Siehe auch