<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le Blog du grand loup Zeur &#187; Programmation</title>
	<atom:link href="http://blog.gaetan-grigis.eu/category/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gaetan-grigis.eu</link>
	<description>Le blog qui vous fait connaitre ce que vous savez déjà</description>
	<lastBuildDate>Tue, 17 Jan 2012 08:43:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Extension chrome : Prévisualisation des vidéos sur Itunes</title>
		<link>http://blog.gaetan-grigis.eu/programmation/extension-chrome-previsualisation-des-videos-sur-itunes/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/extension-chrome-previsualisation-des-videos-sur-itunes/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 19:04:27 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=1095</guid>
		<description><![CDATA[Plop à tous &#8230; Aujourd&#8217;hui, pour le lol, la création d&#8217;une extension pour ne pas à avoir à installer itunes pour mater les vidéos des podcasts (j&#8217;ai pas trop cherché, mais sur linux, y&#8217;a rien apparemment qui permettrait de mater les vidéos :s &#8230; j&#8217;ai du mal chercher en fait). Mais heureusement, Apple fait bien [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous &#8230;</p>
<p>Aujourd&#8217;hui, pour le lol, la création d&#8217;une extension pour ne pas à avoir à installer itunes pour mater les vidéos des podcasts (j&#8217;ai pas trop cherché, mais sur linux, y&#8217;a rien apparemment qui permettrait de mater les vidéos :s &#8230; j&#8217;ai du mal chercher en fait).<br />
<span id="more-1095"></span><br />
Mais heureusement, Apple fait bien les choses et fournit l&#8217;url des vidéos directement dans sa page web :<br />
<img src="http://blog.gaetan-grigis.eu/wp-content/uploads/2011/06/Itunes-pett.png" alt="" title="Itunes-pett" width="711" height="72" class="aligncenter size-full wp-image-1096" /></p>
<p>Il suffit d’exécuter ce script dans la page pour rajouter un évènement au Click de l&#8217;image montrant la vidéo pour ouvrir une nouvelle fenêtre directement sur la vidéo en question : </p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="st0">&#39;table[class*=&quot;tracklist-table&quot;] &gt; tbody &gt; tr&#39;</span><span class="br0">&#41;</span>.<span class="me1">each</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>index<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> url = $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&quot;video-preview-url&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&#39;span[class*=&quot;video&quot;]&#39;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; window.<span class="kw3">open</span><span class="br0">&#40;</span>url,<span class="st0">&#39;Your video&#39;</span>,<span class="st0">&#39;&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Maintenant, il faut juste créer une extension JS pour l’exécuter directement.<br />
Il faut tout d&#8217;abord, un fichier json nommé manifest.json, qui indiquera les droits du script et ses dépendances (ici jquery (une lib) et cleaner (mon script)) :</p>
<div class="geshi no json">
<ol>
<li class="li1">
<div class="de1">{
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &quot;name&quot;: &quot;ItunesHTML5&quot;,
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &quot;description&quot;:&quot;Extension permettant d&#39;avoir un aperçu d&#39;un podcast vidéo directement sur la page web de itunes&quot;,
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &quot;version&quot;:&quot;0.0.1&quot;,
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &quot;content_scripts&quot;: [
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &quot;matches&quot;: [&quot;http://itunes.apple.com/*&quot;],
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &quot;js&quot;: [&quot;jquery.js&quot;, &quot;cleaner.js&quot;]
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; }
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; ]
</div>
</li>
<li class="li1">
<div class="de1">}</div>
</li>
</ol>
</div>
<p>On télécharge ensuite <a href="http://jquery.com/">jquery.js</a> que l&#8217;on met dans le même dossier que le manifest, ainsi que le bout de code javascript à mettre dans le fichier cleaner.js (à mettre aussi dans le même dossier que le manifest)).</p>
<p>On accès ensuite à la page des <a href="chrome://extensions/">extensions de chrome</a> et l&#8217;on click sur &laquo;&nbsp;Charger l&#8217;extension non empaquetée&nbsp;&raquo;, on indique le dossier contenant l&#8217;extension et voilà &#8230; on accède à un podcast itunes et on clique sur l&#8217;icône de l&#8217;écran pour visualiser la vidéo :<br />
<img src="http://blog.gaetan-grigis.eu/wp-content/uploads/2011/06/itunesclick.png" alt="" title="itunesclick" width="652" height="274" class="aligncenter size-full wp-image-1097" /></p>
<p>Donc voilà, rien de complexe, l&#8217;extension reste pour le lol, je ne sais pas si elle sera très utile, mais je l&#8217;ai quand même proposé au <a href="https://chrome.google.com/webstore/detail/glfpeccpghhhkljknhkpgallkelibelj?hl=fr">google webstore</a> pour permettre un téléchargement direct de l&#8217;extension. (Pour le moment, l&#8217;extension n&#8217;a pas l&#8217;air accessible :s).</p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=1095">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/non-classe/lire-des-videos-en-webm-sur-youtube/" rel="bookmark" title="Permanent Link: Lire des vidéos en webm sur youtube">Lire des vidéos en webm sur youtube</a></li><li><a href="http://blog.gaetan-grigis.eu/ubuntu/gnome-desactiver-la-previsualisation-de-medias/" rel="bookmark" title="Permanent Link: Gnome : Désactiver la prévisualisation de medias">Gnome : Désactiver la prévisualisation de medias</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/la-rc-de-firefox-bientot-dans-les-depot-dhardy/" rel="bookmark" title="Permanent Link: La RC de Firefox bientot dans les depots d&#8217;hardy">La RC de Firefox bientot dans les depots d&#8217;hardy</a></li><li><a href="http://blog.gaetan-grigis.eu/non-classe/les-liens-du-we/" rel="bookmark" title="Permanent Link: Les liens du WE">Les liens du WE</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/systeme-dalerte-via-sms-sur-vos-serveurs-grace-a-google-calendar/" rel="bookmark" title="Permanent Link: Système d&#8217;alerte via SMS sur vos serveurs grace à google calendar.">Système d&#8217;alerte via SMS sur vos serveurs grace à google calendar.</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/extension-chrome-previsualisation-des-videos-sur-itunes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Application android pour les horaires de tram/bus grenoblois (Tag/SemiTag)</title>
		<link>http://blog.gaetan-grigis.eu/programmation/java/application-android-pour-les-horaires-de-trambus-grenoblois-tagsemitag/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/java/application-android-pour-les-horaires-de-trambus-grenoblois-tagsemitag/#comments</comments>
		<pubDate>Sat, 21 May 2011 09:00:19 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[bus]]></category>
		<category><![CDATA[grenoble]]></category>
		<category><![CDATA[htmlcleaner]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[semitag]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[tram]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=1081</guid>
		<description><![CDATA[Plop à tous &#8230; Alors voilà &#8230; hier j&#8217;avais cours de Java, et comme l&#8217;ennui c&#8217;est fait sentir, j&#8217;ai décidé de créer un &#171;&#160;clone&#160;&#187; de mon application pour les horaires des transports strasbourgeois en un peu plus propre (côté code), mais toujours aussi simpliste (faudrait voir pour utiliser des threads pour le système de recherche, [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous &#8230;</p>
<p>Alors voilà &#8230; hier j&#8217;avais cours de Java, et comme l&#8217;ennui c&#8217;est fait sentir, j&#8217;ai décidé de créer un &laquo;&nbsp;clone&nbsp;&raquo; de mon application pour les horaires des transports strasbourgeois en un peu plus propre (côté code), mais toujours aussi simpliste (faudrait voir pour utiliser des threads pour le système de recherche, une barre de chargement, une widget configurable, &#8230; mais en 8 heures j&#8217;ai pas eu le temps ^^).<br />
<span id="more-1081"></span><br />
<a href="http://blog.gaetan-grigis.eu/wp-content/uploads/2011/05/android-tag.png"><img src="http://blog.gaetan-grigis.eu/wp-content/uploads/2011/05/android-tag.png" alt="" title="android-tag" width="323" height="487" class="aligncenter size-full wp-image-1082" /></a></p>
<p>L&#8217;application se base sur les données fournit par le site : <a href="http://tag.mobitrans.fr/">tag.mobitrans.fr</a>, le site utilise des tokens et chaque recherche doit se faire en tapant dans 3 pages différentes, puis une page par ligne de tram/bus, donc potentiellement pas mal de parsing et de conso de bande passante).</p>
<p>Pour ne pas à avoir à utiliser de regexp, j&#8217;ai utilisé la librairie <a href="http://htmlcleaner.sourceforge.net/">htmlcleaner</a>, qui transforme de l&#8217;html en XML bien formé, permettant des requêtes xpath pour récupérer les éléments, réduisant de façon significative le temps de développement.</p>
<p>Un petit code d&#8217;exemple de l&#8217;utilisation d&#8217;Html cleaner : </p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">HtmlCleaner hc = <span class="kw2">new</span> HtmlCleaner<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">TagNode tn = hc.<span class="me1">clean</span><span class="br0">&#40;</span><span class="st0">&quot;url du site&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//recuperation du contenu d&#39;une div ayant pour classe &#39;corpsL&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw3">Object</span> o : tn.<span class="me1">evaluateXPath</span><span class="br0">&#40;</span><span class="st0">&quot;//div[@class=&#39;corpsL&#39;]//div&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//affichage du texte pour les elements de type a &nbsp; </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span>TagNode<span class="br0">&#41;</span> o<span class="br0">&#41;</span>.<span class="me1">getElementsByName</span><span class="br0">&#40;</span><span class="st0">&quot;a&quot;</span>, <span class="kw2">false</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">getText</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Le code <a href="https://github.com/cipher16/AndroidTagMobiTrans">source du projet</a> pour donner quelques idées et l&#8217;<a href="https://github.com/cipher16/AndroidTagMobiTrans/raw/master/bin/tag.apk">apk</a>.</p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=1081">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/non-classe/un-peu-davancement-dans-lapplication-android-de-la-cts/" rel="bookmark" title="Permanent Link: Un peu d&#8217;avancement dans l&#8217;application Android de la CTS &#8230;">Un peu d&#8217;avancement dans l&#8217;application Android de la CTS &#8230;</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/mon-application-android-pour-les-horaires-de-la-cts/" rel="bookmark" title="Permanent Link: Mon Application Android pour les horaires de la CTS">Mon Application Android pour les horaires de la CTS</a></li><li><a href="http://blog.gaetan-grigis.eu/android/application-android-pour-le-telechargement-des-versions-de-cyanogen/" rel="bookmark" title="Permanent Link: Application android pour le téléchargement des versions de Cyanogen">Application android pour le téléchargement des versions de Cyanogen</a></li><li><a href="http://blog.gaetan-grigis.eu/android/android-application-de-controle-a-distancebackupinfo/" rel="bookmark" title="Permanent Link: [Android] application de contrôle à distance/backup/info">[Android] application de contrôle à distance/backup/info</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/android-c2dm-notification-push-en-bash-avec-wget/" rel="bookmark" title="Permanent Link: Android C2DM Notification push en bash avec wget">Android C2DM Notification push en bash avec wget</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/java/application-android-pour-les-horaires-de-trambus-grenoblois-tagsemitag/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Notification Ossec sur Twitter en perl</title>
		<link>http://blog.gaetan-grigis.eu/programmation/perl/notification-ossec-sur-twitter-en-perl/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/perl/notification-ossec-sur-twitter-en-perl/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 12:49:13 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[conf]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=1055</guid>
		<description><![CDATA[Aujourd&#8217;hui, du twitter et de l&#8217;ossec, comme je le disais dans mon précédent article sur les notifications d&#8217;ossec, l&#8217;utilisation de twitter pour les notification ne fonctionne plus, car depuis aout 2010, les authentifications http ne fonctionnent plus, et il faut passer par le système Oauth, qui permet de ne plus avoir à stocker ses mots [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui, </p>
<p>du twitter et de l&#8217;ossec, comme je le disais dans mon précédent article sur les notifications d&#8217;ossec, l&#8217;utilisation de twitter pour les notification ne fonctionne plus, car depuis aout 2010, les authentifications http ne fonctionnent plus, et il faut passer par le système <a href="http://oauth.net/">Oauth</a>, qui permet de ne plus avoir à stocker ses mots de passe dans chaque application utilisant le service, et de pouvoir désactiver les accès depuis le site de twitter.<br />
<span id="more-1055"></span><br />
J&#8217;ai utilisé le langage perl pour l&#8217;autorisation et la publication des tweets :<br />
Il faut tout d&#8217;abord aller sur le site <a href="http://dev.twitter.com/">des applications twitter</a> pour récupérer les clés d&#8217;autorisation de l&#8217;application et son &#8216;secret&#8217;.</p>
<p><img src="http://blog.gaetan-grigis.eu/wp-content/uploads/2011/04/ossec-twitter-ban.png" alt="" title="ossec-twitter-ban" width="508" height="86" class="aligncenter size-full wp-image-1061" /></p>
<p>Installer les dépendances : </p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">apt-get <span class="kw2">install</span> libnet-twitter-<span class="kw2">perl</span></div>
</li>
</ol>
</div>
<p>Puis lancer le logiciel une premiere fois pour générer les tokens d&#8217;accès.<br />
(Les deux fichiers suivant se mettent dans active-response/bin)</p>
<div class="geshi no perl">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/perl</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># Net::Twitter &#8211; OAuth et Envoie de status</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">use</span> warnings;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">use</span> strict;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">use</span> Net::<span class="me2">Twitter</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">use</span> File::<span class="me2">Spec</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">use</span> Storable;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">use</span> Data::<span class="me2">Dumper</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">my</span> <span class="re0">$status</span> = <span class="kw3">shift</span> <span class="kw1">or</span> <span class="kw3">die</span><span class="br0">&#40;</span><span class="st0">&quot;Il manque le status en parametre&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$status</span> = <span class="kw3">substr</span> <span class="re0">$status</span>, <span class="nu0">0</span>, <span class="nu0">140</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">my</span> <span class="re0">%consumer_tokens</span> = <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; consumer_key &nbsp; &nbsp;=<span class="sy0">&gt;</span> <span class="st0">&#39;Remplacer par votre clé&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; consumer_secret =<span class="sy0">&gt;</span> <span class="st0">&#39;Remplacer par votre secret&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">my</span> <span class="br0">&#40;</span><span class="kw3">undef</span>, <span class="kw3">undef</span>, <span class="re0">$datafile</span><span class="br0">&#41;</span> = File::<span class="me2">Spec</span>-<span class="sy0">&gt;</span><span class="me1">splitpath</span><span class="br0">&#40;</span>$<span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$datafile</span> =~ <span class="kw3">s</span><span class="sy0">/</span>\..<span class="sy0">*/</span>.dat<span class="sy0">/</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">my</span> <span class="re0">$nt</span> = Net::<span class="me2">Twitter</span>-<span class="sy0">&gt;</span><span class="me1">new</span><span class="br0">&#40;</span>traits =<span class="sy0">&gt;</span> <span class="br0">&#91;</span><span class="kw3">qw</span><span class="sy0">/</span>API::<span class="me2">REST</span> OAuth<span class="sy0">/</span><span class="br0">&#93;</span>, <span class="re0">%consumer_tokens</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">my</span> <span class="re0">$access_tokens</span> = <span class="kw3">eval</span> <span class="br0">&#123;</span> retrieve<span class="br0">&#40;</span><span class="re0">$datafile</span><span class="br0">&#41;</span> <span class="br0">&#125;</span> <span class="sy0">||</span> <span class="br0">&#91;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span> <span class="re0">@$access_tokens</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$nt</span>-<span class="sy0">&gt;</span><span class="me1">access_token</span><span class="br0">&#40;</span><span class="re0">$access_tokens</span>-<span class="sy0">&gt;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$nt</span>-<span class="sy0">&gt;</span><span class="me1">access_token_secret</span><span class="br0">&#40;</span><span class="re0">$access_tokens</span>-<span class="sy0">&gt;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$auth_url</span> = <span class="re0">$nt</span>-<span class="sy0">&gt;</span><span class="me1">get_authorization_url</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">print</span> <span class="st0">&quot; Autoriser cette application via : $auth_url<span class="es0">\n</span>Puis, entrez le PIN# pour continuer: &quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">$pin</span> = <span class="re4">&lt;STDIN&gt;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">chomp</span> <span class="re0">$pin</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">my</span> <span class="re0">@access_tokens</span> = <span class="re0">$nt</span>-<span class="sy0">&gt;</span><span class="me1">request_access_token</span><span class="br0">&#40;</span>verifier =<span class="sy0">&gt;</span> <span class="re0">$pin</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; store \<span class="re0">@access_tokens</span>, <span class="re0">$datafile</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#$status = $nt-&gt;user_timeline({ count =&gt; 1 });</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">#print Dumper $status;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">my</span> <span class="re0">$result</span> = <span class="re0">$nt</span>-<span class="sy0">&gt;</span><span class="me1">update</span><span class="br0">&#40;</span><span class="re0">$status</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Il faut ensuite créer un nouveau script pour gérer les status depuis les notifications d&#8217;ossec :</p>
<p>J&#8217;ai modifié le script existant pour utiliser mon script de publication, et aussi pour spécifier les messages d&#8217;erreurs fournit par l&#8217;id 20100 (de Snort), qui renvoit un message bidon, là je fournit l&#8217;erreur détectée par Snort de façon plus précise.</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="co0">#!/bin/sh</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co0"># Tweeter an alert &#8211; copy at /var/ossec/active-response/bin/ossec-tweeter.sh</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co0"># Author: Daniel Cid</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co0"># Checking user arguments</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#91;</span> <span class="st0">&quot;x$1&quot;</span> = <span class="st0">&quot;xdelete&quot;</span> <span class="br0">&#93;</span>; <span class="kw1">then</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">exit</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">fi</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ALERTID=</span>$<span class="nu0">4</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">RULEID=</span>$<span class="nu0">5</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">LOCAL=</span>`<span class="kw2">dirname</span> $<span class="nu0">0</span>`;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ALERTTIME=</span>`<span class="kw3">echo</span> <span class="st0">&quot;$ALERTID&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> -d &nbsp;<span class="st0">&quot;.&quot;</span> -f <span class="nu0">1</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ALERTLAST=</span>`<span class="kw3">echo</span> <span class="st0">&quot;$ALERTID&quot;</span> <span class="sy0">|</span> <span class="kw2">cut</span> -d &nbsp;<span class="st0">&quot;.&quot;</span> -f <span class="nu0">2</span>`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co0"># Logging</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">cd</span> <span class="re1">$LOCAL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">cd</span> ..<span class="sy0">/</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re2">PWD=</span>`<span class="kw3">pwd</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;`date` $0 $1 $2 $3 $4 $5 $6 $7 $8&quot;</span> <span class="sy0">&gt;&gt;</span> <span class="re0">$<span class="br0">&#123;</span>PWD<span class="br0">&#125;</span><span class="sy0">|</span>><span class="sy0">/</span>..<span class="sy0">/</span>logs<span class="sy0">/</span>active-responses.log</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">ALERTFULL=</span>`<span class="kw2">grep</span> -A <span class="nu0">10</span> <span class="st0">&quot;$ALERTTIME&quot;</span> <span class="re0">$<span class="br0">&#123;</span>PWD<span class="br0">&#125;</span><span class="sy0">|</span>><span class="sy0">/</span>..<span class="sy0">/</span>logs<span class="sy0">/</span>alerts<span class="sy0">/</span>alerts.log <span class="sy0">|</span> <span class="kw2">grep</span> -v <span class="st0">&quot;.$ALERTLAST: &quot;</span> -A <span class="nu0">10</span> <span class="sy0">|</span> <span class="kw2">grep</span> -v <span class="st0">&quot;Src IP: &quot;</span> <span class="sy0">|</span> <span class="kw2">grep</span> -v <span class="st0">&quot;User: &quot;</span> <span class="sy0">|</span>grep <span class="st0">&quot;Rule: &quot;</span> -A <span class="nu0">1</span><span class="sy0">|</span>head <span class="nu0">-1</span><span class="sy0">|</span>sed <span class="st0">&#39;s/Rule: //&#39;</span>`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> <span class="br0">&#91;</span> $<span class="nu0">5</span> -eq <span class="st0">&quot;20100&quot;</span> <span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">then</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re2">ALERTFULLTMP=</span>`<span class="kw2">grep</span> -A <span class="nu0">10</span> <span class="st0">&quot;$ALERTTIME&quot;</span> <span class="re0">$<span class="br0">&#123;</span>PWD<span class="br0">&#125;</span><span class="sy0">|</span>><span class="sy0">/</span>..<span class="sy0">/</span>logs<span class="sy0">/</span>alerts<span class="sy0">/</span>alerts.log <span class="sy0">|</span> <span class="kw2">grep</span> -v <span class="st0">&quot;.$ALERTLAST: &quot;</span> -A <span class="nu0">10</span> <span class="sy0">|</span> <span class="kw2">grep</span> -v <span class="st0">&quot;Src IP: &quot;</span> <span class="sy0">|</span> <span class="kw2">grep</span> -v <span class="st0">&quot;User: &quot;</span> <span class="sy0">|</span>grep <span class="st0">&quot;Rule: &quot;</span> -A <span class="nu0">1</span><span class="sy0">|</span>sed <span class="st0">&#39;s/Rule: //&#39;</span><span class="sy0">|</span>head <span class="nu0">-2</span>`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re2">REALMSG=</span>`<span class="kw3">echo</span> <span class="re1">$ALERTFULLTMP</span><span class="sy0">|</span>sed -e <span class="st0">&quot;s/.*(.*) <span class="es0">\(</span>.*<span class="es0">\)</span> <span class="es0">\[</span><span class="es0">\*</span>.*/<span class="es0">\1</span>/g&quot;</span>`</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re2">ALERTFULL=</span>`<span class="kw3">echo</span> <span class="re1">$ALERTFULL</span><span class="sy0">|</span>sed -e <span class="st0">&quot;s/&#39;.*&#39;/&#39;$REALMSG&#39;/g&quot;</span>`</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">fi</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re2">STATUS=</span><span class="st0">&quot;Ban temp : $3 Regle : $ALERTFULL&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">/</span>var<span class="sy0">/</span>ossec<span class="sy0">/</span>active-response<span class="sy0">/</span>bin<span class="sy0">/</span>twitter.pl <span class="st0">&quot;$STATUS&quot;</span></div>
</li>
</ol>
</div>
<p>Modifier la conf de etc/ossec.conf en rajoutant : </p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;command<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>ossec-tweeter<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;executable<span class="re2">&gt;</span></span></span>ossec-tweeter.sh<span class="sc3"><span class="re1">&lt;/executable<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;expect<span class="re2">&gt;</span></span></span>srcip<span class="sc3"><span class="re1">&lt;/expect<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;timeout_allowed<span class="re2">&gt;</span></span></span>yes<span class="sc3"><span class="re1">&lt;/timeout_allowed<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/command<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;active-response<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;command<span class="re2">&gt;</span></span></span>ossec-tweeter<span class="sc3"><span class="re1">&lt;/command<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;location<span class="re2">&gt;</span></span></span>local<span class="sc3"><span class="re1">&lt;/location<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;level<span class="re2">&gt;</span></span></span>6<span class="sc3"><span class="re1">&lt;/level<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/active-response<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>Et normalement, c&#8217;est tout bon, vous devriez pouvoir twitter les attaques &#8230;</p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=1055">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/mes-applicationsscripts/" rel="bookmark" title="Permanent Link: Mes Applications/Scripts">Mes Applications/Scripts</a></li><li><a href="http://blog.gaetan-grigis.eu/python-2/alerte-dossec-en-notification-sur-le-bureau/" rel="bookmark" title="Permanent Link: Alerte d&#8217;ossec en notification sur le bureau">Alerte d&#8217;ossec en notification sur le bureau</a></li><li><a href="http://blog.gaetan-grigis.eu/non-classe/ossec-et-iptables-ban-a-duree-variable/" rel="bookmark" title="Permanent Link: Ossec et Iptables : ban à durée variable">Ossec et Iptables : ban à durée variable</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/securiser-un-blog-wordpress-par-un-ips-avec-wpsyslog2-et-ossec/" rel="bookmark" title="Permanent Link: Sécuriser un blog WordPress par un IPS avec wpsyslog2 et ossec">Sécuriser un blog WordPress par un IPS avec wpsyslog2 et ossec</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/ossec-et-sshbannissement-ip-definitif-de-cracker/" rel="bookmark" title="Permanent Link: [OSSEC et SSH]Bannissement ip définitif de cracker">[OSSEC et SSH]Bannissement ip définitif de cracker</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/perl/notification-ossec-sur-twitter-en-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Petit serveur d&#8217;adresse mail de diffusion</title>
		<link>http://blog.gaetan-grigis.eu/programmation/petit-serveur-dadresse-mail-de-diffusion/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/petit-serveur-dadresse-mail-de-diffusion/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 09:00:53 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[diffusion]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=972</guid>
		<description><![CDATA[Plop à tous &#8230; encore un truc useless à partager. J&#8217;ai récemment dû intervenir dans une entreprise qui avait un serveur de mail qui ne supportait pas les listes de diffusion (service de base fournit par yahoo en fait, donc à part forwarder des mails sur une adresse, il est pas possible de faire grand [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous &#8230; encore un truc useless à partager.</p>
<p>J&#8217;ai récemment dû intervenir dans une entreprise qui avait un serveur de mail qui ne supportait pas les listes de diffusion (service de base fournit par yahoo en fait, donc à part forwarder des mails sur une adresse, il est pas possible de faire grand chose).</p>
<p>Ne voulant pas perdre trop de temps à mettre en place des systèmes du genre mailman ou autre, pour créer une vingtaine d&#8217;alias pour deux adresses mails (style support@mondomaine.fr qui envoit un mail pour toute la team de support), j&#8217;ai décidé de coder un serveur de mail qui ne répondrait qu&#8217;à certaines adresses et renverrait le mail sur les adresses configurées pour cette adresse de diffusion.</p>
<p>Ecrire ce genre de truc en python est encore plus rapide que de chercher l&#8217;équivalent sur google <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  d&#8217;où ma démarche.<br />
<span id="more-972"></span></p>
<p>La version de base fonctionne ainsi :<br />
Pour la conf, il faut un fichier du genre à mettre dans le répertoire de l&#8217;executable :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">mail_monadressedediffusion<span class="sy0">@</span>mondomaine.fr.conf</div>
</li>
</ol>
</div>
<p>qui contiendra la liste des adresses mails du genre :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">monuser1<span class="sy0">@</span>mondomaine.fr</div>
</li>
<li class="li1">
<div class="de1">monuser2<span class="sy0">@</span>mondomaine.fr</div>
</li>
</ol>
</div>
<p>Ainsi, tout les mails envoyés à &laquo;&nbsp;monadressedediffusion@mondomaine.fr&nbsp;&raquo; seront envoyés à &laquo;&nbsp;monuser1@mondomaine.fr&nbsp;&raquo; et &laquo;&nbsp;monuser2@mondomaine.fr&nbsp;&raquo;.</p>
<p>Bien entendu, si l&#8217;adresse mail sur lequel on chope le mail n&#8217;a pas de conf (mail_[adresse mail].conf), on n&#8217;envoi pas de mail, donc on termine pas en relais pour les méchants spammeurs (pour une utilisation en proxy local, on peut enlever cette partie du code &#8230;).</p>
<p>Comm d&#8217;hab&#8217;, le code est fournit à titre d&#8217;exemple &laquo;&nbsp;as his &#038; for educational purpose only&nbsp;&raquo; comme dirait les anglais, à adapter à ses besoins <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">smtpd</span> <span class="kw1">import</span> PureProxy</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">asyncore</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">asynchat</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">smtplib</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">re</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">sys</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">os</span>.<span class="me1">path</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">pwd</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">grp</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> mySMTP <span class="br0">&#40;</span>PureProxy<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,s,n<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">serv</span> = n</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; PureProxy.<span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,s,<span class="kw2">None</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> process_message <span class="br0">&#40;</span><span class="kw2">self</span>, peer, mailfrom, rcpttos, data<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> rcpt <span class="kw1">in</span> rcpttos:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">file</span>=<span class="st0">&quot;mail_&quot;</span>+rcpt+<span class="st0">&quot;.conf&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">exists</span><span class="br0">&#40;</span><span class="kw2">file</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = <span class="kw2">open</span><span class="br0">&#40;</span><span class="kw2">file</span>,<span class="st0">&#39;r&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rcpts = <span class="kw2">list</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> line <span class="kw1">in</span> f:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line=line.<span class="me1">strip</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> line<span class="sy0">!</span>=mailfrom:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rcpts.<span class="me1">append</span><span class="br0">&#40;</span>line<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span>rcpts<span class="br0">&#41;</span><span class="sy0">&gt;</span><span class="nu0">0</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; smtpSender = <span class="kw3">smtplib</span>.<span class="me1">SMTP</span><span class="br0">&#40;</span> <span class="kw2">self</span>.<span class="me1">serv</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>, <span class="kw2">self</span>.<span class="me1">serv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; smtpSender.<span class="me1">sendmail</span><span class="br0">&#40;</span> mailfrom, rcpts, data <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; smtpSender.<span class="me1">quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">None</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> __name__ == <span class="st0">&quot;__main__&quot;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span><span class="sy0">&lt;</span><span class="nu0">2</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Il manque des arguments : &quot;</span>+<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>+<span class="st0">&quot; &#39;serveur smtp&#39;,&#39;port&#39;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">os</span>.<span class="me1">getuid</span><span class="br0">&#40;</span><span class="br0">&#41;</span> == <span class="nu0">0</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; running_uid = <span class="kw3">pwd</span>.<span class="me1">getpwnam</span><span class="br0">&#40;</span><span class="st0">&quot;nobody&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; running_gid = <span class="kw3">grp</span>.<span class="me1">getgrnam</span><span class="br0">&#40;</span><span class="st0">&quot;nobody&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">os</span>.<span class="me1">setgid</span><span class="br0">&#40;</span>running_gid<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">os</span>.<span class="me1">setuid</span><span class="br0">&#40;</span>running_uid<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> == <span class="nu0">3</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serv = mySMTP <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&quot;0.0.0.0&quot;</span>, <span class="nu0">8025</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>,<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">try</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">asyncore</span>.<span class="me1">loop</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">KeyboardInterrupt</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">pass</span></div>
</li>
</ol>
</div>
<p>Ce système n&#8217;agit qu&#8217;en proxy, il faudra donc lui fournir l&#8217;adresse d&#8217;un serveur smtp et son port en paramètre pour qu&#8217;il puisse forwarder les mails.</p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=972">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/mes-applicationsscripts/" rel="bookmark" title="Permanent Link: Mes Applications/Scripts">Mes Applications/Scripts</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/checker-la-validite-dune-adresse-mail-en-php-via-smtp/" rel="bookmark" title="Permanent Link: Checker la validité d&#8217;une adresse mail en PHP via SMTP">Checker la validité d&#8217;une adresse mail en PHP via SMTP</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/creer-son-propre-service-de-mail-jetable-avec-appengine/" rel="bookmark" title="Permanent Link: Créer son propre service de mail jetable avec appengine">Créer son propre service de mail jetable avec appengine</a></li><li><a href="http://blog.gaetan-grigis.eu/non-classe/changement-dadresse/" rel="bookmark" title="Permanent Link: Changement d&#8217;adresse">Changement d&#8217;adresse</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/analyse-automatisee-des-logs-apache/" rel="bookmark" title="Permanent Link: Analyse automatisée des logs apache">Analyse automatisée des logs apache</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/petit-serveur-dadresse-mail-de-diffusion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>monter un serveur PHP en une ligne de commande (ou presque)</title>
		<link>http://blog.gaetan-grigis.eu/systeme/monter-un-serveur-php-en-une-ligne-de-commande-ou-presque/</link>
		<comments>http://blog.gaetan-grigis.eu/systeme/monter-un-serveur-php-en-une-ligne-de-commande-ou-presque/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 09:45:22 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[cgi-bin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[sh]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=795</guid>
		<description><![CDATA[Dans le genre &#171;&#160;news de webg33k&#160;&#187; en voici une &#8230; A la base, je cherchais à utiliser/écrire un serveur http en python (pas mal de classes existent dans le domaine) pour servir une page html bidon après un man in the middle avec redirection dnspoof sur le serveur http en question, au lieu de déployer [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le genre &laquo;&nbsp;news de webg33k&nbsp;&raquo; en voici une &#8230;</p>
<p>A la base, je cherchais à utiliser/écrire un serveur http en python (pas mal de <a href="http://docs.python.org/library/basehttpserver.html">classes</a> existent dans le domaine) pour servir une page html bidon après un man in the middle avec redirection dnspoof sur le serveur http en question, au lieu de déployer l&#8217;artillerie lourde apache ou nginx.<br />
<span id="more-795"></span><br />
Après diverses recherche sur mon <a href="http://www.google.fr">ami</a>, je suis tombé sur : <a href="http://blog.rom1v.com/2009/12/creer-un-serveur-http-en-10-secondes/">créer un serveur http en 10 secondes</a> &#8230;</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">sudo</span> python -m SimpleHTTPServer <span class="nu0">80</span></div>
</li>
</ol>
</div>
<p>Créant ainsi un serveur http accessible sur : http://127.0.0.1/). Mais cette technique ne fournit que des fichiers statiques (ok c&#8217;est déjà pas mal &#8230; et c&#8217;est plus où moins ce que je cherchais).</p>
<p>Mais en lisant la doc, on peut trouver un &laquo;&nbsp;CGIHTTPServer&nbsp;&raquo;, c&#8217;est un serveur qui peut exécuter des scripts (python, perl, php, sh, &#8230;) et l&#8217;utilisation est similaire :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">python -m CGIHTTPServer <span class="nu0">8080</span></div>
</li>
</ol>
</div>
<p>qui créera un serveur HTTP sur le dossier courant avec la possibilité d&#8217;éxecuter des scripts (EN CLI = ligne de commande) sur le port 8080 (accessible sur http://127.0.0.1:8080/).</p>
<p>ATTENTION, il ne faut pas executer le serveur avec un sudo (pour utiliser le port 80), car sinon, les scripts seront executés en root, ainsi pour le script php suivant (à mettre dans un dossier nommé &laquo;&nbsp;cgi-bin&nbsp;&raquo; dans le dossier courant d&#8217;éxecution de la commande, et faire un chmod +x et <span style="color: #ff0000;">nécessite l&#8217;installation du paquet php-cli</span>) :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#!/usr/bin/php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><span class="co1">//pour signaler la fin des headers</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="kw3">phpinfo</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p><a href="http://blog.gaetan-grigis.eu/wp-content/uploads/2010/04/python-server.png"><img class="aligncenter size-full wp-image-796" title="python-server" src="http://blog.gaetan-grigis.eu/wp-content/uploads/2010/04/python-server.png" alt="" width="769" height="325" /></a><br />
 <br />
On remarque bien que le script a les droits root &#8230; donc à EVITER.</p>
<p>Il faut donc l&#8217;executer sur le port un port supérieur à 1024 (pour ne pas utiliser les droits root : 8080 est le port le plus courant dans ce genre de cas), puis effectuer une redirection de port via iptables qui permettra ici d&#8217;accéder au port 8080 du serveur en faisant une requête sur le port 80 :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">sudo</span> iptables -t nat -A PREROUTING -p tcp &#8211;dport <span class="nu0">80</span> -j REDIRECT &#8211;to-ports <span class="nu0">8080</span></div>
</li>
</ol>
</div>
<p>(ne fonctionne pas pour l&#8217;adresse de loopback 127.0.0.1).</p>
<p>Si vous voulez exécuter d&#8217;autre type de script : sh, python, &#8230;, il suffit de les mettre dans le dossier cgi-bin et de faire un chmod +x dessus.</p>
<p>En python :</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/python</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="st0">&quot;les kikoolols attaquent!!!&quot;</span></div>
</li>
</ol>
</div>
<p>En bash : </p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="co0">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">echo</span> <span class="st0">&quot;les kikoolols attaquent!!!&quot;</span></div>
</li>
</ol>
</div>
<p>Ne pas oublier le premier print &laquo;&nbsp;&nbsp;&raquo; ou echo &laquo;&nbsp;&nbsp;&raquo;, qui indique la fin des headers HTTP. </p>
<p>Voilà &#8230; c&#8217;était le post inutile mais indispensable de la semaine <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=795">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/systeme/se-monter-un-environnement-de-developpement-lamp-rapidement/" rel="bookmark" title="Permanent Link: Se monter un environnement de developpement LAMP rapidement">Se monter un environnement de developpement LAMP rapidement</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/tor-proxy-et-randomiser-le-choix-des-serveurs-de-sortie/" rel="bookmark" title="Permanent Link: Tor Proxy et randomiser le choix des serveurs de sorties">Tor Proxy et randomiser le choix des serveurs de sorties</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/sortie-de-metasploit-32/" rel="bookmark" title="Permanent Link: Sortie de Metasploit 3.2">Sortie de Metasploit 3.2</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/primary-domain-controller-sous-linux/" rel="bookmark" title="Permanent Link: Primary Domain Controller sous Linux &#8230;">Primary Domain Controller sous Linux &#8230;</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/telecharger-sur-mu-via-bash/" rel="bookmark" title="Permanent Link: Telecharger sur MU via bash">Telecharger sur MU via bash</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/systeme/monter-un-serveur-php-en-une-ligne-de-commande-ou-presque/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Push Ip(hone&#124;od) en PHP en envoi &#171;&#160;batch&#160;&#187;</title>
		<link>http://blog.gaetan-grigis.eu/programmation/push-iphoneod-en-php-en-envoi-batch/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/push-iphoneod-en-php-en-envoi-batch/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 17:37:03 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[certificat]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[push]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=790</guid>
		<description><![CDATA[Plop à tous &#8230; Un article en intraveineuse pour tenter de réanimer mon blog &#8230; Alors oui l&#8217;Iphone ça pue, c&#8217;est propriétaire, c&#8217;est moche et tout et tout, mais bon ça se répand comme la peste alors on fait avec :s. Qu&#8217;est ce que le push sur IPhone ?? L&#8217;envoi de messages depuis les services d&#8217;apple vers [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous &#8230;</p>
<p>Un article en intraveineuse pour tenter de réanimer mon blog &#8230; Alors oui l&#8217;Iphone ça pue, c&#8217;est propriétaire, c&#8217;est moche et tout et tout, mais bon ça se répand comme la peste alors on fait avec :s.<br />
<span id="more-790"></span><br />
Qu&#8217;est ce que le push sur IPhone ?? L&#8217;envoi de messages depuis les services d&#8217;apple vers tout les Iphones inscrit à une application, ce qui permet aux développeurs d&#8217;applications IPhone d&#8217;envoyer des messages (en quasi temps réel) pour informer d&#8217;une mise à jour, faire ch**r son monde, &#8230;</p>
<p>L&#8217;implémentation est assez intéressante, puisque les envois se font avec des certificats via une connexion SSL.</p>
<p>Allons droit au but &#8230;</p>
<p>Tout d&#8217;abord, il faut avoir un compte chez Apple (<a href="http://developer.apple.com/iphone/index.action">bouark</a> &#8230;), il faudra générer un certificat x509 (qui servira selon toute vraisemblance à signer les certificats des applications &#8230; à ne pas perdre donc).</p>
<p>Puis lors de l&#8217;ajout des fonctionnalités de push à notre appli, récupérer le certificat propre à l&#8217;application que l&#8217;on développe. Le certificat de notre application est nommé : aps_developer_identity.cer (une fois téléchargé depuis leur portail), mais pour l&#8217;utiliser, il faut changer de format, et supprimer le mot de passe, ce qu&#8217;il est possible de faire avec le script suivant (en le mettant dans le même dossier que le certificat) :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="co0">#!/bin/bash</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co0">#Generate PEM from cer</span></div>
</li>
<li class="li1">
<div class="de1">openssl x509 -inform der -<span class="kw1">in</span> aps_developer_identity.cer -out apns-dev-cert.pem</div>
</li>
<li class="li1">
<div class="de1"><span class="co0">#In case of p12 apns-dev-cert</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co0">#openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12</span></div>
</li>
<li class="li1">
<div class="de1">openssl pkcs12 -nocerts -out apns-dev-key.pem -<span class="kw1">in</span> apns-dev-key.p12</div>
</li>
<li class="li1">
<div class="de1"><span class="co0">#Remove password if needed</span></div>
</li>
<li class="li1">
<div class="de1">openssl rsa -<span class="kw1">in</span> apns-dev-key.pem -out apns-dev-key-noenc.pem</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">cat</span> apns-dev-key-noenc.pem apns-dev-cert.pem <span class="sy0">&gt;</span> apns-dev.pem</div>
</li>
</ol>
</div>
<p>Une fois le certif au format pem récupéré (ici nommé apns-dev.pem), on peut passer à l&#8217;envoi de push en PHP (en sandbox pour les test, sinon, il faudra changer l&#8217;url en gateway.push.apple.com) :</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> sendPushToToken<span class="br0">&#40;</span><span class="re1">$msg</span><span class="sy0">,</span><span class="re1">$token</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$serverId</span><span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$name</span><span class="sy0">=</span><span class="st0">&quot;nom de mon appli&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsHost</span> <span class="sy0">=</span> <span class="st0">&#39;gateway.sandbox.push.apple.com&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsPort</span> <span class="sy0">=</span> <span class="nu0">2195</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsCert</span> <span class="sy0">=</span> <span class="st0">&#39;apns-dev.pem&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/*DON&#39;T TOUCH BELOW*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$payload</span><span class="br0">&#91;</span><span class="st0">&#39;aps&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;alert&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$msg</span><span class="sy0">,</span> <span class="st0">&#39;badge&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="st0">&#39;sound&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;default&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$payload</span><span class="br0">&#91;</span><span class="st0">&#39;server&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;serverId&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$serverId</span><span class="sy0">,</span> <span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$name</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$output</span> <span class="sy0">=</span> json_encode<span class="br0">&#40;</span><span class="re1">$payload</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$streamContext</span> <span class="sy0">=</span> <span class="kw3">stream_context_create</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">stream_context_set_option</span><span class="br0">&#40;</span><span class="re1">$streamContext</span><span class="sy0">,</span> <span class="st0">&#39;ssl&#39;</span><span class="sy0">,</span> <span class="st0">&#39;local_cert&#39;</span><span class="sy0">,</span> <span class="re1">$apnsCert</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apns</span> <span class="sy0">=</span> stream_socket_client<span class="br0">&#40;</span><span class="st0">&#39;ssl://&#39;</span><span class="sy0">.</span><span class="re1">$apnsHost</span><span class="sy0">.</span><span class="st0">&#39;:&#39;</span><span class="sy0">.</span><span class="re1">$apnsPort</span><span class="sy0">,</span><span class="re1">$error</span><span class="sy0">,</span><span class="re1">$errorString</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span>STREAM_CLIENT_CONNECT<span class="sy0">,</span><span class="re1">$streamContext</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsMessage</span> <span class="sy0">=</span> <span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span><span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&#39; &#39;</span><span class="sy0">,</span><span class="st0">&#39;&#39;</span><span class="sy0">,</span><span class="re1">$token</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$output</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re1">$apns</span><span class="sy0">,</span> <span class="re1">$apnsMessage</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re1">$apns</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>L&#8217;utilisation est très simple : on appel sendPushToToken(&#8216;notre message&#8217;,'le token de l&#8217;appareil&#8217;);<br />
et dans les 5 minutes, le message est reçu &#8230;.</p>
<p>Pour l&#8217;envoi en batch, on rajoute une boucle à l&#8217;envoi avec un tableau de tokens : </p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">function</span> sendPushToTokens<span class="br0">&#40;</span><span class="re1">$msg</span><span class="sy0">,</span><span class="re1">$tokens</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$serverId</span><span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$name</span><span class="sy0">=</span><span class="st0">&quot;nom de mon appli&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsHost</span> <span class="sy0">=</span> <span class="st0">&#39;gateway.sandbox.push.apple.com&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsPort</span> <span class="sy0">=</span> <span class="nu0">2195</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apnsCert</span> <span class="sy0">=</span> <span class="st0">&#39;apns-dev.pem&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="coMULTI">/*DON&#39;T TOUCH BELOW*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$payload</span><span class="br0">&#91;</span><span class="st0">&#39;aps&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;alert&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$msg</span><span class="sy0">,</span> <span class="st0">&#39;badge&#39;</span> <span class="sy0">=&gt;</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="st0">&#39;sound&#39;</span> <span class="sy0">=&gt;</span> <span class="st0">&#39;default&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$payload</span><span class="br0">&#91;</span><span class="st0">&#39;server&#39;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="st0">&#39;serverId&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$serverId</span><span class="sy0">,</span> <span class="st0">&#39;name&#39;</span> <span class="sy0">=&gt;</span> <span class="re1">$name</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$output</span> <span class="sy0">=</span> json_encode<span class="br0">&#40;</span><span class="re1">$payload</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$streamContext</span> <span class="sy0">=</span> <span class="kw3">stream_context_create</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">stream_context_set_option</span><span class="br0">&#40;</span><span class="re1">$streamContext</span><span class="sy0">,</span> <span class="st0">&#39;ssl&#39;</span><span class="sy0">,</span> <span class="st0">&#39;local_cert&#39;</span><span class="sy0">,</span> <span class="re1">$apnsCert</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="re1">$apns</span> <span class="sy0">=</span> stream_socket_client<span class="br0">&#40;</span><span class="st0">&#39;ssl://&#39;</span><span class="sy0">.</span><span class="re1">$apnsHost</span><span class="sy0">.</span><span class="st0">&#39;:&#39;</span><span class="sy0">.</span><span class="re1">$apnsPort</span><span class="sy0">,</span><span class="re1">$error</span><span class="sy0">,</span><span class="re1">$errorString</span><span class="sy0">,</span><span class="nu0">2</span><span class="sy0">,</span>STREAM_CLIENT_CONNECT<span class="sy0">,</span><span class="re1">$streamContext</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re1">$tokens</span> <span class="kw1">as</span> <span class="re1">$token</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re1">$apnsMessage</span> <span class="sy0">=</span> <span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">pack</span><span class="br0">&#40;</span><span class="st0">&#39;H*&#39;</span><span class="sy0">,</span><span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&#39; &#39;</span><span class="sy0">,</span><span class="st0">&#39;&#39;</span><span class="sy0">,</span><span class="re1">$token</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$output</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="re1">$output</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re1">$apns</span><span class="sy0">,</span> <span class="re1">$apnsMessage</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re1">$apns</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>L&#8217;utilisation est la suivante : sendPushToTokens(&#8216;mon message&#8217;,array(&#8216;token1&#8242;,&#8217;token2&#8242;))<br />
et dans les 5 minutes nos deux ip(hone|od) recevront notre message &#8230;</p>
<p>Le gros problème dans l&#8217;histoire, c&#8217;est qu&#8217;Apple ne renvoi aucune données &#8230; on ne peut pas savoir si toutes les personnes sont capables de recevoir le message (aucun retour n&#8217;est prévu). Pour ce faire on peut appeler le service de <a href="http://developer.apple.com/IPhone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html">feedback</a>.</p>
<p>Un script PHP permet de récupérer les <a href="http://iphonesdkdev.blogspot.com/2009/04/apns-client-development-certificate.html">tokens s&#8217;étant désabonnés</a>. (C&#8217;est amusant &#8230; tout les codes PHP pour l&#8217;envoi de PUSH se ressemble ^^&#8230; mais n&#8217;ayant pas encore utilisé le service de feedback, je préfère donner l&#8217;url du script en question)</p>
<p>Voilà &#8230; alors spammez bien xD.</p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=790">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/mes-applicationsscripts/" rel="bookmark" title="Permanent Link: Mes Applications/Scripts">Mes Applications/Scripts</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/android-c2dm-notification-push-en-bash-avec-wget/" rel="bookmark" title="Permanent Link: Android C2DM Notification push en bash avec wget">Android C2DM Notification push en bash avec wget</a></li><li><a href="http://blog.gaetan-grigis.eu/android/android-application-de-controle-a-distancebackupinfo/" rel="bookmark" title="Permanent Link: [Android] application de contrôle à distance/backup/info">[Android] application de contrôle à distance/backup/info</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/utiliser-git-pour-gerer-ses-projets-mini-memo/" rel="bookmark" title="Permanent Link: Utiliser Git pour gérer ses projets (mini mémo)">Utiliser Git pour gérer ses projets (mini mémo)</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/openvpn-et-authentification-par-ca-login-et-mot-de-passe/" rel="bookmark" title="Permanent Link: OpenVPN et authentification par CA, Login et mot de passe">OpenVPN et authentification par CA, Login et mot de passe</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/push-iphoneod-en-php-en-envoi-batch/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[PATCH] Correction du bug &#171;&#160;Error Retrieving Directory: system:111&#8243; de tortunnel</title>
		<link>http://blog.gaetan-grigis.eu/programmation/cpp/patch-correction-du-bug-error-retrieving-directory-system111-de-tortunnel/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/cpp/patch-correction-du-bug-error-retrieving-directory-system111-de-tortunnel/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 11:19:19 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[moxie]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[system:111]]></category>
		<category><![CDATA[torproxy]]></category>
		<category><![CDATA[tortunnel]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=773</guid>
		<description><![CDATA[Plop à tous &#8230; Aujourd&#8217;hui je publie un patch ^^ &#8230; pour le logiciel tortunnel (l&#8217;open-source ça a du bon ), en effet, pour ceux qui connaissent ce soft, une erreur &#171;&#160;Error Retrieving Directory: system:111&#8243; est apparue depuis quelque temps, rendant le logiciel inutilisable,  ce bug vient juste du fait que &#171;&#160;moxie&#160;&#187; a hardcodé les [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous &#8230;</p>
<p>Aujourd&#8217;hui je publie un patch ^^ &#8230; pour le logiciel <a href="http://www.thoughtcrime.org/software/tortunnel/">tortunnel</a> (l&#8217;open-source ça a du bon <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), en effet, pour ceux qui connaissent ce soft, une erreur &laquo;&nbsp;Error Retrieving Directory: system:111&#8243; est apparue depuis quelque temps, rendant le logiciel inutilisable,  ce bug vient juste du fait que &laquo;&nbsp;moxie&nbsp;&raquo; a hardcodé les IP des &laquo;&nbsp;tor directory&nbsp;&raquo; dans son logiciel, en particulier : &laquo;&nbsp;128.31.0.34&#8243; qui n&#8217;existe plus, d&#8217;où l&#8217;erreur system:111, il faut donc changer 3 fichiers (protocole/(Directory.cpp|ServerListing.cpp|ServerListingGroup.cpp)) et remplacer &laquo;&nbsp;128.31.0.34&#8243; par &laquo;&nbsp;192.251.226.206&#8243; (ou par une autre ip d&#8217;un tor directory que l&#8217;on peut trouver <a href="http://torstatus.blutmagie.de/">ici</a>). Attention il semblerait qu&#8217;il ne soit pas possible d&#8217;utiliser le &laquo;&nbsp;tor directory&nbsp;&raquo; courant en serveur de sortie (ce qui retournerait une erreur 111, malgré l&#8217;utilisation de ce patch, donc vous ne pourrez plus utiliser : 192.251.226.206 en node de sortie)<br />
<span id="more-773"></span><br />
Le patch (ok j&#8217;ai honte, j&#8217;ai juste remplacé les ip, et pas fait un truc tout beau tout propre &#8230;).</p>
<div class="geshi no patch">
<ol>
<li class="li1">
<div class="de1">diff -ur tortunnel-0.2-base/protocol/Directory.cpp tortunnel-0.2/protocol/Directory.cpp
</div>
</li>
<li class="li1">
<div class="de1">&#8212; tortunnel-0.2-base/protocol/Directory.cpp 2009-04-26 19:42:49.000000000 +0200
</div>
</li>
<li class="li1">
<div class="de1">+++ tortunnel-0.2/protocol/Directory.cpp 2010-04-03 13:05:17.552754889 +0200
</div>
</li>
<li class="li1">
<div class="de1">@@ -101,9 +101,9 @@
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;boost::shared_ptr&lt;std::string&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;request(new std::string(&quot;GET /tor/status/all HTTP/1.0\r\nConnection: close\r\n\r\n&quot;));
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">- &nbsp;std::string ip(&quot;128.31.0.34&quot;);
</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp;std::string ip(&quot;194.109.206.212&quot;);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">- &nbsp;Network::suckUrlToString(io_service, ip, 9031, request, &amp;directoryList, handler); &nbsp;
</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp;Network::suckUrlToString(io_service, ip, 80, request, &amp;directoryList, handler);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">diff -ur tortunnel-0.2-base/protocol/ServerListing.cpp tortunnel-0.2/protocol/ServerListing.cpp
</div>
</li>
<li class="li1">
<div class="de1">&#8212; tortunnel-0.2-base/protocol/ServerListing.cpp 2009-04-26 19:44:06.000000000 +0200
</div>
</li>
<li class="li1">
<div class="de1">+++ tortunnel-0.2/protocol/ServerListing.cpp 2010-04-03 13:05:39.052750364 +0200
</div>
</li>
<li class="li1">
<div class="de1">@@ -131,6 +131,6 @@
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;free(identity);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">- &nbsp;std::string ip(&quot;128.31.0.34&quot;);
</div>
</li>
<li class="li1">
<div class="de1">- &nbsp;Network::suckUrlToString(io_service, ip, 9031, request, &amp;descriptorList, handler);
</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp;std::string ip(&quot;194.109.206.212&quot;);
</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp;Network::suckUrlToString(io_service, ip, 80, request, &amp;descriptorList, handler);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;}
</div>
</li>
<li class="li1">
<div class="de1">diff -ur tortunnel-0.2-base/protocol/ServerListingGroup.cpp tortunnel-0.2/protocol/ServerListingGroup.cpp
</div>
</li>
<li class="li1">
<div class="de1">&#8212; tortunnel-0.2-base/protocol/ServerListingGroup.cpp 2009-04-26 19:44:23.000000000 +0200
</div>
</li>
<li class="li1">
<div class="de1">+++ tortunnel-0.2/protocol/ServerListingGroup.cpp 2010-04-03 13:05:24.799002388 +0200
</div>
</li>
<li class="li1">
<div class="de1">@@ -57,7 +57,7 @@
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;request-&gt;append(&quot; HTTP/1.0\r\nConnection: close\r\n\r\n&quot;);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;
</div>
</li>
<li class="li1">
<div class="de1">- &nbsp;std::string ip(&quot;128.31.0.34&quot;);
</div>
</li>
<li class="li1">
<div class="de1">- &nbsp;Network::suckUrlToString(io_service, ip, 9031, request, &amp;descriptorList, handler);
</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp;std::string ip(&quot;194.109.206.212&quot;);
</div>
</li>
<li class="li1">
<div class="de1">+ &nbsp;Network::suckUrlToString(io_service, ip, 80, request, &amp;descriptorList, handler);
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;}</div>
</li>
</ol>
</div>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=773">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/utiliser-tor-a-la-vitesse-de-la-lumiere/" rel="bookmark" title="Permanent Link: Utiliser Tor à la vitesse de la lumière ;)">Utiliser Tor à la vitesse de la lumière ;)</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/tor-proxy-et-randomiser-le-choix-des-serveurs-de-sortie/" rel="bookmark" title="Permanent Link: Tor Proxy et randomiser le choix des serveurs de sorties">Tor Proxy et randomiser le choix des serveurs de sorties</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/automatiser-la-recuperation-et-la-compilation-du-kernel-et-de-son-patch-grsec/" rel="bookmark" title="Permanent Link: Automatiser la récupération et la compilation du kernel et de son patch GrSec">Automatiser la récupération et la compilation du kernel et de son patch GrSec</a></li><li><a href="http://blog.gaetan-grigis.eu/securite/cote-securite-cest-deja-noel/" rel="bookmark" title="Permanent Link: Côté sécurité, c&#8217;est déjà noël!!">Côté sécurité, c&#8217;est déjà noël!!</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/securite-coupler-lids-prelude-avec-mod_security/" rel="bookmark" title="Permanent Link: Sécurité : Coupler l&#8217;IDS Prelude avec mod_security">Sécurité : Coupler l&#8217;IDS Prelude avec mod_security</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/cpp/patch-correction-du-bug-error-retrieving-directory-system111-de-tortunnel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer son propre service de mail jetable avec appengine</title>
		<link>http://blog.gaetan-grigis.eu/programmation/creer-son-propre-service-de-mail-jetable-avec-appengine/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/creer-son-propre-service-de-mail-jetable-avec-appengine/#comments</comments>
		<pubDate>Sat, 27 Mar 2010 11:45:29 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mail jetable]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[trashmail]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=769</guid>
		<description><![CDATA[Plop à tous Au détour d&#8217;un article de Korben, j&#8217;ai découvert les app engine de google, qui permettent de créer des sites/applications web en python et java. Le service est très performant et malgré quelques limites, il permet tout de même un trafic par jour de 1Gb en http et 1Gb en https (avec un [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous<br />
Au détour d&#8217;un <a href="http://www.korben.info/creer-un-serveur-proxy.html">article de Korben</a>, j&#8217;ai découvert les <a href="http://code.google.com/appengine/docs/python/overview.html">app engine de google</a>, qui permettent de créer des sites/applications web en python et java. Le service est très performant et malgré quelques limites, il permet tout de même un trafic par jour de 1Gb en http et 1Gb en https (avec un certificat valide <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p>Le gros problème de ce service : <a href="http://code.google.com/appengine/docs/python/datastore/">la base de données</a> (pas de join et on a seulement droit à : 10368000 requêtes par jour ^^).</p>
<p>L&#8217;API fournit, ainsi que l&#8217;environnement de développement est simple à maitriser/mettre en oeuvre. Il me fallait donc un projet plus ou moins (f)utile pour utiliser ce service et le connaitre un peu mieux. L&#8217;un des services proposés par les appengine de google est la <a href="http://code.google.com/appengine/docs/python/mail/receivingmail.html">réception de mail en http</a>. Super utile pour créer des adresses mails à la volée, utilisant depuis quelque temps le service de <a href="http://www.yopmail.com/en/">mail jetable</a> de yopmail, j&#8217;ai donc tenté de recréer une partie du service proposé par yopmail en python pour les appengine &#8230;</p>
<p>Le but de l&#8217;appli est très simple, on crée une adresse mail pour 30 minutes (ou plus), on fournit l&#8217;adresse mail générée à la place de notre adresse mail courante et on attend le mail. Une fois l&#8217;adresse expirée, les mails reçût seront automatiquement droppés.</p>
<p>Pour tester le service : en <a href="http://mail-jetable.appspot.com/">http</a> et en <a href="https://mail-jetable.appspot.com/">https</a>, les adresses mails proposées par le service sont du type : pseudo@mail-jetable.appspotmail.com (ok c&#8217;est long, mais il faut au moins ça pour combattre le spam ^^).</p>
<p>Le code source étant un peu plus long que mes scripts habituels, j&#8217;ai donc ouvert un <a href="http://code.google.com/p/mail-jetable-appengine/">dépôt SVN</a> (sur google code évidemment <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) pour publier les sources.</p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=769">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/mes-applicationsscripts/" rel="bookmark" title="Permanent Link: Mes Applications/Scripts">Mes Applications/Scripts</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/utiliser-google-app-pour-gerer-son-domaine/" rel="bookmark" title="Permanent Link: Utiliser Google App pour gérer son Domaine">Utiliser Google App pour gérer son Domaine</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/checker-la-validite-dune-adresse-mail-en-php-via-smtp/" rel="bookmark" title="Permanent Link: Checker la validité d&#8217;une adresse mail en PHP via SMTP">Checker la validité d&#8217;une adresse mail en PHP via SMTP</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/petit-serveur-dadresse-mail-de-diffusion/" rel="bookmark" title="Permanent Link: Petit serveur d&#8217;adresse mail de diffusion">Petit serveur d&#8217;adresse mail de diffusion</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/administration/mise-en-place-dun-cdn-via-google-app-engine/" rel="bookmark" title="Permanent Link: Mise en place d&#8217;un CDN via Google App Engine">Mise en place d&#8217;un CDN via Google App Engine</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/creer-son-propre-service-de-mail-jetable-avec-appengine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Envoyer des mails dans le passé</title>
		<link>http://blog.gaetan-grigis.eu/programmation/envoyer-des-mails-dans-le-passe/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/envoyer-des-mails-dans-le-passe/#comments</comments>
		<pubDate>Sat, 20 Mar 2010 15:05:34 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[back to the future]]></category>
		<category><![CDATA[fake]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[smtp]]></category>
		<category><![CDATA[temps]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=762</guid>
		<description><![CDATA[Plop à tous &#8230; Aujourd&#8217;hui, une astuce de &#171;&#160;gros noob&#160;&#187;, le but est d&#8217;envoyer un mail à une date passée ou future, genre pour le rendu d&#8217;un devoir à 23h59m59s alors qu&#8217;on vient de le terminer à 2h42 du mat, tout en sachant que le prof ne le lira pas avant 7 ou 8 heures [...]]]></description>
			<content:encoded><![CDATA[<p>Plop à tous &#8230;</p>
<p>Aujourd&#8217;hui, une astuce de &laquo;&nbsp;gros noob&nbsp;&raquo;, le but est d&#8217;envoyer un mail à une date passée ou future, genre pour le rendu d&#8217;un devoir à 23h59m59s alors qu&#8217;on vient de le terminer à 2h42 du mat, tout en sachant que le prof ne le lira pas avant 7 ou 8 heures du mat&#8217; &#8230; le truc totalement useless quoi, mais souvent on perd des points pour des trucs de ce genre, &#8230; (quoi ?? ça vous est jamais arrivé ?? bande de lèche-*** &#8230;.)<br />
<span id="more-762"></span><br />
Les plus futés sauront qu&#8217;en modifiant la date de leur machine, on peut fausser les dates d&#8217;envoi (genre en reculant la date de deux jours, la plupart des mailers/logiciels de récupération de mails vont afficher le mail comme étant reçu il y a deux jours &#8230;).</p>
<p>Mais nous sommes informaticiens, et ce genre de méthode, c&#8217;est pour les noobs &#8230; nous on va coder un bon gros serveur SMTP pour envoyer des mails dans le temps xD&#8230;</p>
<p>En fait en python, ça consiste en 40 lignes de codes &#8230; (et encore &#8230; c&#8217;est crade comme d&#8217;hab <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</p>
<p>L&#8217;utilisation du script suivant ce fait comme suit :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>nomDuScript <span class="st0">&#39;adresse serveur smtp du fai&#39;</span> <span class="st0">&#39;25&#39;</span> <span class="st0">&quot;date d&#39;envoi&quot;</span></div>
</li>
</ol>
</div>
<p>Ou, si l&#8217;on veut rajouter des faux headers (histoire d&#8217;expliquer le retard du mails, ou rajouter de faux relais &#8230;)</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>nomDuScript <span class="st0">&#39;adresse serveur smtp du fai&#39;</span> <span class="st0">&#39;25&#39;</span> <span class="st0">&quot;date d&#39;envoi&quot;</span> <span class="st0">&#39;/chemin/du/fichier contenant/les/headers&#39;</span></div>
</li>
</ol>
</div>
<p>Un fichier d&#8217;exemples de (fake) headers à rajouter :</p>
<div class="geshi no smtp">
<ol>
<li class="li1">
<div class="de1">Received: from [1.3.3.7] (helo=lol.kikoo.rox)
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; by leskikoolol.attaqu.ent with esmtp id m4573r-573417-00
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; for lolmaster@kikoo.rox; Sat, 20 mar 2010 01:02:03 +0000
</div>
</li>
<li class="li1">
<div class="de1">Received: from kikoo.lol.rox (kikoo.lol.rox [10.3.3.7])
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; by lol.kikoo.rox with ESMTP id f7O1Sci1337
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; for lolmaster@kikoo.rox; Sat, 20 Mar 2010 00:00:00 +0000</div>
</li>
</ol>
</div>
<p>et l&#8217;exemple d&#8217;utilisation pour le header en question :</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>nomDuScript <span class="nu0">127.0</span><span class="nu0">.0</span><span class="nu0">.1</span> <span class="nu0">25</span> <span class="st0">&quot;Fri, 19 Mar 2010 23:59:58 +0000&quot;</span> headers</div>
</li>
</ol>
</div>
<p>Qui permettra de faire croire à votre correspondant ici lolmaster@kikoo.rox :</p>
<ul>
<li>que vous avez envoyé votre mail vendredi 19 mars 2010 à 23h59, par votre machine nommée &laquo;&nbsp;kikoo.lol.rox&nbsp;&raquo; à l&#8217;ip 10.3.3.7</li>
<li>que le mail a été reçu à minuit par le serveur smtp à l&#8217;ip 1.3.3.7 nommé &laquo;&nbsp;lol.kikoo.rox&nbsp;&raquo;</li>
<li>puis, que le mail a été relayé à 01h02 par le serveur smtp nommé &laquo;&nbsp;leskikoolol.attaqu.ent&nbsp;&raquo;</li>
</ul>
<p>Ce qui expliquera au correspondant le temps de latence entre l&#8217;envoi du mail et sa réception. (Faudra bien sûr changer les infos pour coller à la réalité ^^)</p>
<p>Le script, qui créé un serveur SMTP sur le port 8025 (il faudra configurer votre client mail pour utiliser le serveur SMTP 127.0.0.1 sur le port 8025) :</p>
<div class="geshi no python">
<div class="head">#!/usr/bin/env python</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">smtpd</span> <span class="kw1">import</span> PureProxy</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">asyncore</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">asynchat</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">smtplib</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">re</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">sys</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> mySMTP <span class="br0">&#40;</span>PureProxy<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,s,n,d,f=<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">date</span> = d</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">self</span>.<span class="me1">serv</span> = n</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">self</span>.<span class="me1">fich</span> = f</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; PureProxy.<span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,s,<span class="kw2">None</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> process_message <span class="br0">&#40;</span><span class="kw2">self</span>, peer, mailfrom, rcpttos, data<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;p = <span class="kw3">re</span>.<span class="kw2">compile</span><span class="br0">&#40;</span><span class="st0">&quot;Date: .*&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;data = p.<span class="me1">sub</span><span class="br0">&#40;</span><span class="st0">&quot;Date: &quot;</span>+<span class="kw2">self</span>.<span class="me1">date</span>,data<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">fich</span> <span class="sy0">!</span>=<span class="st0">&quot;&quot;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = <span class="kw2">open</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">fich</span>,<span class="st0">&#39;r&#39;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;t = f.<span class="me1">read</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;f.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;data = t + data</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw1">print</span> <span class="st0">&quot;Message + header: &quot;</span>+data</div>
</li>
<li class="li1">
<div class="de1">&nbsp;smtpSender = <span class="kw3">smtplib</span>.<span class="me1">SMTP</span><span class="br0">&#40;</span> <span class="kw2">self</span>.<span class="me1">serv</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>, <span class="kw2">self</span>.<span class="me1">serv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;smtpSender.<span class="me1">sendmail</span><span class="br0">&#40;</span> mailfrom, rcpttos, data <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;smtpSender.<span class="me1">quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> <span class="kw2">None</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> __name__ == <span class="st0">&quot;__main__&quot;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span><span class="sy0">&lt;</span><span class="nu0">4</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Il manque des arguments : &quot;</span>+<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>+<span class="st0">&quot; &#39;serveur smtp&#39;,&#39;port&#39;,&#39;date&#39;[, &#39;fichier header&#39;]&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> == <span class="nu0">4</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serv = mySMTP <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&quot;127.0.0.1&quot;</span>, <span class="nu0">8025</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>,<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>,<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> == <span class="nu0">5</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; serv = mySMTP <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&quot;127.0.0.1&quot;</span>, <span class="nu0">8025</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>,<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>,<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span>,<span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">try</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">asyncore</span>.<span class="me1">loop</span> <span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">KeyboardInterrupt</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">pass</span></div>
</li>
</ol>
</div>
<p>Amusez-vous bien <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=762">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/programmation/php-programmation/envoyer-des-sms-via-google-calendar-et-php-socket-party/" rel="bookmark" title="Permanent Link: Envoyer des sms via google calendar et php &#8230; socket party ^^">Envoyer des sms via google calendar et php &#8230; socket party ^^</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/php-programmation/fork-et-php-utile/" rel="bookmark" title="Permanent Link: Fork et PHP utile ??">Fork et PHP utile ??</a></li><li><a href="http://blog.gaetan-grigis.eu/mes-applicationsscripts/" rel="bookmark" title="Permanent Link: Mes Applications/Scripts">Mes Applications/Scripts</a></li><li><a href="http://blog.gaetan-grigis.eu/non-classe/ossec-et-iptables-ban-a-duree-variable/" rel="bookmark" title="Permanent Link: Ossec et Iptables : ban à durée variable">Ossec et Iptables : ban à durée variable</a></li><li><a href="http://blog.gaetan-grigis.eu/programmation/php-programmation/marre-du-spam-sur-wordpress/" rel="bookmark" title="Permanent Link: Marre du spam sur wordpress ??">Marre du spam sur wordpress ??</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/envoyer-des-mails-dans-le-passe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mon Application Android pour les horaires de la CTS</title>
		<link>http://blog.gaetan-grigis.eu/programmation/mon-application-android-pour-les-horaires-de-la-cts/</link>
		<comments>http://blog.gaetan-grigis.eu/programmation/mon-application-android-pour-les-horaires-de-la-cts/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 19:13:42 +0000</pubDate>
		<dc:creator>Gaëtan</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[cts]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.gaetan-grigis.eu/?p=632</guid>
		<description><![CDATA[Amis Strasbourgeois bonsoir &#8230; Après un WE chargé sur Strasbourg, j&#8217;ai remarqué que la Compagnie des Transports de Strasbourg (CTS) avais mis en place un site web intéressant en temps réel (semble-t-il) pour calculer les horaires des BUS/Trams du réseau urbain. L&#8217;autre partie du service &#171;&#160;Temps Réel&#160;&#187; se fait par SMS par envoi du code [...]]]></description>
			<content:encoded><![CDATA[<p>Amis Strasbourgeois bonsoir &#8230;<br />
Après un WE chargé sur Strasbourg, j&#8217;ai remarqué que la Compagnie des Transports de Strasbourg (<a href="http://www.cts-strasbourg.fr/">CTS</a>) avais mis en place <a href="http://tr.cts-strasbourg.fr/">un site web</a> intéressant en temps réel (semble-t-il) pour calculer les horaires des BUS/Trams du réseau urbain.</p>
<p>L&#8217;autre partie du service &laquo;&nbsp;Temps Réel&nbsp;&raquo; se fait par SMS par envoi du code de la station à un numéro surtaxé &#8230; :s. Ayant un forfait 3G, je vais pas claquer un SMS surtaxé si je peux accéder au web gratuitement (quel radin <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), mais le site est assez bof depuis mon navigateur, et c&#8217;est assez lent &#8230;</p>
<p>Ayant acheté un G1 dans le but de dev des applis, j&#8217;en ai profité pour faire ce que je sais (apparemment) faire de mieux &#8230; parser des sites web pour en extraire des informations, dans ce cas précis, les horaires des transports en commun.</p>
<p>L&#8217;application ressemble à ceci : (super moche je sais, mais elle fait sont boulot &#8230; c&#8217;est l&#8217;essentiel).</p>
<p><a href="http://blog.gaetan-grigis.eu/wp-content/uploads/2009/12/android-CTS.png"><img class="aligncenter size-full wp-image-633" title="android-CTS" src="http://blog.gaetan-grigis.eu/wp-content/uploads/2009/12/android-CTS.png" alt="android-CTS" width="322" height="294" /></a>Pour le code source, j&#8217;ai tenté de faire au plus simple (traduction : le code est aussi beau que le screenshot fournit plus haut ^^, <em>pour ma décharge, je dirais que j&#8217;ai tout mis dans un fichier histoire de ne pas à avoir trop de fichier à fournir ici</em>).</p>
<p>Si vous avez des idées pour améliorer l&#8217;appli je suis open <img src='http://blog.gaetan-grigis.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  (à part si c&#8217;est pour me recycler et changer de métier :s). Je pense changer l&#8217;appli en widget (si j&#8217;ai le temps &#8230;).<br />
<span id="more-632"></span><br />
Pour les fichiers, tout d&#8217;abord le main.java</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> eu.<span class="me1">gaetangrigis</span>.<span class="me1">cts</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.io.BufferedReader;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.io.IOException;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.io.InputStreamReader;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.Calendar;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.regex.Matcher;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import java.util.regex.Pattern;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.app.Activity;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.app.Dialog;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.app.TimePickerDialog;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.app.TimePickerDialog.OnTimeSetListener;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.os.Bundle;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.view.View;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.view.View.OnClickListener;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.view.View.OnFocusChangeListener;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.view.ViewGroup.LayoutParams;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.widget.Button;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.widget.EditText;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.widget.TableLayout;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.widget.TableRow;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.widget.TextView;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import android.widget.TimePicker;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.http.HttpResponse;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.http.client.methods.HttpGet;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.http.client.ClientProtocolException;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.http.client.HttpClient;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">import org.apache.http.impl.client.DefaultHttpClient;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> Main <span class="kw2">extends</span> Activity <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="coMULTI">/** Called when the activity is first created. */</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">Button</span> check<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">Button</span> clear<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> TextView t<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> EditText station<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> EditText heure<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> EditText minute<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> TableLayout table<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw4">int</span> mHeure<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw4">int</span> mMinute<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> TimePickerDialog.<span class="me1">OnTimeSetListener</span> mTimeSetListener<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">final</span> <span class="kw3">Calendar</span> c = <span class="kw3">Calendar</span>.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> onCreate<span class="br0">&#40;</span>Bundle savedInstanceState<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">super</span>.<span class="me1">onCreate</span><span class="br0">&#40;</span>savedInstanceState<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setContentView<span class="br0">&#40;</span>R.<span class="me1">layout</span>.<span class="me1">main</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//Recuperation des champs</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; table = <span class="br0">&#40;</span>TableLayout<span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">maTable</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; station = <span class="br0">&#40;</span>EditText<span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">idStation</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; heure = <span class="br0">&#40;</span>EditText<span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">heure</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; minute = <span class="br0">&#40;</span>EditText<span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">minute</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;check=<span class="br0">&#40;</span><span class="kw3">Button</span><span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">check</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;clear=<span class="br0">&#40;</span><span class="kw3">Button</span><span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">clear</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; t =<span class="br0">&#40;</span>TextView<span class="br0">&#41;</span> findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">information</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//Texte par défaut</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mHeure = c.<span class="me1">get</span><span class="br0">&#40;</span><span class="kw3">Calendar</span>.<span class="me1">HOUR_OF_DAY</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mMinute = c.<span class="me1">get</span><span class="br0">&#40;</span><span class="kw3">Calendar</span>.<span class="me1">MINUTE</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; t.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Entrez les informations demandées&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; station.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;75&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mTimeSetListener = <span class="kw2">new</span> TimePickerDialog.<span class="me1">OnTimeSetListener</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">public</span> <span class="kw4">void</span> onTimeSet<span class="br0">&#40;</span>TimePicker view, <span class="kw4">int</span> hourOfDay, <span class="kw4">int</span> minute<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mHeure = hourOfDay<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mMinute = minute<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateTime<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; updateTime<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; check.<span class="me1">setOnClickListener</span><span class="br0">&#40;</span><span class="kw2">new</span> OnClickListener<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw2">public</span> <span class="kw4">void</span> onClick<span class="br0">&#40;</span><span class="kw3">View</span> v<span class="br0">&#41;</span> <span class="br0">&#123;</span>startResearch<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; clear.<span class="me1">setOnClickListener</span><span class="br0">&#40;</span><span class="kw2">new</span> OnClickListener<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw2">public</span> <span class="kw4">void</span> onClick<span class="br0">&#40;</span><span class="kw3">View</span> v<span class="br0">&#41;</span> <span class="br0">&#123;</span>clearResearch<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; heure.<span class="me1">setOnFocusChangeListener</span><span class="br0">&#40;</span><span class="kw2">new</span> OnFocusChangeListener<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw2">public</span> <span class="kw4">void</span> onFocusChange<span class="br0">&#40;</span><span class="kw3">View</span> v, <span class="kw4">boolean</span> hasFocus<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw1">if</span><span class="br0">&#40;</span>hasFocus<span class="br0">&#41;</span>showDialog<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; minute.<span class="me1">setOnFocusChangeListener</span><span class="br0">&#40;</span><span class="kw2">new</span> OnFocusChangeListener<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw2">public</span> <span class="kw4">void</span> onFocusChange<span class="br0">&#40;</span><span class="kw3">View</span> v, <span class="kw4">boolean</span> hasFocus<span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="kw1">if</span><span class="br0">&#40;</span>hasFocus<span class="br0">&#41;</span>showDialog<span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> clearResearch<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;table.<span class="me1">removeAllViews</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> startResearch<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;t.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Recherche en cours&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; HttpGet site &nbsp; = <span class="kw2">new</span> HttpGet<span class="br0">&#40;</span><span class="st0">&quot;http://tr.cts-strasbourg.fr/HorTRweb/ResultatsHoraires.aspx?arret=&quot;</span>+station.<span class="me1">getText</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot;&amp;type=TOUS&amp;heure=&quot;</span>+heure.<span class="me1">getText</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot;&amp;min=&quot;</span>+minute.<span class="me1">getText</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; HttpClient cli = <span class="kw2">new</span> DefaultHttpClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; HttpResponse resp<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> res<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> content=<span class="kw2">new</span> <span class="kw3">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> ret = <span class="kw2">new</span> <span class="kw3">String</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> dTab=<span class="kw2">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resp = cli.<span class="me1">execute</span><span class="br0">&#40;</span>site<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">BufferedReader</span> read = <span class="kw2">new</span> <span class="kw3">BufferedReader</span><span class="br0">&#40;</span><span class="kw2">new</span> <span class="kw3">InputStreamReader</span><span class="br0">&#40;</span>resp.<span class="me1">getEntity</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>res=read.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">!</span>=<span class="kw2">null</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>res.<span class="me1">matches</span><span class="br0">&#40;</span><span class="st0">&quot;.*&lt;table class=.depart.*&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>dTab=<span class="kw2">true</span><span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>dTab==true<span class="sy0">&amp;&amp;</span>res.<span class="me1">matches</span><span class="br0">&#40;</span><span class="st0">&quot;.*&lt;/table&gt;.*&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>dTab=<span class="kw2">false</span><span class="sy0">;</span>break<span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>dTab==<span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#123;</span>content+=res<span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pattern p = Pattern.<span class="me1">compile</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;td[^&gt;]*&gt;([^&lt;]*)&lt;/td&gt;&lt;td[^&gt;]*&gt;([^&lt;]*)&lt;/td&gt;&lt;td[^&gt;]*&gt;([^&lt;]*)&lt;/td&gt;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Matcher m = p.<span class="me1">matcher</span><span class="br0">&#40;</span>content<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>m.<span class="me1">find</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i=<span class="nu0">1</span><span class="sy0">;</span>i<span class="sy0">&lt;</span>=m.<span class="me1">groupCount</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>i++<span class="br0">&#41;</span><span class="br0">&#123;</span>ret+=m.<span class="me1">group</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>+<span class="st0">&quot; &quot;</span><span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table.<span class="me1">addView</span><span class="br0">&#40;</span>addTextRow<span class="br0">&#40;</span>ret<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret=<span class="st0">&quot;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">catch</span> <span class="br0">&#40;</span>ClientProtocolException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>t.<span class="me1">setText</span><span class="br0">&#40;</span>e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">catch</span> <span class="br0">&#40;</span><span class="kw3">IOException</span> e<span class="br0">&#41;</span> <span class="br0">&#123;</span>t.<span class="me1">setText</span><span class="br0">&#40;</span>e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">finally</span><span class="br0">&#123;</span>t.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Recherche terminé&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> TableRow addTextRow<span class="br0">&#40;</span><span class="kw3">String</span> text<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;TableRow tr = <span class="kw2">new</span> TableRow<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; TextView tt = <span class="kw2">new</span> TextView<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; tt.<span class="me1">setText</span><span class="br0">&#40;</span>text<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; tr.<span class="me1">addView</span><span class="br0">&#40;</span>tt<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> tr<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; @Override</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">protected</span> <span class="kw3">Dialog</span> onCreateDialog<span class="br0">&#40;</span><span class="kw4">int</span> id<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">switch</span> <span class="br0">&#40;</span>id<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">case</span> <span class="nu0">0</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw2">return</span> <span class="kw2">new</span> TimePickerDialog<span class="br0">&#40;</span><span class="kw2">this</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mTimeSetListener, mHeure, mMinute, <span class="kw2">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">return</span> <span class="kw2">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw4">void</span> updateTime<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">String</span> add=<span class="st0">&quot;&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; heure.<span class="me1">setText</span><span class="br0">&#40;</span>mHeure+<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>mMinute<span class="sy0">&lt;</span><span class="nu0">10</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;add=<span class="st0">&quot;0&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; minute.<span class="me1">setText</span><span class="br0">&#40;</span>add+mMinute<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Puis le main.xml (qui définit l&#8217;interface graphique)</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;utf-8&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;LinearLayout</span> <span class="re0">xmlns:android</span>=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:orientation</span>=<span class="st0">&quot;vertical&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_width</span>=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;TextView</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_width</span>=<span class="st0">&quot;fill_parent&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/information&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:text</span>=<span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;LinearLayout</span> <span class="re0">xmlns:android</span>=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:orientation</span>=<span class="st0">&quot;horizontal&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextView</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:text</span>=<span class="st0">&quot;Code de la station : &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;EditText</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/idStation&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:text</span>=<span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/LinearLayout<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;LinearLayout</span> <span class="re0">xmlns:android</span>=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:orientation</span>=<span class="st0">&quot;horizontal&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextView</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:text</span>=<span class="st0">&quot;Heure voulue : &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;EditText</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/heure&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;TextView</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:text</span>=<span class="st0">&quot;h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;EditText</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/minute&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/LinearLayout<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;LinearLayout</span> <span class="re0">xmlns:android</span>=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:orientation</span>=<span class="st0">&quot;horizontal&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;Button</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:text</span>=<span class="st0">&quot;Check&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/check&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;Button</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:text</span>=<span class="st0">&quot;Clear&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/clear&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/LinearLayout<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;TableLayout</span> <span class="re0">xmlns:android</span>=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:id</span>=<span class="st0">&quot;@+id/maTable&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_width</span>=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/TableLayout<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/LinearLayout<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>et enfin le Manifest.xml (pour ne pas oublier les permissions d&#8217;accès au net)</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;?</span>xml version=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;utf-8&quot;</span><span class="sy0">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>manifest xmlns:android=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw2">package</span>=<span class="st0">&quot;eu.gaetangrigis.cts&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; android:versionCode=<span class="st0">&quot;1&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; android:versionName=<span class="st0">&quot;1.0&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">&lt;</span>application android:icon=<span class="st0">&quot;@drawable/icon&quot;</span> android:label=<span class="st0">&quot;@string/app_name&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>activity android:name=<span class="st0">&quot;.Main&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; android:label=<span class="st0">&quot;@string/app_name&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>intent-filter<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>action android:name=<span class="st0">&quot;android.intent.action.MAIN&quot;</span> /<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>category android:name=<span class="st0">&quot;android.intent.category.LAUNCHER&quot;</span> /<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>/intent-filter<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&lt;</span>/activity<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">&lt;</span>/application<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">&lt;</span>uses-sdk android:minSdkVersion=<span class="st0">&quot;4&quot;</span> /<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>uses-permission android:name=<span class="st0">&quot;android.permission.INTERNET&quot;</span> /<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>/manifest<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>

                            <div id="aspdf">
                                <a href="http://blog.gaetan-grigis.eu/wp-content/plugins/as-pdf/generate.php?post=632">
                                    <span>Télécharger l'article au format PDF</span>
                                </a>
                            </div>
                        <hr /><h2>Articles similaires : </h2><ul><li><a href="http://blog.gaetan-grigis.eu/programmation/java/application-android-pour-les-horaires-de-trambus-grenoblois-tagsemitag/" rel="bookmark" title="Permanent Link: Application android pour les horaires de tram/bus grenoblois (Tag/SemiTag)">Application android pour les horaires de tram/bus grenoblois (Tag/SemiTag)</a></li><li><a href="http://blog.gaetan-grigis.eu/non-classe/un-peu-davancement-dans-lapplication-android-de-la-cts/" rel="bookmark" title="Permanent Link: Un peu d&#8217;avancement dans l&#8217;application Android de la CTS &#8230;">Un peu d&#8217;avancement dans l&#8217;application Android de la CTS &#8230;</a></li><li><a href="http://blog.gaetan-grigis.eu/android/application-android-pour-le-telechargement-des-versions-de-cyanogen/" rel="bookmark" title="Permanent Link: Application android pour le téléchargement des versions de Cyanogen">Application android pour le téléchargement des versions de Cyanogen</a></li><li><a href="http://blog.gaetan-grigis.eu/android/android-application-de-controle-a-distancebackupinfo/" rel="bookmark" title="Permanent Link: [Android] application de contrôle à distance/backup/info">[Android] application de contrôle à distance/backup/info</a></li><li><a href="http://blog.gaetan-grigis.eu/systeme/android-c2dm-notification-push-en-bash-avec-wget/" rel="bookmark" title="Permanent Link: Android C2DM Notification push en bash avec wget">Android C2DM Notification push en bash avec wget</a></li></ul><hr /><small>Copyright &copy; 2008-2011 - Gaetan Grigis - <a href="http://blog.gaetan-grigis.eu">blog.gaetan-grigis.eu</a> </small>]]></content:encoded>
			<wfw:commentRss>http://blog.gaetan-grigis.eu/programmation/mon-application-android-pour-les-horaires-de-la-cts/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

