六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 99|回复: 0

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

[复制链接]

升级  0.4%

326

主题

326

主题

326

主题

探花

Rank: 6Rank: 6

积分
1008
 楼主| 发表于 2013-2-7 09:40:16 | 显示全部楼层 |阅读模式
案例:我正在将我网站的资料搬到我在百度空间的博客哦:作为备份用。
http://hi.baidu.com/java2000_net



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


一 认证

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

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

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


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

二 发送数据

我们使用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}替换为我们自己的内容。
下面是发送数据的代码

<div class="highlighter">

  •   /**
  •    * 发送普通的POST数据
  •    * 
  •    * @param host
  •    *          主机
  •    * @param charset
  •    *          编码
  •    * @param postURL
  •    *          表单提交的地址URL
  •    * @param referer
  •    *          来源,使用填写表单的页面
  •    * @param cookies
  •    *          认证数据
  •    * @param message
  •    *          发送的数据模板
  •    * @param title
  •    *          标题,将替换模板里的对应位置
  •    * @param content
  •    *          内容,将替换模板里的对应位置
  •    * @return 成功返回true
  •    */<span />
  •   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方式<span />
  •       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));
  • <span />
  •       con.addRequestProperty("Content-Length", Integer.toString(message.getBytes(charset).length));
  •       OutputStream os = con.getOutputStream(); // 输出流,写数据<span />
  •       os.write(message.getBytes(charset));
  •       os.flush();
  •       BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); // 读取结果<span />
  •       String line;
  •       while ((line = reader.readLine()) != null) {
  •         // System.out.println(line); // 我这里不再读取每一样了,大家测试时可以去掉注释掉的break,并去掉这里的注释<span />
  •         break;
  •       }
  •       os.close();
  •       reader.close();
  •       return true;
  •     } catch (Exception ex) {
  •       ex.printStackTrace();
  •       return false;
  •     }
  •   }
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表