1

我正在尝试在我的 GWT 应用程序中编写服务器端 Facebook 通知服务。我的想法是,我将把它作为一个 timertask 或 cron 作业来运行。

使用下面的代码,我得到一个登录 URL,我希望能够以编程方式登录,因为这旨在实现自动化(无头方式)。我打算尝试使用 HTMLunit 提交,但我认为 FB API 应该满足这一点。

请指教。

public class NotificationServiceImpl extends RemoteServiceServlet implements NotificationService {

    /**serialVersionUID*/
    private static final long serialVersionUID = 6893572879522128833L;
    private static final String FACEBOOK_USER_CLIENT = "facebook.user.client";
    long facebookUserID;    

    public String sendMessage(Notification notification) throws IOException {
        String api_key = notification.getApi_key();
        String secret = notification.getSecret_key();
        try {
          //  MDC.put(ipAddress, req.getRemoteAddr());            
            HttpServletRequest request = getThreadLocalRequest();
            HttpServletResponse response = getThreadLocalResponse();  
           HttpSession session =   getThreadLocalRequest().getSession(true);
         //  session.setAttribute("api_key", api_key);

            IFacebookRestClient<Document> userClient = getUserClient(session); 
            if(userClient == null) {
              System.out.println("User session doesn't have a Facebook API client setup yet. Creating one and storing it in the user's session.");
                userClient = new FacebookXmlRestClient(api_key, secret);
                session.setAttribute(FACEBOOK_USER_CLIENT, userClient);
            }

            System.out.println("Creating a FacebookWebappHelper, which copies fb_ request param data into the userClient");
            FacebookWebappHelper<Document> facebook = new FacebookWebappHelper<Document>(request, response, api_key, secret, userClient);
            String nextPage = request.getRequestURI();
            nextPage = nextPage.substring(nextPage.indexOf("/", 1) + 1); //cut out the first /, the context path and the 2nd /
            System.out.println(nextPage); 
            boolean redirectOccurred = facebook.requireLogin(nextPage);
            if(redirectOccurred) {
                    return null;
            }
            redirectOccurred = facebook.requireFrame(nextPage);
            if(redirectOccurred) {
                    return null;
            }


            try {
                facebookUserID = userClient.users_getLoggedInUser();

                if (userClient.users_hasAppPermission(Permission.STATUS_UPDATE)) {
                    userClient.users_setStatus("Im testing Facebook With Java! This status is written using my Java code! Can you see it? Cool :D", false);
                }
            } catch(FacebookException ex) {
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error while fetching user's facebook ID");
                System.out.println("Error while getting cached (supplied by request params) value " +
                                 "of the user's facebook ID or while fetching it from the Facebook service " +
                                 "if the cached value was not present for some reason. Cached value = {}" + userClient.getCacheUserId());
                return null;
            }

         //   MDC.put(facebookUserId, String.valueOf(facebookUserID));

           // chain.doFilter(request, response);
    } finally {
          //  MDC.remove(ipAddress);
         //   MDC.remove(facebookUserId);
    }

        return String.valueOf(facebookUserID);
    }

    public static FacebookXmlRestClient getUserClient(HttpSession session) {
        return (FacebookXmlRestClient)session.getAttribute(FACEBOOK_USER_CLIENT);
    }

}

Error message: 
[ERROR] com.google.gwt.user.client.rpc.InvocationException: <script type="text/javascript">
[ERROR] top.location.href = "http://www.facebook.com/login.php?v=1.0&api_key=MY_KEY&next=notification";
[ERROR] </script>
4

0 回答 0