Qiita
Python
QiitaAPI
python3

Qiita ハック with Python#2

Pythonを使ってQiitaをいじる実験です。親記事: https://qiita.com/_____/items/d2d52823ea8ef763e3a7

過去の自分の投稿に、いいね、コメント、ストックしてくれた人をお礼にフォローしてみます。「いいね、コメント、ストック」は記事ごとに情報を取得するので、

  1. 過去の全投稿記事のIDを取得
  2. a各記事ごとにいいね等してくれたユーザ名を取得
  3. まだフォローしてなければフォロー

という手順を踏みます。2.の手順が記事投稿分になるのでAPI呼び出し数は、 3*投稿記事数 となることや、たくさんいいねされる人気者は 3.で登録するユーザ数分だけAPI呼び出しが走るので、APIの利用上限に引っかからないようにしましょう。いいねされていない投稿に関してはAPI呼び出しをしないという最適化が可能です。

import urllib, urllib.parse, urllib.request
import json

token = 'XXXXXX'
myname = '_____'

opener = urllib.request.build_opener()
opener.addheaders = [('Authorization', 'Bearer {}'.format(token)),]
urllib.request.install_opener(opener)

def get_mypostids():
  url = "https://qiita.com/api/v2/authenticated_user/items?per_page=100"
  data = json.load(urllib.request.urlopen(url))
  return [x['id'] for x in data]

def wholikes(postid):
  url = f"https://qiita.com/api/v2/items/{postid}/likes"
  data = json.load(urllib.request.urlopen(url))
  return [x['user']['id'] for x in data]

def whocomments(postid):
  url = f"https://qiita.com/api/v2/items/{postid}/comments"
  data = json.load(urllib.request.urlopen(url))
  return [x['user']['id'] for x in data]

def whostocks(postid):
  url = f"https://qiita.com/api/v2/items/{postid}/stockers?per_page=100"
  data = json.load(urllib.request.urlopen(url))
  return [x['id'] for x in data]

def my_following():
  _ = "https://qiita.com/api/v2/authenticated_user"
  uid = json.load(urllib.request.urlopen(_))['id']
  ret = []
  for i in range(3):
    url = f"https://qiita.com/api/v2/users/{uid}/followees?page={i+1}&per_page=100"
    data = json.load(urllib.request.urlopen(url))
    ret += [x['id'] for x in data ]
  return ret

def follow(uid):
  url = f"https://qiita.com/api/v2/users/{uid}/following"
  req = urllib.request.Request(url, method='PUT')
  urllib.request.urlopen(req)

if __name__ == '__main__':
  who = []
  for pid in get_mypostids():
    who += wholikes(pid)
    who += whocomments(pid)
    who += whostocks(pid)
  who = list(set(who))

  following = my_following()
  for user in who:
    if user not in following:
      follow(user)