J'ai écrit un script Python qui exporte tous mes articles à l'aide de l'API Qiita v2

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

À propos de l'API Qiita v2

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.

Général

Comment créer un jeton d'accès

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.

Exemple d'en-tête de réponse

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.

Implémentation de script

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.

Script complet

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()

API Qiita utilisée

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.

Langue et bibliothèque utilisées

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:

Méthode de conservation

Cela ne peut pas être aidé s'il est trop élaboré, alors je l'ai simplifié comme suit.

--1 message = enregistrer sous 1 fichier

Cependant, dans le cas de Windows, certaines mises en garde sont reflétées dans le script.

en conclusion

Je 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

J'ai écrit un script Python qui exporte tous mes articles à l'aide de l'API Qiita v2
Création d'un script Python prenant en charge l'API e-Stat (ver.2)
J'ai écrit un script qui divise l'image en deux
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
Création d'un wrapper Python pour l'API Qiita
Un mémo que j'ai écrit un tri rapide en Python
Création du wrapper d'API Qiita Python "qiipy"
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai écrit un script pour relancer la montre gulp qui mourra bientôt
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Un mémo que j'ai touché au magasin de données avec python
Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python
J'ai remplacé le livre de recettes Windows PowerShell par un script python.
J'ai créé une application avec Lambda qui notifie LINE de "j'aime" à l'aide de l'API Qiita.
J'ai essayé de toucher l'API Qiita
Notes diverses sur l'utilisation de python pour les projets
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
Script Python qui compare le contenu de deux répertoires
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
J'ai écrit une fonction pour charger le script d'extension Git en Python
[Ev3dev] Créez un programme qui capture LCD (écran) en utilisant python
J'ai écrit un script pour extraire les liens de pages Web en Python
Un script qui renvoie 0, 1 attaché au premier Python prime
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
J'ai fait un Line-bot avec Python!
J'ai écrit la file d'attente en Python
J'ai essayé d'utiliser l'API checkio
J'ai écrit la pile en Python
J'ai créé mon propre outil de recherche à l'aide de l'API Law [Smart Roppo]
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
Script Python qui collecte automatiquement des images typiques à l'aide de la recherche d'images Bing
[Python] J'ai écrit un code simple qui génère automatiquement AA (Ascii Art)
Écrivain AtCoder J'ai écrit un script qui regroupe les concours pour chaque écrivain
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai écrit un lecteur de corpus qui lit les résultats de l'analyse MeCab
[IOS] J'ai créé un widget qui affiche la tendance de Qiita dans Pythonista3. [Python]
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
Essayez d'utiliser l'API Wunderlist en Python
Classe qui atteint l'API de DMM
Essayez d'utiliser l'API Kraken avec Python
J'ai essayé d'utiliser l'API de données YOUTUBE V3
Tweet à l'aide de l'API Twitter en Python
Exécuter l'interpréteur Python dans le script
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
[Python débutant] J'ai rassemblé les articles que j'ai écrits
Un programme qui utilise Python pour lire des fichiers indésirables
Implémentation du wrapper Python pour l'API Qiita v2
[Python] Un programme qui arrondit le score
J'ai essayé d'utiliser l'API BigQuery Storage
Laisser Python mesurer le score moyen d'une page à l'aide de l'API PageSpeed Insights
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
Obtenez une liste d'articles publiés par les utilisateurs avec Python 3 Qiita API v2