package com.suan.weclient.util;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import com.google.gson.Gson;
public class DataParser {
public static final int LOGIN_SUCCESS = 1;
public static final int LOGIN_FAILED = 0;
public static final int GET_MESSAGE_SUCCESS = 1;
public static final int GET_MESSAGE_FAILED = 0;
public static final int GET_USER_PROFILE_SUCCESS = 1;
public static final int GET_USER_PROFILE_FAILED = 0;
public static final int GET_MASS_DATA_SUCCESS = 1;
public static final int GET_MASS_DATA_FAILED = 0;
public static int getUserProfile(String source, UserBean userBean) {
Document document = Jsoup.parse(source);
Elements numElements = document.getElementsByClass("number");
for (int i = 0; i < numElements.size(); i++) {
if (numElements.size() == 3) {
if (i == 0) {
int newMessage = Integer
.parseInt(numElements.get(i).html());
userBean.setNewMessage(newMessage + "");
}
if (i == 1) {
int newPeople = Integer.parseInt(numElements.get(i).html());
userBean.setNewPeople(newPeople + "");
}
if (i == 2) {
int totalPeople = Integer.parseInt(numElements.get(i)
.html());
userBean.setTotalPeople(totalPeople + "");
}
}
}
Elements avataElements = document.getElementsByClass("avatar");
for (int i = 0; i < avataElements.size(); i++) {
String fakeId = getProfileFakeId(avataElements.get(i).attr("src"));
if (!fakeId.equals("")) {
userBean.setFakeId(fakeId);
}
}
Elements nickNameElements = document.getElementsByClass("nickname");
for (int i = 0; i < nickNameElements.size(); i++) {
String nickNameString = nickNameElements.get(i).html();
if (nickNameString != "") {
userBean.setNickname(nickNameString);
return GET_USER_PROFILE_SUCCESS;
}
}
return GET_USER_PROFILE_FAILED;
}
public interface ParseMassDataCallBack{
public void onBack(UserBean userBean);
}
public static void getMassData(final String source,final UserBean userBean,final ParseMassDataCallBack parseMassDataCallBack) {
final Handler loadHandler = new Handler() {
// 子类必须重写此方法,接受数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// 此处可以更新UI
UserBean getBean = (UserBean) msg.obj;
parseMassDataCallBack.onBack(getBean);
}
};
new Thread() {
public void run() {
String result = "";
Pattern pattern = Pattern
.compile("can_verify_apply\\s\\?\\s\\'(\\d*)\\'\\*");
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
result = matcher.group(1);
userBean.setMassLeft(Integer.parseInt(result));
Message message = new Message();
message.obj =userBean;
loadHandler.sendMessage(message);
}
}
}.start();
}
private static String getProfileFakeId(String source) {
String result = "";
Pattern pattern = Pattern.compile("fakeid=(\\d*)");
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
return matcher.group(1);
}
return result;
}
public static class MessageResultHolder {
public MessageHolder messageHolder;
public ArrayList<MessageItem> messageItems;
public String lastMsgId = "";
}
public interface MessageListParseCallBack {
public void onBack(MessageResultHolder messageResultHolder);
}
public static void getNewMessage(
final MessageListParseCallBack messageListParseCallBack,
final String source, final UserBean userBean,
final MessageHolder messageHolder, final String referer) {
final Handler loadHandler = new Handler() {
// 子类必须重写此方法,接受数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// 此处可以更新UI
MessageResultHolder messageResultHolder = (MessageResultHolder) msg.obj;
messageListParseCallBack.onBack(messageResultHolder);
}
};
new Thread() {
public void run() {
Document document = Jsoup.parse(source);
Elements scriptElements = document.getElementsByTag("script");
for (Element nowElement : scriptElements) {
if (nowElement.html().contains("wx.cgiData ")) {
JSONArray getArray = getMessageArray(nowElement.html());
ArrayList<MessageItem> getMessageList = getMessageItems(
getArray, userBean, referer);
String latestMsgId = getLatestMsgId(nowElement.html());
messageHolder.setMessage(getMessageList);
messageHolder.setLatestMsgId(latestMsgId);
Message message = new Message();
MessageResultHolder messageResultHolder = new MessageResultHolder();
messageResultHolder.lastMsgId = latestMsgId;
messageResultHolder.messageHolder = messageHolder;
messageResultHolder.messageItems = getMessageList;
message.obj = messageResultHolder;
loadHandler.sendMessage(message);
}
}
}
}.start();
}
public static void getNextMessage(
final MessageListParseCallBack messageListParseCallBack,
final String source, final UserBean userBean,
final MessageHolder messageHolder, final String referer) {
final Handler loadHandler = new Handler() {
// 子类必须重写此方法,接受数据
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
// 此处可以更新UI
MessageResultHolder messageResultHolder = (MessageResultHolder) msg.obj;
messageListParseCallBack.onBack(messageResultHolder);
}
};
new Thread() {
public void run() {
Document document = Jsoup.parse(source);
Elements scriptElements = document.getElementsByTag("script");
for (Element nowElement : scriptElements) {
if (nowElement.html().contains("wx.cgiData ")) {
Log.e("next parse", "find wx.cgiData");
Log.e("next parse", "content"+nowElement.html());
JSONArray getArray = getMessageArray(nowElement.html());
ArrayList<MessageItem> getMessageList = getMessageItems(
getArray, userBean, referer);
String latestMsgId = getLatestMsgId(nowElement.html());
messageHolder.addMessage(getMessageList);
messageHolder.setLatestMsgId(latestMsgId);
Message message = new Message();
MessageResultHolder messageResultHolder = new MessageResultHolder();
messageResultHolder.lastMsgId = latestMsgId;
messageResultHolder.messageHolder = messageHolder;
messageResultHolder.messageItems = getMessageList;
Log.e("next parse", "parse end"+getMessageList.size()+"|"+messageHolder.getMessageList().size());
message.obj = messageResultHolder;
loadHandler.sendMessage(message);
}
}
}
}.start();
}
public static int analyseLogin(UserBean nowBean, HttpResponse response,
Context context) {
try {
int hitAmount = 0;
String strResult = EntityUtils.toString(response.getEntity());
JSONObject resultJsonObject = new JSONObject(strResult);
int ret = (Integer) resultJsonObject.get("Ret");
if (resultJsonObject.get("Ret") != null) {
if (ret != 302) {
// progressDialog.dismiss();
AlertDialog.Builder builder = new AlertDialog.Builder(
context).setTitle("登录失败,请检查账户名和密码")
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
// TODO Auto-generated
// method stub
}
});
builder.show();
return LOGIN_FAILED;
}
}
int index = strResult.indexOf("token");
if (index != -1) {
String tokenString = getToken(resultJsonObject);
nowBean.setToken(tokenString);
hitAmount++;
}
for (int i = 0; i < response.getAllHeaders().length; i++) {
if (response.getAllHeaders()[i].getName()
.contains("Set-Cookie")) {
String nowCookie = response.getAllHeaders()[i].getValue();
if (nowCookie.contains("slave_user")) {
String slaveUser = nowCookie.substring(
nowCookie.indexOf("slave_user") + 11,
nowCookie.indexOf(";"));
nowBean.setSlaveUser(slaveUser);
hitAmount++;
}
if (nowCookie.contains("slave_sid")) {
String slaveSid = nowCookie.substring(
nowCookie.indexOf("slave_sid") + 10,
nowCookie.indexOf(";"));
nowBean.setSlaveSid(slaveSid);
hitAmount++;
}
}
}
if (hitAmount == 3) {
SharedPreferenceManager.updateUser(context, nowBean);
}
} catch (Exception exception) {
Log.e("login exception", exception + "");
return LOGIN_FAILED;
}
return LOGIN_SUCCESS;
}
private static String getToken(JSONObject resultJsonObject) {
String tokenString = "";
try {
String contentString = resultJsonObject.getString("ErrMsg");
tokenString = contentString.substring(
contentString.indexOf("token") + 6, contentString.length());
} catch (Exception e) {
}
return tokenString;
}
private static JSONArray getMessageArray(String source) {
try {
String content = source.substring(source.indexOf("{\"msg_item\":"),
source.indexOf(").msg_item"));
JSONObject nowJsonObject = new JSONObject(content);
return nowJsonObject.getJSONArray("msg_item");
} catch (Exception exception) {
}
return null;
}
private static String getLatestMsgId(String source) {
String result = "";
Pattern pattern = Pattern.compile("latest_msg_id\\s:\\s'(\\d*)',");
Matcher matcher = pattern.matcher(source);
while (matcher.find()) {
return matcher.group(1);
}
return result;
}
private static boolean filter = false;
private static ArrayList<MessageItem> getMessageItems(JSONArray jsonArray,
UserBean userBean, String referer) {
ArrayList<MessageItem> messageItems = new ArrayList<MessageItem>();
Gson gson = new Gson();
for (int i = 0; i < jsonArray.length(); i++) {
try {
JSONObject nowJsonObject = jsonArray.getJSONObject(i);
nowJsonObject.put("token", userBean.getToken());
nowJsonObject.put("slave_sid", userBean.getSlaveSid());
nowJsonObject.put("slave_user", userBean.getSlaveUser());
nowJsonObject.put("referer", referer);
MessageItem nowItem = (MessageItem) gson.fromJson(
nowJsonObject.toString(), MessageItem.class);
if (filter) {
if (nowItem.getType() == MessageItem.MESSAGE_TYPE_TEXT||nowItem.getType() == MessageItem.MESSAGE_TYPE_IMG) {
messageItems.add(nowItem);
}
} else {
messageItems.add(nowItem);
}
} catch (Exception exception) {
Log.e("parse errror", exception + "");
}
}
return messageItems;
}
}