帮朋友做了个整站,更新新闻的时候他用不惯我写的后台,老是发微信公众号,让我帮忙发到网站上,我觉得太麻烦了,就写了个调用的方法。
微信公众号自带保护,不让跨域访问。
只能用http://cors-anywhere.herokuapp.com/跨域访问接口。
http://cors-anywhere.herokuapp.com/+公众号文章地址
就可以得到文章的源代码,加以正则匹配
就可以得到文章的标题,正文。
匹配标题: /<h2 class=\"rich_media_title\" id=\"activity-name\">([\s\S]*)<\/h2>/ig
匹配正文: /js_content\">([\s\S]*?)<\/div>/ig
最后需要做的是把图片
的路径用正则替换一下,因为公众号采取的是lazy-load,只有浏览到了才会加载,result.replace(/data-src="/g,'src="http://img01.store.sogou.com/net/a/04/link?appid=100520029&url=')
。
其中替换后sogou部分的网址是加载图片的API,不加这个的话,同样会提示禁止站外加载图片。
效果如下:
https://codepen.io/2bt/full/joBKJg
(2021年更新)
前端的方法API总是失效,现在改用本地PHP进行Curl访问图片,再封装内容给到前端。
源码如下,需要自己调整一下正则和输出的样式:
<?php
class WxCrawler
{
//微信内容div正则
private $wxContentDiv = '/<div class="rich_media_content " id="js_content" style="visibility: hidden;">(.*?)<\/div>/s';
//微信图片样式
private $imageStyle = 'style="width: 100% !important;height: auto !important;visibility: visible !important;"';
/**
* 爬取内容
* @param $url
* @return false|string
* @author bignerd
* @since 2016-08-16T10:13:58+0800
*/
private function _get($url)
{
$context = stream_context_create(array('http'=> array('header'=>'Connection:close')));
return file_get_contents($url,false,$context);
}
public function crawByUrl($url)
{
$content = $this->_get($url);
$basicInfo = $this->articleBasicInfo($content);
list($content_html, $content_text) = $this->contentHandle($content);
return array_merge($basicInfo,['content_html' => $content_html,'content_text' => $content_text