【问题标题】:twitter4j.auth.AccessToken instantiating in ColdFusiontwitter4j.auth.AccessToken 在 ColdFusion 中实例化
【发布时间】:2011-12-06 10:07:15
【问题描述】:

我正在使用 ColdFusion 9.0.1 和 twitter4j 库的最新(当前日期)稳定版本 - twitter4j-core-2.2.4。我正在尝试创建允许用户使用他们的 Twitter 帐户在我们的网站上登录或注册的功能。 我能够创建授权部分:用户单击我们网站上的链接,系统将他重定向到 Twitter 页面。在此页面上,他能够“授权”我们的应用程序。在该系统使用 callBackURL 将他重定向回来之后。 但我对下一步有问题。当我尝试 setOAuthAccessToken 并尝试使用以下部分代码实例化 AccessToken 对象时:

accessToken = createObject( 'java', 'twitter4j.auth.AccessToken' ).init( 'myStoredRequestToken', 'myStoredRequestTokenSecret' );

但我有以下错误:

实例化 Java 对象时发生异常。班上 不能是接口或抽象类。错误:''。

有什么想法吗?

更新:

stacktrace的开始部分:

'coldfusion.runtime.java.JavaObjectInstantiationException:对象实例化异常。在coldfusion.runtime.java.JavaProxy.CreateObject(JavaProxy.java:171) 在coldfusion.runtime.java.JavaProxy.invoke(JavaProxy.java:80) 在coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2360) 在cftwitter2ecfc2084917956$funcGETUSERCREDENTIALS.runFunction(C:\inetpub\wwwroot_test\twPlayGrnd_com\twitter.cfc:36) 在coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) 在coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java :368) 在coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) 在...

...切到这里,不确定这是否重要...

最后一部分是

cfapplication2ecfc665259542$funcONREQUEST.runFunction(C:\inetpub\wwwroot_test\twPlayGrnd\application.cfc:55) ... 55 更多原因:java.lang.IllegalArgumentException:访问令牌格式无效。在 twitter4j.auth.AccessToken.(AccessToken.java:50) ... 60 更多'

我看到了有关错误格式的消息,但根据 http://twitter4j.org 的文档,它应该接受两个 agruments(带键的字符串)。我错了吗?

更新 2 *请找出答案 - 很抱歉让您对我的第一篇文章和示例感到困惑...当然,我使用了 myStoredRequestToken、myStoredRequestTokenSecret,而不是消费者密钥/秘密 * *我为此功能使用了相关的代码部分*

application.cfc (“onApplicationStart”函数,在应用程序启动时实例化组件)

<cffunction name="onApplicationStart" access="public" returntype="boolean" output="false">
  ...
  <cfset application.com.twitterInstance = server.javaloader.create("twitter4j.TwitterFactory").getInstance() />
  <cfset application.com.twitter = createObject("component","_com.twitter").init() />  *<!--- cfc component which will be listed below --->*
  ...
</cffunction>

twitter.cfc (对应的coldfusion组件)

<cfcomponent displayname="twitter" output="false">

  <cffunction name="init" access="public" output="false">
    <cfreturn this>
  </cffunction>     

<cffunction name="authorizeTwitter" access="public" output="false">
  <cfargument name="callBackURL" type="string" required="false" default="#request.twtCallBackURL#" /> 

    <cfset var requestToken = "" />

    <cfset application.com.twitterInstance.setOAuthConsumer(request.twtConsumerKey,request.twtConsumerSecret) />   
    <cfset requestToken = application.com.twitterInstance.getOAuthRequestToken(arguments.callBackURL) />
    <cflock scope="session" type="exclusive" timeout="10">
      <cfset session.oAuthRequestToken = requestToken.getToken()>
      <cfset session.oAuthRequestTokenSecret = requestToken.getTokenSecret()>
    </cflock>
    <cflocation url="#vLocal.requestToken.getAuthorizationURL()#" addtoken="No" />
</cffunction>


<cffunction name="getUserCredentials" access="public" output="true">
  <cfset var vLocal = {} />
  <cfset vLocal.accessToken = "" />
  <cfset vLocal.userData = "" />
  <cfset vLocal.requestToken = "" />

  <cfset vLocal.accessToken = server.javaloader.create("twitter4j.auth.AccessToken").init(session.oAuthRequestToken,session.oAuthRequestTokenSecret)>
  <cfset application.com.twitterInstance.setOAuthAccessToken(vLocal.accessToken) />
  <cfset vLocal.userData = application.com.twitterInstance.verifyCredentials() />

  <cfdump var="#vLocal.userData#" label="User Credentials">
</cffunction>

第一个功能是第一步 - 向 twitter 请求自动化页面(用户可以在其中自动化或拒绝应用程序)。回调 URL 运行调用第二个函数的页面,我只有在这一步有问题(生成 accessToken 的行)。

如果我使用 createObject 函数而不是 javaloader,我会得到相同的结果。

*所以,我的主要问题还是一样 - 获取用户唯一的访问令牌?请指出我,我做错了什么?唯一用户的 accessToken 生成的正确格式是什么?我应该在那里放置 oauth_verifier 参数吗?如果有,怎么做?*

