API:Zdroj nápadů na články

This page is a translated version of the page API:Article ideas generator and the translation is 100% complete.

Přehled

V tomto průvodci získáte ukázku aplikace zdroje nápadů na články, který navrhuje články z různých kategorií, které na anglické Wikipedii ještě neexistují.

Tento průvodce vás naučí, jak to udělat pomocí:

Postup vytváření této aplikace krok za krokem:

Krok 1: Nastavení vývojového prostředí Python a Flask

Chcete-li nastavit vývojové prostředí Python pro aplikaci Flask, budete muset nainstalovat Python, vytvořit virtuální prostředí a nainstalovat Flask and Requests.

Tato aplikace používá Python3, doporučenou verzi pro nové projekty Pythonu.

Další informace o rozdílech mezi Pythonem2 a Pythonem3 najdete zde. Chcete-li nainstalovat Python3 na svůj místní počítač, postupujte podle pokynů krok za krokem v těchto instalačních průvodcích.

Zde je návod, jak nastavit vývojové prostředí pro tvorbu aplikace:

$ mkdir article-ideas-generator
$ cd article-ideas-generator/
Tím se vytvoří nový adresář a změní se do něj
$ python3 --version #Python 3.6.5
Tento příkaz zkontroluje vaši verzi Pythonu 
$ python3 -m venv venv
Tento příkaz vytvoří virtuální prostředí s názvem 'venv'
$ source venv/bin/activate
Tím se aktivuje virtuální prostředí
$ pip install Flask requests
Tento příkaz nainstaluje balíčky Flask a Requests se všemi jejich závislostmi

Krok 2: Vytvoření jednoduché aplikace Flask

Vykreslení jednoduché statické stránky

Vložte následující kód do $HOME/article-ideas-generator/articles.py

#!/usr/bin/python3

"""
    articles.py1

    Ukázky kódu API MediaWiki Action

    Aplikace generátor nápadů na články: Navrhuje články z různých kategorií, které na anglické Wikipedii ještě neexistují.
    Aplikace používá jako zdroj modul action=parse a modul prop=links.

    Licence MIT
"""

from flask import Flask, request, render_template
import requests

APP = Flask(__name__)

@APP.route('/')
def index():
    """ Zobrazí stránku indexu přístupnou na '/'
    """
    return render_template('articles.html')

if __name__ == '__main__':
    APP.run()

Přesuňte tento jediný řádek kódu ‎<h1>Article ideas generator‎</h1> do souboru HTML do složky templates: $article-ideas-generator/templates/articles.html

V této jednoduché aplikaci používáme metodu render_template, která vykreslí šablonu s názvem articles.html z adresáře templates.

Poté spusťte aplikaci Flask pomocí příkazu python articles.py a otevřete http://127.0.0.1:5000/, abyste si aplikaci zobrazili v prohlížeči. V okně prohlížeče byste měli vidět "Article ideas generator".

Styl vaší aplikace

Pojďme udělat nějaký styl aplikace. Chcete-li to provést, přidejte značky odkazů pro načtení externí a interní šablony stylů. Externí šablona stylů je v tomto případě adresa URL souboru CSS pro písmo Amatic.

Nahraďte stávající kód v $article-ideas-generator/templates/articles.html následujícím:

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

Vložte následující kód do $HOME/article-ideas-generator/static/style.css

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;
}
 
Ukázka aplikace zdroje nápadů na články

Rozvržení aplikace

$HOME/article-ideas-generator
├── templates/
│   └── articles.html
├── static/
│   └── style.css
├── articles.py
└── venv/

Krok 3: Načtení části stránky z Wikipedia:Requested articles

Pojďme napsat nějaký kód ve funkci get_page_sections() v $HOME/article-ideas-generator/articles.py, abychom načetli části stránky z Wikipedia:Requested articles. Tato funkce bere název stránky jako argument a odešle GET požadavek na Action API, aby analyzoval části stránky. Volání API se skládá z koncového bodu https://en.wikipedia.org/w/api.php a parametrů řetězce dotazu. Některé z klíčových parametrů jsou:

  • action=parse - modul pro analýzu obsahu na stránce
  • page=page - název stránky k analýze
  • prop=sections - říká, která část informace se má načíst, v tomto příkladu jsou to sekce
