kn007的个人博客
♥ You are here: Home > 软件与网络 > php > WordPress 新文章同步微博(带文章特色图片)

WordPress 新文章同步微博(带文章特色图片)

by | 62 Comments

提醒:本文最后更新于 3289 天前,文中所描述的信息可能已发生改变,请仔细核实。

80fe6253jw1eper7k5k8sj20hs0op42v
2017年7月提示,微博开放平台正式变更接口。
新方法新文章见:《[全新接口]WordPress 新文章带图片同步微博》。

首先图文无关,之前发过一篇文章《WordPress 新文章同步微博详解》,介绍了如何申请微博应用,还有如何新文章同步到微博。算是蛮实用的小功能啦~

后来,我添加了带图片微博的功能。

当时弄好了还跟大发说了,大发跟我说这个非常容易,没什么意思,不想实现。。。

一方面为了这句话,一方面也是自己不想发。所以我就一直没发。。。

呵呵,人生有时无谓的争口气。。虽然是挺无所谓的。

不过怎么说呢,如果没人发的话,我可能是不会发的额。宁愿烂在肚子,也不愿给伸手党。

一般我发布类似这种功能函数后,就会有为这个函数更加优化和更加实用做努力的想法。

所以,又要折腾这个函数了。想想发布文章时,顺便加上关键词、分类目录这些功能。应该还不错。。

接下来,有认识和不认识的朋友,总问我如何实现WordPress 新文章同步微博时,能带上图片。我都没分享,最多是说个方法。

几个月后,估计大发也被别人烦了,发了文章《WordPress 新文章同步图文微博》。

怎么说呢,完全是简化版的官方api函数,可以实现功能,但有点臃肿。当时我也在他文章说了,把我的方法分享出来。而且在QQ上也跟大发说了要发出来的。

但一直拖,想想,好东西是要分享的。所以就有了这篇文章。

为了小白们,我对代码做了一些基本注释。希望不要来问我了。

简单说下,首先没使用WP_Http(),因为我这种方法,不大适用。大发那种可以用WP_Http(),那样会更标准一些。

第二,这种算是自适应POST的方法。根据协议,如果你POST的数据是数组,那么他的头就已经是multipart/form-data。

说下大发说道的几个错误,之所以会那样,是普通POST即便定义header头,但对于坑爹的微博,还需要带上Authorization头,坑爹的是微博说明没写。。所以坑了你们。没有这个头也不是不可以,但就要定义Content-Disposition,Content-Type要带boundary这些,很麻烦,我觉得。

Authorization头是什么呢,我简单写下:

$headers[] = 'Authorization: Basic ' . base64_encode("微博帐号:微博密码");

实际上,这是一种非常不安全的做法,如果你wordpress泄漏代码的话,你微博帐号和密码就被泄露了。我觉得还是用api来认证的好,即便泄露,也只是应用存在一些风险,但影响不是很大的那种。

注:还有个办法,申请upload_url_text接口。

第三,我这个代码实现的功能是:如果非DEBUG模式,首先检查ID是否存在,是否为文章,是否发布过(这个貌似有点问题,下一版本修复);然后确定文章是否有图片,有的话优先特色图片,特色图片不存在,取文章第一张被使用的图片发布;如果没有图片,直接发布。如果是DEBUG模式,不检查ID,同上第二步骤,最后输出你请求的数据和微博返回的数据。

第四,为了照顾小白,我把函数加了个前缀,保证函数不会冲突。函数kn007_post_by_curl可以复用。

第五,DEBUG模式可能你们用的少,我是偶尔会用到,所以代码中没有去掉,不影响性能。

代码如下,复制到funcions.php下即可(这个不用教了吧):