【问题讨论】:

  • 这确实很奇怪。该参数签名与该类的构造函数之一匹配,它不是接口。也许尝试在参数上使用 JavaCast 以确保它们以 java.lang.String 的形式通过。否则我会画一个空白。
  • 发布堆栈跟踪。它包含真实的(即更详细的)错误消息。
  • @Leigh - 谢谢,完成。我应该发布整个堆栈跟踪吗?剪切部分只包含一个一个运行的函数和模板。
  • @JasonDean 感谢您的想法,刚刚测试了以下内容:accessToken = createObject( "java", "twitter4j.auth.AccessToken" ).init(javaCast("string",session.oAuthRequestToken),javaCast("string",session.oAuthRequestTokenSecret)); 但不幸的是有同样的错误:(
  • 它确实接受两个字符串,是的。但无论如何从错误中听起来它不喜欢钥匙。你确定它们是有效的吗?

标签: coldfusion twitter4j


【解决方案1】:

您传递的是消费者密钥/秘密,而不是访问令牌/秘密。 你可以在 dev.twitter.com 上生成你的访问令牌/秘密。 https://dev.twitter.com/apps » 创建我的访问令牌

最好, 佑介

【讨论】:

  • +1。我只是想通了!从字面上看,在您回复前两分钟:)
  • 谢谢@Yusuke ...但是伙计们,现在看来我完全迷路了...不,我没有使用消费者密钥/秘密作为访问令牌/秘密。老实说,我认为 dev.twitter.com 端的访问令牌的生成仅用于访问 twitter 以在那里发布推文或其他东西(我从那里只获得了消费者密钥和秘密)。但正如我所描述的,我需要在我的网站上使用 twitter 帐户对用户进行身份验证,并且需要获取他的数据(姓名、图像、推文数量等)所以,我需要获取用户的唯一访问令牌(稍后将放置在数据库供进一步使用)
  • 我使用了来自不同资源的示例,并假设我需要根据请求令牌生成令牌,例如 linklink 我在帖子的新更新中描述了我的步骤。请看一下,让我知道你的想法
  • @Stalker - 老实说 .. 我有点迷失自己 :) 虽然我了解 code,但我不了解 api 还。所以我不想让你去“野鹅追逐”。我怀疑 Yusuke 更了解 api。如果他可以为您指出一个可以满足您需要的有效 java 示例,我可以帮助您使其工作。
  • @Leigh - 我明白了,还是谢谢你。将等待Yusuke评论,希望他能提供帮助。
【解决方案2】:

认为借助示例8. Sign in with TwitterAdding support for automated tweets with OAuth。仅用我自己的帐户进行了测试..

在重定向到授权页面之前,将整个 RequestToken 对象保存在会话变量中。您将需要它来提取 AccessToken。注意:我将 TwitterFactory 存储在应用程序范围内 - 不是实例

 <cfset Twitter = application.TwitterFactory.getInstance()>
 <cfset Twitter.setOAuthConsumer(application.TwitterConsumerKey, application.TwitterConsumerSecret)>
 <cfset Session.RequestToken = Twitter.getOAuthRequestToken( YourCallBackURL )>    

在回调时,twitter 会在 URL 中添加一个名为 oauth_verifier 的参数。使用该值和保存的RequestToken 来提取AccessToken

<cfset AccessToken = Twitter.getOAuthAccessToken(Session.RequestToken, URL.oauth_verifier)>
<cfset session.StoredAccessToken = AccessToken.getToken()>
<cfset session.StoredAccessSecret = AccessToken.getTokenSecret()>

拥有AccessToken/Secret 后,您可以在任何地方访问用户详细信息(更新状态,...)。

<cfset Twitter = application.TwitterFactory.getInstance()>
<cfset Twitter.setOAuthConsumer(application.TwitterConsumerKey,application.TwitterConsumerSecret)>
<cfset AccessToken = createObject("java", "twitter4j.auth.AccessToken")>
<cfset OAuthToken = AccessToken.init(session.StoredAccessToken, session.StoredAccessSecret)>
<cfset Twitter.setOAuthAccessToken(OAuthToken)>
<cfset userData = Twitter.verifyCredentials()>

<cfoutput>
    id = #userData.getId()#<br> 
    name = #userData.getName()#<br> 
    followers = #userData.getFollowersCount()#<br>  
    friends = #userData.getFriendsCount()#<br>  
</cfoutput>

【讨论】:

  • 非常感谢您继续提供帮助 :) 是的,我也想通了,我的解决方案与您发布的代码相似,但直到现在我才能将它放在这里(它花费了我很辛苦,现在是清晨)。这个解决方案非常适合我,谢谢!
  • 我很高兴你的坚持得到了回报,你终于让它工作了 :) 不确定你是否看到了关于 TwitterFactory 的注释。我认为 instance 不应该存储在应用程序范围内,而应该存储在工厂中。
  • 嗯...看起来我错过了那件事,是的,你也是对的。再次感谢,利 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多