How can I send an image on the web in an XMPP (Jabber) message?
For the XMPP interface for the Stack Overflow chat, I am currently taking the HTML of the chat messages and converting to valid XML, and setting that as the html
child element of the XMPP message
object. In my Mac OS X jabber client this was working great! It meant that when users in the SO chat posted a oneboxed image, the image would show up in my XMPP client (Adium for OS X):
However I just updated Adium to the latest version and apparently they considered what I was doing to be a security hole and against XMPP specs, and changed that behavior. Their reasoning was that XMPP should开发者_JS百科 not reveal your Ip address, and to fetch an image over HTTP would reveal my IP address.
So now the chats are imageless over XMPP. How can I make images work over XMPP? Should my XMPP component download the images and embed them into the <Message>
stanzas? Can the images be proxied through the XMPP server? Or is this an impossibility?
Adium, iChat and Pidgin all support XEP-0231, which allows you to send the provide binary data, including images to this purpose. Basically, it allows you to specify a unique identifier as the source for an image, and then the other client can decide if he wants to request the data in a <iq>
request.
I've been working with this in python's Twisted, but meeting with some frustration. I do know that Adium and iChat at least use it to request the data.
Try embedding it in a data: uri, like <img src="data:image/png;base64,VGhlIGltYWdlIGRhdGEgZ29lcyBoZXJlCg==" alt="some text" />
Just an idea...
What about parsing the image URL's, downloading the images, putting them into a temp folder with filenames representative of the original URLs (the filename could be a hash of the original URL) and substituting the original URLs in the messages for these file URLs?
Another idea... having a local server that fetches the real URLs?
精彩评论