document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/pygment_trac.css" />');
document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/embed.css" />');
document.write('<div class="flowcoder_post flowcoder_clearfix">');
document.write('<div class="flowcoder_posttitle"><a href=\"http://flowcoder.com/142\">Posting XMPP (Jabber) messages without external XMPP libraries<\/a></div>');
document.write('<div class="flowcoder_postbody flowcoder_syntax"><div class=\"highlight\"><pre><span class=\"c\"># Origin: some challenge on reddit<\/span>\n\n<span class=\"kn\">import<\/span> <span class=\"nn\">socket<\/span><span class=\"o\">,<\/span> <span class=\"nn\">base64<\/span><span class=\"o\">,<\/span> <span class=\"nn\">ssl<\/span>\n\n<span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;user&quot;<\/span>\n<span class=\"n\">server<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;jabber.org&quot;<\/span>\n<span class=\"n\">port<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5222<\/span>\n<span class=\"n\">password<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;password&quot;<\/span>\n<span class=\"n\">recipient<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;foo@bar.com&quot;<\/span>\n<span class=\"n\">message<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;hello&quot;<\/span>\n<span class=\"n\">useSSL<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span>\n\n<span class=\"k\">def<\/span> <span class=\"nf\">waitfor<\/span><span class=\"p\">(<\/span><span class=\"n\">socket<\/span><span class=\"p\">,<\/span> <span class=\"n\">element<\/span><span class=\"p\">)<\/span> <span class=\"p\">:<\/span>\n  <span class=\"nb\">input<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;&quot;<\/span>  \n  <span class=\"k\">while<\/span> <span class=\"ow\">not<\/span> <span class=\"p\">(<\/span><span class=\"s\">&quot;&lt;&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">element<\/span><span class=\"p\">)<\/span> <span class=\"ow\">in<\/span> <span class=\"nb\">input<\/span> <span class=\"ow\">or<\/span> <span class=\"ow\">not<\/span> <span class=\"nb\">input<\/span><span class=\"o\">.<\/span><span class=\"n\">endswith<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;&gt;&quot;<\/span><span class=\"p\">)<\/span> <span class=\"p\">:<\/span>\n    <span class=\"nb\">input<\/span> <span class=\"o\">+=<\/span> <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">recv<\/span><span class=\"p\">(<\/span><span class=\"mi\">1024<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"n\">socket<\/span><span class=\"o\">.<\/span><span class=\"n\">socket<\/span><span class=\"p\">()<\/span>\n<span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">connect<\/span><span class=\"p\">((<\/span><span class=\"n\">server<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"p\">))<\/span>\n<span class=\"n\">header<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&quot;&lt;stream:stream version=&#39;1.0&#39; xmlns:stream=&#39;http://etherx.jabber.org/streams&#39; xmlns=&#39;jabber:client&#39; to=&#39;&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">server<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;&#39; xmlns:xml=&#39;http://www.w3.org/XML/1998/namespace&#39;&gt;&quot;<\/span>\n<span class=\"k\">if<\/span> <span class=\"n\">useSSL<\/span> <span class=\"p\">:<\/span>\n  <span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">send<\/span><span class=\"p\">(<\/span><span class=\"n\">header<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;&lt;starttls xmlns=&#39;urn:ietf:params:xml:ns:xmpp-tls&#39;/&gt;&quot;<\/span><span class=\"p\">)<\/span>\n  <span class=\"n\">waitfor<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">,<\/span> <span class=\"s\">&quot;proceed&quot;<\/span><span class=\"p\">)<\/span>\n  <span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ssl<\/span><span class=\"o\">.<\/span><span class=\"n\">wrap_socket<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">send<\/span><span class=\"p\">(<\/span><span class=\"n\">header<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;&lt;auth xmlns=&#39;urn:ietf:params:xml:ns:xmpp-sasl&#39; mechanism=&#39;PLAIN&#39;&gt;&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">base64<\/span><span class=\"o\">.<\/span><span class=\"n\">b64encode<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;<\/span><span class=\"se\">\\0<\/span><span class=\"s\">&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">user<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;<\/span><span class=\"se\">\\0<\/span><span class=\"s\">&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">password<\/span><span class=\"p\">)<\/span><span class=\"o\">+<\/span> <span class=\"s\">&quot;&lt;/auth&gt;&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">waitfor<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">,<\/span> <span class=\"s\">&quot;success&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">send<\/span><span class=\"p\">(<\/span><span class=\"n\">header<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;&lt;iq type=&#39;set&#39;&gt;&lt;bind xmlns=&#39;urn:ietf:params:xml:ns:xmpp-bind&#39;/&gt;&lt;/iq&gt;&lt;iq type=&#39;set&#39;&gt;&lt;session xmlns=&#39;urn:ietf:params:xml:ns:xmpp-session&#39;/&gt;&lt;/iq&gt;&lt;message to=&#39;&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">recipient<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;&#39;&gt;&lt;body&gt;&quot;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">message<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot;&lt;/body&gt;&lt;/message&gt;&quot;<\/span><span class=\"p\">)<\/span>\n<span class=\"n\">s<\/span><span class=\"o\">.<\/span><span class=\"n\">close<\/span><span class=\"p\">()<\/span>\n<\/pre><\/div>\n</div>');
document.write('<div class="flowcoder_bottombar flowcoder_clearfix">');
document.write('<div class="flowcoder_postedby">Posted by <a href=\"http://flowcoder.com/zh\">zh<\/a> on <a href=\"http://flowcoder.com/\">Flowcoder<\/a></div>');
document.write('<div class="flowcoder_viewraw"><a href=\"http://flowcoder.com/142.txt\">view raw<\/a></div>');
document.write('</div></div>');
