API:Zdroj nápadů na články
Tato stránka je součástí dokumentace k API Action MediaWiki. |
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.
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
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;
}
|
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áncepage=page
- název stránky k analýzeprop=sections
- říká, která část informace se má načíst, v tomto příkladu jsou to sekce
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;
}
|
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'
|
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 dotazulinks
použitý jako modul generátoru k získání sady odkazů vložených na stránkugpllimit=20
- počet odkazů k načtení
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 %}
|
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
- Přispějte ukázkovou aplikací, kterou jste vyvinuli pomocí MediaWiki API, do tohoto úložiště ukázek kódu.