Can't get List of followers in Twitter using Fabric

依然范特西╮ 提交于 2020-01-21 20:26:08

问题


I am using Fabric sdk for Twitter. In this I am able to make login request as it's described in its document. Now I wan't to get list of follower of logged in user and show in RecycleView with follower name and profile image. I have tried various solutions like:

private void getFollowersdReq(long userID) {
        showProgressDialog();


        JsonObjectRequest getRegisterReq = new JsonObjectRequest(Request.Method.GET,
                "https://api.twitter.com/1.1/followers/list.json?cursor=-1&&skip_status=true&include_user_entities=false&user_id=" + userID, null,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        LogUtils.LOGD("Server Response", response.toString());
                        hideProgressDialog();
                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d("server Error",
                        "Error: " + error.getMessage());
                Toast.makeText(getActivity(),
                        "Error:" + error.getMessage(), Toast.LENGTH_LONG).show();
                hideProgressDialog();
            }
        }) {

            /**
             * Passing some request headers
             * */
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Content-Type", "application/json");
                headers.put("Accept", "application/json");
                return headers;
            }

        };

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(getRegisterReq, new SignpostUrlStack(twitterToken, secret));

        // Cancelling request
        // ApplicationController.getInstance().getRequestQueue().cancelAll(tag_json_obj);
    }

In above code I am calling Twitter API to get list of followers but in this I am getting error message

{
    "errors": [
        {
            "code": 215,
            "message": "Bad Authentication data."
        }
    ]
}

Also I have tried

class MyTwitterApiClient extends TwitterApiClient {
        public MyTwitterApiClient(TwitterSession session) {
            super(session);
        }

        public CustomService getCustomService() {
            return getService(CustomService.class);
        }

        public UsersService getUsersService() {
            return getService(UsersService.class);
        }
    }

    interface CustomService {
        @GET("/1.1/followers/list.json")
        void show(@Query("user_id") Long userId,
                  @Query("screen_name") String var,
                  @Query("skip_status") Boolean var1,
                  @Query("include_user_entities") Boolean var2,
                  @Query("count") Integer var3, Callback<User> cb);
    }

    interface UsersService {
        @GET("/1.1/users/show.json")
        void show(@Query("user_id") Long userId,
                  @Query("screen_name") String screenName,
                  @Query("include_entities") Boolean includeEntities,
                  Callback<User> cb);
    }

Called this class like:

new MyTwitterApiClient(session).getCustomService().show(userID, null, true, true, 100, new Callback<User>() {
            @Override
            public void success(Result<User> result) {
                LogUtils.LOGI("Get success",result.toString());
            }

            @Override
            public void failure(TwitterException e) {
                hideProgressDialog();
            }
        });

By this method also I am not able to get desired output.


回答1:


The second method (using TwitterApiClient) is almost correct except for the response data model. Refere https://dev.twitter.com/rest/reference/get/followers/list for the structure of the response. You need to build a data model according to this structure. Here is the fix :

//data model
public class Followers {
        @SerializedName("users")
        public final List<User> users;

        public Followers(List<User> users) {
            this.users = users;
        }
    }

class MyTwitterApiClient extends TwitterApiClient {
    public MyTwitterApiClient(TwitterSession session) {
        super(session);
    }

    public CustomService getCustomService() {
        return getService(CustomService.class);
    }

}

interface CustomService {@GET("/1.1/followers/list.json")
    void show(@Query("user_id") Long userId, @Query("screen_name") String
    var, @Query("skip_status") Boolean var1, @Query("include_user_entities") Boolean var2, @Query("count") Integer var3, Callback < Followers > cb);
}



new MyTwitterApiClient(session).getCustomService().show(userID, null, true, true, 100, new Callback < Followers > () {@Override
    public void success(Result < Followers > result) {
        Log.i("Get success", "" + result.data.users.size());
    }

    @Override
    public void failure(TwitterException e) {

    }
 });

The above code is working for me. Hope it helps!




回答2:


