如何为 Facebook 创建 XMPP 聊天客户端? [英] How to create XMPP chat client for facebook?

查看:24
本文介绍了如何为 Facebook 创建 XMPP 聊天客户端?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为 FACEBOOK 创建 XMPP 客户端.我为 gmail 做了这个,现在我必须为 FaceBook 创建相同的.我用谷歌搜索了很多,得到了一些代码,但我仍然遇到这种类型的错误 Not connected to serverservice-unavailable(503)

I'm creating XMPP client for FACEBOOK. i did this for gmail, now i have to create same for FaceBook. i googled a lot for this got some code, still i'm getting this type of errors Not connected to server and service-unavailable(503)

在这里我分享我所做的代码.

here i'm sharing the code what i did.

public class ClientJabberActivity extends Activity {

ArrayList<String> m_discussionThread;
ArrayAdapter<String> m_discussionThreadAdapter;
XMPPConnection m_connection;
private Handler m_handler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    m_handler = new Handler();

    try {
        initConnection();
    } catch (XMPPException e) {
        e.printStackTrace();
    }

    final EditText recipient = (EditText) this.findViewById(R.id.recipient);
    final EditText message = (EditText) this.findViewById(R.id.message);
    ListView list = (ListView) this.findViewById(R.id.thread);

    m_discussionThread = new ArrayList<String>();
    m_discussionThreadAdapter = new ArrayAdapter<String>(this,
            R.layout.multi_line_list_item, m_discussionThread);
    list.setAdapter(m_discussionThreadAdapter);

    Button send = (Button) this.findViewById(R.id.send);
    send.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {

            String to = recipient.getText().toString();
            String text = message.getText().toString();

            Message msg = new Message(to, Message.Type.chat);
            msg.setBody(text);
            m_connection.sendPacket(msg);
            m_discussionThread.add(" Me  : ");
            m_discussionThread.add(text);
            m_discussionThreadAdapter.notifyDataSetChanged();
        }
    });
}

private void initConnection() throws XMPPException {

    ConnectionConfiguration config = new ConnectionConfiguration(
            "chat.facebook.com", 5222, "chat.facebook.com");
    config.setSASLAuthenticationEnabled(true);
    m_connection = new XMPPConnection(config);
    try {
        SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM",
                SASLXFacebookPlatformMechanism.class);
        SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0);
        m_connection.connect();          
        m_connection.login(apiKey + "|" + sessionKey, sessionSecret, "Application");
    } catch (XMPPException e) {
        m_connection.disconnect();
        e.printStackTrace();
    }

    Presence presence = new Presence(Presence.Type.available);
    m_connection.sendPacket(presence);

    PacketFilter filter = new MessageTypeFilter(Message.Type.chat);

    m_connection.addPacketListener(new PacketListener() {
        public void processPacket(Packet packet) {
            Message message = (Message) packet;
            if (message.getBody() != null) {
                String fromName = StringUtils.parseBareAddress(message
                        .getFrom());
                m_discussionThread.add(fromName + ":");
                m_discussionThread.add(message.getBody());

                m_handler.post(new Runnable() {
                    public void run() {
                        m_discussionThreadAdapter.notifyDataSetChanged();
                    }
                });
            }
        }
    }, filter);

    ChatManager chatmanager = m_connection.getChatManager();
    chatmanager.addChatListener(new ChatManagerListener() {
        public void chatCreated(final Chat chat,
                final boolean createdLocally) {
            chat.addMessageListener(new MessageListener() {
                public void processMessage(Chat chat, Message message) {
                    System.out.println("Received message: "
                            + (message != null ? message.getBody() : "NULL"));
                    Log.i("CHAT USER",
                            "Received message is: " + message.getBody());
                }
            });
        }
    });
}
 }

和这个类SASLXFacebookPlatformMechanism

我如何像这样登录 xmpp.login(apiKey + "|" + sessionKey, sessionSecret, "Application"); 我知道如何获取 acessToken,Facebook 的应用程序密钥.我不知道 sessionKey、sessionSecret 如何获取这些值以及如何解决这个问题.

How can i login like this xmpp.login(apiKey + "|" + sessionKey, sessionSecret, "Application"); i know how to get acessToken, Application Key for facebook. i don't know about sessionKey, sessionSecret how to get those values and how to solve this problem.

如果我使用 xmpp.login(apiKey, accessToken, "Application"); 我收到此错误 --IllegalArgumentException: API 密钥或会话密钥不存在

If i use xmpp.login(apiKey, accessToken, "Application"); i am getting this error --IllegalArgumentException: API key or session key is not present

最后我从 Amal 解决方案中得到了解决方案:xmpp.login(apiKey, accessToken, "Application");

Finally i got solution from Amal solution : xmpp.login(apiKey, accessToken, "Application");

推荐答案

要获取访问令牌,您必须先登录

to get access token first you have to login

fb.authorize(FacebookActivity.this, new String[] {"xmpp_login"},Facebook.FORCE_DIALOG_AUTH, new DialogListner());

SASLXFacebookPlatformMecha 类

SASLXFacebookPlatformMecha class

import java.io.IOException;
import java.net.URLEncoder;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.harmony.javax.security.auth.callback.CallbackHandler;
import org.apache.harmony.javax.security.sasl.Sasl;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.sasl.SASLMechanism;
import org.jivesoftware.smack.util.Base64;

