MSN 博客搬家工具

#工具 #编程语言/Java

1. 说明
最近 MSN 的博客即将关闭,而使用 MSN 上推荐的迁移到 workpress,又总是不成功。在网上下了几个工具,都是各个 blog

开发的,只能搬到特定的 blog 中去。让人十分郁闷。 后来试写了一段代码,先把从 MSN 博客备份到本地,挑了些技术文档搬到了 CSDN

,下面是程序的实现和说明,大家举一反三吧。用此方法也可以搬到其它的 blog。 编译好的程序可以下载,源码可以下载,大家可以直接使用或者修改加以完善。

2. 原理
使用 XML-RPC 协议,一个 XML-RPC 消息就是一个请求体为 xml 的 http-post

请求,被调用的方法在服务器端执行并将执行结果以 xml 格式编码后返回,可以通过此协议,读写 blog 上的文章,如 CSDN,

WORDPRESS,新浪等都支持,利用它可以方便地开发 blog 的客户端。

3. 程序说明

  1. MSN 网页解析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
** public class Fetcher {  
private String getPage(String file) { // ** ** 读取日志文件 ** **
BufferedReader reader = null;
StringBuilder sb = new StringBuilder();
** ** String line = null;
try {
reader = new BufferedReader(new InputStreamReader(
new FileInputStream((file)), Charset.forName("utf-8")));
while ((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
} catch (MalformedURLException e) {
System.out.println("file:" + file);
System.out.println("error:" + e);
} catch (IOException e) {
System.out.println("file:" + file);
System.out.println("error:" + e);
}
return sb.toString();
}

// ** ** 解析日志文件:标题,日期,正文 ** **
public void getDoc(String file, String server, String user, String passwd) {
String html = getPage(file);
String titleDivRegex = " <title>.+?</title>";
Pattern titleDivPattern = Pattern.compile(titleDivRegex);
Matcher titleDivMatcher = titleDivPattern.matcher(html);
String title = null;
if (titleDivMatcher.find()) { // ** ** 标题 ** **
title = titleDivMatcher.group().replaceAll(" <title>", "")
.replaceAll("</title>", "");
}
String dateDivRegex = "<h5 id=/".+?/">.+?</h5>";
Pattern dateDivPattern = Pattern.compile(dateDivRegex);
Matcher dateMatcher = dateDivPattern.matcher(html);
String dateStr = null;
Date postDate = null;
if (dateMatcher.find()) { // ** ** 日期 ** **
dateStr = dateMatcher.group().replaceAll(" <h5 id=/".+?/">", "")
.replaceAll("</h5>", "").trim();
String tmp = dateStr.replace("&#58;", ":");
postDate = new Date(tmp);
}
String textDivRegex = "<div id=/".*/" class=/"blogpost/">.+?</div>";
Pattern textDivPattern = Pattern.compile(textDivRegex);
Matcher textMatcher = textDivPattern.matcher(html);
String text = null;
if (textMatcher.find()) { // ** ** 正文 ** **
text = textMatcher.group().replaceAll(
" <div id=/".*/" class=/"blogpost/">", "").replaceAll(
"</div>", "").trim();
}
String[] categories = { "android", "linux" };
text = "<html><meta http-equiv=/"Content-Type/" content=/"text/html;
charset=utf-8/">"
\+ text + "</html>";

Post post = new Post(title, text, categories, postDate);
post.setServer(server, user, passwd);
post.publish();

System.out.println("title:" + title);
System.out.println("date" + postDate);
}
** ** } **

2) 上转到其它博客
** public class Post {
private Date dateCreated;
private String description;
private String title;
private String[] categories;
private String mServer;
private String mUser;
** ** private String mPasswd;
static private XmlRpcClientConfigImpl config;
static private XmlRpcClient client;

public Post(String title, String description, String[] categories,
Date dateCreated) {
this.dateCreated = dateCreated;
this.description = description;
this.title = title;
this.categories = categories;
}

static {
config = new XmlRpcClientConfigImpl();
client = new XmlRpcClient();
}

private void writelog(String log) {
UI.getInstance().showLog(log);
}

public void setServer(String server, String user, String passwd) {
mServer = server;
mUser = user;
mPasswd = passwd;
try {
config.setServerURL(new URL(mServer));
client.setConfig(config);
} catch (MalformedURLException e) {
System.out.println("connect error");
}
}

public void publish() {
Map <String, Object> struct = new HashMap<String, Object>();
struct.put("dateCreated", dateCreated);
struct.put("description", description);
struct.put("title", title);
struct.put("categories", categories);
Object[] params = new Object[] { mUser, mUser, mPasswd, struct, true };
String blogid = null;
try { // ** ** 发布日志 ** **
blogid = (String) client.execute("metaWeblog.newPost", params);
writelog("OK: title=" + title + " id=" + blogid + "/n");
} catch (XmlRpcException e) {
writelog("ERR: title=" + title + "/n");
}
struct.clear();
}
}

4. 使用方法

  1. 下载代码
  1. 从此处下载
    http://download.csdn.net/source/2773467
    (注意:本程序只测试过迁移到 CSDN,迁移到其它 Blog 可能需要修改代码)

  2. 将下载的软件包解压缩

  1. 运行程序
  1. 改 msn blog 日期格式以便于程序识别
  1. 打开 msn blog,并登录

  2. 选项 - > 常规
    将日期设置为 yyyy/mm/dd 格式
    将时间设置为 hh:mm:ss 格式

  1. 将 msn blog 日志保存到本地
  1. msn 博客登录后,在迁移页面点击” 将日志下载到 PC”

  2. 解包,依据 index 把需要迁移的日志放入目录 X

  1. 上传到其它 blog
  1. 在其它 blog 注册用户

  2. cd blogmover

  3. java -jar blogmover.jar
    点击 Choose 选择迁移日志所存在的目录 X
    在 Server,UserID, Passwd 中填写新 blog 的信息,然后点击 Send

  1. 编译源码
  1. 用 eclipse 打开

  2. File->New->JavaProject->Create project from existing source 打开源码

  3. 项目名 -> 右键 ->Build Path->Configure Build Path…->Add Extennal JARs

加入软件包一级目录的三个库 (wsxxx, xmlxxx, xmlxxx)

  1. 编译运行即可

5. 参考

  1. 从百度空间到 CSDN——博客搬家源码
    [http://blog.csdn.net/telnetor/archive/2010/05/04/5556539.aspx

](http://blog.csdn.net/telnetor/archive/2010/05/04/5556539.aspx)

  1. 各个 blog 的 xml-rpc 支持 (MetaWeblog API)
    [http://www.discuz.net/thread-946562-1-1.html

](http://www.discuz.net/thread-946562-1-1.html)