En tant que pratique de l'API Qiita v2, j'ai écrit un script pour exporter tous les articles que j'ai publiés. Je vais le résumer après avoir étudié.
Ce que j'ai appris cette fois
Pour plus de détails, voir Document Qiita API v2 --Qiita: Developer, mais ici je ferai une note des principaux points.
Quant à l'impression, je pensais que c'était une sensation simple, très similaire à GitHub API v3.
Vous pouvez publier à partir de l'écran des paramètres après vous être connecté à Qiita. Vous pouvez accéder à l'API en tant qu'utilisateur authentifié en l'incluant simplement dans l'en-tête de la demande.
Vous pouvez choisir parmi plusieurs types d'autorisations de jeton, mais si vous n'avez pas GET, read_qiita suffira.
Ce qui suit est le cas lorsque https://qiita.com/api/v2/authenticated_user/items (liste des publications des utilisateurs authentifiés) est GET, mais que l'en-tête de réponse ressemble à ce qui suit.
{
"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"
}
Il y a plusieurs choses, mais je pense que les valeurs suivantes sont souvent vues.
--Rate-Limit: nombre maximum de requêtes. 1000 fois ici.
Je voulais juste sauvegarder l'article de Qiita, alors j'ai écrit un script "récupérez tous les articles que j'ai publiés".
Le livrable a été téléchargé sur GitHub. Windows + Python 2.7. C'est pour moi, donc c'est une petite omission. Par exemple, comme il ne prend pas en charge la pagination, vous ne pouvez pas obtenir plus de 100 cas.
Il s'est avéré être quelque chose comme ça. Je l'ai également téléchargé sur GitHub.
# -*- 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):
"""Convertir en un nom de fichier valide sous Windows. """
ret = ustr
#Exclure les caractères qui ne peuvent pas être utilisés comme noms de fichier.
invalid_chars = u'\\/:*?"<>|'
for invalid_char in invalid_chars:
ret = ret.replace(invalid_char, u'')
#Encoder avec encodage terminal.
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 des messages des utilisateurs authentifiés
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 des messages des utilisateurs authentifiés - Documentation Qiita API v2 https://qiita.com/api/v2/docs#get J'ai utilisé -apiv2authenticated_useritems
.
Lorsque vous faites cela, les données de publication seront renvoyées sous forme de tableau. Pour plus de détails sur les données publiées, voir Publié par l'utilisateur - Document Qiita API v2. Les éléments suivants sont-ils importants?
--rendered_body: corps HTML
Cette fois, j'ai décidé de l'enregistrer comme valeur de corps.
J'ai utilisé la bibliothèque Python 2.7 requests. Comme HTTP pour les humains., Il est très facile à utiliser.
Pour Python, je sais que 3.x est le courant dominant, mais j'y suis habitué, alors j'ai utilisé 2.7: sweat:
Cela ne peut pas être aidé s'il est trop élaboré, alors je l'ai simplifié comme suit.
--1 message = enregistrer sous 1 fichier
(titre de l'article) .md
--Enregistrer dans le même répertoire que le scriptCependant, dans le cas de Windows, certaines mises en garde sont reflétées dans le script.
sys.stdout.encoding
et obtenez le codage du terminal. Convertissez en conséquence et économisez
--Il existe des symboles demi-largeur qui ne peuvent pas être utilisés comme noms de fichiers sous Windows → SupprimerJe pense que je comprends l'utilisation minimale, alors j'aimerais jouer avec d'autres choses. Un article connexe a déjà été publié sur Qiita, je vais donc le lire également.
À propos, la limite de débit de l'API Qiita v2 est de 1000 fois / h, elle peut donc être utilisée environ 16 fois en 1 minute. Ce ne sera pas un problème si vous n'en abusez pas.
Recommended Posts