Další informace o modulu analýzy viz API:Analýza wikitextu .
def get_page_sections(page):
    """ Získání sekce stránky
    """
    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

Dále rozšiřte cestu Python Flask / v $HOME/article-ideas-generator/articles.py, aby zavolala funkci definovanou výše a také předejte výsledky vrácené funkcí do render_template.

APP = Flask(__name__)
SESSION = requests.Session()
API_ENDPOINT = 'https://en.wikipedia.org/w/api.php'
PAGE = {}

@APP.route('/')
def index():
    """ Zobrazí stránku indexu přístupnou na '/'
    """
    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'])

Umístěte následující kód šablony Jinja do $HOME/article-ideas-generator/templates/articles.html. Dynamicky vykresluje řadu tlačítek kategorií na základě částí stránky získaných prostřednictvím výše uvedeného rozhraní API.

{% 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 %}

Umístěte následující kód do $HOME/article-ideas-generator/static/style.css pro styling tlačítka.

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 stránky v demo aplikaci

Krok 4: Získání další sekce na základě výběru uživatele

Na základě kategorie nebo sekce vybrané uživatelem v předchozím kroku chceme načíst podsekce od Wikipedia:Requested articles. Rozšiřte cestu Python Flask / na $HOME/article-ideas-generator/articles.py, abyste mohli zpracovávat požadavky POST. Můžete tak učinit přidáním GET a POST do seznamu argumentů methods v dekorátoru trasy. Poté můžete získat výběr kategorie dostupný ve formátu dictionary z objektu request, který je předán funkci get_page_sections() k dalšímu zpracování.

# Upravte trasu APP tak, aby podporovala požadavky GET i POST
@APP.route('/', methods=['GET', 'POST'])

# Přidejte tyto řádky do funkce index()
if request.method == 'POST':
    PAGE['name'] = PAGE['name'] + '/' + \
        request.form.to_dict()['category']
    PAGE['type'] = 'subcategory'
 
Choose a subcategory stránka v ukázce aplikace. Zobrazují se podkategorie pro kategorii Natural Sciences (viz snímek obrazovky výše)

Krok 5: Sběr a zobrazení článků s chybějícími odkazy

Pojďme napsat nějaký kód ve funkci get_red_links() v $HOME/article-ideas-generator/articles.py, abychom načetli asi 20 článků s chybějícími odkazy na stránce. Tato funkce vezme jako argument název stránky, odešle požadavek GET na Action API a vrátí všechny odkazy vložené na danou stránku. Z další extrakce můžete získat ty odkazy, které chybí a ještě neexistují na anglické Wikipedii. Volání API se skládá z koncového bodu https://en.wikipedia.org/w/api.php a parametrů řetězce dotazu. Některé z klíčových parametrů jsou:

  • action=query - modul pro dotazování informací
  • titles=title - název stránky pro sběr odkazů
  • generator=links - submodul modulu dotazu links použitý jako modul generátoru k získání sady odkazů vložených na stránku
  • gpllimit=20 - počet odkazů k načtení
Další informace o modulu analýzy viz API:Odkazy .
def get_red_links(title):
    """ Získejte chybějící odkazy na stránce
    """
    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

Dále rozšiřte blok if pro metodu POST v cestě / v $HOME/article-ideas-generator/articles.py tak, aby zavolala funkci get_red_links(), pokud je stránka, ze které je vydán požadavek, typu subcategory.

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'])

Umístěte následující kód šablony Jinja do $HOME/article-ideas-generator/templates/articles.html. Dynamicky vykresluje seznam odkazů pomocí dat získaných prostřednictvím výše uvedeného API.

{% 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 stránka v ukázce aplikace.

Prohlédněte si kompletní Python, CSS a HTML kód.

$HOME/article-ideas-generator/articles.py
#!/usr/bin/python3

"""
    articles.py

    Ukázky kódu API MediaWiki Action

    Aplikace zdroj nápadů na články: Navrhuje články z různých kategorií, které na anglické Wikipedii ještě neexistují. Aplikace používá modul action=parse a modul prop=links jako generátor.

    Licence MIT
"""

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():
    """ Zobrazí stránku indexu přístupnou na '/'
    """
    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):
    """ Získání sekce stránky
    """
    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):
    """ Získejte chybějící odkazy na stránce
    """
    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>


Další kroky

Související odkazy