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
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.
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.
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.
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.
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()
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.
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ß:
Es kann nicht geholfen werden, wenn es zu aufwendig ist, also habe ich es wie folgt einfach gemacht.
--1 post = als 1 Datei speichern
(Artikeltitel) .md
Im Fall von Windows gibt es jedoch einige Einschränkungen, die sich im Skript widerspiegeln.
sys.stdout.encoding
ab und rufen Sie die Terminalcodierung ab. Entsprechend konvertieren und speichernIch 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