使用Java程序向百度空间发博客的尝…

来源:互联网 发布:人人聚财网络贷款 编辑:程序博客网 时间:2024/06/07 09:46
案例:我正在将我网站的资料搬到我在百度空间的博客哦: http://hi.baidu.com/java2000_net

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


一 认证

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

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

2 用Firefox + Firebug 你只要看一下网络链接数据的Header,就可以看到cookie部分的数据了,比如
使用Java程序向百度空间发博客的尝试
我们编写的程序,就需要把这个同时送过去,这样对方的程序就会自动识别登录的用户信息了。

二 发送数据

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

查看复制到剪切板打印
  1.   
  2. ublic static boolean post(String host, String charset, String postURL,String referer, String cookies, String message, String title, Stringcontent)  
  3.   try  
  4.     URL url new URL(postURL);  
  5.     HttpURLConnection con (HttpURLConnection) url.openConnection();  
  6.     con.setDoOutput(true); // POST方式  
  7.     con.setRequestMethod("POST");  
  8.     con.addRequestProperty("Host"host);  
  9.     con.addRequestProperty("Referer"referer);  
  10.     con.addRequestProperty("Cookie"cookies);  
  11.     con.addRequestProperty("Content-Type""application/x-www-form-urlencoded");  
  12.     message message.replace("{TITLE}"URLEncoder.encode(title, charset));  
  13.     message message.replace("{CONTENT}"URLEncoder.encode(content, charset));  
  14.   
  15.     con.addRequestProperty("Content-Length"Integer.toString(message.getBytes(charset).length));  
  16.     OutputStream os con.getOutputStream(); // 输出流,写数据  
  17.     os.write(message.getBytes(charset));  
  18.     os.flush();  
  19.     BufferedReader reader new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); // 读取结果  
  20.     String line;  
  21.     while ((line reader.readLine()) != null 
  22.       // System.out.println(line); // 我这里不再读取每一样了,大家测试时可以去掉注释掉的break,并去掉这里的注释  
  23.       break 
  24.      
  25.     os.close();  
  26.     reader.close();  
  27.     return true 
  28.   catch (Exception ex)  
  29.     ex.printStackTrace();  
  30.     return false 
  31.    
  32.  
   public static boolean post(String host, String charset, String postURL,String referer, String cookies, String message, String title, Stringcontent) {    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;    }  }

给大家提供一个参考的参数数据
查看复制到剪切板打印
  1. host=hi.baidu.com  
  2. charset=GBK  
  3. cookie 
  4. post=http://hi.baidu.com/java2000%5Fnet/creat/blog/  
  5. action=http://hi.baidu.com/java2000%5Fnet/commit  
  6. 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+  
host=hi.baidu.comcharset=GBKcookie=post=http://hi.baidu.com/java2000%5Fnet/creat/blog/action=http://hi.baidu.com/java2000%5Fnet/commitmessage=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就是提交博客的地址,其它的大家自己看吧

发送的接口
查看复制到剪切板打印
  1. package net.java2000.blogsender;  
  2.   
  3. public interface Sender  
  4.   public boolean send(String title, String message);  
  5.   
  6.  
package net.java2000.blogsender;public interface Sender {  public boolean send(String title, String message);}



我们给百度博客的实现类
查看复制到剪切板打印
  1. package net.java2000.blogsender.baidu;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Properties;  
  5.   
  6. import net.java2000.blogsender.Sender;  
  7. import net.java2000.blogsender.util.PostUtil;  
  8.   
  9.   
  10. public class BaiduSender implements Sender  
  11.   
  12.   private String host;  
  13.   private String charset;  
  14.   private String post;  
  15.   private String action;  
  16.   private String cookie;  
  17.   private String message;  
  18.   
  19.   public boolean send(String title, String content)  
  20.     content content.replace("\r\n""<br/>");  
  21.     content content.replace("\n""<br/>");  
  22.     return PostUtil.post(host, charset, action, post, cookie, message, title, content);  
  23.    
  24.   
  25.   public BaiduSender()  
  26.     Properties new Properties();  
  27.     try  
  28.       p.load(BaiduSender.class.getResourceAsStream("baidu.properties"));  
  29.       host p.getProperty("host");  
  30.       charset p.getProperty("charset");  
  31.       post p.getProperty("post");  
  32.       action p.getProperty("action");  
  33.       cookie p.getProperty("cookie");  
  34.       message p.getProperty("message");  
  35.     catch (IOException e)  
  36.       e.printStackTrace();  
  37.      
  38.    
  39.  
package net.java2000.blogsender.baidu;import java.io.IOException;import java.util.Properties;import net.java2000.blogsender.Sender;import net.java2000.blogsender.util.PostUtil;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();    }  }}



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



小结

用程序做类似的东西基本都差不多,都是模拟浏览器进行数据的提交。