1

我已经尝试了几天让我的应用程序以某种方式连接到 twitter 的 rest api v 1.1,但几乎没有任何效果,或者我无法很好地适应它来工作,两者之一。我已经从 twitter 开发者网站上找到了一个解释代码的教程,我尝试为我的应用程序实现它,但它一直给我一个奇怪的错误,并显示以下文本 "api.twitter.com" 。我不知道这是什么类型的错误,但我认为这与 http 请求有关,因为我看到它没有通过这行代码“HttpResponse response = client.execute(post);”。我希望我能得到一些反馈,或者一些想法,我真的有点麻烦。提前致谢。

这是它的代码:

  package com.gtware.android.twitter.restapi;

  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.UnsupportedEncodingException;
  import java.net.URLEncoder;
  import java.util.Date;
  import java.util.UUID;

  import javax.crypto.Mac;
  import javax.crypto.spec.SecretKeySpec;

  import org.apache.http.HttpResponse;
  import org.apache.http.client.HttpClient;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.client.methods.HttpRequestBase;
  import org.apache.http.entity.StringEntity;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.json.JSONException;
  import org.json.JSONObject;

  import android.app.Activity;
  import android.app.AlertDialog;
  import android.os.Bundle;
  import android.text.Editable;
  import android.text.TextWatcher;
  import android.util.Base64;
  import android.util.Log;
  import android.view.View;
  import android.widget.Button;
  import android.widget.EditText;

 public class PostActivity extends Activity {

 public static final String ENCODING = "UTF-8";
 private static final String postURL = "https://api.twitter.com/1.1/statuses/update.json";

   / /Keys & Secrets
   private static final String consumerKey = "this is where i enter my consumer key ";
   private static final String consumerSecret = "this is where i enter my consumer secret ";
   private static final String accessToken = "this is where i enter my accestoken";
   private static final String accessTokenSecret = "this is where i enter my accestokenSecret";

   //OAuth Header Keys
   private static final String oauth_consumer_key = "oauth_consumer_key";
   private static final String oauth_nonce = "oauth_nonce";
   private static final String oauth_signature = "oauth_signature";
   private static final String oauth_signature_method = "oauth_signature_method";
   private static final String oauth_timestamp = "oauth_timestamp";
   private static final String oauth_token = "oauth_token";
   private static final String oauth_version = "oauth_version";
   private static final String status = "status";
   private static final String include_entities="include_entities";
   private static final String x="true";
   private EditText tweetEditor;
   private Button postButton;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.post_main);
    postButton = (Button)findViewById(R.id.postButton);
    tweetEditor = (EditText)findViewById(R.id.tweetEditor);
    tweetEditor.addTextChangedListener(new TextWatcher() {
     public void onTextChanged(CharSequence s, int start, int before, int count) {
      if(tweetEditor.getText().length() == 0) {
       postButton.setEnabled(false);
      }
      else {
       postButton.setEnabled(true);
      }
     }
     public void beforeTextChanged(CharSequence s, int start, int count,
 int after) { }

     public void afterTextChanged(Editable s) { }
    });
      }

      private void alertUser(String str) {
       new AlertDialog.Builder(this)
      .setMessage(str)
      .setNeutralButton("OK", null)
      .show();
}

public void post(View button) {
 HttpClient client = new DefaultHttpClient();
 HttpPost post = new HttpPost(postURL);
 try {
  String message = tweetEditor.getText().toString();
  addAuthorizationHeader(message, post);
  post.setEntity(new StringEntity(percentEncode(status) + "=" + percentEncode(message)));

  HttpResponse response = client.execute(post);

  parsePostResponse(response);
 }
 catch(Exception e) {
  Log.e(PostActivity.class.getName(), e.getMessage());
  alertUser("Error: " + e.getMessage());
 }
}

