API:Zdroj nápadů na články
Akce API MediaWiki |
---|
Základní informace |
Přihlášení |
Uživatelské účty a uživatelé |
Operace spojené se stránkou |
|
Vyhledávání |
Nástroje pro vývojáře |
Návody |
v · d · u |
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:
$ mkdirarticle-ideas-generator $ cdarticle-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-mvenvvenv Tento příkaz vytvoří virtuální prostředí s názvem 'venv' $ sourcevenv/bin/activate Tím se aktivuje virtuální prostředí $ pipinstallFlaskrequests 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 """ fromflaskimport Flask, request, render_template importrequests APP = Flask(__name__) @APP.route('/') defindex(): """ 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
defget_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('/') defindex(): """ 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.
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í.
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í
defget_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 """ fromflaskimport Flask, request, render_template importrequests APP = Flask(__name__) SESSION = requests.Session() API_ENDPOINT = 'https://en.wikipedia.org/w/api.php' PAGE = {} @APP.route('/', methods=['GET', 'POST']) defindex(): """ 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']) defget_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 defget_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.