使用 Twitter API 版本 1.1 检索 user_timeline 的最简单 Java 示例

2023-12-05

我正在寻找一个使用 Twitter 1.1 API 的简单 Java 示例,但没有找到。使用此处发布的 PHP 示例:使用 Twitter API 版本 1.1 检索 user_timeline 的最简单 PHP 示例和其他一些 Stackoverflow 帖子,我能够想出以下工作示例。

public void testUserTimelineWithAuthSample() throws Exception {
    //This will read the timeline of your account.
    String method = "GET";
    String url = "https://api.twitter.com/1.1/statuses/user_timeline.json";

    String oAuthConsumerKey = "Your value here.";
    String oAuthConsumerSecret = "Your value here."; //<--- DO NOT SHARE THIS VALUE

    String oAuthAccessToken = "Your value here.";
    String oAuthAccessTokenSecret = "Your value here."; //<--- DO NOT SHARE THIS VALUE

    String oAuthNonce = String.valueOf(System.currentTimeMillis());
    String oAuthSignatureMethod = "HMAC-SHA1";
    String oAuthTimestamp = time();
    String oAuthVersion = "1.0";

    String signatureBaseString1 = method;
    String signatureBaseString2 = url;
    String signatureBaseString3Templ = "oauth_consumer_key=%s&oauth_nonce=%s&oauth_signature_method=%s&oauth_timestamp=%s&oauth_token=%s&oauth_version=%s";
    String signatureBaseString3 = String.format(signatureBaseString3Templ,
                                                    oAuthConsumerKey, 
                                                    oAuthNonce,
                                                    oAuthSignatureMethod,
                                                    oAuthTimestamp,
                                                    oAuthAccessToken,
                                                    oAuthVersion);

    String signatureBaseStringTemplate = "%s&%s&%s";
    String signatureBaseString =  String.format(signatureBaseStringTemplate, 
                                                                URLEncoder.encode(signatureBaseString1, "UTF-8"), 
                                                                URLEncoder.encode(signatureBaseString2, "UTF-8"),
                                                                URLEncoder.encode(signatureBaseString3, "UTF-8"));

    System.out.println("signatureBaseString: "+signatureBaseString);

    String compositeKey = URLEncoder.encode(oAuthConsumerSecret, "UTF-8") + "&" + URLEncoder.encode(oAuthAccessTokenSecret, "UTF-8");

    String oAuthSignature =  computeSignature(signatureBaseString, compositeKey);
    System.out.println("oAuthSignature       : "+oAuthSignature);

    String oAuthSignatureEncoded = URLEncoder.encode(oAuthSignature, "UTF-8");
    System.out.println("oAuthSignatureEncoded: "+oAuthSignatureEncoded);

    String authorizationHeaderValueTempl = "OAuth oauth_consumer_key=\"%s\", oauth_nonce=\"%s\", oauth_signature=\"%s\", oauth_signature_method=\"%s\", oauth_timestamp=\"%s\", oauth_token=\"%s\", oauth_version=\"%s\"";

    String authorizationHeaderValue = String.format(authorizationHeaderValueTempl,
                                                        oAuthConsumerKey,
                                                        oAuthNonce,
                                                        oAuthSignatureEncoded,
                                                        oAuthSignatureMethod,
                                                        oAuthTimestamp,
                                                        oAuthAccessToken,
                                                        oAuthVersion);
    System.out.println("authorizationHeaderValue: "+authorizationHeaderValue);


    System.out.println("url: "+url);
    System.out.println("authorizationHeaderValue:"+authorizationHeaderValue);

    GetMethod getMethod = new GetMethod(url);
    getMethod.addRequestHeader("Authorization", authorizationHeaderValue);
    HttpClient cli = new HttpClient();
    int status = cli.executeMethod(getMethod);
    System.out.println("Status:"+status);

    long responseContentLength = getMethod.getResponseContentLength();
    System.out.println("responseContentLength:"+responseContentLength);

    String response = getMethod.getResponseBodyAsString();  
    System.out.println("response: "+response);
}


