无需webview让小程序内显示任意公众号文章

06-01 1284阅读

微信小程序内显示任意公众号文章(无需webview)

目录

  • 微信小程序内显示任意公众号文章(无需webview)
    • 实现原理
    • 什么是richtext
    • 实现过程
      • 1.找到对应文章链接
      • 2.在小程序内获取到文章的html文稿
      • 解除隐藏限制
      • 最终代码

        实现原理

        • 小程序官方提供的组件
        • 微信公众号文章可以在浏览器打开
        • 小程序内wx.request可以访问微信公众号域名

          什么是richtext

          大家可以看官方文档,简单来说就是在小程序内静态的去渲染html格式的文本

          (注意这和webview是完全不同的,rich-text渲染的html,没有任何交互功能,但是可以反应对应的css)

          微信官方开放文档:rich-text

          实现过程

          1.找到对应文章链接

          很简单,在微信打开对应的文章,然后在浏览器打开或者直接拷贝链接,那我们就获取到文章地址了。

          2.在小程序内获取到文章的html文稿

          在使用小程序的wx.request之前,需要确保后台添加了对应的请求域名,在下图对应区域添加微信公众号的域名,当前是https://mp.weixin.qq.com,注意只有https是支持的!无需webview让小程序内显示任意公众号文章

          接着我们就可以尝试用wx.request去获取html,像这样:

          无需webview让小程序内显示任意公众号文章

          无需webview让小程序内显示任意公众号文章

          按理来说,如果是一个静态页面,那content里就是对应的html文本,然后放在rich-text组件就完事了,但是结果你会发现,界面只出现了标题,其他是一片空白。

          难道网页的html是动态加载的吗?

          很幸运,博主通过搜索文章中间的文字内容,发现文章的内容确实都在获取到的html文本之中,所以官方平台只是用一定的方法隐藏了对应的内容。

          解除隐藏限制

          一般来讲html想要隐藏标签内容,无非几种简单手段,通过设置display,opacity等css属性,而很巧的是微信公众的文章css也都直接写在标签的style里,这让我们的处理方便了很多。

          用浏览器打开我们获取到的html文本,再打开浏览器开发者工具,找出对应属性,进行调试修改。通过修改style属性,问题轻松解除了。我们只需要去掉html中的visibility: hidden; opacity: 0;字段,就成功了。

          但是结果并不是,博主发现图片并没有成功显示。

          难道是微信公众号对图片做了跨域限制吗?

          很幸运,并不是,如果真的做了跨域限制,那我们所有的努力都泡汤了。

          html只是把img标签的src属性改成了data-src,那我们只要用一个replace替换就搞定了!

          最后我们破解限制的代码:

          html = html .slice(start,end)
          html = html.replace('visibility: hidden; opacity: 0;','').replaceAll('data-src','src')
          

          当然我们可以去掉一些html里没用的内容:

          const start = res.data.indexOf(')
                  const end = res.data.indexOf(')
          

          这里我们截取了文章的核心标签

          最终代码

          wx.request({
                url: url,  //这里替换你的文章链接
                method:'GET',
                success:res=>{
                  var html = res.data
                  const start = res.data.indexOf(')
                  const end = res.data.indexOf(')
                  html = html .slice(start,end)
                  html = html.replace('visibility: hidden; opacity: 0; ','').replaceAll('data-src','src')
                  // console.log(html)
                  this.setData({
                    content:html,
                    loading:false
                  })
                }
              })
          
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码