Greasy Fork is available in English.

微信公众号文章图片格式转换与下载(WeChat Official Account Articles Automatically Download Tools)

微信公众号文章图片格式转换与下载, ON/OFF按钮可选择是否浏览时自动下载图片, 并额外支持豆瓣B站站点webp/avif转jpg。

// ==UserScript==
// @name           微信公众号文章图片格式转换与下载(WeChat Official Account Articles Automatically Download Tools)
// @author         Lepturus
// @description    微信公众号文章图片格式转换与下载, ON/OFF按钮可选择是否浏览时自动下载图片, 并额外支持豆瓣B站站点webp/avif转jpg。
// @include        *://mp.weixin.qq.com/*
// @include        *://mmbiz.qpic.cn/*
// @include        *://doubanio.com/*
// @include        *://*.douban.com/*
// @include        *://*.bilibili.com/read*
// @grant          GM_addStyle
// @version     1.3
// @namespace https://greasyfork.org/users/213516
// ==/UserScript==
GM_addStyle(".switch{position:relative;width:45px;height:17px;margin-bottom:-2px;display:inline-block} .switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ca2222;transition:.4s}.slider:before{position:absolute;content:'';height:13px;width:13px;left:2px;bottom:2px;background-color:#fff;transition:.4s}input:checked+.slider{background-color:#2ab934}input:checked+.slider:before{transform:translateX(28px)}.on{display:none}.off,.on{color:#fff;position:absolute;transform:translate(-50%,-50%);top:50%;left:50%;font-size:8px}input:checked+.slider .on{display:block} input:checked+.slider .off{display:none}.slider.round{border-radius:17px}.slider.round:before{border-radius:50%}")

var imgs = document.getElementsByTagName("img")

// 微信公众号文章批量下载按钮
if(document.getElementById('meta_content')){
    var dswitch = document.createElement ('label');
    dswitch.innerHTML = "<input id='d_switch' type='checkbox'><div class='slider round'><span class='on'>ON</span><span class='off'>OFF</span></div>";
    dswitch.setAttribute('class', 'switch');
    document.getElementById('meta_content').appendChild(dswitch);}

function downloadImg(url, name) {
    fetch(url).then(res => res.blob()).then((blob) => {
        const a = document.createElement('a');
        a.style.display = 'none';
        a.href = URL.createObjectURL(blob);
        a.download = name;
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
    });
}


function convert(){
    for (var i=0;i<imgs.length;i++)
    {
        // 转换是否为微信懒加载图片, jpeg&wxfrom=5&wx_lazy=1&wx_co=1
        if(imgs[i].src.includes('&wx_lazy')){
            // 图片转换为JPG
            imgs[i].src = imgs[i].src.replace(/&tp=webp&/g,"&tp=jpg&")
            if (document.getElementById("d_switch").checked){
                // 判断图片是否已下载
                imgs[i].src = imgs[i].src.replace(/&tp=jpg&.*/g,"")
                // s?__biz=MjM5MTEzODczMQ==&mid 为微信旧版URL
                let filename = document.URL.replace(/.*\/s\//,"").replace(/\?poc_token.*/,"").replace(/\?poc_token.*/,"").replace(/==&mid.*/,"").replace(/.*\?__biz=/,"")
                if(imgs[i].src.match(/wx_fmt=(.*)&wxfrom/)){
                downloadImg(imgs[i].src,  filename + "_" + i.toString().padStart(2, '0')  +"." + imgs[i].src.match(/wx_fmt=(.*)&wxfrom/)[1])}
                else{
                downloadImg(imgs[i].src, filename + "_" + i.toString().padStart(2, '0')  +".jpg")
                }
                imgs[i].src = imgs[i].src.replace(/&wx_lazy/,"&wx_downloaded")
            }
            console.log(i,imgs[i].src)}
        if(imgs[i].src.includes('doubanio')&&imgs[i].src.includes('webp')){ // douban
            imgs[i].src = imgs[i].src.replace(/\.webp/g,".jpg")
        }
        if(imgs[i].src.includes('hdslb')){ // Bilibili
            //document.getElementsByTagName("img").forEach((ele) => { ele.src = ele.src.replace(/@.*\.avif/g,"")}); //replace avif extension
            imgs[i].src = imgs[i].src.replace(/\.webp/g,".jpg").replace(/@.*\.avif/g,"")
        }
    }
}
// 懒得用onload
setInterval(convert,1000);