文档章节

WP2OSC--Wordpress博客文章导入OSChina博客

LIBINBIN0069
 LIBINBIN0069
发布于 2015/07/03 23:12
字数 1687
阅读 19
收藏 1

前言

OSChina的API开放至今都没用它做过什么事,如今建了个本站,正打算把文章内容备份到OSChina,官方提供了个导入工具(move.oschina.net),但是无法兼容目前新版的WP,它使用的是wp导出的xml文件。既然如此,何不自己使用API做一个导入工具呢?!

于是,wp2osc诞生了...

wp2osc概述

WP2OSC是一个可以把Wordpress博客的文章有选择的导入OSChina的博客中。

WP2OSC使用纯php代码,结合Wordpress自身的函数来读取文章列表、分类信息,准确率高,速度快,对Wordpress熟悉的同学还可以重新定制下页面显示方式。

wp2osc的导入方式

  1. 先登录OSCChina,拿到access_token后,回到index.php,token等信息使用session保存;
  2. 按照Wordpress的分类结构显示文章列表,然后在这个分类上,可以选择OSChina博客的系统分类和用户分类;
  3. 通过checkbox的方式,选择需要导入的文章。点击开始导入按钮后,程序自动组合当前勾选的文章的ID和对应的分类ID,拼接成json字符串,post给wp2osc.php文件;
  4. wp2osc.php文件根据文章ID,查询文章的各种信息,然后组合成最终的请求链接,post给OSChina Open API指定的URL上。

使用方法

访问我的git仓库,下载源码:https://git.oschina.net/lijialong1314/WP2OSC

  1. 下载文件后,把app目录放到wordpress站点的根目录;
  2. 打开app/wp2osc/index.php文件,修改第61行(您自己的oschina用户ID);
  3. 打开app/wp2osc/wp2osc.php文件,修改第9行(您自己的oschina用户ID);
  4. 打开app/wp2osc/token.php文件,修改第8,9,10行(您自己的APPkey,Secret,回调url需要设置为token.php文件在线上访问的完整路径);
  5. 访问 http://您的域名/app/wp2osc。

效果预览:http://devonios.com/app/wp2osc

存在的问题

由于OSChina的OpenAPI在处理content参数时,过滤了img标签,所以导入的文章无法显示图片。。。 详见:使用OpenApi导入Wordpress的博客内容时,图片地址如何处理?

目前只能手动复制图片源地址,然后粘贴到oschina的博客编辑器中,保存时,oschina会自动下载图片保存到自己的服务器上。

代码(1)获取Token

OSChina的API同样基于OAuth2(真是腻了...),需要先GET Code,然后用Code去Get Token。

我的做法是:在一个叫token.php的文件中,检测是否有code参数,如果没有就跳转到oschina的验证页面,登录成功后,oschina会跳回token.php页面,此时有了code参数,那就可以用它去请求获取token了,拿到token后,就可以把它保存在session中,然后再跳到程序的首页(index.php)。

<?php
session_start();
require("../lib/common.php");

$dataType = "json";
$response_type = "code";
$grant_type = "authorization_code";
$client_id = "您的app key";
$client_secret = "您的app secret";
//回调地址,需要设置为当前token.php文件在线上访问的完整路径
$redirect_uri = "http://devonios.com/app/wp2osc/token.php";
$codeurl = "https://www.oschina.net/action/oauth2/authorize";
$tokenurl = "https://www.oschina.net/action/openapi/token?";
$userurl = "https://www.oschina.net/action/openapi/user";
$cateurl = "https://www.oschina.net/action/openapi/blog_catalog_list";

$code = $_GET["code"];

if ($code != "")
{
   //获取token数据
}
else
{
  header("Location: ".$codeurl."?response_type=".$response_type."&client_id=".$client_id."&redirect_uri=".$redirect_uri);
}

获取token数据部分代码:

//请求的参数数组
$fields = [
  "grant_type" => urlencode($grant_type),
  "client_id" => urlencode($client_id),
  "redirect_uri" => urlencode($redirect_uri),
  "code" => urlencode($code),
  "state" => urlencode($state),
  "client_secret" => urlencode($client_secret),
  "dataType" => urlencode($dataType)
];

//转换成字符串
$fields_string = "";
foreach($fields as $key=>$value) {
 $fields_string .= $key.'='.$value.'&';
}
rtrim($fields_string, '&');

//发送请求获取json数据

//拿到数据后,保存到session中
$_SESSION["osctoken"] = $token;
$_SESSION["oscusername"] = $username;
$_SESSION["oscuserid"] = $userid;
$_SESSION["syscate"] = $blog_sys_catalog_listArray;
$_SESSION["usercate"] = $blog_user_catalog_listArray;
//然后回到首页
header("Location: index.php");

代码(2)读取Wordpress的分类和文章

当回到index.php后,需要在页面显示文章列表,这里是用分类结构来显示的,即先读分类,然后用分类ID去读该分类下的所有文章。循环用列表方式(li)显示。

global $wpdb;
$request = "SELECT $wpdb->terms.term_id, name FROM $wpdb->terms ";
$request .= " LEFT JOIN $wpdb->term_taxonomy ON $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id ";
$request .= " WHERE $wpdb->term_taxonomy.taxonomy = 'category' ";
$request .= " ORDER BY term_id asc";
$categorys = $wpdb->get_results($request);
//循环每个分类
foreach ($categorys as $category) 
{
	$catname = $category->name;
	$catid = $category->term_id;
        //这里显示html代码
        //通过分类id,查询分类下的所有文章
        $catposts = new WP_Query();
        $catposts->query('cat='.$catid);
        while ($catposts->have_posts()) : $catposts->the_post();
        //这里显示html代码
        endwhile;
}

