我正在使用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参数吗?如果是这样,怎么样?*
答案 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>