API:Madde fikirleri oluşturucu
Bu sayfa MediaWiki Eylem API'si belgelerinin bir parçasıdır. |
Genel bakış
Bu eğitimde, İngilizce Vikipedi'de henüz bulunmayan çeşitli kategorilerden maddeler öneren bir madde fikirleri üretme uygulamasının bir demosunu alacaksınız.
Bu eğitim size bunu kullanarak nasıl yapacağınızı öğretecektir:
Bu uygulamayı oluşturmak için adım adım bir süreç:
1. adım: Python ve Flask geliştirme ortamını ayarlayın
Bir Flask uygulaması için Python geliştirme ortamını kurmak için Python'u kurmanız, sanal bir ortam oluşturmanız ve Flask ve İstekleri kurmanız gerekir.
Python2 ve Python3 arasındaki farklar hakkında buradan daha fazla bilgi edinin. Python3'ü yerel makinenize kurmak için, bu kurulum kılavuzlarında adım adım talimatları izleyin.
Uygulamayı oluşturmak için geliştirme ortamının nasıl kurulacağı aşağıda açıklanmıştır:
$ mkdir article-ideas-generator
$ cd article-ideas-generator/
Bu, yeni bir dizin oluşturacak ve ona dönüşecek
$ python3 --version #Python 3.6.5
Bu komut Python sürümünüzü kontrol eder
$ python3 -m venv venv
Bu komut 'venv' adında bir sanal ortam oluşturacak
$ source venv/bin/activate
Bu sanal ortamı etkinleştirecek
$ pip install Flask requests
Bu komut, Flask ve İstekleri paketlerini tüm bağımlılıklarıyla birlikte kuracaktır.
|
2. adım: Basit bir Flask uygulaması oluşturun
Basit bir statik sayfa oluşturun
Aşağıdaki kodu $HOME/article-ideas-generator/articles.py
içinde yerleştirin
#!/usr/bin/python3
"""
articles.py1
MediaWiki Eylem API Kodu Örnekleri
Madde fikirleri oluşturucu uygulaması: İngilizce Vikipedi'de henüz bulunmayan çeşitli kategorilerden maddeler önerir.
Uygulama, oluşturucu olarak action=parse modül ve prop=links modül kullanır.
MIT lisansı
"""
from flask import Flask, request, render_template
import requests
APP = Flask(__name__)
@APP.route('/')
def index():
""" '/' altında erişilebilen dizin sayfasını görüntüler
"""
return render_template('articles.html')
if __name__ == '__main__':
APP.run()
|
Bu <h1>Article ideas generator</h1>
kod satırını templates
klasörünün içindeki bir HTML dosyasına bırakın:
$article-ideas-generator/templates/articles.html
templates
dizininden articles.html
adlı şablonu oluşturan render_template
yöntemini kullanıyoruz.Ardından python articles.py
komutuyla Flask uygulamanızı çalıştırın ve uygulamanızı tarayıcıda görüntülemek için http://127.0.0.1:5000/
açın.
Tarayıcı pencerenizde "Article ideas generator" görmeniz gerekir.
Uygulamanızı şekillendirin
Biraz uygulama stili yapalım.
Bunu yapmak için, harici ve dahili bir stil sayfası yüklemek için bağlantı etiketleri ekleyin.
Bu durumda harici stil sayfası, Amatic
yazı tipi için bir CSS dosyasının URL'sidir.
$article-ideas-generator/templates/articles.html
içindeki mevcut kodu aşağıdaki ile değiştirin:
<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>
Aşağıdaki kodu $HOME/article-ideas-generator/static/style.css
içinde yerleştirin
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;
}
|
Uygulama düzeni
$HOME/article-ideas-generator ├── templates/ │ └── articles.html ├── static/ │ └── style.css ├── articles.py └── venv/
3. adım: Sayfa bölümlerini Wikipedia:Requested articles üzerinden alın
Wikipedia:Requested articles üzerinden sayfa bölümlerini getirmek için get_page_sections()
işlevine $HOME/article-ideas-generator/articles.py
içinde bir kod yazalım.
Bu işlev, bağımsız değişken olarak sayfa adını alır ve sayfanın bölümlerini ayrıştırmak için Eylem API'sine GET
bir istekte bulunur.
API çağrısı, https://en.wikipedia.org/w/api.php
uç noktası ve sorgu dizesi parametrelerinden oluşur.
Bazı temel parametreler şunlardır:
action=parse
- bir sayfadaki içeriği ayrıştırmak için modülpage=page
- ayrıştırılacak sayfa başlığıprop=sections
- hangi bilgi parçasının alınacağını söyler, bu örnekte bölümler
def get_page_sections(page):
""" Sayfa bölümlerini alın
"""
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
Ardından, yukarıda tanımlanan işlevi çağırmak ve ayrıca işlevin döndürdüğü sonuçları render_template
ile geçirmek için /
Python Flask yolunu $HOME/article-ideas-generator/articles.py
olarak genişletin.
APP = Flask(__name__)
SESSION = requests.Session()
API_ENDPOINT = 'https://en.wikipedia.org/w/api.php'
PAGE = {}
@APP.route('/')
def index():
""" '/' altında erişilebilen dizin sayfasını görüntüler
"""
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'])
Aşağıdaki Jinja şablon kodunu $HOME/article-ideas-generator/templates/articles.html
alanına yerleştirin.
Yukarıdaki API üzerinden elde edilen kategoriler olarak sayfa bölümleri verilerinin yardımıyla dinamik olarak bir dizi düğme oluşturur.
{% 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 %}
Düğme stili için aşağıdaki kodu $HOME/article-ideas-generator/static/style.css
değerine yerleştirin.
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;
}
|
4. adım: Kullanıcı seçimine göre daha fazla bölüm alın
Kullanıcının önceki adımda seçtiği bir kategori veya bölüme bağlı olarak, Wikipedia:Requested articles üzerinden alt bölümleri getirin.
POST isteklerini işlemek için Python Flask rotasını /
olarak $HOME/article-ideas-generator/articles.py
içinde genişletin.
Bunu, yol dekoratöründeki methods
bağımsız değişken listesine hem GET
hem de POST
ekleyerek yapabilirsiniz.
Daha sonra dictionary
biçiminde mevcut kategori seçimini request
nesnesinden elde edebilirsiniz, bu daha ileri işlemler için get_page_sections()
işlevini geçirilir.
# Hem GET hem de POST isteklerini desteklemek için APP yolunu değiştirin
@APP.route('/', methods=['GET', 'POST'])
# Bu satırları index() işlevine ekleyin
if request.method == 'POST':
PAGE['name'] = PAGE['name'] + '/' + \
request.form.to_dict()['category']
PAGE['type'] = 'subcategory'
|
5. adım: Bağlantıları eksik olan maddeleri toplayın ve görüntüleyin
Bir sayfadaki eksik bağlantıları olan yaklaşık 20 madde getirmek için get_red_links()
işlevine $HOME/article-ideas-generator/articles.py
cinsinden bir kod yazalım.
Bu 1function, bağımsız değişken olarak sayfa adını alır ve Eylem API'sine GET
bir istekte bulunur ve sağlanan sayfaya gömülü tüm bağlantıları döndürür.
Daha fazla çıkarımdan, eksik olan ve henüz İngilizce Vikipedi'de bulunmayan bağlantıları edinebilirsiniz.
API çağrısı, https://en.wikipedia.org/w/api.php
uç noktası ve sorgu dizesi parametrelerinden oluşur.
Bazı temel parametreler şunlardır:
action=query
- bilgi sorgulama modülütitles=title
- bağlantıları toplamak için sayfa başlığıgenerator=links
- sorgu modülünün alt modülülinks
, bir sayfaya gömülü bir dizi bağlantı almak için üretici modülü olarak kullanılırgpllimit=20
- alınacak bağlantı sayısı
def get_red_links(title):
""" Bir sayfadaki eksik bağlantıları alın
"""
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
Ardından, talebin alındığı sayfa subcategory
türündeyse get_red_links()
işlevini çağırmak için $HOME/article-ideas-generator/articles.py
içindeki /
yolundaki POST
yöntemiyle ilgili if
bloğunu genişletin.
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'])
Aşağıdaki Jinja şablon kodunu $HOME/article-ideas-generator/templates/articles.html
içine yerleştirin.
Yukarıdaki API üzerinden elde edilen veriler yardımıyla dinamik olarak bir bağlantı listesi oluşturur.
{% 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 %}
|
Python, CSS ve HTML kodunun tamamını görüntüleyin.
$HOME/article-ideas-generator/articles.py |
---|
#!/usr/bin/python3
"""
articles.py
MediaWiki Eylem API Kodu Örnekleri
Madde fikirleri oluşturucu uygulaması: İngilizce Vikipedi'de henüz bulunmayan çeşitli kategorilerden maddeler önerir. Uygulama, jeneratör olarak action=parse modül ve prop=links modül kullanır.
MIT lisansı
"""
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():
""" '/' altında erişilebilen dizin sayfasını görüntüler
"""
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):
""" Sayfa bölümlerini alın
"""
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):
""" Bir sayfadaki eksik bağlantıları alın
"""
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>
|
Sonraki adımlar
- MediaWiki API'sini kullanarak geliştirdiğiniz bir demo uygulamasına bu kod örnekleri deposuna katkıda bulunun.