使用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部分的数据了,比如
我们编写的程序,就需要把这个同时送过去,这样对方的程序就会自动识别登录的用户信息了。
二 发送数据
我们使用HttpURLConnection 的 POST方法进行数据的发送,注意其中关键的几个部分
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}替换为我们自己的内容。
下面是发送数据的代码
给大家提供一个参考的参数数据
其中的cookie我去掉了,哈哈。 post 就是填写博客的地址,action就是提交博客的地址,其它的大家自己看吧
发送的接口
我们给百度博客的实现类
三 解决发送太频繁的问题
我测试,百度的文章最快需要1分钟才能发一个,否则会因为发送太快而让你输入验证码,那个我可破解不了。
所以我们的程序应该发送一个之后,休眠1分钟再发另外一个。
小结:
用程序做类似的东西基本都差不多,都是模拟浏览器进行数据的提交。
手里有好多的技术资料,不想一个一个的粘贴到那里,包括在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部分的数据了,比如
我们编写的程序,就需要把这个同时送过去,这样对方的程序就会自动识别登录的用户信息了。
二 发送数据
我们使用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}替换为我们自己的内容。
下面是发送数据的代码
查看复制到剪切板打印
-
- ublic
static boolean post(String host, String charset, String postURL,String referer, String cookies, String message, String title, Stringcontent) { -
{ -
URL url = URL(postURL); -
HttpURLConnection con = (HttpURLConnection) url.openConnection(); -
con.setDoOutput( // POST方式 -
con.setRequestMethod( -
con.addRequestProperty( host); -
con.addRequestProperty( referer); -
con.addRequestProperty( cookies); -
con.addRequestProperty( "application/x-www-form-urlencoded"); -
message = message.replace( URLEncoder.encode(title, charset)); -
message = message.replace( URLEncoder.encode(content, charset)); -
-
con.addRequestProperty( Integer.toString(message.getBytes(charset).length)); -
OutputStream os = con.getOutputStream(); 输出流,写数据 -
os.write(message.getBytes(charset)); -
os.flush(); -
BufferedReader reader = BufferedReader( newInputStreamReader(con.getInputStream(), //charset)); 读取结果 -
String line; -
((line null)= reader.readLine()) != { -
System.out.println(line); // 我这里不再读取每一样了,大家测试时可以去掉注释掉的break,并去掉这里的注释 -
-
} -
os.close(); -
reader.close(); -
true; -
} (Exception ex) { -
ex.printStackTrace(); -
false; -
} - }
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; } }
给大家提供一个参考的参数数据
查看复制到剪切板打印
- 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+
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就是提交博客的地址,其它的大家自己看吧
发送的接口
查看复制到剪切板打印
- package
net.java2000.blogsender; -
- public
interface Sender { -
boolean send(String title, String message); -
- }
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; -
-
- public
class BaiduSender implementsSender { -
-
String host; -
String charset; -
String post; -
String action; -
String cookie; -
String message; -
-
boolean send(String title, String content) { -
content = content.replace( "<br/>"); -
content = content.replace( "<br/>"); -
PostUtil.post(host, charset, action, post, cookie, message, title, content); -
} -
-
BaiduSender() { -
Properties p = Properties(); -
{ -
p.load(BaiduSender. -
host = p.getProperty( -
charset = p.getProperty( -
post = p.getProperty( -
action = p.getProperty( -
cookie = p.getProperty( -
message = p.getProperty( -
} (IOException e) { -
e.printStackTrace(); -
} -
} - }
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分钟再发另外一个。
小结:
用程序做类似的东西基本都差不多,都是模拟浏览器进行数据的提交。
- 使用Java程序向百度空间发博客的尝…
- 使用Java程序自动发博客的尝试
- 使用Java程序自动发博客的尝试-带附件
- java程序向指定邮箱发邮件
- 了空间的法国是反方向的大幅度发
- 博客转到百度空间
- 百度空间博客
- paip.百度空间 JAVA程序发文总结
- 发邮件的JAVA程序
- 使用scribeFire发的第一篇博客
- 向CListView空间发LVN_COLUMNCLICK消息
- 关于我的百度空间和CSDN博客
- 博客搬家了,原来的百度空间放弃不用了
- 编程中国-百度空间-博客园……
- Java程序自动发布文章到百度空间
- Java程序自动发布文章到百度空间
- #define 的使用【转】_zhi_qiu_yi_ye的空间_百度空间
- 因百度空间关闭,从现在开始,我就使用本CSDN博客作为主博客
- 经验……
- 协议
- 协议2
- 面试经验题
- 让 Windows 在后台和前台程序之间平均分配处理器资源。
- 使用Java程序向百度空间发博客的尝…
- Ajax实现不刷屏的前提下实现页面定…
- 软件测试工程师要求
- 操作系统面试
- 图基本概念
- 二叉树
- Perl模式匹配
- 递归练习
- 设计模式程序参考