3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Qiita API v2 でPythonista(3) の記事を取得する(Pythonista3 Advent Calendar 2022 前夜祭0日目)

Last updated at Posted at 2022-11-30

この記事は、Pythonista3 Advent Calendar 2022 の00日目(前夜祭)の記事です。

一方的な偏った目線で、Pythonista3 を紹介していきます。

ほぼ毎日iPhone(Pythonista3)で、コーディングをしている者です。よろしくお願いします。

以下、私の2022年12月時点の環境です。

--- SYSTEM INFORMATION ---
**System Information**

* Pythonista 3.3 (330025), Default interpreter 3.6.1
* iOS 16.1.1, model iPhone12,1, resolution (portrait) 828.0 x 1792.0 @ 2.0

他の環境(iPad や端末の種類、iOS のバージョン違い)では、意図としない挙動(エラーになる)なる場合もあります。ご了承ください。

ちなみに、model iPhone12,1 は、iPhone11 です。

Pythonista3 Advent Calendar 2022 前夜祭

いよいよ、明日からQiita Advent Calendar 2022 がはじまりますね!

つまり、Pythonista3 Advent Calendar 2022 もはじまります。

25日間全記事が私ですね。よろしくお願いします。

11月頃のAdvent Calendar 案内リリース前後にPythonista3 で、Core ML を使ったVision にて顔認識が成功してしまいまして。。。

それに気をよくした勢いでAdvent Calendar に登録をしてしまいました。という経緯でございます。

結果、このようにもりもりと、記事を量産している次第であります。

img221130_005654.gif

モチベーションあげてこー

Pythonista3 の面白さ楽しさを紹介したい思いは強いのです。

が、25記事。。。年末。。。

Advent Calendar なのだからクリスマス・年末に向けているので当たり前なのですが。。。

あかん、もう、12月が来てしまう。。。

本来はAdvent Calendar 本編の記事を進めなくてはいけないのは重々承知の上なのですが、なぜか前夜祭として前日に1記事追加している始末。。。

みんな!!オラに元気を可能な限りわけてくれ!たのむ!

みんなの元気、、、?

Qiita の登録もAdvent Calendar 登録を機におこないました。

なのでまだ、登録ユーザー側のQiita は全く理解していません。

このギリギリのタイミングで、改めて投稿の方法などをみている時に、API の存在に気がつきました。

「そうだ、Qiita のPythonista3 の記事をAPI の力で集めてみよう」

まだ、本格的に記事のアップや公開までもしていないのに、いらん事を思いついてしまいました。

思い立ったが吉日。どうにもやめられない性分なのです。

Qiita API v2 から、Pythonista3 タグ記事を集める

先にお断りをしておきます。

普段はAPI で何かする。とか全くしておらず、今回は雰囲気でなんとかしています。

とりあえず「適当に作ったらうごいたあああああああ!!」状態でございます。色々と教えてください。

こちらと睨めっこし、進めました。

GET /api/v2/tags | Qiita API v2ドキュメント - Qiita:Developer

以下、コードの全貌です(恥ずかしい)

qiitaAPIv2.py
from pathlib import Path
import requests


def get_accesstoken():
  _path = Path().home() / 'Documents' / 'qiitaAccessToken.txt'
  return _path.read_text().replace('\n', '') if _path.exists() else None


TOKEN = get_accesstoken()
HEADERS = {'Authorization': f'Bearer {TOKEN}'} if TOKEN else None
URL = 'https://qiita.com/api/v2/tags/'


def get_tag_items_count(tag_name):
  url = URL + tag_name
  r = requests.get(url, headers=HEADERS)
  text_json = r.json()
  return int(text_json['items_count'])  # int 追い掛け