代码(3)根据文章ID获取文章详细信息(内容、标题、标签等)

在我们准备提交数据时,需要先通过选择的文章id获取文章的相关信息。

foreach($postidsobj as $postid)
{
	//一篇文章对象,使用wp提供的get_post函数
	$_post = get_post($postid);
	
	//内容
	$content = $_post->post_content;
	
	//将内容中的代码pre标签的class转换为oschina支持的
	$content = convert_pre_to_oscpre($content);
	
	//文章内容底部插入一些固定信息
	$content = insert_footinfo_content($content,$_post->post_name);

	//标题
	$title = $_post->post_title;
	
	//摘要,截取200字符
	$length = apply_filters('excerpt_length',200);
	$abstracts= apply_filters('the_excerpt',wp_trim_words($content,$length));
	
	//标签,用wp提供的wp_get_post_tags函数,转换成逗号分割的字符串
	$tags = wp_get_post_tags($postid);
	$_tags = "";
	foreach($tags as $tag){
		$_tags .= ($tag->name.",");
	}
	rtrim($_tags, ',');
	
	$postdata["catalog"] = $usercateid;
	$postdata["classification"] = $syscateid;
	$postdata["content"] = $content;
	$postdata["title"] = $title;
	$postdata["abstracts"]= preg_replace("/<(.*?)>/","",$abstracts);//摘要内容去掉html代码,oschina博客的摘要是纯文本形式
	$postdata["tags"] = $_tags;
	
	$resultJson = send_post($posturl,$postdata);
	$resultJsonObj = json_decode($resultJson,true);
	//结果保存下来
	$allresult[] =  "文章ID:".$postid.",文章标题:".$title.",状态:".$resultJsonObj["error_description"];
}

代码(4)转换pre代码标签

由于两边的代码高亮用的不是同一个插件,所以需要修改pre标签,这个需要根据您所用的编辑器,所用的代码高亮插件来调整。

我的代码如下:

function convert_pre_to_oscpre($content){
	
	$repArray = [
		'class="brush:cpp;"'           => 'class="brush:cpp;"',
		'class="brush:php;"'  => 'class="brush:php;"',
		'class="brush:cpp;"'  => 'class="brush:cpp;"',
		'class="brush:shell;"'  => 'class="brush:shell;"',
		'class="brush:js;"'   => 'class="brush:js;"',
		'class="brush:css;"'  => 'class="brush:css;"',
		'class="brush:html;"' => 'class="brush:html;"'
	];                     
	
	foreach($repArray as $key=>$value){
		$content = str_replace($key,$value,$content);
	}
	
	return $content;
}

代码(5)php发送get和post请求

很简单,使用curl即可。

function send_get($urlstring)
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $urlstring);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$result = curl_exec($ch);
	curl_close($ch);
	return $result;
}

function send_post($urlstring,$data)
{
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_URL, $urlstring);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	
	$result  = curl_exec($ch);
	curl_close($ch);
	return $result;
}

界面效果图

导入结束,显示结果:

tips:

本文由wp2osc导入,原文链接:http://devonios.com/wp2osc.html

由于OSChina的OpenAPI在处理content参数时会自动过滤img标签,所以无法显示图片,详见

© 著作权归作者所有

LIBINBIN0069
粉丝 13
博文 86
码字总数 48294
作品 1
徐汇
个人站长
私信 提问
Wordpress博客导入到OSC--WP2OSC

WP2OSC是一个可以把Wordpress博客的文章有选择的导入OSChina的博客中。 WP2OSC使用纯php代码,结合Wordpress自身的函数来读取文章列表、分类信息,准确率高,速度快,对Wordpress熟悉的同学还...

DragonFK
2015/07/04
450
0
DragonFK/WP2OSC

#7月18号更新 新增导入csdn博客功能。改名为wp2blog。 #WP2blog WP2blog是一个可以把Wordpress博客的文章有选择的导入OSChina、csdn的博客中。 WP2blog使用纯php代码,结合Wordpress自身的函...

DragonFK
2015/07/04
0
0
使用Swift读取Cookie内容

前言 一个http请求中,我们经常会涉及到Get请求的URL Param,POST请求的HTTP Body,Response Json,这些都是一个标准REST API标配的元素。 在一些安全验证的API中,通常会涉及到Cookie。当用...

DragonFK
2015/07/12
1K
0
IOS拦截重定向请求(302)的几种方式

前言 在多数情况下,我们做的网络请求是返回200状态码的,但也有返回302的时候,比如使用基于Oauth2认证协议的API时,在认证阶段,需要提供一个回调地址,当用户授权后,服务器会返回一个302...

DragonFK
2015/07/12
9.9K
0
wordpress博客批量导入OSchina博客

wordpress博客批量导入OSchina博客 Wordpress有同步文章到百度hi空间、新浪博客等的插件,没有同步到OSchina博客的插件,而OSChina也没有提供博客导入的功能。就简单用代码(java)实现了这功能...

youthflies
2013/09/28
626
4

没有更多内容

加载失败,请刷新页面

加载更多

BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
24分钟前
5
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
4
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
6
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
6
1
正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置 今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有...

Airship
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部