XMPP vCard Python Script
3 June 2009 by DanCouldn't find a script to update my Jabber/XMPP vCard photo (a/k/a avatar), so I wrote one. It requires xmpppy (a/k/a python-xmpp). It should work with gTalk, but I have not tested it.
Credit to pastebin for some code snippets.
Hope this saves someone some time and effort.
#!/usr/bin/python
'''vcard.py - Update your XMPP vcard photo with the image you provide
Usage: vcard.py image_file jid password
'''
from xmpp import JID, Client, Iq, Presence, NS_VERSION, NS_VCARD
import sys
import os
import time
from base64 import encode, decode
from hashlib import sha1
try:
file=os.path.expanduser(sys.argv[1])
jid=sys.argv[2]
password=sys.argv[3]
resource='vcard'
except:
print >>sys.stderr, __doc__
sys.exit(2)
NS_VCARD_UPDATE = 'vcard-temp:x:update'
NS_NICK = 'http://jabber.org/protocol/nick'
def hash_img(img):
return sha1(img).hexdigest()
def base64_img(img):
return img.encode('base64')
def get_img(file):
try:
os.stat(file)[6]
fh = open(file, 'rb')
img = fh.read()
return img
except Exception, e:
print >>sys.stderr, e
sys.exit(2)
def get_mime_type(file):
try:
ext = file[-4:]
if ext == '.png':
mime_type = 'image/png'
elif ext == '.gif':
mime_type = 'image/gif'
elif ext == '.jpg' or ext == '.jpeg':
mime_type = 'image/jpeg'
else:
raise ValueError, "Wrong mime-type detected. Check file suffix."
except ValueError, e:
print >>sys.stderr, e
sys.exit(2)
return mime_type
def send_vcard(conn, base64_img, mime_type, nick):
iq_vcard = Iq(typ='set')
vcard = iq_vcard.addChild(name='vCard', namespace=NS_VCARD)
vcard.addChild(name='NICKNAME', payload=[nick])
photo = vcard.addChild(name='PHOTO')
photo.setTagData(tag='TYPE', val=mime_type)
photo.setTagData(tag='BINVAL', val=base64_img)
conn.send(iq_vcard)
def send_presence(conn, status, hash1, nick):
presence = Presence(status = status, show = 'xa', priority = '-1')
presence.setTag(name='x',namespace=NS_VCARD_UPDATE).setTag(name='photo',namespace=NS_VCARD_UPDATE).setData(hash1)
presence.setTag(name='nick',namespace=NS_NICK).setData(nick)
conn.send(presence)
if __name__ == '__main__':
img = get_img(file)
j=JID(jid)
cl=Client(j.getDomain(),debug=[])
conn=cl.connect()
if not conn:
raise Exception, 'failed to start connection'
auth=cl.auth(j.getNode(),password,resource,sasl=1)
if not auth:
raise Exception, 'could not authenticate'
send_vcard(cl, base64_img(img), get_mime_type(file), j.getNode())
send_presence(cl, 'Updated vCard Image', hash_img(img), j.getNode())
time.sleep(1)
cl.disconnect()
Dave offered the well-worn phrase "haul yourself up by your bootstraps" as the mental image we should have when we use the bootstrapping metaphor. Imagine that you're wearing your boots, you grab your bootstraps and pull on them. Well, the best outcome I can imagine is that you'd fail to accomplish anything. If you could accomplish anything, I think all you'd do is pull your feet out from under yourself. But the phrase is supposed to connote (I think) strength by self-determination and self-motivation. That's why MBA-types say they're going to "bootstrap" their start-ups when what they really mean is that their start-ups will be self-funded at the outset.