private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException, Exception 
{
    SecretKey secretKey = null;

    byte[] keyBytes = keyString.getBytes();
    secretKey = new SecretKeySpec(keyBytes, "HmacSHA1");

    Mac mac = Mac.getInstance("HmacSHA1");

    mac.init(secretKey);

    byte[] text = baseString.getBytes();

    return new String(Base64.encodeBase64(mac.doFinal(text))).trim();
}

private String time() {
    long millis = System.currentTimeMillis();
    long secs = millis / 1000;
    return String.valueOf( secs );
}

但是,如果我向 url 添加参数,例如:

String url = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=twitterapi&count=2";

I get:

响应:{“errors”:[{“message”:“无法验证您的身份”,“code”:32}]}

知道哪里出了问题吗?


这对于使用新 Twitter API 1.1 的时间轴非常有效

1)下载twitter4j-core-3.0.3.jarhttp://twitter4j.org/en/2)尝试使用此代码:

private static final String TWITTER_CONSUMER_KEY = "xxxxxxxxxxxxxxxxxx";
private static final String TWITTER_SECRET_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private static final String TWITTER_ACCESS_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxx";
private static final String TWITTER_ACCESS_TOKEN_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxx";

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
    .setOAuthConsumerKey(TWITTER_CONSUMER_KEY)
    .setOAuthConsumerSecret(TWITTER_SECRET_KEY)
    .setOAuthAccessToken(TWITTER_ACCESS_TOKEN)
    .setOAuthAccessTokenSecret(TWITTER_ACCESS_TOKEN_SECRET);
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
try {
    Query query = new Query("MrEdPanama");
    QueryResult result;
    do {
        result = twitter.search(query);
        List<Status> tweets = result.getTweets();
        for (Status tweet : tweets) {
            System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText());
        }
    } while ((query = result.nextQuery()) != null);
    System.exit(0);
} catch (TwitterException te) {
    te.printStackTrace();
    System.out.println("Failed to search tweets: " + te.getMessage());
    System.exit(-1);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Twitter API 版本 1.1 检索 user_timeline 的最简单 Java 示例 的相关文章

随机推荐

  • 为什么 strcpy 采用 const char* 作为 src 而不是 char *?

    我实现了自己的 strcpys 来查找 src as const char 和 char 之间是否有任何区别 但没有发现以下 2 个之间有任何区别 并且两者的工作原理相同 char my strcpy char dest char src
  • 是否可以检查两组是否相等?

    如果我有一些像这样的 HTML b 1 i 2 i 3 b 以及以下正则表达式 lt gt gt lt gt gt 然后它会匹配 b 1 i 2 i 我希望它只匹配开始标签和结束标签相同的 HTML 有没有办法做到这一点 Thanks Jo
  • Javascript:for循环中定义的每个事件处理程序都是相同的,使用最后一次迭代的值

    我无法理解 Javascript 中的范围规则 在下面的示例中 我假设范围 url 变量在 for 循环中是私有的 并且 onload event 函数将看到这个私有实例 但事情似乎并非如此 警报将弹出最后一个网址两次 如果有人能澄清发生了
  • 在python中设置字典的属性

    是否可以从 python 中的字典创建一个对象 使得每个键都是该对象的一个 属性 像这样的东西 d name Oscar lastName Reyes age 32 e Employee d print e name Oscar print
  • 基于工作流状态的不同权限

    我需要根据对象的工作流程状态对对象设置不同的权限 例如 经理组 仅在状态 草稿时才可以编辑对象 但 超级经理组 在状态 已验证时也可以编辑对象 似乎不可能使用ir model access我正在评估是否可以使用ir rule 看来不是 有没
  • 来自数据库的 Primefaces 树

    我有以下实体类 Entity Table name THE TREE catalog schema dbo public class TheTree implements Serializable private static final
  • 使用 Photokit 编写带有元数据的照片

    我目前正在使用 ALAsset 框架将图像从照片库保存到带有元数据的文档目录 我使用的代码是 ALAssetsLibrary library ALAssetsLibrary alloc init autorelease library as
  • Rails-4,ExecJS::Pages 中的ProgramError#welcome

    我正在尝试向我的 Rails 应用程序添加登录 注销功能 为此我添加了bcryptgem 用于密码加密和访问控制器 现在 当我在本地运行它时 我收到一条错误消息 在添加上述功能之前 我的应用程序运行良好 错误信息 TypeError Obj
  • Android 中的 Activity 或 Fragment?

    我正在创建一个带有操作栏的应用程序 选项卡会转到不同的网页 当用户单击不同的选项卡时 我希望以前的选项卡网页保持相同的状态 即再次按下选项卡时不重新加载 最好的方法是什么 单独活动 碎片 一项活动中有多个网络视图 Thanks 使用 Act
  • 从 mod_rewrite 规则中排除图像

    我的 htaccess 脚本无意中更改了图像 URL 因此 URL 路径中包含 portfolio 的任何图像都会受到不利影响 有什么方法可以将图像从该特定规则中排除吗 redirect 301 sitemap xml http www e
  • WPF 中线程的非常基本的解释?

    我对 WPF 非常陌生 我在互联网上查找了一些有关线程的示例和教程 他们有自己的描述方式 但对于像我这样天真的人来说 我想以自己的方式去理解 我可以使用数据库更新功能开始我的第一个线程 这是场景 我有大量数据要插入数据库中 现在让我们假设以
  • flowjs:调用方法“join”。无法在混合上调用方法

    假设我有一个恒定的动物 我用它导入 import animals from animals 假设动物常数为 hoofed horses sheep goats feline lions tigers canine dogs wolves 假
  • 如何使用flask-admin编辑模型视图

    如何从flask admin的编辑页面使用generate password hash设置password hash 我在 python shell 中创建用户名和密码 密码经过哈希处理 admin add view MyModelView
  • 如何在文件中存储和检索 Python 本机数据结构?

    我正在读取 XML 文件并将所需数据重新组织为 Python 数据结构 列表 元组等 例如 我的 XML 解析器模块之一会生成以下数据 data miner py animals Chicken Sheep Cattle Horse pop
  • Xamarin.IOS:本地化不起作用

    我有一个 Xamarin IOS 应用程序并尝试本地化一些图像 我以这篇文章作为指导 https developer xamarin com guides ios advanced topics localization and inter
  • WPF:可编辑的组合框会掉落?

    我正在尝试创建一个既可编辑又可下拉而不是下拉的组合框 按向上箭头键 默认为向下键 时也应打开菜单 我尝试修改 ComboBox 的默认 ControlTemplate 但它似乎不支持 IsEditable 默认ControlTemplate
  • 如何用SAX正确解析XML?

    我正在从 REST 服务接收 XML 文档 该文档应使用 SAX 进行解析 请参阅以下由 XSD 生成的示例 设置解析器不是问题 我的主要问题是实际处理startElement endElement 我不明白如何提取我需要的项目并存储它们
  • 套接字:有时(很少)数据包在接收过程中丢失

    我在用着Socket从 udp 多播接收数据 代码很简单 s new Socket AddressFamily InterNetwork SocketType Dgram ProtocolType Udp while true int co
  • 使用 Firebase Simple Login 保护路由

    我正在尝试在使用 Firebase Simple Login 的 Ember 应用程序中实现以下事件序列ember cli 在允许进入任何路由之前检查用户是否经过身份验证 All路由需要经过身份验证 如果用户未通过身份验证 则重定向到Log
  • 使用 Twitter API 版本 1.1 检索 user_timeline 的最简单 Java 示例

    我正在寻找一个使用 Twitter 1 1 API 的简单 Java 示例 但没有找到 使用此处发布的 PHP 示例 使用 Twitter API 版本 1 1 检索 user timeline 的最简单 PHP 示例和其他一些 Stack