上一篇:穷游省钱三大妙招: 最便宜的机票、酒店(转)
下一篇:ServiceOntario换地址
自动发帖机原理和代码
米娅 2012年12月4日 12:11:02

自动发帖机原理和代码


原理:

我们在写灌水机器人、抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录。 要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的。

HTTP协议是一个无连接的协议,也就是说这次对话的内容和状态与上次的无关,为了实现和用户的持久交互,网站与浏览器之前在刚建立会话时将在服务器内存中建立一个Session,该Session标识了该用户(浏览器),每一个Session都有一个唯一的ID,第一次建立会话时服务器将生成的这个ID传给浏览器,浏览器在接下来的浏览中每一个发向服务器的请求中都将包含该SessionID,从而标识了自己的身份。

服务器上是使用内存来保存Session中的信息,那么浏览器又使用什么来保存服务器分配的这个SessionID了?对,是Cookie。在刚建立会话时浏览器向服务器的请求中将不包含SessionID在Cookie中,服务器就认为是一个全新的会话,从而在服务器上分配一段内存给该Session用,同时将该Session的ID在Http Header中使用Set-Cookie发送给浏览器。

以上出自博客园深蓝居 http://blog.163.com/da7_1@126/blog/static/104072678201251442617448/


JAVA 编写代码自动在 discuz 7.2 的论坛上发帖子
2楼 2012年12月4日 12:13:06 米娅
来自:http://leidiqiu.iteye.com/blog/861103

遇到一个 Powered by discuz 7.2 ! 的论坛,有积分的限制,很是不爽,发帖可以增加积分,所以花了点时间琢磨弄个自动发帖机,以下

是基本的代码和原理说明,要实现自动发帖,循环执行以下代码即可。(注意发帖的时间间隔限制)

package com.ldq;

import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

public class MyNewTopic {

private static URL url;
private static HttpURLConnection con;
private static String temp;
private static InputStream is;
private static byte[] b;
private static int pos;
private static String cookie_sid;
private static String cookie_auth;
private static String my_cookie;
private static String login_formhash;
private static String post_formhash;
private static String user = "test";// 用户名
private static String pass = "test";// 密码
private static String new_fid = "11";// 版块 ID
private static String subject = "新主题";// 标题
private static String msg = "这里是新主题的内容";// 帖子内容

public static void main(String[] args) {
// TODO Auto-generated method stub
try {

// 获取 cookie_sid 和 login_formhash --------------------
url = new URL("http://192.168.72.130/bbs/logging.php?action=login");
con = (HttpURLConnection) url.openConnection();
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
// 获取服务器发给客户端的 Cookie
temp = con.getHeaderField("Set-Cookie");
System.out.println("Set-Cookie:" + temp);
// 取 Cookie 前面的部分就可以了,后面是过期时间、路径等,不用管它
cookie_sid = temp.substring(0, 14);
System.out.println(cookie_sid);

is = con.getInputStream();
b = new byte[is.available()];
is.read(b);
// 服务器会返回一个页面,此页面中包含 formhash
temp = new String(b);
// 找出这个 formhash 的位置
pos = temp.indexOf("name="formhash" value=");
// System.out.println(temp);
// 找出这个 formhash 的内容,这是登录用的 formhash
login_formhash = temp.substring(pos + 23, pos + 23 + 8);
System.out.println("login_formhash:" + login_formhash);
System.out
.println("------------------------------------------------------------");
is.close();
}

// 获取cookie_auth -----------------------------------------------
url = new URL("http://192.168.72.130/bbs/logging.php");
con = (HttpURLConnection) url.openConnection();

// 设定以 POST 发送
con.setRequestMethod("POST");
// 加入 Cookie 内容
con.setRequestProperty("Cookie", cookie_sid);
// 添加 POST 的内容
con.setDoOutput(true);
OutputStreamWriter osw = new OutputStreamWriter(con
.getOutputStream());
osw
.write("action=login&loginfield=username&questionid=0&answer=&loginsubmit=yes&formhash="
+ login_formhash
+ "&username="
+ user
+ "&password=" + pass);
osw.flush();
osw.close();

if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
Map> map = con.getHeaderFields();
List list = map.get("Set-Cookie");
for (int i = 0; i < list.size(); i++) {
temp = list.get(i);
if (temp.contains("CsN_auth")) {
System.out.println(temp);
// 取 Cookie 前面的部分就可以了,后面是过期时间、路径等,不用管它
cookie_auth = temp.split(";")[0];
System.out.println("cookie_auth:" + cookie_auth);
}
}

is = con.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
// System.out.println(new String(b));
System.out
.println("------------------------------------------------------------");
is.close();
}

// 正式登录
url = new URL(
"http://192.168.72.130/bbs/post.php?action=newthread&fid="
+ new_fid);
HttpURLConnection con = (HttpURLConnection) url.openConnection();

my_cookie = cookie_sid + ";" + cookie_auth;
System.out.println(my_cookie);
// 加入 Cookie 内容
con.setRequestProperty("Cookie", my_cookie);

if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = con.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
temp = new String(b);
pos = temp.indexOf("id="formhash" value=");
// System.out.println(temp);
// 获得发帖用的 formhash
post_formhash = temp.substring(pos + 21, pos + 21 + 8);
System.out.println("post_formhash:" + post_formhash);
System.out
.println("------------------------------------------------------------");
is.close();
}

// 发新帖子
url = new URL("http://192.168.72.130/bbs/post.php");
con = (HttpURLConnection) url.openConnection();

con.setRequestMethod("POST");
con.setRequestProperty("Cookie", my_cookie);
con.setDoOutput(true);
osw = new OutputStreamWriter(con.getOutputStream());
temp = "action=newthread&topicsubmit=yes&subject=" + subject
+ "&formhash=" + post_formhash + "&fid=" + new_fid
+ "&message=" + msg;
osw.write(temp);
osw.flush();
osw.close();

if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = con.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
// System.out.println(new String(b));
System.out
.println("------------------------------------------------------------");
is.close();
}

} catch (Exception e) {
e.printStackTrace();
}

}
}
第1页 共1页
相关链接
1. 网页自动跳转代码
2. 背景固定CSS代码
3. 在本页内运用标签跳转(附html代码)
4. 网页防复制(附代码)
5. Drupal 7: 多站点,一套核心代码,一套数据库,共用用户数据,一次登陆,同步session
6. 将Excel数据保存到MySQL数据库及PHP读Excel数据(附代码)
7. 传递selected OPTION 的值到表单的一个hidden INPUT(附代码)
8. XMLHttpRequest中文乱码解决方法(附代码)
9. 如何解决有些浏览器flash文件(.swf)不显示的问题(附代码)
10. 如何用Adobe Flash CS4和ActionScript 3.0添加超级链接(附代码)
11. 如何得到flash(.swf)的资源,比如图片、代码 - 反编译
12. 如何在Adobe Flash CS4中给flash加入超级链接(附代码)
13. 如何在网页嵌入flash,并无警告提示播放(附代码)
14. 网页右键禁用JavaScript代码
15. 在结果页显示前显示进度条,代码
16. 用Session和Cookie结合实现登陆认证(附代码)