Qiita API v2에서 자신의 스톡을 모두 지우는 Python 스크립트를 작성해 보았습니다.

600건 이상 모여 있는 스톡을 전부 지우고 싶었으므로 써 보았습니다. 스크립트는 GitHub에 업로드 중.

Qiita API v2 정보



Qiita API v2의 일반 정보는 이전에 작성한 Qiita API v2를 사용하여 자신의 모든 게시물을 내보내는 Python 스크립트를 작성했습니다.으로 요약되어 있습니다.

스크립트 정보



동기



자신이 쓴 기사에 대한 반응만을 통보해 주었으면 하는데 「스탁한 기사」가 갱신되었을 때도 통지되어 버리는 것이 번거롭기 때문입니다.

운영에 문의해 보았는데, 이 통지를 끊는 방법은 현시점에서는 없다고 하는 것이었습니다.

그런데, 스톡을 지워 갈까요… 그래서 API를 사용하여 단번에 지우기로 결정했습니다.

(여담 1) 원래 왜 그렇게 재고하고 있습니까?



Qiita에는 "좋아요"와 "스톡"이 있지만, 나는 다음과 같이 인식하고 있습니다.
  • 좋아요 : 투고자에 대한 노력
  • 재고 : 개인 북마크

  • 항상 기계적으로 좋아요와 스톡을 동시에 실시했습니다.

    (여담 2) 결국 어떤 운용으로 했다?



    북마크 기능 부분은 좋아하는 게시물 에서 볼 수 있기 때문에 주식은 실시하지 않고 좋아하는 것만 하기로 했습니다.

    동작 데모



    다음은 우리 계정으로 시도한 예입니다. 665개의 스톡을 모두 지웁니다.
    $ python stock_canceler.py -u sta
    getting between 1 to 100...
    getting between 101 to 200...
    getting between 201 to 300...
    getting between 301 to 400...
    getting between 401 to 500...
    getting between 501 to 600...
    getting between 601 to 700...
    1/655 TITLE:Windows環境+node.js+mocha+istanbulでUTしてコードカバレッジを取る...
    2/655 TITLE:grunt+istanbul+mochaでNode.jsのテスト&カバレッジ計測を行う...
    3/655 TITLE:システムで「性別」の情報を扱う前に知っておくべきこと...
    ...
    653/655 TITLE:2015年センター試験数学IAを全てプログラム(Python)で解く...
    654/655 TITLE:100万倍速いプログラムを書く...
    655/655 TITLE:いい結婚相手を見つける最適な方法を検証してみた...
    Fin.
    
    $ python stock_canceler.py -u sta
    getting between 1 to 100...
    Fin.
    

    스크립트 구현



    사용한 Qiita API



    필요한 것은 다음 두 가지입니다.
  • (1) 지정된 사용자의 재고 목록을 가져옵니다.
  • GET /api/v2/users/:user_id/stocks
  • 사용자로 자신을 지정하면 자신의 재고 목록을 얻을 수 있습니다

  • (2) 지정한 기사를 자신의 스톡에서 DELETE 한다
  • DELETE /api/v2/items/:item_id/stock
  • 재고에서 지우고 싶은 기사 ID가 필요하지만 (1)에서 가져옵니다


  • 사용법으로는
  • 우선 (1)에서 자신의 스톡 목록을 모두 GET한다
  • GET 한 주식 목록을 스캔하여 ...
  • item_id 검색
  • (2) 요청 보내기


  • 이렇게 됩니다.

    사용한 언어 및 라이브러리


  • Python 3.6

  • requests 라이브러리

  • 페이지 네이션 정보



    Qiita API는 한 번에 100개까지만 데이터를 가져올 수 있으므로 100개보다 많은 데이터를 얻으려면 페이지네이션을 고려해야 합니다.

    문서를 따르면 응답의 Link 헤더나 Total-Count 이나를 보고, 능숙하게 반복 요청을 보내면 됩니다만, 귀찮았기 때문에 본 스크립트에서는 옆으로 착용하고 있습니다.

    아래에 코드를 발췌합니다.

    먼저 스톡 목록을 요청하는 코드는 다음과 같습니다.
    def get_stocks(target_userid, page, per_page):
        url = 'https://qiita.com/api/v2/users/{}/stocks'.format(target_userid)
        params = {
            'page'     : page,
            'per_page' : per_page,
        }
        r = get(url, params, headers)
    
        items = r.json()
        stocks = []
        is_last = False
    
        # int(r.headers['Total-Count']) 見た方が良い?
        # でも len(items) と Total-Count が食い違うケースはそうはないと思う(思いたい)ので
        # とりあえず len で判定.
        # ★ per_page(=100)件分取れなかった=データ全部取れた、とみなす
        if len(items) < per_page:
            is_last = True
    
        for i,item in enumerate(items):
            stock = Stock(item)
            stocks.append(stock)
    
    return [stocks, is_last]
    

    이것을 이하의 코드로 반복적으로 호출하는 것으로 페이지네이션(같은 것)을 실현하고 있습니다.
    PAGE_START_NO = 1
    target_userid = args.username
    per_page = 100
    
    cur_page = PAGE_START_NO
    all_stocks = []
    
    # ★ 1-100件、101-200件、というふうに繰り返すループ
    while True:
        a = (cur_page-1)*per_page + PAGE_START_NO
        b = a + per_page - 1
        print('getting between {} to {}...'.format(a, b))
    
        stocks, is_last = get_stocks(target_userid, cur_page, per_page)
        all_stocks.extend(stocks)
    
        if is_last:
            break
    
        cur_page += 1
    

    길지만 요컨대
  • 1-100번째를 가져온다
  • 101-200번째를 가져온다
  • ……

  • 라고 오로지 반복해 가고, 100건분 취할 수 없었던 시점을 끝으로 간주하고 있습니다. 나만의 스쿠리로 한 번만 실행하기 때문에 이런 걸로 좋을 것입니다

    결론



    이제 번거로운 주식 알림에서 왔습니다. API가 있으면 이러한 작업도 비교적 편하게 할 수 있기 때문에 좋네요.

    좋은 웹페이지 즐겨찾기