package com.bao.lc.site.s3.commands; import java.util.HashMap; import java.util.Map; import org.apache.commons.chain.Context; import org.apache.commons.collections.MapUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpUriRequest; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.AndFilter; import org.htmlparser.filters.HasAttributeFilter; import org.htmlparser.filters.NodeClassFilter; import org.htmlparser.tags.FormTag; import org.htmlparser.tags.InputTag; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import com.bao.lc.bean.IDValuePair; import com.bao.lc.bean.ResultCode; import com.bao.lc.client.RequestBuilder; import com.bao.lc.client.utils.HttpClientUtils; import com.bao.lc.common.URI2NameBuilder; import com.bao.lc.httpcommand.BasicHttpCommand; import com.bao.lc.httpcommand.params.HttpCommandPNames; import com.bao.lc.httpcommand.params.HttpCommandParams; import com.bao.lc.site.s3.params.TdPNames; import com.bao.lc.util.MiscUtils; public class GetTicketBookInitPage extends BasicHttpCommand { private static Log log = LogFactory.getLog(GetTicketBookInitPage.class); public GetTicketBookInitPage() { super(); } protected IDValuePair preExecute(Context context) throws Exception { // Remove the response if it exists HttpCommandParams.purgeResponseParams(context); // Request context.put(HttpCommandPNames.TARGET_REQUEST, buildTargetRequest(context)); // Referrer String referer = MapUtils.getString(context, TdPNames.PARAM_TICKET_BOOK_INIT_REFERER); context.put(HttpCommandPNames.TARGET_REFERER, referer); return ResultCode.RC_OK; } protected IDValuePair postExecute(Context context) throws Exception { // 1. Save the response content HttpResponse rsp = HttpCommandParams.getResponse(context); String charset = HttpCommandParams.getCharset(rsp, context); URI2NameBuilder ub = new URI2NameBuilder(); ub.uri(HttpCommandParams.getTargetRequestURI(context)); ub.addParamName("method").encoding(charset); String content = HttpClientUtils.saveToString(rsp.getEntity(), charset, ub); //getSelected@https://dynamic.12306.cn/otsweb/js/order/query_common_func.js?version=2.4 //submitRequest@https://dynamic.12306.cn/otsweb/js/order/query_single_bindevent.js?version=2.4 //orderForm // 2. Parse IDValuePair rc = parseContent(context, content, charset); HttpCommandParams.purgeRequestParams(context); return rc; } private HttpUriRequest buildTargetRequest(Context context) { RequestBuilder rb = new RequestBuilder(); String uriString = MapUtils.getString(context, TdPNames.PARAM_TICKET_BOOK_INIT_URL); String encoding = HttpCommandParams.getDefaultResponseCharset(context); rb.uriStr(uriString).encoding(encoding); return rb.create(); } private IDValuePair parseContent(Context context, String content, String charset) throws ParserException { Parser parser = MiscUtils.createParser(content, charset, log); NodeFilter filter = new AndFilter(new NodeClassFilter(FormTag.class), new HasAttributeFilter("id", "orderForm")); NodeList nodeList = parser.parse(filter); if(nodeList.size() <= 0) { log.fatal("Can't find the orderForm."); return ResultCode.RC_UNKOWN; } Map<String, String> orderParamMap = new HashMap<String, String>(); FormTag orderForm = (FormTag)nodeList.elementAt(0); NodeList inputs = (NodeList)orderForm.getFormInputs(); for(int i = 0, size = inputs.size(); i < size; i++) { InputTag input = (InputTag)inputs.elementAt(i); String name = input.getAttribute("name"); String value = input.getAttribute("value"); if(value == null) { value = ""; } orderParamMap.put(name, value); } context.put(TdPNames._ORDER_FORM_PARAMETER_MAP, orderParamMap); if(log.isDebugEnabled()) { log.debug("orderParamMap: " + MiscUtils.toString(orderParamMap)); } return ResultCode.RC_OK; } }