def get_item_list(tag_name, items_count):
  item_list = []
  url = URL + tag_name + '/items'
  count = (items_count // 100) + 1  # 100記事以上あれば
  for c in range(count):
    params = {
      'page': f'{c + 1}',
      'per_page': '100',
    }
    r = requests.get(url, params=params, headers=HEADERS)
    items_json = r.json()
    for item in items_json:
      item_list.append([
        item['title'],
        item['url'],
        item['user']['id'],
        item['created_at'],
      ])
  return item_list


def get_qiita():
  pool_list = []
  tags = ['Pythonista3', 'Pythonista']
  for tag in tags:
    count = get_tag_items_count(tag)
    item_list = get_item_list(tag, count)
    pool_list.extend(item_list)
  return list(map(list, set(map(tuple, pool_list))))  # 重複しているものを削除


def out_md_format(tag_item_list):
  out_txt = ''
  for item in tag_item_list:
    # 力技
    out_txt += f'- [{item[0]}]({item[1]})\n  - {item[2]}\n  - {item[3]}\n\n'
  print(out_txt)
  print(f'\n{len(tag_item_list)} 記事')


if __name__ == '__main__':
  qiita_list = get_qiita()
  l = sorted(qiita_list, key=lambda x: x[3], reverse=True)  # 作成日でソート
  out_md_format(l)

取得まで少し時間がかかります。

img221130_012543.gif

なんと、ざっくり取得して183 もの記事があるのですね!

img221130_150819.png

最新の記事は、take_me さんの【Pythonista3】ActivityIndicatorの使い方 - Qiita でございました!

記事の内容がなかなか攻めていて、@ui.in_background のことも紹介されており、最高ですよね!

ActivityIndicator は、過去使ってみようと思いつつ実際やっていなかったので今度試してみたいものです☺️

(かんたんな)コード説明

後で判明しましたが、access token は必須ではないです。トークンがあれば試行回数が増える感じでした。

このコードを試す程度でしたら、access token は不要ですね。

今回は、access token なくても動くようにしています。

requests モジュール

Pythonista3 にデフォルトで入っているので使いました。完全に雰囲気で使ってます!

記事全部取得ができず(100記事まで?)

  • 何記事あるか確認
  • 記事数に合わせて取得

そのたびに、requests.get しております。こんなにrequests.get って呼び出すのかしらん?と、モヤっとしていますです。

また、今回検索tag が'Pythonista3', 'Pythonista' の2つあるので、上記の流れを2回行っていることになります。

get したもの

返ってきたjson から、タイトル・URL ・ユーザー名・作成日をlist で突っ込んでいます。本来はdic なのかもしれませんね。

items_json = r.json()

item_list = []

for item in items_json:
  item_list.append([
    item['title'],
    item['url'],
    item['user']['id'],
    item['created_at'],
  ])

Pythonista3 の内容ではなく、Pythonista (Python を書く人)のことも、持ってきてるかもしれませんが、そのあたりは無視してます!

それなりに整える

PythonistaPythonista3 両方で、tag 登録の可能性もあるので、重複を削除:

list(map(list, set(map(tuple, pool_list))))

作成日で並び替え:

sorted(qiita_list, key=lambda x: x[3], reverse=True)

自分でlist 作って格納しているので、インデックス指定の力技です。

出力

100を越えるリンク集を記事として公開すると、スパム扱いされそうなので自重しますが、自分用にMarkdown 形式に:

out_txt += f'- [{item[0]}]({item[1]})\n  - {item[2]}\n  - {item[3]}\n\n'

print 出力すると、Pythonista3 のconsole ではハイパーリンク認識をしてくれるので、URL をタップするとPythonista3 内部のブラウザが立ち上がります。

img221130_151040.png

Pythonista3 の内部処理を細かく確認してないですが、多分UIWebView を使っているのではないだろうか、、、

UIWebViewを使用するAppのアップデート期限の延長 - 最新ニュース - Apple Developer

ここらへんの、ドキドキ感があります。

API 登録

実際のところAPI 登録する必要なかったかもなのですが、私は登録したので、その流れを紹介していきます。

  • 右上の自身のアカウントアイコンをタップ
  • [設定] をタップ

img221130_171137.png

  • [アプリケーション] をタップ

img221130_171534.png

  • 下の方にスクロール
  • 新しくトークンを発行する をタップ

img221130_171654.png

  • アクセストークンの説明 に良きな内容を入力
    • 今回はPythonista3TagSearch
  • read_qiita を選択
  • [発行する] をタップ

img221130_171806.png

  • トークン文字列が出ているのでコピー

img221130_172013.png

(私は)コピーした文字列を、ScriptLibrary 直下にqiitaAccessToken.txt として保存しました。

Advent Calendar 楽しみー

明日から始まるAdvent Calendar 楽しみですね!

私もQiita にあるPythonista3 の記事読んでモチベーションあげて、Pythonista3 Advent Calendar 2022 頑張りたいと思います。

この記事のように、所々にスクリーンショットやGIF でのキャプチャを入れて、なるべく楽しげにやっていきます。

もしかすると、そこら辺の読み込みで表示遅くなっていたらすみません。。。

ここまで、読んでいただきありがとうございました。

せんでん

Discord

Pythonista3 の日本語コミュニティーがあります。みなさん優しくて、わからないところも親身に教えてくれるのでこの機会に覗いてみてください。

書籍

iPhone/iPad でプログラミングする最強の本。

その他

  • サンプルコード

Pythonista3 Advent Calendar 2022 でのコードをまとめているリポジトリがあります。

コードのエラーや変なところや改善点など。ご指摘やPR お待ちしておりますー

  • Twitter

なんしかガチャガチャしていますが、お気兼ねなくお声がけくださいませー

  • GitHub

基本的にGitHub にコードをあげているので、何にハマって何を実装しているのか観測できると思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?