Bo○kQから学生を守りたい

プログラミング

お久しぶりです,ぴのです.新年度が始まってから講義やら研究やらで忙しくなってきました.講義はオンラインで開講されるものがほとんどですが,研究室で受ける方が捗るし学食でメシを食えるので毎日足を運んでいます.

さて,久しぶりに講義を受けるとたまに登場するのが「Bo○kQ(旧:Bo○kRoll)」です.知らない人のために説明すると,大学などで講義スライドなどを閲覧することのできるwebビューアのことです.Bo○kQ自体はメモ機能や栞機能などがあって便利といえば便利なのですが(使ったことないけど),このビューアには「スライドをダウンロードできない」という学生にとって致命的な欠陥があります.なぜそんな欠陥があるかというと,「教材をダウンロードできない」という機能がBo○kQの目的の一つだからです(参考).

今回はそんなBo○kQからPDFを頂戴するプログラムを書いてみました.

注意点

講義スライドは著作物です。講義スライドをダウンロードする行為はわりとグレーゾーンなことなので取り扱いには注意しましょう。何かあっても管理人は責任はとれないぞ。

実行手順

必要ライブラリをインストールする

pip install requests bs4 img2pdf

プログラムを書く

プログラムの大まかな流れはこんな感じです。

  1. Bo○kQにログインする
  2. スライドの画像ファイル(.jpg)をダウンロードする
  3. スライドをPDFに変換する
import os
import time
import shutil

import requests
from bs4 import BeautifulSoup
import img2pdf

bookq = 'https://bookq.s.kyushu-u.ac.jp'
your_id = '0000000000' #ID
your_pass = 'XXXXXXXXXXX' #パスワード
book_id = '14dad...' #スライドのURLにあるそれっぽいID
file_name = 'output.pdf' #出力ファイルの名前

#ログイン
s = requests.session()
login = s.get(f'{bookq}/login')
soup = BeautifulSoup(login.text, 'html.parser')
csrf = soup.select_one('input[name=_csrf]').get('value')
login = s.post(f'{bookq}/login', data={'userid': your_id, 'password': your_pass,'_csrf': csrf})

#ファイルの取得
def get_pdf(book_id, file_name='output.pdf'):
    os.mkdir('tmp/')
    for page in range(1, 1000):
        r = s.get(f'{bookq}/contents/unzipped/{book_id}_2/OPS/images/out_{page}.jpg', stream=True)
        if r.status_code == 200:
            with open(f'tmp/img{str(page).zfill(3)}.jpg', 'wb') as f:
                f.write(r.content)
            time.sleep(1)
        else:
            with open(file_name,'wb') as f:
                f.write(img2pdf.convert([f'tmp/{j}' for j in sorted(os.listdir('tmp/'))]))
            shutil.rmtree('tmp/')
            break
            
get_pdf(book_id=book_id, file_name=file_name)

実行する

IDなどの各変数に値をセットして実行するとスライドを取得できます!sleepを挟んでいるため若干時間がかかることに注意。

おわりに

管理人のゴールデンウィークは全くゴールデンじゃないらしいぞ

+3

コメント

タイトルとURLをコピーしました