MyTwitterApiClient.java

import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.TwitterApiClient;
import com.twitter.sdk.android.core.TwitterSession;
import retrofit.client.Response;
import retrofit.http.GET;
import retrofit.http.Query;

    public class MyTwitterApiClient extends TwitterApiClient {
        public MyTwitterApiClient(TwitterSession session) {
            super(session);
        }

        /**
         * Provide CustomService with defined endpoints
         */
        public CustomService getCustomService() {
            return getService(CustomService.class);
        }
    }

    // example users/show service endpoint
    interface CustomService {
        @GET("/1.1/followers/ids.json")
        void list(@Query("user_id") long id, Callback<Response> cb);
    }

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Note: Your consumer key and secret should be obfuscated in your source code before shipping.
    private static final String TWITTER_KEY = "YOUR_TWITTER_KEY";
    private static final String TWITTER_SECRET = "YOUR_TWITTER_SECRET";
    TwitterLoginButton loginButton;
    SharedPreferences shared;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig), new Crashlytics());
        setContentView(R.layout.activity_main);
        shared = getSharedPreferences("demotwitter", Context.MODE_PRIVATE);
        loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
           @Override
           public void success(Result<TwitterSession> result) {
               // Do something with result, which provides a TwitterSession for making API calls
                TwitterSession session = Twitter.getSessionManager()
                        .getActiveSession();
                TwitterAuthToken authToken = session.getAuthToken();
                String token = authToken.token;
                String secret = authToken.secret;

//Here we get all the details of user's twitter account

                System.out.println(result.data.getUserName()
                        + result.data.getUserId());
                Twitter.getApiClient(session).getAccountService()
                        .verifyCredentials(true, false, new Callback<User>() {

                            @Override
                            public void success(Result<User> userResult) {

                                User user = userResult.data;
//Here we get image url which can be used to set as image wherever required.      
                 System.out.println(user.profileImageUrl+" "+user.email+""+user.followersCount);

                            }

                            @Override
                            public void failure(TwitterException e) {

                            }

                        });
                shared.edit().putString("tweetToken", token).commit();
                shared.edit().putString("tweetSecret", secret).commit();
                TwitterAuthClient authClient = new TwitterAuthClient();
                authClient.requestEmail(session, new Callback<String>() {
                    @Override
                    public void success(Result<String> result) {
                        // Do something with the result, which provides the
                        // email address
                        System.out.println(result.toString());
                        Log.d("Result", result.toString());
                        Toast.makeText(getApplicationContext(), result.data,
                                Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void failure(TwitterException exception) {
                        // Do something on failure
                        System.out.println(exception.getMessage());
                    }
                });
                MyTwitterApiClient apiclients=new MyTwitterApiClient(session);
                apiclients.getCustomService().list(result.data.getUserId(), new Callback<Response>() {

                    @Override
                    public void failure(TwitterException arg0) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void success(Result<Response> arg0) {
                        // TODO Auto-generated method stub
                        BufferedReader reader = null;
                        StringBuilder sb = new StringBuilder();
                        try {

                            reader = new BufferedReader(new InputStreamReader(arg0.response.getBody().in()));

                            String line;

                            try {
                                while ((line = reader.readLine()) != null) {
                                    sb.append(line);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }


                        String result = sb.toString();
                    System.out.println("Response is>>>>>>>>>"+result);
                    try {
                        JSONObject obj=new JSONObject(result);
                        JSONArray ids=obj.getJSONArray("ids");
              //This is where we get ids of followers
                        for(int i=0;i<ids.length();i++){
                        System.out.println("Id of user "+(i+1)+" is "+ids.get(i));
                        }
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    }

                });
           }

           @Override
           public void failure(TwitterException exception) {
               // Do something on failure
           }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Pass the activity result to the login button.
        loginButton.onActivityResult(requestCode, resultCode, data);
    }

}


来源:https://stackoverflow.com/questions/32759374/cant-get-list-of-followers-in-twitter-using-fabric

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!