您的位置:首页 > 编程语言 > Java开发

使用Java程序自动发博客的尝试

2008-08-21 20:12 435 查看
案例:我正在将我网站的资料搬到我在百度空间的博客哦:作为备份用。
http://hi.baidu.com/java2000_net


手里有好多的技术资料,不想一个一个的粘贴到那里,包括在CSDN的一些代码,想复制一份到那里,留个备份。决定使用Java程序直接向博客里发数据。
需要解决的几个问题
1 认证
2 发送数据
3 解决发送太频繁的问题

一 认证[/b]

百度支持保存用户名和密码,也就是自动登录,所以其登录信息肯定保存在cookie里面。
如何获得cookie呢?我提供2个方法
1 你去你机器的IE的临时目录里查找cookie吧,比如
C:/Documents and Settings/Administrator/Local Settings/Temporary Internet Files

里面有许多的cookie文件,具体是哪个?你自己找吧,我就不多说了。

2 用Firefox + Firebug 你只要看一下网络链接数据的Header,就可以看到cookie部分的数据了,比如



我们编写的程序,就需要把这个同时送过去,这样对方的程序就会自动识别登录的用户信息了。

二 发送数据[/b]

我们使用HttpURLConnection 的 POST方法进行数据的发送,注意其中关键的几个部分
Host 这个一定要设置成提交的主机相同,因为对于虚拟主机,这个最关键了
Referer 这个一般被用来防止盗链,所以一定要设置为一个属于他站点的链接,比如发贴的页面链接
Cookie 这个是认证的关键,否则发贴后会让你登录的
Content-Type 对于普通的POST提交,使用 application/x-www-form-urlencoded,如果是带附件的提交,则需要使用multipart/form-data; boundary=XXXXXXX, 其中的XXXXXX是数据的边缘分界标志
Content-Length 提交的数据长度,字节数
数据没啥特殊的,只要符合表单的要求就可以了,比如百度博客的数据格式如下
ct=1&cm=1&spRefURL=http%3A%2F%2Fhi.baidu.com%2Fjava2000%25255Fnet%2Fcreat%2Fblog%2F&spBlogTitle={TITLE}&spBlogText={CONTENT}&spBlogCatName=%C4%AC%C8%CF%B7%D6%C0%E0&spIsCmtAllow=1&spBlogPower=0&spVcode=&spVerifyKey=&tj=+%B7%A2%B1%ED%CE%C4%D5%C2+

其中的{TITLE}应该替换为我们自己的主题,{CONTENT}替换为我们自己的内容。
下面是发送数据的代码

/**
* 发送普通的POST数据
*
* @param host
* 主机
* @param charset
* 编码
* @param postURL
* 表单提交的地址URL
* @param referer
* 来源,使用填写表单的页面
* @param cookies
* 认证数据
* @param message
* 发送的数据模板
* @param title
* 标题,将替换模板里的对应位置
* @param content
* 内容,将替换模板里的对应位置
* @return 成功返回true
*/
public static boolean post(String host, String charset, String postURL, String referer, String cookies, String message, String title, String content) {
try {
URL url = new URL(postURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true); // POST方式
con.setRequestMethod("POST");
con.addRequestProperty("Host", host);
con.addRequestProperty("Referer", referer);
con.addRequestProperty("Cookie", cookies);
con.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
message = message.replace("{TITLE}", URLEncoder.encode(title, charset));
message = message.replace("{CONTENT}", URLEncoder.encode(content, charset));

con.addRequestProperty("Content-Length", Integer.toString(message.getBytes(charset).length));
OutputStream os = con.getOutputStream(); // 输出流,写数据
os.write(message.getBytes(charset));
os.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); // 读取结果
String line;
while ((line = reader.readLine()) != null) {
// System.out.println(line); // 我这里不再读取每一样了,大家测试时可以去掉注释掉的break,并去掉这里的注释
break;
}
os.close();
reader.close();
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
给大家提供一个参考的参数数据

host=hi.baidu.com
charset=GBK
cookie=
post=http://hi.baidu.com/java2000%5Fnet/creat/blog/
action=http://hi.baidu.com/java2000%5Fnet/commit
message=ct=1&cm=1&spRefURL=http%3A%2F%2Fhi.baidu.com%2Fjava2000%25255Fnet%2Fcreat%2Fblog%2F&spBlogTitle={TITLE}&spBlogText={CONTENT}&spBlogCatName=%C4%AC%C8%CF%B7%D6%C0%E0&spIsCmtAllow=1&spBlogPower=0&spVcode=&spVerifyKey=&tj=+%B7%A2%B1%ED%CE%C4%D5%C2+

其中的cookie我去掉了,哈哈。 post 就是填写博客的地址,action就是提交博客的地址,其它的大家自己看吧

发送的接口

package net.java2000.blogsender;

public interface Sender {
public boolean send(String title, String message);

}

我们给百度博客的实现类

package net.java2000.blogsender.baidu;

import java.io.IOException;
import java.util.Properties;

import net.java2000.blogsender.Sender;
import net.java2000.blogsender.util.PostUtil;

/**
* 百度的博客发送实现类
*
* @author 赵学庆,Java世纪网(java2000.net)
*
*/
public class BaiduSender implements Sender {

private String host;
private String charset;
private String post;
private String action;
private String cookie;
private String message;

public boolean send(String title, String content) {
content = content.replace("/r/n", "<br/>");
content = content.replace("/n", "<br/>");
return PostUtil.post(host, charset, action, post, cookie, message, title, content);
}

public BaiduSender() {
Properties p = new Properties();
try {
p.load(BaiduSender.class.getResourceAsStream("baidu.properties"));
host = p.getProperty("host");
charset = p.getProperty("charset");
post = p.getProperty("post");
action = p.getProperty("action");
cookie = p.getProperty("cookie");
message = p.getProperty("message");
} catch (IOException e) {
e.printStackTrace();
}
}
}

三 解决发送太频繁的问题[/b]
我测试,百度的文章最快需要1分钟才能发一个,否则会因为发送太快而让你输入验证码,那个我可破解不了。
所以我们的程序应该发送一个之后,休眠1分钟再发另外一个。

小结[/b]:

用程序做类似的东西基本都差不多,都是模拟浏览器进行数据的提交。
JavaEye的博客发送程序也快弄好了,整理完毕后也发上来和大家分享。

欢迎访问Java世纪网 http://www.java2000.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: