package li.discuz;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import li.http.Request;
import li.http.Response;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class Discuz {
public static final String REFERER = "Referer";
public static final String UTF8 = "UTF-8";
public static final HttpClient HTTP_CLIENT = new DefaultHttpClient();
public static final HttpContext CONTEXT = new BasicHttpContext();
public static final CookieStore COOKIE_STORE = new BasicCookieStore();
private String domain;
public Discuz(String domain) {
this.domain = domain;
}
private li.http.CookieStore cookieStore;
/**
* 登陆
*/
public void login(String username, String password) throws Exception {
String referer = domain + "member.php?mod=logging&action=login&mobile=yes";
Document document = Jsoup.connect(referer).get();
String action = domain + document.select("form").attr("action");
Request request = new Request();
request.setReferer(referer);
request.setUrl(action);
request.setField("formhash", document.select("input#formhash").attr("value"));
request.setField("referer", document.select("input#referer").attr("value"));
request.setField("submit", document.select("input#submit").attr("value"));
request.setField("loginsubmit", "true");
request.setField("questionid", "0");
request.setField("answer", "");
request.setField("username", username);
request.setField("password", password);
Response response = request.execute(cookieStore = new li.http.CookieStore());
System.err.println(response.getBody());
}
/**
* 发帖
*/
public void post(Integer fid, String subject, String message) throws IOException {
String referer = domain + "forum.php?mod=post&action=newthread&fid=" + fid + "&mobile=yes";
Document document = Jsoup.connect(referer).get();
String action = domain + document.select("form#postform").attr("action");
Request request = new Request();
request.setReferer(referer);
request.setUrl(action);
request.setField("formhash", document.select("input#formhash").attr("value"));
request.setField("posttime", document.select("input#posttime").attr("value"));
request.setField("subject", subject);
request.setField("message", message);
request.setField("topicsubmit", "发表帖子");
Response response = request.execute(cookieStore);
System.err.println(response.getHeaders());
System.out.println(response.getBody());
}
/**
* 回帖
*/
public void reply(Integer tid, String message) {}
/**
* 原来的登陆
*/
public List<Cookie> login2(String username, String password) {
String referer = domain + "member.php?mod=logging&action=login&mobile=yes";
HttpGet get = new HttpGet(referer);
Document document = Jsoup.parse(content(execute(HTTP_CLIENT, get, CONTEXT).getEntity()));
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair("formhash", document.select("input#formhash").attr("value")));
formParams.add(new BasicNameValuePair("referer", document.select("input#referer").attr("value")));
formParams.add(new BasicNameValuePair("submit", document.select("input#submit").attr("value")));
formParams.add(new BasicNameValuePair("loginsubmit", "true"));
formParams.add(new BasicNameValuePair("questionid", "0"));
formParams.add(new BasicNameValuePair("answer", ""));
formParams.add(new BasicNameValuePair("username", username));
formParams.add(new BasicNameValuePair("password", password));
String action = domain + document.select("form").attr("action");
HttpPost post = new HttpPost(action);
post.setHeader(REFERER, referer);
post.setEntity(urlEncodedFormEntity(formParams, UTF8));
CONTEXT.setAttribute(ClientContext.COOKIE_STORE, COOKIE_STORE);
HttpResponse response = execute(HTTP_CLIENT, post, CONTEXT);
System.out.println(content(response.getEntity()));
return COOKIE_STORE.getCookies();
}
public void post2(Integer fid, String subject, String message) {
String referer = domain + "forum.php?mod=post&action=newthread&fid=" + fid + "&mobile=yes";
HttpGet get = new HttpGet(referer);
Document document = Jsoup.parse(content(execute(HTTP_CLIENT, get, CONTEXT).getEntity()));
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair("formhash", document.select("input#formhash").attr("value")));
formParams.add(new BasicNameValuePair("posttime", document.select("input#posttime").attr("value")));
formParams.add(new BasicNameValuePair("subject", subject));
formParams.add(new BasicNameValuePair("message", message));
formParams.add(new BasicNameValuePair("topicsubmit", "发表帖子"));
String action = domain + document.select("form#postform").attr("action");
HttpPost post = new HttpPost(action);
post.setHeader(REFERER, referer);
post.setEntity(urlEncodedFormEntity(formParams, UTF8));
HttpResponse response = execute(HTTP_CLIENT, post, CONTEXT);
System.out.println(content(response.getEntity()));
}
public void reply2(Integer tid, String message) {
String referer = domain + "forum.php?mod=viewthread&tid=" + tid + "&mobile=yes";
HttpGet get = new HttpGet(referer);
Document document = Jsoup.parse(content(execute(HTTP_CLIENT, get, CONTEXT).getEntity()));
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
formParams.add(new BasicNameValuePair("formhash", document.select("input[name=formhash]").attr("value")));
formParams.add(new BasicNameValuePair("replysubmit", document.select("input#fastpostsubmit").attr("value")));
formParams.add(new BasicNameValuePair("message", message));
String action = domain + document.select("form#fastpostform").attr("action");
HttpPost post = new HttpPost(action);
post.setHeader(REFERER, referer);
post.setEntity(urlEncodedFormEntity(formParams, UTF8));
HttpResponse response = execute(HTTP_CLIENT, post, CONTEXT);
System.out.println(content(response.getEntity()));
}
/**
* 执行http请求
*/
public static HttpResponse execute(HttpClient client, HttpUriRequest request, HttpContext context) {
try {
return client.execute(request, context);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 组装http请求的form表单
*/
public static HttpEntity urlEncodedFormEntity(List<NameValuePair> formParams, String charset) {
try {
return new UrlEncodedFormEntity(formParams, charset);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 提取页面内容文本
*/
public static String content(HttpEntity entity) {
try {
return EntityUtils.toString(entity);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}