API:Madde fikirleri oluşturucu

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

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'ı kurmanız gerekir.

Bu uygulama, yeni Python projeleri için önerilen sürüm olan Python3'ü kullanır.

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
Bu komut, Flask paketini tüm bağımlılıkları ile 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, render_template

app = Flask(__name__)

@app.route('/')
def index():
    """ '/' altında erişilebilen dizin sayfasını görüntüler
    """
    return render_template('places.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

Bu basit uygulamada, 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ı, bir Google Font Amatic 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="//fonts.googleapis.com/css?family=Amatic+SC:700">
<link rel="stylesheet" href="//fonts.googleapis.com/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/static.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;
}
 
Madde oluşturma fikirleri demo uygulaması

Uygulama düzeni

$HOME/article-ideas-generator
├── templates/
│   └── articles.html
├── static/
│   └── static.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ül
  • page=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
Ayrıştırma modülü hakkında daha fazla bilgi için API:Vikimetin ayrıştırma sayfasına bakın.
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.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/static.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;
}
 
Demo uygulamasında Choose a category sayfası

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'
 
Demo uygulamasında Choose a subcategory sayfası. Natural Sciences kategorisi için alt kategoriler gösteriliyor (yukarıdaki ekran görüntüsüne bakın)

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ır
  • gpllimit=20 - alınacak bağlantı sayısı
Ayrıştırma modülü hakkında daha fazla bilgi için API:Links sayfasına bakın.
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 %}
 
Demo uygulamasında Missing links sayfası

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="//fonts.googleapis.com/css?family=Amatic+SC:700">
<link rel="stylesheet" href="//fonts.googleapis.com/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.

Ayrıca bakınız