在 JAVA 中使用 Smack API 连接到 Google 日历

发布于 2024-10-14 11:23:07 字数 54 浏览 4 评论 0原文

谁能告诉我如何使用 Smack API 连接到 Google 日历服务器(如果我能做到的话)。

Can anyone tell me how to connect to Google Calendar server using the Smack API, if i can do that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

两个我 2024-10-21 11:23:07

使用 Smack 连接到 Google 日历是什么意思? Smack 会让你连接到 XMPP 服务器,这是一种即时消息传递方式。如果您想要类似于 http://clockwerx.blogspot .com/2008/10/interacting-with-google-calendar-via.html 然后有两个方面:实现机器人,然后连接到它并与其交谈。
但一般来说,下面是一个可以让您连接到 GTalk 的代码示例:

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.packet.Presence.Type;

public class Communicator {
    public static final String XMPP_SERVER = "talk.google.com";
    public static final String XMPP_HOST_NAME = "gmail.com";
    public static final String XMPP_SERVICE_NAME = "gmail.com";
    public static final int PACKET_REPLY_TIMEOUT = 500, DEFAULT_XMPP_SERVER_PORT = 5222;

    XMPPConnection conn;
    Roster buddyList;

    public static String canonicalizeUsername(String username) {
        if (!username.contains("@")) {
            username += "@" + XMPP_SERVICE_NAME;
        }
        return username;
    }

    public Communicator(String username, String password) throws XMPPException {
        this(XMPP_SERVER, DEFAULT_XMPP_SERVER_PORT, username, password);
    }

    public Communicator(String serverAddress, Integer serverPort, String username,
                        String password) throws XMPPException {
        username = canonicalizeUsername(username);
        SmackConfiguration.setPacketReplyTimeout(PACKET_REPLY_TIMEOUT);
        ConnectionConfiguration config =
                  new ConnectionConfiguration(serverAddress, serverPort != null ? serverPort : DEFAULT_XMPP_SERVER_PORT,
                                              XMPP_HOST_NAME, ProxyInfo.forDefaultProxy());
        //config.setSASLAuthenticationEnabled(true);
        //config.setSecurityMode(SecurityMode.disabled);
        //SASLAuthentication.supportSASLMechanism("PLAIN");
        conn = new XMPPConnection(config);
        conn.connect();
        System.out.println("Connected to " + serverAddress + ":" + serverPort);
        conn.login(username, password);
        System.out.println("Logged in as " + username);
        setStatus(true, "ON");
    }

    public void setStatus(boolean available, String status) {
        Presence presence = new Presence(available ? Type.available : Type.unavailable);
        presence.setStatus(status);
        conn.sendPacket(presence);
    }

    public void destroy() throws Exception {
        conn.disconnect();
    }

    public boolean sendMessage(String msgText, String to) throws XMPPException {
        to = canonicalizeUsername(to);
        ChatManager mgr = conn.getChatManager();
        Chat chat = mgr.createChat(to, new MessageListener() {
                public void processMessage(Chat chat, Message msg) {
                    System.out.println(msg.getBody());
                }
            });
        //important bit is to set Message type to 'chat', Google seems to ignore the default type
        Message msg = new Message(msgText, Message.Type.chat);
        chat.sendMessage(msg);
        return true;
    }

    public static void main(String args[]) {
    try {
        Communicator comm = new Communicator("username", "password");
        comm.sendMessage("", "");
        JOptionPane.showMessageDialog(null, "Close this when you want to quit");
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}
}

What do you mean by connecting to Google Calendar using Smack? Smack will let you connect to an XMPP server, which is an instant messaging means. If you want something similar to http://clockwerx.blogspot.com/2008/10/interacting-with-google-calendar-via.html then there are two sides: implement the bot and then connect to it and talk to it.
But generally speaking, here's a code sample that will let you connect to GTalk:

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.proxy.ProxyInfo;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.packet.Presence.Type;

public class Communicator {
    public static final String XMPP_SERVER = "talk.google.com";
    public static final String XMPP_HOST_NAME = "gmail.com";
    public static final String XMPP_SERVICE_NAME = "gmail.com";
    public static final int PACKET_REPLY_TIMEOUT = 500, DEFAULT_XMPP_SERVER_PORT = 5222;

    XMPPConnection conn;
    Roster buddyList;

    public static String canonicalizeUsername(String username) {
        if (!username.contains("@")) {
            username += "@" + XMPP_SERVICE_NAME;
        }
        return username;
    }

    public Communicator(String username, String password) throws XMPPException {
        this(XMPP_SERVER, DEFAULT_XMPP_SERVER_PORT, username, password);
    }

    public Communicator(String serverAddress, Integer serverPort, String username,
                        String password) throws XMPPException {
        username = canonicalizeUsername(username);
        SmackConfiguration.setPacketReplyTimeout(PACKET_REPLY_TIMEOUT);
        ConnectionConfiguration config =
                  new ConnectionConfiguration(serverAddress, serverPort != null ? serverPort : DEFAULT_XMPP_SERVER_PORT,
                                              XMPP_HOST_NAME, ProxyInfo.forDefaultProxy());
        //config.setSASLAuthenticationEnabled(true);
        //config.setSecurityMode(SecurityMode.disabled);
        //SASLAuthentication.supportSASLMechanism("PLAIN");
        conn = new XMPPConnection(config);
        conn.connect();
        System.out.println("Connected to " + serverAddress + ":" + serverPort);
        conn.login(username, password);
        System.out.println("Logged in as " + username);
        setStatus(true, "ON");
    }

    public void setStatus(boolean available, String status) {
        Presence presence = new Presence(available ? Type.available : Type.unavailable);
        presence.setStatus(status);
        conn.sendPacket(presence);
    }

    public void destroy() throws Exception {
        conn.disconnect();
    }

    public boolean sendMessage(String msgText, String to) throws XMPPException {
        to = canonicalizeUsername(to);
        ChatManager mgr = conn.getChatManager();
        Chat chat = mgr.createChat(to, new MessageListener() {
                public void processMessage(Chat chat, Message msg) {
                    System.out.println(msg.getBody());
                }
            });
        //important bit is to set Message type to 'chat', Google seems to ignore the default type
        Message msg = new Message(msgText, Message.Type.chat);
        chat.sendMessage(msg);
        return true;
    }

    public static void main(String args[]) {
    try {
        Communicator comm = new Communicator("username", "password");
        comm.sendMessage("", "");
        JOptionPane.showMessageDialog(null, "Close this when you want to quit");
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}
}
苏璃陌 2024-10-21 11:23:07

我怀疑这个问题在这么长时间后仍然存在。但对于未来寻找答案的用户,我会提供它。

Smack API 用于 XMPP 消息传递。您不太可能通过它获得日历访问权限。

大多数(基于云的)日历都基于 WebDAV 的专门化工作,称为 CalDAV。合适的客户端库是 caldav4j

I doubt the problem still persists after that long time. But for future users searching for an answer I will provide it.

Smack API is used for XMPP messaging. It is unlikely you get calendar access with that.

Most (cloud based) calendars do work based on a specialization of WebDAV which is called CalDAV. A suitable client library is caldav4j.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文