twitter4j.auth.AccessToken在ColdFusion中实例化

时间:2011-10-12 19:26:16

标签: coldfusion twitter4j

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

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

但我有错误:

  

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

有什么想法吗?

更新:

stacktrace的开始部分:

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

...切到这里,不确定这很重要......

最后一部分是

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参数吗?如果是这样,怎么样?*

2 个答案:

答案 0 :(得分:2)

您正在传递使用者密钥/机密而不是访问令牌/机密。 您可以在dev.twitter.com上生成访问令牌/密钥。 https://dev.twitter.com/apps»创建我的访问令牌

最佳, 介

答案 1 :(得分:0)

我弄清楚示例8. Sign in with Twitter的帮助有什么问题, Adding 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>