private void addAuthorizationHeader(String tweet, HttpRequestBase request) throws Exception {
 request.setHeader("Content-Type", "application/x-www-form-urlencoded");

 String nonce = base64Encode((UUID.randomUUID().toString().replaceAll("-", "").replace("=","").getBytes()));
 nonce=nonce.substring(0, nonce.length()-1);
    String signatureMethod = "HMAC-SHA1";
    String timeStamp = String.valueOf(new Date().getTime() / 1000);
    String version = "1.0";

    //Generating the Parameter String:
    //Add request parameters and status message alphabetically (DO NOT ADD SIGNATURE)
    //Encode keys and values while adding
    //Insert = character between each key and its value
    //Add an ampersand (&) to the end if there are more parameters
    String parameterString = 
      percentEncode(include_entities)+"="+percentEncode(x)+"&"+
       percentEncode(oauth_consumer_key) + "=" + percentEncode(consumerKey) + "&" +
       percentEncode(oauth_nonce) + "=" + percentEncode(nonce) + "&" +
       percentEncode(oauth_signature_method) + "=" + percentEncode(signatureMethod) + "&" +
       percentEncode(oauth_timestamp) + "=" + percentEncode(timeStamp) + "&" +
       percentEncode(oauth_token) + "=" + percentEncode(accessToken) + "&" +
       percentEncode(oauth_version) + "=" + percentEncode(version) + "&" +
       percentEncode(status) + "=" + percentEncode(tweet);
    Log.e("This is the parameterString",parameterString);
    Log.e("This is the nonce  variable",nonce);
    //Generate the SignatureBaseString
    String signatureBaseString = "POST&" + percentEncode(postURL) + "&" + percentEncode(parameterString);
     Log.e("Signature base looks like this ",signatureBaseString);
    //Generate the SigningKey
    String signingKey = percentEncode(consumerSecret) + "&" + percentEncode(accessTokenSecret);
    Log.e("Signing key  looks like this ",signingKey);
    //Generate HMAC-MD5 signature
    String signature = generateHmacSHA1(signingKey, signatureBaseString);
    Log.e("Signature looks like  so  ",signature);
    //Build the HTTP Header
    String oauthHeader =
"OAuth " + 
percentEncode(oauth_consumer_key) + "=\"" + percentEncode(consumerKey) + "\", " +  
percentEncode(oauth_nonce) + "=\"" + percentEncode(nonce) + "\", " + 
percentEncode(oauth_signature) + "=\"" + percentEncode(signature) + "\", " + 
   percentEncode(oauth_signature_method) + "=\"" + percentEncode(signatureMethod) + "\", " + 
   percentEncode(oauth_timestamp) + "=\"" + percentEncode(timeStamp) + "\", " + 
   percentEncode(oauth_token) + "=\"" + percentEncode(accessToken) + "\", " + 
   percentEncode(oauth_version) + "=\"" + percentEncode(version) + "\"";
     Log.e("Header looks like this ",oauthHeader);
    request.addHeader("Authorization", oauthHeader);
}

private String generateHmacSHA1(String key, String value) throws Exception {
 SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(ENCODING), "HmacSHA1");
 Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(keySpec);
    byte[] result = mac.doFinal(value.getBytes(ENCODING));
    return base64Encode(result);
}

private void parsePostResponse(HttpResponse response) throws IllegalStateException, IOException, JSONException {
 StringBuilder sb = getResponseBody(response);
 if(response.getStatusLine().getStatusCode() == 200) {
  alertUser("Tweet Successful!\nID: " + new JSONObject(sb.toString()).get("id"));
 }
 //Not OK
 else {
  Log.e(PostActivity.class.getName(), "Response Code: " + response.getStatusLine().getStatusCode() + "\nResponse: " + sb.toString());
  alertUser("Error Code: " + response.getStatusLine().getStatusCode() + "\n" + new JSONObject(sb.toString()).getString("error"));
 }
}

      private static StringBuilder getResponseBody(HttpResponse response) throws IllegalStateException, IOException {
       InputStream is = response.getEntity().getContent();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while((line = br.readLine()) != null) {
     sb.append(line);
    }
    br.close();
    return sb;
      }

private String percentEncode(String s) throws UnsupportedEncodingException {
    //This could be done faster with more hand-crafted code.
    return URLEncoder.encode(s, ENCODING)
      // OAuth encodes some characters differently:
            .replace("+", "%20").replace("*", "%2A")
            .replace("%7E", "~");
}

private static String base64Encode(byte[] array) {
 return Base64.encodeToString(array, Base64.NO_WRAP);
}

  }
4

0 回答 0