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

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


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 新文章同步微博(带文章特色图片)