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

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

by | 62 Comments

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

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回复

      @wick: 你什么浏览器,我这边chrome、Firefox、IE11、手机都正常

    2. LV5回复

      @kn007: Firefox啊~~~~~~ :mrgreen: 难道是我显示器太大的原因?

    3. MOD回复

      @wick: 确实是有问题。妹的。以前不会啊。没时间搞,有时间看看

    4. LV5回复

      @kn007: 貌似是一年前还是两年前俺就提过一次~被你无视了~~~ :x

    5. MOD回复

      @wick: 傻逼火狐。

    6. MOD回复

      @wick: 你试试

    7. LV5回复

      @kn007: 嗯~这下正常了~~~ :mrgreen: :mrgreen:

    8. MOD回复

      @wick: :o 果然够傻逼

    9. LV5回复

      @kn007: 嗯~果断用回IE6~~~ :evil: :evil:

    10. MOD回复

      @wick: 那还是算了,我更新了所有代码高亮。

    11. LV5回复

      @kn007: 爽的一塌糊涂~~~

    12. MOD回复

      @wick: :o 坑的是我,爽的是你

  2. LV4回复

    gravatar上不去鸟

    1. MOD回复

      @尽欢: 早就上不去了,好吧

  3. 直接做成插件不好吗

    1. MOD回复

      @睡着的水: 不是不好 :o 喜欢代码版的主要是,以后有时间再做

  4. 回复

    这个功能不错

    1. MOD回复

      @小二苘: :lol: 谢谢

  5. 现在看着头疼。

    1. MOD回复

      @郑永: :o 不是吧

  6. LV1回复

    屌屌屌。。准备过两天试试同步。谢博主!

    1. MOD回复

      @料网: 不谢 :o

  7. 回复

    感觉玩微博的人似乎少了很多了

    1. MOD回复

      @拇指读: 嗯,或许吧。

  8. 怎么自动显示文章摘要呢?
    这个只能显示文章的标题

    1. MOD回复

      @World: 取适当内容做摘要就好了额

    2. @kn007: 我的意思是同步微博的时候怎么显示摘要? :lol: :lol:

    3. MOD回复

      @World: 加一个截断函数+content就行

    4. @kn007: 明天试试 :cool:

    5. MOD回复

      @World: 如果你本身有些摘要,那就是截断函数+excerpt

    6. MOD回复

      @kn007: 嗯,140字感觉没啥用

    7. @kn007: 明儿抽空折腾折腾
      用你的这个代码 不能同步图片 没有设置特色图片 文章里面插入的图片
      我反复试了N次 只有一带图片就不同步(不知道是不是因为在本地测试的缘故 :lol: :mrgreen:

    8. MOD回复

      @World: 反正我带图片是可以 :o 不带摘要是不想断章取义

    9. MOD回复

      @World: 话说最近不忙 :mrgreen:

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif