暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Chrome神器Tampermonkey之自动显示公众号音频下载链接

背井 2021-03-03
2667

工欲善其事,必先利其器。



无需多言,Chrome浏览器绝对是Web开发者心中的神器之一。配上插件扩展,其更是如虎添翼。今天推荐一个神级插件 —— Tampermonkey,并提供一个实战示例。



Tampermonkey 能做什么?


它是一个用户脚本(userscript)管理器,有着千万级别的用户数。用户脚本是一小段程序,可以用来给网页添加额外的功能。比如改变页面的主题样式、为Youtube视频添加下载按钮、甚至可以用来屏蔽网站广告。


怎么运行 Tampermonkey?


  1. 首先,建议你安装最新版的chrome

  2. 然后,如果你在国内,需要有一架可用的梯子

  3. 打开chrome,访问插件安装页,https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo,点击 Add to Chrome 按钮进行安装


怎么为 Tampermonkey 添加新的脚本?


1. 点击浏览器右上角 Tampermonkey 图标,选择 添加新脚本

 


2. 在新打开窗口中加入自己的js脚本,按 cmd + s (或 ctrl + s) 保存。




以上只是简单的步骤,更高级的技巧请参考 Tampermonkey 官方文档,http://www.tampermonkey.net


下面说说怎么写一个自动显示公众号音频下载链接的用户脚本。




需求来源


某老师做课程演示时需要将公众号上相关音频下载下来,以方便放到ppt中。



公众号默认是不给音频下载地址的,所以我们要自己探索。


探索的方法我在之前的文章中也有提过,请自行复习:



一言以蔽之,只需要通过 Chrome网络面板 定位到资源类型为 media 的链接:




我们要做的,是在用户脚本中把这个过程自动化。




先上代码:

    // ==UserScript==
    // @name 微信音频下载
    // @namespace http://tampermonkey.net/
    // @version 0.1
    // @description try to take over the world!
    // @author Youmoo
    // @match https://mp.weixin.qq.com/**
    // @grant unsafeWindow
    // ==/UserScript==


    (async function (w, doc) {
    'use strict';


    await delay(3000);
    let [voiceId, dom] = fromCgiData() || fromMpVoice() || [];
    if (!voiceId) {
    return console.info('未发现音频资源...');
    }




    const link = `https://res.wx.qq.com/voice/getvoice?mediaid=${voiceId}`;
    console.info('发现音频资源,下载链接:', link);


    const a = doc.createElement('a');
    a.href = link;
    a.textContent = '点我下载音频';
    a.target = '_blank';
    dom.after(a);




    function fromCgiData() {
    // https://mp.weixin.qq.com/mp/audio?_wxindex_=0&scene=104&__biz=MzI3NjY3NDc3Ng==&mid=2247494834&idx=3&voice_id=MzI3NjY3NDc3Nl8yMjQ3NDk0ODIw&sn=2317b46ffe663257af3f49cbaee61bb6#wechat_redirect
    console.log('cgi data', w.cgiData);
    const {cgiData: d} = w;
    if (!d || !d.voiceid) {


    return;
    }
    return [d.voiceid, doc.getElementById('voice_parent')];
    }


    function fromMpVoice() {
    // https://mp.weixin.qq.com/s/r70i5Eny_m0_Uk_b5u_-PQ
    const v = doc.querySelector('mpvoice');
    if (!v) {
    return;
    }
    return [v.getAttribute('voice_encode_fileid'), doc.querySelector('.js_audio_frame')];
    }


    function delay(ms) {
    return new Promise(res => setTimeout(res, ms));
    }
    })(window.unsafeWindow||window, document);




    你如果只是要下载音频,则不需要理解这段代码;如果你是一名技术并对其原理感兴趣,请继续往下看,我会对重要的部分解释。


    • 第7行,@match 用来指定在哪些网页上运行。这里我们要求脚本在微信开放平台域名下运行。

    • 第8行,@grant 用来声明需要的权限。unsafeWindow 可以用来访问页面上的js对象。

    • 第14、51行,因有些公众号页面音频内容是异步的,我们要延迟一会再去访问这些内容,以免拿不到。

    • 第21行,组装音频下载源。

    • 第24~28行,将下载源显示到音频下方。

    • 第31、42行,目前发现公众号显示音频时,有2种不同的dom排布,所以写了两个方法分别进行处理。

    • 第54行,我们传入了 window.unsafeWindow||window,这样,即使不借助 Tampermonkey,我们直接复制上面脚本在Chrome终端下运行,也能达到同样效果。


    我们看看效果:





    如果对您有用,还请「转发」或点个「在看」。


    更多的工具介绍:


    文章转载自背井,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论