Создание экземпляра twitter4j.auth.AccessToken в ColdFusion - PullRequest
2 голосов
/ 12 октября 2011

Я работаю с 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. Класс не должен быть интерфейсом или абстрактным классом. Ошибка: ''.

Есть идеи?

Обновление:

Начальная часть трассировки стека:

'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. : 368) at coldfusion.filter.FunctionAccessFilter.invoke (FunctionAccessFilter.java:55) в ...

... отсюда, не уверен, что это важно ...

последняя часть

cfapplication2ecfc665259542 $ funcONREQUEST.runFunction (C: \ inetpub \ wwwroot_test \ twPlayGrnd \ application.cfc: 55) ... еще 55 причин: java.lang.IllegalArgumentException: неверный формат маркера доступа * 10 *. на twitter4j.auth.AccessToken. (AccessToken.java:50) ... еще 60 '

Я видел сообщение о неправильном формате, но на основании документации в http://twitter4j.org должно быть принято два аргумента (строки с ключами). Я не прав?

Обновление 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 (соответствующий компонент холодного синтеза)

<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>

Первая функция для первого шага - запросить твиттер для страницы авторизации (где пользователь может авторизовать или отклонить приложение). URL обратного вызова запускает страницу, которая вызывает вторую функцию, и у меня проблема только на этом этапе (строка для генерации accessToken).

У меня тот же результат, если я использую функцию createObject вместо javaloader.

* Итак, мой главный вопрос остается прежним - получить пользователям уникальный токен доступа? Пожалуйста, укажите мне, что я делаю не так? Что такое правильный формат для генерации accessToken уникального пользователя? Должен ли я разместить параметр oauth_verifier там? если да, то как? *

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Вы передаете потребительский ключ / секрет вместо токена доступа / секрета. Вы можете создать свой токен доступа / секретный ключ на dev.twitter.com. https://dev.twitter.com/apps »создать мой токен доступа

Лучший, Юсуке

0 голосов
/ 14 октября 2011

Я думаю Я понял, что не так, с помощью примеров 8.Войдите через Twitter и . Добавлена ​​поддержка автоматических твитов с помощью 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>
...