更新calibre-web豆瓣插件calibre-web-douban-api

最近豆瓣更新了反爬政策嗤锉,連封面圖片也不允許直接訪問虫溜,越來越嚴格了合敦,以前的calibre-web-douban-api插件不能正常獲取封面,因此只能想其他辦法來實現(xiàn)封面的獲取豌汇。

插件已更新到最新幢炸,本文是記錄插件獲取封面的技術實現(xiàn),使用參考:https://fugary.com/?p=238

源碼地址:https://github.com/fugary/calibre-web-douban-api/blob/main/src/NewDouban.py

如何實現(xiàn)

其實獲取封面只需要指定Refer=https://book.douban.com頭信息就可以了拒贱。

calibre-web是第三方開源服務宛徊,在不能修改其源碼的情況下,要實現(xiàn)豆瓣封面需要處理兩個問題:

  1. 封面的預覽
  2. 封面下載

封面預覽

封面預覽實際是從瀏覽器根據(jù)豆瓣的封面url直接發(fā)起請求柜思,沒有辦法增加頭信息(Chrome瀏覽器插件倒是可以實現(xiàn))岩调,因此只能通過本地服務代理訪問豆瓣url

代理地址

calibre-web是用flask開發(fā)赡盘,可以考慮引入flask的藍圖對象号枕,自己添加一個路由地址,在路由中轉發(fā)請求陨享,參考代碼:

from cps.search_metadata import meta
from flask import request, Response

@meta.route("/metadata/douban_cover", methods=["GET"])
def proxy_douban_cover():
    cover_url = urllib.parse.unquote(request.args.get('cover'))
    res = requests.get(cover_url, headers=DEFAULT_HEADERS)
    return Response(res.content, mimetype=res.headers['Content-Type'])

這樣就實現(xiàn)了葱淳,通過本地的/metadata/douban_cover?cover=https://xxxx地址顯示封面了。

服務地址

有了本地代理服務抛姑,然后就需要在返回封面數(shù)據(jù)的時候把這個代理服務替換原始的豆瓣封面地址赞厕。

這里有點麻煩,因為flaskrequest對象是通過線程本地變量實現(xiàn)定硝,元數(shù)據(jù)服務又是通過線程池去獲取元數(shù)據(jù)皿桑,線程池中是獲取不到request對象的,嘗試獲取將會報錯。

{RuntimeError}RuntimeError('Working outside of request context.\n\nThis typically means that you attempted to use functionality that needed\nan active HTTP request. Consult the documentation on testing for\ninformation about how to avoid this problem.')

因此只有在元數(shù)據(jù)獲取之后诲侮、往外輸出之前來修改封面地址镀虐,這里通過繼承MetaRecord重寫魔法函數(shù)__getattribute__來實現(xiàn)封面url地址的替換,參考代碼:

@dataclasses.dataclass
class DoubanMetaRecord(MetaRecord):

    def __getattribute__(self, item):  # cover通過本地服務代理訪問
        if item == 'cover' and DOUBAN_PROXY_COVER:
            cover_url = super().__getattribute__(item)
            if cover_url:
                try:
                    host_url = DOUBAN_PROXY_COVER_HOST_URL
                    if not host_url and request.host_url:
                        host_url = request.host_url
                    if host_url and host_url not in cover_url:
                        self.cover = host_url + DOUBAN_PROXY_COVER_PATH + urllib.parse.quote(cover_url)
                except BaseException:
                    pass
        return super().__getattribute__(item)

這樣就實現(xiàn)了豆瓣封面預覽功能了沟绪。

如果獲取的服務器地址不正確刮便,可以手動指定DOUBAN_PROXY_COVER_HOST_URL='http://nas_ip:8083/'

封面下載

這個本地代理地址不能實現(xiàn)封面下載,因為如果在保存封面的flask路由中再次訪問其他flask路由會卡死绽慈,感覺是因為沒有開啟flask的多線程處理請求的原因恨旱,在不修改calibre-web的情況下,要實現(xiàn)封面下載坝疼,可以覆蓋calibre-webhelper.save_cover_from_url方法搜贤,用自己寫的方法去替換掉save_cover_from_url,在檢測到是douban的封面地址的情況下裙士,用requests去下載封面數(shù)據(jù)入客,代碼如下:

    @staticmethod
    def hack_helper_cover():
        save_cover = helper.save_cover_from_url
        def new_save_cover(url, book_path):
            if DOUBAN_COVER_DOMAIN in url:
                cover_url = url
                if DOUBAN_PROXY_COVER:
                    component = urllib.parse.urlparse(url)
                    query = urllib.parse.parse_qs(component.query)
                    cover_url = urllib.parse.unquote(query.get('cover')[0])
                res = requests.get(cover_url, headers=DEFAULT_HEADERS)
                return helper.save_cover(res, book_path)
            else:
                return save_cover(url, book_path)
        helper.save_cover_from_url = new_save_cover

這樣就實現(xiàn)了封面預覽和下載了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末腿椎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夭咬,更是在濱河造成了極大的恐慌啃炸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卓舵,死亡現(xiàn)場離奇詭異南用,居然都是意外死亡,警方通過查閱死者的電腦和手機掏湾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門裹虫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人融击,你說我怎么就攤上這事筑公。” “怎么了尊浪?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵匣屡,是天一觀的道長。 經常有香客問我拇涤,道長捣作,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任鹅士,我火速辦了婚禮券躁,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己也拜,他們只是感情好旭贬,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搪泳,像睡著了一般稀轨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岸军,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天奋刽,我揣著相機與錄音,去河邊找鬼艰赞。 笑死佣谐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的方妖。 我是一名探鬼主播狭魂,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼党觅!你這毒婦竟也來了雌澄?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤杯瞻,失蹤者是張志新(化名)和其女友劉穎镐牺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魁莉,經...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡睬涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旗唁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦浓。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖检疫,靈堂內的尸體忽然破棺而出讶请,到底是詐尸還是另有隱情,我是刑警寧澤电谣,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布秽梅,位于F島的核電站,受9級特大地震影響剿牺,放射性物質發(fā)生泄漏企垦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一晒来、第九天 我趴在偏房一處隱蔽的房頂上張望钞诡。 院中可真熱鬧,春花似錦、人聲如沸荧降。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朵诫。三九已至辛友,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剪返,已是汗流浹背废累。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脱盲,地道東北人邑滨。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像钱反,于是被迫代替她去往敵國和親掖看。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內容