Jump to content

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

From mediawiki.org
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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