提醒:本文最后更新于 2705 天前,文中所描述的信息可能已发生改变,请仔细核实。
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 新文章同步微博(带文章特色图片)》
你这代码简直飞出显示器了~~
@wick: 你什么浏览器,我这边chrome、Firefox、IE11、手机都正常
@kn007: Firefox啊~~~~~~ 难道是我显示器太大的原因?
@wick: 确实是有问题。妹的。以前不会啊。没时间搞,有时间看看
@kn007: 貌似是一年前还是两年前俺就提过一次~被你无视了~~~
@wick: 傻逼火狐。
@wick: 你试试
@kn007: 嗯~这下正常了~~~
@wick: 果然够傻逼
@kn007: 嗯~果断用回IE6~~~
@wick: 那还是算了,我更新了所有代码高亮。
@kn007: 爽的一塌糊涂~~~
@wick: 坑的是我,爽的是你
gravatar上不去鸟
@尽欢: 早就上不去了,好吧
直接做成插件不好吗
@睡着的水: 不是不好 喜欢代码版的主要是,以后有时间再做
这个功能不错
@小二苘: 谢谢
现在看着头疼。
@郑永: 不是吧
屌屌屌。。准备过两天试试同步。谢博主!
@料网: 不谢
感觉玩微博的人似乎少了很多了
@拇指读: 嗯,或许吧。
怎么自动显示文章摘要呢?
这个只能显示文章的标题
@World: 取适当内容做摘要就好了额
@kn007: 我的意思是同步微博的时候怎么显示摘要?
@World: 加一个截断函数+content就行
@kn007: 明天试试
@World: 如果你本身有些摘要,那就是截断函数+excerpt
@kn007: 嗯,140字感觉没啥用
@kn007: 明儿抽空折腾折腾
用你的这个代码 不能同步图片 没有设置特色图片 文章里面插入的图片
我反复试了N次 只有一带图片就不同步(不知道是不是因为在本地测试的缘故 )
@World: 反正我带图片是可以 不带摘要是不想断章取义
@World: 话说最近不忙