【问题标题】:Can't get twitter user's follower count via Twitter API无法通过 Twitter API 获取 Twitter 用户的关注者数量
【发布时间】:2016-07-25 07:18:37
【问题描述】:

我很难获得 Twitter 用户的关注者数量。

我确实遵循了 twitter rest api 文档,但找不到我的问题的答案。我通过他们的 rest API 成功地进行了调用,并且我收到了“成功”的回调,但我不知道将我的响应解析为什么。他们的文档一直说“它返回一个”ID集合“。所以我假设我可以将响应解析为一个ID列表(List),但这会导致一个gson解析错误。我可以成功地将它解析为一个JSONOBject但最终是空的。

以下是相关代码:

package com.boomer.omer.kollabstr.backend.twitteroauth;

导入 com.twitter.sdk.android.core.models.User;

import org.json.JSONObject;

import java.util.List;

import retrofit.Callback;
import retrofit.http.GET;
import retrofit.http.Query;


    public interface TwitterGetFollowerCountApiClient {

         @GET("/1.1/followers/ids.json")
        void getFollowerCount(@Query("user_id")Long id,
                          @Query("screen_name")String screenname,
                          @Query("cursor")Long cursor,
                          @Query("stringify_ids")Boolean sids,
                          @Query("count")Long count,
                          Callback<JSONObject> users);
}

然后我从以下位置发送/处理请求:

 private void createSocialMediaObject(final TwitterSession twitterSession){
    getKollabstrTwitterApiClient().getFollowerCountService().
            getFollowerCount(twitterSession.getUserId(),
                    null,
                    null,
                    null,
                    null,
                    new Callback<JSONObject>() {
                @Override
                public void success(Result<JSONObject> result) {
                    SocialMedia twitter = new SocialMedia();
                    twitter.setUsername(twitterSession.getUserName());
                    twitter.setUserid(Long.toString(twitterSession.getUserId()));
                    twitter.setSocialMediaType(SocialMediaType.TWITTER);
                    //twitter.setImpact(result.data.size());
                   // Log.d(TAG,"FOLLOWERS:" + Integer.toString(result.data.size()));
                    Users user = SessionManager.getInstance().getCurrentUser();
                    user.getProfile().getSocialMediaAccounts().add(twitter);
                    SessionManager.getInstance().updateUser(user);
                    Log.d("FOLLOWER",Integer.toString(result.data.length()));
                }

                @Override
                public void failure(TwitterException exception) {
                    Log.d(TAG,"FOLLOWER ERROR:" + exception.toString());

                }
            });



}

我在这里关注了他们的文档:https://dev.twitter.com/rest/reference/get/followers/ids

我想得到一个 id 列表,这样我就可以得到它的大小,这应该是根据他们的页面的关注者数量。但是即使我可以得到一个成功的回调(我假设这表明一个成功的查询正在完成)我无法弄清楚响应应该被解析成什么。

感谢任何帮助。请不要简单地将我介绍给其他图书馆来完成这项工作。

【问题讨论】:

  • 不管您有什么问题,您都可以考虑切换到Retrofit 2,它是您正在使用的 Retrofit 版本的后续版本。
  • 有一个名为 Twitter4J 的简单库,可以让您的生活变得如此轻松;
  • @Eenvincible 我特别说我不想使用其他库。
  • @PattaFeuFeu 这不是我的选择。 TwitterSdk 使用旧的改造。

标签: android rest twitter twitter-fabric


【解决方案1】:

我找到了答案。我只需要将响应解析为 Retrofit 的 Response 类。然后将其转换为 JSON 对象。

 public JSONObject responseToJSON(Response response){
    BufferedReader reader = null;
    StringBuilder sb = new StringBuilder();
    JSONObject jsonObject = null;
    try {

        reader = new BufferedReader(new InputStreamReader(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();

    try {jsonObject=new JSONObject(result);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return  jsonObject;
}

【讨论】:

    【解决方案2】:

    试试我在一些项目中使用的这段代码来让 Twitter 集成工作:

    Twitter4j 设置

    下载 twitter4j 库(jar 文件),将以下内容添加到您的 libs 文件夹中,然后从 libs 文件夹中右键单击它们以添加为库。这意味着您的 build.gradle 文件将如下所示:

    dependencies{
    
       ...
       compile files('libs/twitter4j-async-4.0.4.jar')
       compile files('libs/twitter4j-core-4.0.4.jar')
    }
    

    现在,您可以使用此库连接 Twitter。

    假设:您已经在 Twitter 上的开发者帐户上创建了一个 Twitter 应用程序。

    接下来,无论您希望如何处理请求(AsyncTask、Service 等):

    //this sample code searches for twitter accounts
    
    //rest of your code  here
    
    @Override
    protected ResponseList<User> doInBackground(String... params) {
    
        String location = "kansas city";
    
        try {
            //mTwitter is your Twitter instance!
            return mTwitter.searchUsers(location, 20);
        }catch (TwitterException e){
            e.getMessage();
        }
        return null;
    }
    
    @Override
    protected void onPostExecute(ResponseList<User> response){
        if (response != null){
            progress.dismiss();
    
            if (response.size() == 0 ){
                //you got no results back; zero
            }else{
    
                //you can loop through the response list
    
                User u = response.get(0);
    
                Log.i("USERCOUNT", "THE COUNT: " + u.getFollowersCount());
           }
        }
    }
    

    因此,您可以使用此库快速获得结果;

    我希望这对您有所帮助,如果您需要进一步的帮助,请告诉我!

    【讨论】:

    • 抱歉那部分 - 也许更新你的改造“库”,这可能对你有用?
    猜你喜欢
    • 2021-11-25
    • 2013-07-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2010-12-23
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多