public class SASLXFacebookPlatformMecha extends SASLMechanism {

private static final String NAME = "X-FACEBOOK-PLATFORM";

private String apiKey = "";
private String access_token = "";

/**
 * Constructor.
 */
public SASLXFacebookPlatformMecha(SASLAuthentication saslAuthentication) {
    super(saslAuthentication);
}

@Override
protected void authenticate() throws IOException, XMPPException {

    getSASLAuthentication().send(new AuthMechanism(NAME, ""));
}

@Override
public void authenticate(String apiKey, String host, String acces_token)
        throws IOException, XMPPException {
    if (apiKey == null || acces_token == null) {
        throw new IllegalArgumentException("Invalid parameters");
    }

    this.access_token = acces_token;
    this.apiKey = apiKey;
    this.hostname = host;

    String[] mechanisms = { NAME };
    Map<String, String> props = new HashMap<String, String>();
    this.sc = Sasl.createSaslClient(mechanisms, null, "xmpp", host, props,
            this);
    authenticate();
}

@Override
public void authenticate(String username, String host, CallbackHandler cbh)
        throws IOException, XMPPException {
    String[] mechanisms = { NAME };
    Map<String, String> props = new HashMap<String, String>();
    this.sc = Sasl.createSaslClient(mechanisms, null, "xmpp", host, props,
            cbh);
    authenticate();
}

@Override
protected String getName() {
    return NAME;
}

@Override
public void challengeReceived(String challenge) throws IOException {
    byte[] response = null;

    if (challenge != null) {
        String decodedChallenge = new String(Base64.decode(challenge));
        Map<String, String> parameters = getQueryMap(decodedChallenge);

        String version = "1.0";
        String nonce = parameters.get("nonce");
        String method = parameters.get("method");

        long callId = new GregorianCalendar().getTimeInMillis();

        String composedResponse = "api_key="
                + URLEncoder.encode(apiKey, "utf-8") + "&call_id=" + callId
                + "&method=" + URLEncoder.encode(method, "utf-8")
                + "&nonce=" + URLEncoder.encode(nonce, "utf-8")
                + "&access_token="
                + URLEncoder.encode(access_token, "utf-8") + "&v="
                + URLEncoder.encode(version, "utf-8");

        response = composedResponse.getBytes("utf-8");
    }

    String authenticationText = "";

    if (response != null) {
        authenticationText = Base64.encodeBytes(response,
                Base64.DONT_BREAK_LINES);
    }

    // Send the authentication to the server
    getSASLAuthentication().send(new Response(authenticationText));
}

private Map<String, String> getQueryMap(String query) {
    Map<String, String> map = new HashMap<String, String>();
    String[] params = query.split("\&");

    for (String param : params) {
        String[] fields = param.split("=", 2);
        map.put(fields[0], (fields.length > 1 ? fields[1] : null));
    }

    return map;
}
}

我创建了 ChatManager 类

I created ChatManager class

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Type;
import org.jivesoftware.smackx.pubsub.PresenceState;

public class FacebookChatManager {

private static FacebookChatManager chatManager;
private XMPPConnection connection;
private final String SERVER = "chat.facebook.com";
private final int PORT = 5222;
private final String FACEBOOK_MECHANISM = "X-FACEBOOK-PLATFORM";
private RosterListener rosterListner;

private FacebookChatManager(RosterListener rosterListner)
{
    this.rosterListner = rosterListner;
    ConnectionConfiguration connFig = new ConnectionConfiguration(SERVER,
            PORT);
    connFig.setSASLAuthenticationEnabled(true);
    connection = new XMPPConnection(connFig);
    //setup facebook authentication mechanism
    SASLAuthentication.registerSASLMechanism(FACEBOOK_MECHANISM,
            SASLXFacebookPlatformMecha.class);
    SASLAuthentication.supportSASLMechanism(FACEBOOK_MECHANISM, 0);
}

public static FacebookChatManager getInstance(RosterListener rosterListner)
{
    if(chatManager == null)
    {
        chatManager =  new FacebookChatManager(rosterListner);
    }
    return chatManager;
}

public boolean connect()
{
    try {
        connection.connect();
        return true;
    } catch (XMPPException e) {
        e.printStackTrace();
        connection.disconnect();
    }
    return false;
}

public void disConnect()
{
    connection.disconnect();
}

public boolean logIn(String apiKey, String accessToken)
{
    try {
        connection.login(apiKey, accessToken);
        setPresenceState(Presence.Type.available, "");
        connection.getRoster().addRosterListener(rosterListner);
        return true;
    } catch (XMPPException e) {
        connection.disconnect();
        e.printStackTrace();
    }
    return false;
}

public Roster getRoster()
{
    return connection.getRoster();
}

public Chat createNewChat(String user, MessageListener messageListner)
{
    return connection.getChatManager().createChat(user, messageListner);
}

public void registerNewIncomingChatListner(ChatManagerListener chatManagerListner)
{
    connection.getChatManager().addChatListener(chatManagerListner);
}

public void setPresenceState(Type precenseType, String status)
{
    Presence presence = new Presence(precenseType);
    presence.setStatus(status);
    connection.sendPacket(presence);
}

public Presence getUserPresence(String userId)
{
    return connection.getRoster().getPresence(userId);
}
}

在使用 FacebookChatManager 类的最后,请注意 rosterListnr 用于获取有关您朋友状态更改的信息,根据需要实现一个

at the end to use that FacebookChatManager class note that rosterListnr is used to get info about your friends state change implement one as you want

FacebookChatManager facebookChatManager = FacebookChatManager.getInstance(rosterListner);

if (facebookChatManager.connect()) {
            if (facebookChatManager.logIn(FacebookActivity.APP_ID,
                    access_token)) {
                return facebookChatManager.getRoster();
            }
        }

这篇关于如何为 Facebook 创建 XMPP 聊天客户端?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