add_action('publish_post', 'kn007_new_post_weibo', 0);
function kn007_new_post_weibo($post_ID,$debug=false) {
	$access_token = "应用密匙";//这个是access_token,改为你自己的。
	if(!$debug){//如果不是DEBUG模式
		$post = get_post($post_ID);//提取实际ID页面
		if ( empty($post) ) return false;//不存在返回
		if ( 'post' != $post->post_type ) return false;//不是文章返回
		if ( 'publish' != $post->post_status ) return false;//这篇文章非新文章返回
	}
	if(!wp_is_post_revision($post_ID)){//确保这篇文章不是草稿之类的
		$pictmpfile = "";//图片临时文件变量定义
		$status = "我刚刚发布了新文章《".get_the_title($post_ID)."》,快来看看吧。详细内容请点击:".get_permalink($post_ID);//要发布的文字内容,可以自己改
		if (has_post_thumbnail()) {//如果存在特色图片
			$post_thumbnail_id = get_post_thumbnail_id($post_ID);
			$img_src = wp_get_attachment_url( $post_thumbnail_id );
		}else{//不存在取第一张图
			$content = get_post( $post_ID )->post_content; 
			preg_match_all('/<img.*?(?: |\\t|\\r|\\n)?src=[\'"]?(.+?)[\'"]?(?:(?: |\\t|\\r|\\n)+.*?)?>/sim', $content, $strResult, PREG_PATTERN_ORDER);
			$img_src = $strResult[1][0];
		}
		if( !empty($img_src) ){//如果获取到图片
			$url = "https://api.weibo.com/2/statuses/upload.json";
			$data = '';
			$data = array();
			$data["access_token"]=$access_token;
			$data["status"]=urlencode ($status);
			$picfile = str_replace(home_url(),$_SERVER["DOCUMENT_ROOT"],$img_src);//优先查看本地图片是否存在
			if( !empty($picfile)){
				$data["pic"]='@'.$picfile;
			}else{//如果本地图片不存在,取到本地临时目录
				$filecontent = file_get_contents($img_src);
				$array = explode( '?', basename($img_src) );
				$filename = $array[0];
				$pictmpfile = '/tmp/'.$filename;
				file_put_contents($pictmpfile,$filecontent);
				$data["pic"]='@'.$pictmpfile;
				$filecontent = null;
			}
		}else{//没有图片的动作
			$url = "https://api.weibo.com/2/statuses/update.json";
			$data = "access_token=" . $access_token . "&status=" . urlencode ($status);
		}
		$output = json_decode(kn007_post_by_curl($url,$data));//发布微博
		if ($pictmpfile!=''){unlink($pictmpfile);}//如果存在临时图片,删除它
		if($debug){//如果DEBUG模式,输出DEBUG信息
			var_dump($data);
			echo '<hr />';
			var_dump($output);
		}
		return true;
	}
	return false;
}
function kn007_post_by_curl($url, $data) {//负责POST的函数
	$ch = curl_init();
	curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, TRUE );
	curl_setopt ( $ch, CURLOPT_POST, TRUE );
	curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
	curl_setopt ( $ch, CURLOPT_URL, $url );
	curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);
	$body = curl_exec ( $ch );
	curl_close ( $ch );
	return $body;
}

这是一篇定时文章,如果出现评论错误评论不了,可能是正常原因,稍等片刻,缓存过期了就会好的。

转载请注明转自: kn007的个人博客 的《WordPress 新文章同步微博(带文章特色图片)

donate
有所帮助?
Comments
62 Comments立即评论
  1. LV5
    回复

    国之将亡,遍地舰娘

    1. MOD
      回复

      @be.truth: 这是舰娘么!? :o 我不知道诶。。。 :???: 我只是觉得好看 :twisted: 没玩过舰娘的飘过。

  2. LV3
    回复

    。。。我是来看图的~ :mrgreen:

    1. MOD
      回复

      @xinsenz: :mrgreen: 据说是舰娘的

  3. MOD
    回复

    已添加了新功能,附带tags,正确当新文章发布时,发布微博,已改正(不需使用post_meta)。下次发出来

  4. LV2
    回复

    抛开技术上的东西不说,同步到微博有啥意义呢,一样没人看,哈哈!

    1. MOD
      回复

      @秦大少: :mrgreen: 对我来说,还行

    2. LV5
      回复

      @秦大少: 感觉像一个新闻入口吧,开weibo就是看信息流的。

    3. MOD
      回复

      @be.truth: :arrow: 可以利用分组

  5. LV3
    回复

    微博什么的都不怎么用,上面就木有认识的人,全是关注了些乱七八糟的东西。代码只看懂了部分咯·· :evil:

    1. MOD
      回复

      @夜枫: :o :o 微博好几个圈子

  6. LV2
    回复

    微博地址呢
    粉你啊

    1. MOD
      回复

      @天长地久: 博客右上角不是有么。。。
      http://weibo.com/kn007

  7. LV6
    回复

    :???: 别说同步微博了,我现在觉得分享都没多大用处了 :???:

    1. MOD
      回复

      @Xider: :arrow: 玩玩而已

  8. LV5
    回复

    很久不玩微博了

    1. MOD
      回复
  9. 回复

    妹纸好美,可惜不是我的。

    1. MOD
      回复

      @Me.稀奇: :cry: :cry: 同样不是我的

  10. 回复

    路过,看看, :oops: :oops:

    1. MOD
      回复

      @Funix: 你回来了啊! :mrgreen: 搞个头像呗

    2. MOD
      回复

      @Funix: 貌似友联的正则不能识别到中文域名。。

    3. 回复

      @kn007: 吖?不能识别中文?无所谓啦。。。
      搞个什么头像呢?我好像修改过头像吖!难道Gravatar没弄好?奇怪。。。

    4. MOD
      回复

      @Funix: 就是没有友情链接标识。

    5. MOD
      回复

      @Funix: 头像可能你这个邮箱没头像吧?

    6. 回复

      @kn007: 嗯,想起来了,一直收不到来自G的邮件。。。不知道是哪里出了问题。。。

    7. MOD
      回复

      @Funix: 不会是被Q了吧

;-):|:x:twisted::smile::shock::sad::roll::razz::oops::o:mrgreen::lol::idea::grin::evil::cry::cool::arrow::???::?::!: