2019独角兽企业重金招聘Python工程师标准>>>

本文通过 OscPress 同步至oschina,最新版本请查看原文: https://www.cellmean.com/?p=1005

今天测试OscPress时发现了一些问题,aceess token失效了,token的授权没有到失效时间,可能是osc那边重置了。从文档知道用失效的token请求api时,会返回40x的错误,按照restful api,  我想当然地以为是把错误号会放在响应码的。但是osc open api并不是这样的,它是放在body里的,因为一些浏览器会针对响应码做自己的处理,所以osc 不把错误号放响应头可以理解。 测试了一下,如果token出错了,WP_Http 请求返回的内容是这样的,并不会返回WP_Error.

array(5) { ["headers"]=> array(7) { ["server"]=> string(7) "Tengine" ["connection"]=> string(5) "close" ["date"]=> string(29) "Tue, 12 Jul 2016 06:39:25 GMT" ["cache-control"]=> string(8) "no-store" ["content-type"]=> string(30) "application/json;charset=utf-8" ["www-authenticate"]=> string(108) "Bearer error="invalid_token", error_description="Invalid access token: 1eb50a5d-f5ef-4c12-aaec-9c8908dc9a34"" ["pragma"]=> string(8) "no-cache" } ["body"]=> string(106) "{"error":"invalid_token","error_description":"Invalid access token: 1eb50a5d-f5ef-4c12-aaec-9c8908dc9a34"}" ["response"]=> array(2) { ["code"]=> int(401) ["message"]=> string(22) "Authorization Required" } ["cookies"]=> array(0) { } ["filename"]=> NULL }

我们可以修改一下 错误处理:osc open api的错误信息是放在response跟body里的,我希望把osc返回的错误放入WP_Error这个Wordpress能用错误处理类里,这样更加方便一些。

// 增加对osc api 返回的错误处理
protected function _check_api_error( $response ) {if( !is_wp_error($response) && $response['response']['code'] != 200 ) {$error_obj = json_decode($response['body']);return new WP_Error($error_obj->error,$error_obj->error_description);}return $response;
}

用这个方法对调用osc api方法的返回内容再进行一次过滤,如获取用户个人信息的方法。

// 获得用户信息
protected function _get_openapi_user()
{$url = $this->api_site . '/action/openapi/user';$args = array('access_token' => $this->_get_access_token(),'dataType' => 'json');$response = wp_remote_post($url, array('body' => $args,'sslverify'=>false));return $this->_check_api_error($response);}

增加一个显示错误信息的方法:

// 显示错误信息
protected function _show_error_info( $error ) {echo  $error->get_error_message();if($error->get_error_code() == 'invalid_token'){printf("&nbsp;&nbsp;<em><a href='%s'>点击重新授权</a></em>",$this->_generate_authorize_url());}}

在设置页跟文章编辑页的meta box 中分别调用这个方法显示错误。

// 显示在metabox的内容
public function meta_box_callback(){$response = $this->_get_openapi_user();if(is_wp_error($response)){$this->_show_error_info($response);return;}
....
public function settings_section_text(){echo "<hr/>";$authorize_url = $this->_generate_authorize_url();if(false === $authorize_url){// 未填写应用id和私钥echo "<em>填写应用的id及私钥</em>";}elseif( $access_token = $this->_get_access_token() ) {// 已获取access token,显示个人信息$response = $this->_get_openapi_user();if(is_wp_error($response)) {$this->_show_error_info($response);return;}
....

发布文章时同步的错误也记录下来:

// 发布文章时同步到osc
public function publish_post($ID,$post) {if( isset($_POST['oscpress_syn_enable']) && $_POST['oscpress_syn_enable'] == 0){return ; // 不同步到osc博客}$post_arr = array();$tags = "";$post_arr['title'] = $post->post_title;$post_arr['content'] = $post->post_content;$post_arr['abstracts'] = get_the_excerpt($ID);$tags_arr = wp_get_post_tags($ID);if(!empty($tags_arr)){foreach($tags_arr as $tag) {$tags .= $tag->name .',';}$tags = rtrim($tags,',');}$post_arr['tags'] = $tags;$post_arr = array_merge($post_arr,$_POST['oscpress_syn']);unset($post_arr['tweet_enable']);$response = $this->_blog_pub($post_arr);$oscpress_syn = $_POST['oscpress_syn'];$oscpress_syn['error_msg'] = "ok";$oscpress_syn['timestamp'] = current_time('timestamp');if(!is_wp_error($response) ){if( $_POST['oscpress_syn']['tweet_enable']) {$post_link = apply_filters('oscpress_sync_link',wp_get_shortlink($ID),$ID); // 发布到osc动弹的文章链接$tweet_template ="我发布了一篇文章:<<%%post_title%%>>,传送门:%%post_link%%, 自豪地使用 #OscPress# 同步 ";$tweet_content = str_replace(array('%%post_title%%','%%post_link%%'),array($post_arr['title'],$post_link),$tweet_template);$response2  = $this->_send_tweet($tweet_content);}}else{$oscpress_syn['error_msg'] = $response->get_error_code();}update_post_meta($ID,'_oscpress_syn',$oscpress_syn);
}

metabox显示上次同步的信息:

public function add_meta_boxes(){//加入一个metabox$sync_data = $this->_get_syn_data();$sync_info = "";if($sync_data){$sync_info = sprintf("<span style='font-weight: normal;font-size: 0.8em'>  上次同步于: %s , 状态: %s </span>" , date_i18n('Y-m-d H:i:s',$sync_data['timestamp']),$sync_data['error_msg']);}add_meta_box( "oscpress_meta_box", '<strong>OscPress文章同步</strong>'.$sync_info, array($this,'meta_box_callback')) ;
}

好了。看一下效果: 设置页面:

meta box:

感谢阅读本文,欢迎访问 微言 获取更多内容或 查看原文

转载于:https://my.oschina.net/falcon10086/blog/711165

WordPress插件开发: 文章同步到OSC博客插件(OscPress) (四)相关推荐

  1. wordpress文章自动同步天涯博客插件wp2Tianya发布

    haha,第2个插件了.看到第1个插件wp2netease有人下载,有人使用,真是让人开心啊!天涯tianya.cn发博客的时候需要验证码,开始觉得这样的肯定做不了同步,后来经过分析,发现还有一个接口 ...

  2. 批量采集发布自媒体文章到wp等博客网站

    如何批采集量发布自媒体文章到wp等博客网站,通过147SEO工具,我可以将每天在今日头条.公众号和小红书上的精选文章发布到我们WordPress.织梦.帝国等各类CMS上,通过可视化操作批量管理我们的 ...

  3. 微博发不出去显示服务器同步,WordPress发布文章同步到新浪微博失败的问题解决与分享...

    张戈博客很久之前分享过一篇 WordPress发布文章同步到新浪微博 的文章,但经常有站长留言反馈同步失败,我一直觉得是代码部署问题. 最近很长一段时间,张戈博客也无法同步,我又觉得是微博自身的问题. ...

  4. logminer java_使用OracleLogminer同步Demo1Demo介绍-博客园.PDF

    使用OracleLogminer同步Demo1Demo介绍-博客园 使用Oracle Logminer 同步Demo 1 Demo 介绍 1.1 Demo 设想 前面介绍了Oracle LogMine ...

  5. 基于阿里云ECS+ 宝塔面板(bt) + WordPress 搭建个人主页(以独立博客为例)

    宝塔面板建站 – 一键快速部署WordPress博客程序 基于阿里云ECS+ 宝塔面板(bt) + WordPress 搭建个人主页(以独立博客为例) 以前总是说独立建站独立建站,但始终没有行动.这两 ...

  6. osc 博客搜索的算法的问题

    原文链接: osc 博客搜索的算法的问题 上一篇: vue node 环境配置 vue-cli的安装 下一篇: win10 截屏 软件 我的博客里面有一个nodejs 和webpack入门的文章 ht ...

  7. WordPress响应式主题:Three/博客/CMS/博客导航三合一主题

    效果演示:http://cxyo.vip/ 下载地址在最后面 主题使用说明 1.首页设置 ①选择首页布局:博客布局或杂志布局或博客导航,默认博客布局,若选择杂志布局或博客导航后,必须设置CMS/导航布 ...

  8. wordpress最佳架构_25个旅行博客的最佳WordPress主题(2020)

    wordpress最佳架构 Are you looking for the best WordPress themes for a travel blog? 您是否正在寻找旅行博客的最佳WordPre ...

  9. wordpress绿色小清新运营笔记博客主题模板

    介绍: 本wordpress绿色小清新运营笔记博客主题模板是一款适合个人博客,做seo博客的朋友使用,功能简单,操作方便. 后台没有主题设置功能,很多需要改动代码才能实现,对于小白不怎么友好.有兴趣的 ...

最新文章

  1. 15条走红网络的手机摄影技巧
  2. erlang 编译之 to_core
  3. css中会计算的属性,2017年12月聚合文章--calc() ---一个会计算的css属性 | 码友网
  4. 云计算---openstack基础构架以及服务方式详解
  5. 【随记】Q号解除限制一波三折
  6. android 多个style,Android样式的开发_style篇
  7. 台式计算机 一万元,一万元左右i7-8700K/Z370/GTX1070Ti水冷游戏台式电脑主机配置推荐(2)...
  8. java sql结果写入csv文件_java在处理大数据的时候一些小技巧
  9. [置顶] android 与JavaScript的互相调用
  10. VirtualBox中,WIN虚拟机与WIN共享文件夹
  11. 华为服务器信息失败,服务器远程信息失败
  12. FPGA学习-rom只读存储器(嵌入式块应用)
  13. Python绘制地理图--Cartopy基础
  14. 如何获取优酷视频的通用代码?
  15. Android学习网站推荐
  16. 华为eNSP基础命令
  17. [PTA]习题4-2 求幂级数展开的部分和
  18. Hystrix之四种触发fallback情况的验证
  19. 论文阅读翻译笔记——雅虎S4
  20. 离散数学概论---(8)图论:图的基本概念

热门文章

  1. spring事务-说说Propagation及其实现原理
  2. android 8.0 l2tp问题,【Win】使用L2TP出現809錯誤
  3. java interface class_java interface和class中的协变
  4. layui中laydate兼容ie_layui菜鸟教程--乐字节前端
  5. 与太原工业学院商讨第十七届全国大学生智能车华北赛区承办事宜
  6. 两个晶体管组成的混沌电路
  7. 智能车竞赛技术报告 | 智能视觉组 - 大连海事大学 - 菜鸡啄米
  8. 智能车百度赛道培训第二弹-算法篇
  9. tp5大数据批量导入mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  10. 点击空白处遮罩层关闭_如何手动关闭win10系统自带的windows defender