Question

I'm try make an application chatbot in Android. I use Pandorabots as Chatbot server. To connect between Device Android with the Server. I use pandorabot XML-RPC API, and i use xml-rpc library from android-xmlrpc. so this my code:

public class MainActivity extends Activity {
private EditText editOne;
private TextView textOne;
private Button ButtonOne;
private XMLRPCClient server;
private URI uri;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    uri = URI.create("http://www.pandorabots.com/pandora/talk-xml?botid=e80e92407e341007");
    server = new XMLRPCClient(uri);
    editOne = (EditText) findViewById(R.id.editText1);
    textOne = (TextView) findViewById(R.id.textView1);
    ButtonOne = (Button) findViewById(R.id.button1);

    textSatu.setText(getDataMethod("hi"));
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


private String getDataMethod(String num) {
    String text = "";
    try {
        Log.w("Running server.call", "prosess");
        Object[] data = (Object[]) server.call("input", num);
        Log.w("server.call Run", "finish");
        Log.w("Run HashMap", "prosess");
        for(Object o: data) {
            HashMap map = (HashMap) o;
            Log.w("HashMap Berjalan", "Error");
            text = text + "'that' => " + map.get("that") + "\n\n";
        }
    } catch (XMLRPCException e) {
        Log.w("XMLRPC Test", "Error", e);
        text = "XMLRPC error";
    }       
    return text;
}


 }

But i got error. It's say :org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}methodResponse (position:START_TAG @1:45 in java.io.InputStreamReader@41174280)

can anyone help me? please.

Was it helpful?

Solution

here is a solution that does not require XMLRPCClient. The important thing is to capture the customer ID on the first interaction with the bot, and then send the value of custid back with each subsequent transaction. The bot uses the custid to remember the local variables associated with a conversation thread, such as name, age, gender, topic etc.

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URLEncoder;
public class PandorabotsTalkAPI {
    public String defaultCustid = "0";
    public String custid = defaultCustid;
    public String responseFailed = "RESPONSE FAILED";
    public String defaultBotId = "f5d922d97e345aa1";
    public String defaultHost = "www.pandorabots.com";
    public String askPandorabots(String input) {
        return askPandorabots(input, defaultHost, defaultBotId);
    }
    public String askPandorabots(String input, String host, String botid) {
        //System.out.println("Entering askPandorabots with input="+input+" host ="+host+" botid="+botid);
        String responseContent = pandorabotsRequest(input, host, botid);
        if (responseContent == null) return responseFailed;
        else return pandorabotsResponse(responseContent, host, botid);
    }
    public String responseContent(String url) throws Exception {
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet();
        request.setURI(new URI(url));
        InputStream is = client.execute(request).getEntity().getContent();
        BufferedReader inb = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder("");
        String line;
        String NL = System.getProperty("line.separator");
        while ((line = inb.readLine()) != null) {
            sb.append(line).append(NL);
        }
        inb.close();
        return sb.toString();
    }


    public String spec(String host, String botid, String custid, String input) {
        //System.out.println("--> custid = "+custid);
        String spec = "";
        try {
            if (custid.equals("0"))      // get custid on first transaction with Pandorabots
                spec =    String.format("%s?botid=%s&input=%s",
                        "http://" + host + "/pandora/talk-xml",
                        botid,
                        URLEncoder.encode(input, "UTF-8"));
            else spec =                 // re-use custid on each subsequent interaction
                    String.format("%s?botid=%s&custid=%s&input=%s",
                            "http://" + host + "/pandora/talk-xml",
                            botid,
                            custid,
                            URLEncoder.encode(input, "UTF-8"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        //System.out.println(spec);
        return spec;
    }

    public String pandorabotsRequest(String input, String host, String botid) {
        try {

            String spec = spec(host, botid, custid, input);
            //System.out.println("Spec = "+spec);
            String responseContent = responseContent(spec);
            return responseContent;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    public String pandorabotsResponse (String xmlRpcResponse, String host, String botid) {
        String botResponse = responseFailed;
        try {
            int n1 = xmlRpcResponse.indexOf("<that>");
            int n2 = xmlRpcResponse.indexOf("</that>");

            if (n2 > n1)
                botResponse = xmlRpcResponse.substring(n1+"<that>".length(), n2);
            n1 = xmlRpcResponse.indexOf("custid=");
            if (n1 > 0) {
                custid = xmlRpcResponse.substring(n1+"custid=\"".length(), xmlRpcResponse.length());
                n2 = custid.indexOf("\"");
                if (n2 > 0) custid = custid.substring(0, n2);
                else custid = defaultCustid;
                }
            if (botResponse.endsWith(".")) botResponse = botResponse.substring(0, botResponse.length()-1);   // snnoying Pandorabots extra "."
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return botResponse;
    }

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top