Ich habe ein Python-Skript geschrieben, das alle meine Beiträge mit der Qiita API v2 exportiert

Als Übung für Qiita API v2 habe ich ein Skript geschrieben, um alle Artikel zu exportieren, die ich gepostet habe. Ich werde es nach dem Studium zusammenfassen.

Was ich diesmal gelernt habe

Informationen zur Qiita API v2

Weitere Informationen finden Sie unter Qiita API v2-Dokument - Qiita: Entwickler. Hier sind jedoch einige Punkte zu beachten.

Der Eindruck war für mich ein einfaches Gefühl, ähnlich wie bei GitHub API v3.

Allgemeines

So erstellen Sie ein Zugriffstoken

Sie können nach dem Anmelden bei Qiita über den Einstellungsbildschirm veröffentlichen. Sie können die API als authentifizierter Benutzer aufrufen, indem Sie dies einfach in den Anforderungsheader aufnehmen.

Sie können aus verschiedenen Arten von Token-Berechtigungen auswählen. Wenn Sie jedoch nicht über GET verfügen, reicht read_qiita aus.

Antwort-Header-Beispiel

Das Folgende ist der Fall, wenn https://qiita.com/api/v2/authenticated_user/items (Liste der Beiträge authentifizierter Benutzer) GET ist, der Antwortheader jedoch wie folgt aussieht.

{
  "Rate-Reset": "1500863004",
  "X-XSS-Protection": "1; mode=block",
  "X-Content-Type-Options": "nosniff",
  "Rate-Remaining": "989",
  "transfer-encoding": "chunked",
  "Total-Count": "8",
  "Vary": "Origin",
  "X-Request-Id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
  "Rate-Limit": "1000",
  "Server": "nginx",
  "Connection": "keep-alive",
  "X-Runtime": "0.431045",
  "ETag": "W/\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"",
  "Link": "<https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100>; rel=\"first\", <https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100>; rel=\"last\"",
  "Cache-Control": "max-age=0, private, must-revalidate",
  "Date": "Mon, 24 Jul 2017 01:53:18 GMT",
  "X-Frame-Options": "SAMEORIGIN",
  "Content-Type": "application/json; charset=utf-8"
}

Es gibt verschiedene Dinge, aber ich denke, die folgenden Werte werden oft gesehen.

--Rate-Limit: Maximale Anzahl von Anfragen. 1000 mal hier. --Rate-Remaining: Wie viele weitere Anfragen kann ich stellen? Hier 989 mal (schon 11 mal angefordert) --Rate-Reset: Die Zeit, die die Wiederherstellung der Rate-Remaining benötigt. Epochenzeit. Hier 1500863004 = Montag, 24. Juli 2017, 11:23:24 Uhr --Link: Paginierungsinformationen wie "Welche Seite erhalten Sie jetzt?" Oder "Wie lautet die URL für die nächste / vorherige Seite", wenn Sie nicht alle Elemente gleichzeitig abrufen können. --Total-Count: Die Anzahl der erfassten Daten. 8 Fälle hier.

Skriptimplementierung

Ich wollte nur den Qiita-Artikel sichern, also schrieb ich ein Skript, das "alle Artikel abruft, die ich gepostet habe".

Das Artefakt wurde auf GitHub hochgeladen. Windows + Python 2.7. Es ist für mich, also ist es eine kleine Auslassung. Da die Paginierung beispielsweise nicht unterstützt wird, können Sie nicht mehr als 100 Fälle erhalten.

Vollständiges Skript

Es stellte sich heraus, dass es so etwas war. Ich habe es auch auf GitHub hochgeladen.

# -*- coding: utf-8 -*-

import json
import os
import sys

import requests

def abort(msg):
    print 'Error!: {0}'.format(msg)
    sys.exit(1)

def ustr2filename(ustr):
    """Konvertieren Sie unter Windows in einen gültigen Dateinamen. """

    ret = ustr

    #Schließen Sie Zeichen aus, die nicht als Dateinamen verwendet werden können.
    invalid_chars = u'\\/:*?"<>|'
    for invalid_char in invalid_chars:
        ret = ret.replace(invalid_char, u'')

    #Mit Terminalcodierung codieren.
    ret = ret.encode(sys.stdout.encoding)

    return ret

def get(url, params, headers):
    r = requests.get(url, params=params, proxies=proxies, headers=headers)
    return r

def post(url, data_dict, headers_dict):
    r = requests.post(url, data=json.dumps(data_dict),
                      proxies=proxies, headers=headers_dict)
    return r

def print_response(r, title=''):
    c = r.status_code
    h = r.headers
    print '{0} Response={1}, Detail={2}'.format(title, c, h)

def assert_response(r, title=''):
    c = r.status_code
    h = r.headers
    if c<200 or c>299:
        abort('{0} Response={1}, Detail={2}'.format(title, c, h))

class Article:
    def __init__(self, d):
        self._title      = d['title']
        self._html_body  = d['rendered_body']
        self._md_body    = d['body']
        self._tags       = d['tags']
        self._created_at = d['created_at']
        self._updated_at = d['updated_at']
        self._url        = d['url']

        user = d['user']
        self._userid   = user['id']
        self._username = user['name']

    def save_as_markdown(self):

        title = ustr2filename(self._title)
        body  = self._md_body.encode('utf8')

        filename = '{0}.md'.format(title)
        fullpath = os.path.join(MYDIR, filename)
        with open(fullpath, 'w') as f:
            f.write(body)

    def list2file(filepath, ls):
        with open(filepath, 'w') as f:
            f.writelines(['%s\n' % line for line in ls] )

