我正在嘗試使用以下代碼連接到Facebook chat api
通過SMACK
但我總是會收到X-FACEBOOK-PLATFORM failed: not-authorized
。我有一個有xmpp權限的有效標記,但我想我錯過了一些東西......它正在處理用戶/密碼,但與accessToken無關。X-FACEBOOK-PLATFORM認證錯誤
感謝您的幫助,這件事讓我瘋狂。
public class FacebookChatSample {
public static void main( )
{
String accessToken = //internet example "AAACjg0Eh1N8BAFuhUFZAN0EteV6pjZAsZAI46i8oV3iVmyLdaKiwaBcM5DPFjbEZAq9LZAZAA0qXsvaXkKB7SqnhubzlUAK7tmr3UYLaeQgaXSJ6EZCKn2G";
String consumerKey = //internet example "179784128779487";
long targetFacebookId = 550121201669650L;
String toID = "1002221765";
String message = "HELLOOOOO FROM MY JAVA PROGRAM!!";
XMPPConnection connection = createXMPPConnection();
try
{
connection.connect();
connection.login(consumerKey, accessToken);
String to = String.format("-%[email protected]", Long.valueOf(targetFacebookId));
Chat chat = connection.getChatManager().createChat(to, null);
chat.sendMessage(message);
}
catch(XMPPException e)
{
e.printStackTrace();
}
finally
{
connection.disconnect();
}
}
private static synchronized XMPPConnection createXMPPConnection()
{
SASLAuthentication.registerSASLMechanism(
SASLXFacebookPlatformMechanism.NAME,
SASLXFacebookPlatformMechanism.class);
SASLAuthentication.supportSASLMechanism(
SASLXFacebookPlatformMechanism.NAME, 0);
ConnectionConfiguration configuration = new ConnectionConfiguration(
"chat.facebook.com", 5222);
configuration.setSASLAuthenticationEnabled(true);
return new XMPPConnection(configuration);
}
public static class SASLXFacebookPlatformMechanism extends SASLMechanism
{
public static final String NAME = "X-FACEBOOK-PLATFORM";
public SASLXFacebookPlatformMechanism(
SASLAuthentication saslAuthentication)
{
super(saslAuthentication);
}
private String apiKey = "";
private String accessToken = "";
@Override
protected void authenticate() throws IOException, XMPPException
{
AuthMechanism stanza = new AuthMechanism(getName(), null);
getSASLAuthentication().send(stanza);
}
@SuppressWarnings("hiding")
@Override
public void authenticate(String apiKey, String host, String accessToken)
throws IOException, XMPPException
{
if(apiKey == null || accessToken == null)
{
throw new IllegalStateException("Invalid parameters!");
}
this.apiKey = apiKey;
this.accessToken = accessToken;
this.hostname = host;
String[] mechanisms = { "DIGEST-MD5" };
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 = { "DIGEST-MD5" };
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 decodedResponse = new String(
org.jivesoftware.smack.util.Base64.decode(challenge));
Map<String, String> parameters = getQueryMap(decodedResponse);
String version = "1.0";
String nonce = parameters.get("nonce");
String method = parameters.get("method");
Long callId = Long.valueOf(System.currentTimeMillis());
String composedResponse = String
.format(
"method=%s&nonce=%s&access_token=%s&api_key=%s&call_id=%s&v=%s",
URLEncoder.encode(method, "UTF-8"),
URLEncoder.encode(nonce, "UTF-8"),
URLEncoder.encode(this.accessToken, "UTF-8"),
URLEncoder.encode(this.apiKey, "UTF-8"),
callId, URLEncoder.encode(version, "UTF-8"));
response = composedResponse.getBytes();
}
String authenticationText = "";
if(response != null)
{
authenticationText = org.jivesoftware.smack.util.Base64
.encodeBytes(
response,
org.jivesoftware.smack.util.Base64.DONT_BREAK_LINES);
}
Response stanza = new Response(authenticationText);
getSASLAuthentication().send(stanza);
}
private Map<String, String> getQueryMap(String query)
{
String[] params = query.split("&");
Map<String, String> map = new HashMap<String, String>();
for(String param : params)
{
String name = param.split("=")[0];
String value = param.split("=")[1];
map.put(name, value);
}
return map;
}
}
}