I would like to implement FB-chat inside a webpage. I looked around in Facebook API, i found out that chat is allowed only using XMPP. First I tried to connect to FB-chat using Pidgin and it worked fine. My conclusion was that FB-chat server is acting as the XMPP server. Is this true?
I read about XMPP, it seems that an open TCP connection should be established between the client and the server to exchange the XML stanzas which is not possible from a website (over JavaScript and without plugins) since only http requests/responses can be exchanges, no TCP connection there. This means that there should be some kind of a proxy in between, and as for authentication, FB API suggests to use the X-FACEBOOK-PLATFORM SASL (not the DIGEST MD5, since there is a proxy). I didn't find a clear tutorial or steps how to do so, help here is appreciated.
A bit more research about XMPP client from the web or browser, I saw that I am supposed to use a library called Strophe (based on BOSH protocol) and in other answers some kind of connection manager called Punjab. I read about this BOSH protocol, it seems to be the solution but in some places I found out that it is not allowed in FB (I am not sure how correct is this info though). I tried to setup these but i was totally confused how to begin and what I am really supposed to do.
For the strophe, I didn't find a real tutorial how to implement it, and in what i found, they suggest to first setup a jabber server like ejabberd (I didnt get the need for that).
My question is:
Can somebody suggest an architecture that I should implement to achieve my goal?
So will there be: webpage ->(HTTP) -> Strophe -> (TCP) -> FB-chat OR will it have an XMPP server in between and why?
I would appreciate any answer to any of my questions. Please suggest some links to how to implement all these stuff. I am totally new to all this which made me lost for more than a week now.
If somebody already did this, please help.
Thanks a lot.
Sabah
Informations about facebook chat server :
Protocol: XMPP or Jabber
Username: mathvdh
Domain: chat.facebook.com
Jabber ID: mathvdh#chat.facebook.com
Password: <your Facebook password>
Port: 5222
Server: chat.facebook.com
Use SSL/TLS: no
Allow plaintext authentication: no
I think strophe and punjab should be a working combination for fb chat, see here : XMPP library for facebook chat
And I think the schema would be more like :
client webpage/js/strophe <-> yourserver/punjab <-> facebook xmpp chat server
I'm trying to solve this problem too. So far I have decided on a set up of:
Jappix mini (uses JSJAC.js library) <-> node-xmpp-bosh on node.js on my server <-> Facebook server.
Jappix mini was hard to find but it seems by far the best open source chat bar so worth mentioning here.
I don't have it all set up yet but will update here if I make progress. The main issue will be how to make JSJAC use Facebook API Key authentication. I can't find any info or examples for that, but I found this plugin for strophe library which maybe can be adapted:
https://github.com/rubenjgarciab/turedsocial/blob/master/strophe-plugins/src/facebook.js
Finally, you cannot include your facebook secret key in javascript (because it's a secret!) so you need to use Facebook REST API auth.promoteSession server-side to produce a session-secret key which can be used in the javascript to sign the X-FACEBOOK-PLATFORM auth request.
Hope that helps, I'll add more if/when I get it working.
Sabah,
As mentioned in the previous answers the Punjab <-> strophe.js works. I have forked the facebook strophe client here: https://github.com/javierfigueroa/turedsocial and I added an example.
Hope this helps.
Related
I am preparing to build a WebSockets system to have a bidirectional communication from my server to my clients through WebSockets.
I know that Laravel now very well supports 3rd parties like Pusher Channels and Ably.
There are also some other ways that are also very convenient and simple to use such as Laravel Websockets, soketi, laravel-echo-server.
But my problem is client-side cannot include 3rd party Client Library. My client-side is a Cross-platform Game based on Javascript and HTML5. I can only connect client-side to server-side through WebSocket.
As far as I know, when using 3rd party for server-side, I should use their JS Client Library like pusher/pusher-js, laravel/echo ... Therefore, I can't find any documents if I want to use them with WebSocket.
My goal is to find the best and most suitable solution for both client and server side.
What I have tried?
IDEA 1: Convert pusher.js to my own js
I spent 2 weeks on this. I see this as possible and some functions might work. However, it will take a long time if I want to convert the whole thing.
IDEA 2: Using Pusher and connect the client via Pusher Channels Protocol
I have tested them as follows
var socket = new WebSocket('ws://ws-[cluster_name].pusher.com:[port]/app/[key]');
It worked. I can see them connected on the Pusher Debug Console. However, I can't find any documentation regarding the basics like Subcribe channel, Listening events, Send message to other client, Ping, Pong, ...
IDEA 3: Using Laravel Websockets
Like idea 2, I couldn't find any documentation or examples.
IDEA 4: Using NodeJS instead of Laravel. Choose ws packages
I tried it and it worked as expected. WS is really simple but it is exactly what I want. However I don't have many years of NodeJS experience. Therefore, I feel there are many risks if I choose it to build a new project.
Could you tell me a best way to deal with this problem?
Thanks
The Pusher and Laravel Echo JavaScript clients work with any Pusher-compatible websockets host. (Pusher uses websockets, too.)
All it takes is a little configuration; see, for example, Laravel Websockets' guide on configuring Laravel and then configuring Echo. Both steps point your Pusher requests at your chosen Pusher replacement instead.
No need to write your own library or manually consume websocket data.
I would like to send messages from my Java server to my react-native clients.
I don't know exactly how to solve this. Should the server establish a connection to all clients via the IP addresses of the clients and send the message and then close the connection again? (Sounds the most sensible to me.)
I think that would be better than if the clients connected to the server and the connection should always be maintained. After all, it should run with high performance.
Basically, it doesn't make much sense for my system that the clients connect to the server, since only the server knows when and whether it is sending a message.
I've already tried working with websockets. However, it didn't seem to work without requests from clients.
The difficulty is to find a method that works with Java on the server side and JavaScript on the client side and that the connection is made from the server to the clients and not from the clients to the server. In addition, the transmission should work in real time.
Is that feasible? Are there any better ways? How can I do it?
I hope you can help me.
Greetings. Martin
The basic function of the system
There are multiple cloud based messaging platforms. One of them is Firebase from Google which is free (I guess). Check this out here. https://firebase.google.com/docs/cloud-messaging
You will find multiple tutorials to configure and use it in your react-native and Java server.
Architectural overview: https://firebase.google.com/docs/cloud-messaging/fcm-architecture
Another solution is writing your own logic using the WebSockets.
Lifecycle of message: https://firebase.google.com/docs/cloud-messaging/fcm-architecture#lifecycle_flow
I have a question which I can't seem to answer after searching for an answer on google.
I have a website hosted on a web host, but I want to introduce some real-time functionality on it, like a real-time notification system, or maybe a chat system.
As I understand the short-polling and long-polling methods of simulating a live feature are kinda obsolete. Today with the modern HTML5, we can use Websockets as I understand, or APE(Ajax Push Engine).
The thing is that I don't understand, how do I use websocket or APE on the webhost if they require a server to which they connect in order to work ?
How can I run that server along with my website on the same host ? Or maybe I am missing something ?
Can you give me some information on this problem, that I can read?
Thank you.
WebSocket is just another protocol. It works on port 80, so luckly you don't need a new server.
You just need to implement an abstraction level on your backend (but maybe it can do itself) that gets the HTTP request and looks if there are the upgrade headers.
If the answer is yes, go to websocket code, if not use standard HTTP.
I am aiming to create a WebRTC chat (video/audio) application and most of tutorials and demos that I see are using the following signaling channel:
signaling.simplewebrtc.com:8888
I even found this great demo, where the developer stated that it does not depend on this signaling channel, but when I went through the code I found it there.
Can someone explain me, how can I substitute this with my own signaling channel?
I do not completely understand your question. I guess the URL you provided points to an websocket server. Websockets are often used for signaling because they provide a permanent, full-duplex connection (this means that the server is able to push messages to the client without an previous request).
You have to exchange network information between the two parties who want to set up an RTCPeerConnection because of NAT and firewalls etc... How to exchange that information is not part of the WebRTC-specification. You can use any protocol you want, HTTP,Websockets, even EMail (but that would be pretty ugly to implement :) ). But if you want to build your own signaling-server using node.js you can have a look at the tutorial I am currently writing. It explains in detail how to setup your own very simple video-chat using WebRTC and a Node-Server hosted on uberspace.de:
Tutorial: Create your own Videochat-Application with HTML and JavaScript
If you use my tutorial it would be great if you could tell me if it is understandable.
Edit:
As I am still getting requests for this old tutorial, please use an up to date one like those:
https://www.baeldung.com/webrtc
https://www.html5rocks.com/en/tutorials/webrtc/basics/
Please take a look at this excellent blog on the signaling options that are available for WebRTC.
I have listed a few important blogs and sample WebRTC applications that you might also want to review to help you build your chat application.
I installed nodejs from Install NodeJS along with the required dependencies at signalmaster
Ran node server.js in cmd.
And server started running.
P S: Change url option present in simplewebrtc.bundle.js
Let me know if you face any problem
I wonder why no one has mentioned this so far . You can also use the sip framework based webrtc libraries and clients such as sipml5 , jssip etc . Additionally since you mentioned you would like your own server setup to cater to signalling requests , you will have a wide variety of websockets based sip servers to choose from such as officesip , kamailio , mobicents etc .
You can try and modify the the latest application that ships with Mobicents at https://code.google.com/p/sipservlets/wiki/HTML5WebRTCVideoApplication that allows you to chat and video chat.
Introduction: I want to develop the chat client that user can chat on the browser and I use the protocol call xmpp. Because of HTML5 web socket not yet available I try flash xmlsocket instead.
Problem: I cannot connect to the server via browser. I'm not sure why, but I think that it is the problem of the server configuration.
Question: Which is the best jabber server suitable for this job?
Most probably this is a permission issue. Either that or you've just configured the wrong host/port to connect to. Flash is not allowed to connect to other hosts than the one it was gotten from itself. You have to explicitely allow flash connections on the receiving side of the request (so on the chat server that you are connecting to). Google for crossdomain.xml to get more info.
ejabberd sounds like a suitable option for you. ejabberd is xmpp server written in erlang and is used quite widely. Many of the well known web based im services like www.meebo.com etc are known to be running on ejabberd. It allows you to install other transports which would let you enable talking to users of other protocol like yahoo, msn, icq etc.
You can also have a look at the xiff action script library by ignite realtime. It is an xmpp client library in action script. If you use this library you would just need to implement the ui components.
Hum... flash is ok, but you'd be better of using something like BOSH, which is basically an HTTP layer over XMPP.
Ejabberd would be a good server, as it supports BOSH, I don't know about OpenFire or Tigase (but I'd say they do). Other servers should be looked at carefully because they don't seem to have a "dynamic" community.
You will need a lot of Javascript, and for that, I can recommend StropheJS, which is probably the very best library out there today.
We have created a MUC (Multi-user chat room) client called Aristochat that works in the browser recently at Superfeedr. You can find the code on Github and an example here.