MYDIR = os.path.abspath(os.path.dirname(__file__))

proxies = {
    "http": os.getenv('HTTP_PROXY'),
    "https": os.getenv('HTTPS_PROXY'),
}
token = os.getenv('QIITA_ACCESS_TOKEN')
headers = {
    'content-type'  : 'application/json',
    'charset'       : 'utf-8',
    'Authorization' : 'Bearer {0}'.format(token)
}

#Liste der Beiträge authentifizierter Benutzer
url = 'https://qiita.com/api/v2/authenticated_user/items'
params = {
    'page'     : 1,
    'per_page' : 100,
}
r = get(url, params, headers)
assert_response(r)
print_response(r)

items = r.json()
print '{0} entries.'.format(len(items))
for i,item in enumerate(items):
    print '[{0}/{1}] saving...'.format(i+1, len(items))
    article = Article(item)
article.save_as_markdown()

Qiita API verwendet

Liste der Beiträge von authentifizierten Benutzern - Qiita API v2-Dokumentation https://qiita.com/api/v2/docs#get Ich habe -apiv2authenticated_useritems verwendet.

Wenn Sie dies tun, werden die Post-Daten als Array zurückgegeben. Einzelheiten zu den veröffentlichten Daten finden Sie unter Gepostet vom Benutzer - Qiita API v2-Dokument. Sind die folgenden wichtig?

--rendered_body: HTML-Body --body: Manuskript im Markdown-Format --title: Beitragstitel

Dieses Mal habe ich beschlossen, es als Wert des Körpers zu speichern.

Sprache und Bibliothek verwendet

Ich habe die Python 2.7 [Anfragen] -Bibliothek (http://requests-docs-ja.readthedocs.io/en/latest/) verwendet. Als HTTP für Menschen ist es sehr einfach zu bedienen.

Für Python weiß ich, dass 3.x der Mainstream ist, aber ich bin daran gewöhnt, also habe ich 2.7 verwendet: Schweiß:

Konservierungsmethode

Es kann nicht geholfen werden, wenn es zu aufwendig ist, also habe ich es wie folgt einfach gemacht.

--1 post = als 1 Datei speichern

Im Fall von Windows gibt es jedoch einige Einschränkungen, die sich im Skript widerspiegeln.

abschließend

Ich denke, ich verstehe die minimale Nutzung, also würde ich gerne mit anderen Dingen herumspielen. Ein verwandter Artikel wurde bereits auf Qiita veröffentlicht, daher werde ich ihn auch lesen.

Übrigens beträgt das Ratenlimit der Qiita API v2 1000-mal / h, sodass es in 1 Minute etwa 16-mal verwendet werden kann. Es wird in Ordnung sein, wenn Sie es nicht missbrauchen.

Recommended Posts

Ich habe ein Python-Skript geschrieben, das alle meine Beiträge mit der Qiita API v2 exportiert
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Erstellt einen Python-Wrapper für die Qiita-API
Ein Memo, das ich schnell in Python geschrieben habe
Python Qiita API Wrapper "qiipy" gemacht
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Ich habe ein Skript geschrieben, um die Schluckuhr wiederzubeleben, die bald sterben wird
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Ich habe das Windows PowerShell-Kochbuch durch ein Python-Skript ersetzt.
Ich habe mit Lambda eine App erstellt, die LINE über die Qiita-API über "Likes" informiert.
Ich habe versucht, die Qiita-API zu berühren
Verschiedene Hinweise zur Verwendung von Python für Projekte
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe Chatbot mit LINE Messaging API und Python erstellt
Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
[Ev3dev] Erstellen Sie ein Programm, das das LCD (Bildschirm) mit Python erfasst
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Ein Skript, das 0, 1 an die erste Python-Primzahl zurückgibt
Ich habe Chatbot mit der LINE Messaging API und Python (2) ~ Server ~ erstellt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe die Warteschlange in Python geschrieben
Ich habe versucht, die checkio-API zu verwenden
Ich habe den Stack in Python geschrieben
Ich habe mein eigenes Recherchetool mit der Gesetzes-API [Smart Roppo] erstellt.
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Python-Skript, das mithilfe der Bing-Image-Suche automatisch typische Bilder sammelt
[Python] Ich habe einen einfachen Code geschrieben, der automatisch AA generiert (Ascii Art).
AtCoder-Autor Ich habe ein Skript geschrieben, das Wettbewerbe für jeden Autor zusammenfasst
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe einen Korpusleser geschrieben, der die Ergebnisse der MeCab-Analyse liest
[IOS] Ich habe ein Widget erstellt, das den Trend von Qiita in Pythonista3 anzeigt. [Python]
Ich habe FizzBuzz in Python mit der Support Vector Machine (Bibliothek LIVSVM) geschrieben.
Versuchen Sie es mit der Wunderlist-API in Python
Klasse, die die API von DMM trifft
Versuchen Sie, die Kraken-API mit Python zu verwenden
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Tweet mit der Twitter-API in Python
Führen Sie den Python-Interpreter im Skript aus
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
[Python-Anfänger] Ich habe die Artikel gesammelt, die ich geschrieben habe
Ein Programm, das Python zum Abspielen von Junk verwendet
Implementierter Python-Wrapper für Qiita API v2
[Python] Ein Programm, das die Partitur rundet
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Lassen Sie Python die durchschnittliche Punktzahl einer Seite mithilfe der PageSpeed Insights-API messen
Python-Skript, das SQL-Dateien liest, BigQuery ausführt und CSV speichert
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Holen Sie sich eine Liste der Artikel, die von Benutzern mit Python 3 Qiita API v2 veröffentlicht wurden