<?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>TheGeek.de &#187; twitter</title>
	<atom:link href="http://thegeek.de/t/twitter/feed" rel="self" type="application/rss+xml" />
	<link>http://thegeek.de</link>
	<description>WordPress, PHP, JavaScript, Web 2.0, Gaming, Motorräder, Fotografie, Piratenpartei, Privates</description>
	<lastBuildDate>Tue, 09 Mar 2010 16:09:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Twempy der Twitter Bot: Source Code Release 0.4a</title>
		<link>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-4a</link>
		<comments>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-4a#comments</comments>
		<pubDate>Wed, 30 Dec 2009 13:30:18 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[ki]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[twempy]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-4a</guid>
		<description><![CDATA[Die aktuelle Version des Twempy Bots behebt zwei kleinere Bugs und bringt eine verbesserte Tweet-Routine mit sich. In der Vergangenheit fand ich es immer störend, dass Twempy manchmal zu unmöglichen Zeiten &#8211; meistens genau um Mittag rum &#8211; Sachen wie &#8220;ich gehe jetzt schlafen&#8221; oder ähnlich unpassendes twitterte. Deswegen wird beim Sammeln von Tweets nun [...]]]></description>
			<content:encoded><![CDATA[<p>Die aktuelle Version des Twempy Bots behebt zwei kleinere Bugs und bringt eine verbesserte Tweet-Routine mit sich. In der Vergangenheit fand ich es immer störend, dass Twempy manchmal zu unmöglichen Zeiten &#8211; meistens genau um Mittag rum &#8211; Sachen wie &#8220;ich gehe jetzt schlafen&#8221; oder ähnlich unpassendes twitterte. Deswegen wird beim Sammeln von Tweets nun die Uhrzeit mitgespeichert. So ist es möglich, dass Twempy nur zur Tageszeit &#8211; innerhalb eines Zeitfernsters von zwei Stunden &#8211; passende Tweets absetzt. Dies macht die Tweets des Bots wesentlich glaubhafter.</p>
<p>Die zwei Bugs die behoben wurden, verbessern die Qualität der Antworten, dafür muss allerdings die Konfiguration angepasst werden. Am besten den Wortfilter und die Einstellungen aus der neuen Datei nochmal in die veraltete Datei kopieren, dann müsste es passen. Zudem sollte das Problem, dass Twempy manchmal rumspamt ebenfalls behoben sein &#8211; ich musste um einen Bug in der Twitter API herumprogrammieren.</p>
<p>Wichtig: Die SQL Struktur einer Tabelle hat sich geändert, ein Patch von 0.3a auf 0.4a liegt bei und auch eine neuer Komplettabzug meiner Datenbank ist im neuen Archiv enthalten.</p>
<p>Und hier die aktuellen Quellen: <a href="http://www.codemonster.de/source/twempy_0.4a.rar">http://www.codemonster.de/source/twempy_0.4a.rar</a> (Lizenz: GPLv3)</p>
<p>Viel Spaß!</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-4a/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Twempy der Twitter Bot: Source Code Release 0.3a</title>
		<link>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-3a</link>
		<comments>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-3a#comments</comments>
		<pubDate>Mon, 28 Dec 2009 12:14:14 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[ki]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[twempy]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-3a</guid>
		<description><![CDATA[Da die Datenbasis von Twempy nun durchaus Formen angenommen hat, mit der ich einige Tests bezüglich der Qualität der Antworten durchführen konnte, habe ich der ersten Version der Antwort-Suchfunktion nun eine verbesserte Funktion vorgeschaltet.
Die verbesserte Funktion berücksichtigt nun auch die Wortlängen und blendet mögliche Antworten, mit zu vielen Treffern bei kurzen Wörten aus, wenn eine [...]]]></description>
			<content:encoded><![CDATA[<p>Da die Datenbasis von Twempy nun durchaus Formen angenommen hat, mit der ich einige Tests bezüglich der Qualität der Antworten durchführen konnte, habe ich der ersten Version der Antwort-Suchfunktion nun eine verbesserte Funktion vorgeschaltet.</p>
<p>Die verbesserte Funktion berücksichtigt nun auch die Wortlängen und blendet mögliche Antworten, mit zu vielen Treffern bei kurzen Wörten aus, wenn eine bessere Antwort gefunden werden kann. Sollte die Funktion allerdings nichts passendes finden, dann wird wieder auf die alte unscharfe Funktion zurückgegriffen.</p>
<p>Und hier gibt es die aktuellen Quellen zum Download: <a href="http://www.codemonster.de/source/twempy_0.3a.rar">http://www.codemonster.de/source/twempy_0.3a.rar</a> (Lizenz: GPLv3)</p>
<p>Neu ist übrigens auch ein Ein- und Ausschaltbarer Debug Modus.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-3a/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twempy der Twitter Bot: Source Code Release 0.2a</title>
		<link>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-2a</link>
		<comments>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-2a#comments</comments>
		<pubDate>Fri, 18 Dec 2009 09:42:51 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[ki]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[twempy]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=424</guid>
		<description><![CDATA[Ich habe mir mal kurz die Zeit genommen, die Quellen und die aktuelle Datenbank von Twempy zu einem Release zu verarbeiten. Wer interessiert ist, der kann sich den Bot hier herunterladen: http://www.codemonster.de/source/twempy_0.2a.rar (Lizenz: GPLv3)
Die Installation wird in der Datei INSTALL.txt beschrieben, der Code ist ausreichend kommentiert. *hust*
Es hat sich inzwischen übrigens gezeigt, dass der Bot [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mir mal kurz die Zeit genommen, die Quellen und die aktuelle Datenbank von Twempy zu einem Release zu verarbeiten. Wer interessiert ist, der kann sich den Bot hier herunterladen: <a href="http://www.codemonster.de/source/twempy_0.2a.rar">http://www.codemonster.de/source/twempy_0.2a.rar</a> (Lizenz: GPLv3)</p>
<p>Die Installation wird in der Datei INSTALL.txt beschrieben, der Code ist ausreichend kommentiert. *hust*</p>
<p>Es hat sich inzwischen übrigens gezeigt, dass der Bot sehr viele Tweets lernen muss, um wirklich gute Antworten liefern zu können, und auch, dass bestimmte Worte besser nicht mit in die Suche nach einer Antwort mit einbezogen werden können. In einigen Bereichen bringt Twempy bereits jetzt treffende Ergebnisse, doch bis wirklich ein breites Spektrum an Themen abgedeckt werden können, wird vermutlich eine Antwort-Basis von wenigstens 20.000 Tweets oder noch mehr benötigt. Leider stoße ich mit dem Bot bereits jetzt oft an das Rate-Limit der Twitter API, ich muss dem Twitter Team wohl mal eine E-Mail schreiben.</p>
<p>Viel Spaß mit dem Bot. Wer Verbesserungsvorschläge hat, immer her damit!</p>
<p>CODE IS POETRY.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/twempy-der-twitter-bot-source-code-release-0-2a/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Twempy der twitternde Software Roboter</title>
		<link>http://thegeek.de/twempy-der-twitternde-software-roboter</link>
		<comments>http://thegeek.de/twempy-der-twitternde-software-roboter#comments</comments>
		<pubDate>Sat, 12 Dec 2009 12:49:36 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[ki]]></category>
		<category><![CDATA[selbstlernend]]></category>
		<category><![CDATA[twempy]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=411</guid>
		<description><![CDATA[Ich habe meine Idee, ein selbstständig twitterndes Programm zu schreiben, nun weitgehend in die Tat umgesetzt. Twempy arbeitet im Augenblick an seiner Antwort-Datenbank, antwortet aber bereits auf Anfragen, gibt gelegentlich seinen Status bekannt und twittert sogar manchmal seine Gedanken und Gefühle. ;-)
Die Qualität der Antworten lässt im Moment teilweise noch etwas zu wünschen übrig, da [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe meine Idee, ein <a href="http://thegeek.de/selbstlernender-chat-bot-mit-der-twitter-api">selbstständig twitterndes Programm</a> zu schreiben, nun weitgehend in die Tat umgesetzt. <a href="http://twitter.com/twempy">Twempy</a> arbeitet im Augenblick an seiner Antwort-Datenbank, antwortet aber bereits auf Anfragen, gibt gelegentlich seinen Status bekannt und twittert sogar manchmal seine Gedanken und Gefühle. ;-)<br />
Die Qualität der Antworten lässt im Moment teilweise noch etwas zu wünschen übrig, da die Datenbank der Antworten erst rund 220 Einträge umfasst, aber in der Stunde kommen im Schnitt 20 bis 30 neue Antworten hinzu.</p>
<p>Und so funktioniert es: Twempy sucht alle 5 Minuten nach Tweets mit bestimmten Schlüsselwörtern wie &#8220;und, er, sie, das, &#8230;&#8221;. Findet er einen passenden Tweet, ermittelt der Bot, ob es eine Antwort auf einen anderen Tweet war. Ist dies der Fall wird die Ursprungnachricht geladen und die Wörter extrahiert. Die Wörter werden danach verknüfpt mit dem Antwort-Tweet in einer Datenbank gespeichert. So bildet sich eine Relation von Wörtern zu tweets. Das schöne dabei ist, das Twempy im Grunde jetzt Sprache lernen kann, denn seine Datenbasis wird nicht durch den Programmierer beeinflusst, sondern ausschließlich aus echten Konversationen gebildet.</p>
<p>Erhält Twempy eine @reply (mention), extrahiert er die Wörter und schlägt in der Datenbank nach, welche Antworten passen könnten. Gibt es mehrere gleichwertige Antwortmöglichkeiten, wird zufällig eine mögliche Antwort ausgewählt und getwittert. Ich hoffe, dass die Qualität der Antworten mit wachsender Datenbank besser wird.</p>
<p>Ein weiteres nettes Feature ist, dass beim Lernen die Tweets, die nicht an einen anderen Twitter-Account gerichtet waren ebenfalls in der Datenbank gespeichert werden. Von Zeit zu Zeit twittert Twempy zufällig einen dieser Tweets. Danach wird die Nachricht gelöscht, damit er auf keinen Fall zwei Mal das gleiche sagt.</p>
<p>Offen ist noch, ob ich dieses Verfahren auch auf die Antworten, die der Bot sendet anwenden sollte, so dass auch niemals zwei Mal die gleiche Antwort gesendet werden könnte. Twempy würde seinen Antworten damit wieder verlernen, was aber auch das Risiko birgt, dass er irgendwann keine Antworten mehr parat hat. Da bin ich noch unschlüssig.</p>
<p>Wenn der Quellcode ausgereift ist, werde ich ihn veröffentlichen, aber ich muss noch etwas abwarten. Einige Dinge sind noch unklar, zum Beispiel die Frage, ob die Datenbasis besser wird, wenn nur Anworten gespeichert werden, die einen Ursprungstweet als Auslöser hatten, der nicht selbst ebenfalls eine Antwort auf einen anderen Tweet war. Mir ist nämlich aufgefallen, dass diese mitten aus der Konversation gegriffenen Antworten teilweise in keinem logischn Zusammenhang zu den verwendeten Wörtern stehen.</p>
<p>Es wird noch einige Tests benötigen, warten wir mal ab&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/twempy-der-twitternde-software-roboter/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Selbstlernender Chat-Bot mit der Twitter API?</title>
		<link>http://thegeek.de/selbstlernender-chat-bot-mit-der-twitter-api</link>
		<comments>http://thegeek.de/selbstlernender-chat-bot-mit-der-twitter-api#comments</comments>
		<pubDate>Fri, 11 Dec 2009 11:39:06 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[idee]]></category>
		<category><![CDATA[ki]]></category>
		<category><![CDATA[selbstlernend]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=404</guid>
		<description><![CDATA[Ich habe mich schon immer für künstliche Intelligenzen und selbstlernende System interessiert. Die Spielereien mit der Twitter API hat mich nun auf folgende Idee gebracht.
Es ist jetzt erstmal nur ein Gedankenspiel, viel nachgedacht habe ich darüber noch nicht, aber könnte man die Twitter API nicht dazu nutzen einen Chat-Bot zu entwickeln, der aus Konversationen auf [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe mich schon immer für künstliche Intelligenzen und selbstlernende System interessiert. Die Spielereien mit der Twitter API hat mich nun auf folgende Idee gebracht.</p>
<p>Es ist jetzt erstmal nur ein Gedankenspiel, viel nachgedacht habe ich darüber noch nicht, aber könnte man die Twitter API nicht dazu nutzen einen Chat-Bot zu entwickeln, der aus Konversationen auf Twitter lernt? Nehmen wir doch mal eine wahllos ausgewählte Konversation aus meiner Timeline:</p>
<blockquote><p><strong>vjstephan</strong>: Sich selber mal für ein paar Stunden ohne Internetz und Handy in den Schnittraum einsperren wirkt wahre Wunder. #twitaly<br />
<strong>motorradblogger</strong>: @vjstephan Oh darf man gespannt sein? #twitaly<br />
<strong>vjstephan</strong>: @motorradblogger Wieso solltest du gespannt sein? Du warst doch dabei.<br />
<strong>motorradblogger</strong>: @vjstephan Das ist so lang her. Hab schon wieder alles vergessen. ;-)</p></blockquote>
<p>Ein Bot könnte über die Twitter API solche Konversationen suchen und bis zum Ursprung zurückverfolgen. Dafür wird in den Tweets extra eine &#8220;in reply to&#8221; ID gespeichert. Ist der Ursprungstweet gefunden, werden die einzelnen Wörter (ohne Links und Hashtags) herausgeschnitten und in einer Datenbank mit der Antwort (oder den Antworten) auf den Tweet verknüpft. Dieses Verfahren wird auf alle Tweets der Konversation angewendet.</p>
<p>Hat dieser Bot eine große Datenbasis angesammelt, könnte man ihm selbst einen Tweet schicken. Auch hier werden die einzelnen Wörter wieder ausgeschnitten und mit der Datenbank verglichen. Es ergeben sich dann aufgrund der Worthäufigkeit verschiedene Antwortmöglichkeiten, von denen die passenste, oder manchmal auch eine zufällige, als Antwort gesendet wird.</p>
<p>Das System würde von echten Konversationen lernen und möglicherweise würden die Antworten des Bots dadurch auch sehr echt wirken.</p>
<p>Ich werde das am Wochenende mal ausprobieren. Mal sehen was daraus wird. Vielleicht knackt so ein Bot ja endlich den Turing Test. ;-)</p>
<p>Einen Account und einen Namen hat der Bot jedenfalls schonmal: <a href="http://twitter.com/twempy">http://twitter.com/twempy</a></p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/selbstlernender-chat-bot-mit-der-twitter-api/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spaß mit der Twitter API und Ausdruck des Protests gegenüber Harley Davidson</title>
		<link>http://thegeek.de/spas-mit-der-twitter-api-und-ausdruck-des-protests-gegenuber-harley-davidson</link>
		<comments>http://thegeek.de/spas-mit-der-twitter-api-und-ausdruck-des-protests-gegenuber-harley-davidson#comments</comments>
		<pubDate>Wed, 09 Dec 2009 12:54:30 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[buell]]></category>
		<category><![CDATA[harley davidson]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[protest]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=398</guid>
		<description><![CDATA[@moto1203 hat mich über Twitter kontaktiert und gefragt, ob es nicht irgendwie möglich sei ein Programm zu schreiben, dass bei bestimmten Hashtags eine @reply erzeugt. Thematisch ging&#8217;s konkret um den bekannten Motorradhersteller &#8220;Harley Davidson&#8221;, der kürzlich die Tochter- und Traditionsfirma &#8220;BUELL&#8221; einfach so dicht gemacht hat. Buell Motorräder wurden &#8220;nicht oft genug&#8221; verkauft, was aber [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://twitter.com/moto1203">@moto1203</a> hat mich über Twitter kontaktiert und gefragt, ob es nicht irgendwie möglich sei ein Programm zu schreiben, dass bei bestimmten Hashtags eine @reply erzeugt. Thematisch ging&#8217;s konkret um den bekannten Motorradhersteller &#8220;Harley Davidson&#8221;, der kürzlich die Tochter- und Traditionsfirma &#8220;BUELL&#8221; einfach so dicht gemacht hat. Buell Motorräder wurden &#8220;nicht oft genug&#8221; verkauft, was aber nichts daran ändert, das die Kisten ihren Markt hatten. Das fanden wir jedenfalls schon ziemlich kacke von Harley Davidson.</p>
<p>Also habe ich kurzerhand einen neuen Twitter-Account mit dem klangvollen Namen &#8220;<a href="http://twitter.com/subversives">@subversives</a>&#8221; erstellt und ein kleines PHP-Skript geschrieben, dass neue Tweets mit einem #harley Hashtag sucht und eine zufällig ausgewählte Antwort erstellt. Natürlich konfigurierbar. :-)<span id="more-398"></span></p>
<p>Dazu gibt es zwei kleine Funktionen. Die erste Funktion sucht Tweets nach einem bestimmten Suchbegriff:</p>
<pre class="brush:php">
// Twitter search api
function twt_search( $username, $password, $search, $since_id = 0, $rpp = 30, $page = 1 )
{
	// Curl init
	$curl = curl_init();

	// Curl basic settings
	curl_setopt( $curl, CURLOPT_URL, 'http://search.twitter.com/search.json' );
	curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
	curl_setopt( $curl, CURLOPT_USERPWD, "$username:$password" );
	curl_setopt( $curl, CURLOPT_POST, true );

	// Build POST parameters
	$post_arr = array();
	$post_arr[] = "q=" . urlencode( $search );
	if( !empty( $since_id ) )
		$post_arr[] = "since_id=" . $since_id;
	if( !empty( $rpp ) )
		$post_arr[] = "rpp=" . $rpp;
	if( !empty( $page ) )
		$post_arr[] = "page=" . $page;
	curl_setopt( $curl, CURLOPT_POSTFIELDS, implode( '&#038;', $post_arr ) );

	// Exec, set return
	$return = json_decode( curl_exec( $curl ) );

	// Close curl
	curl_close( $curl );

	return $return;
}
</pre>
<p>Übergeben werden Benutzername, Passwort, der Suchbegriff und &#8211; wenn bekannt &#8211; auch die &#8220;since_id&#8221;, welche es ermöglicht nur Tweets mit einer höheren ID zu ermitteln. Das ist für unser lustiges Protest-Skript wichtig, denn wir wollen die Leute ja nicht zuspammen und immer wieder auf die gleichen Tweets antworten. Nur neue Tweets seit der letzten Suche sollen berücksichtigt werden, also merken wir uns einfach die höchste Tweet ID und übergeben diese wieder bei der nächsten Suche. Der Parameter &#8220;rpp&#8221; steht übrigens für &#8220;results per page&#8221; &#8211; mit der Voreinstellung werden also maximal 30 Tweets zurückgegeben.</p>
<p>Technisch wird die Abfrage über die CURL-Bibliothek realisiert, theoretisch ginge es aber auch mit &#8220;file_get_contents&#8221; oder &#8220;fopen&#8221;, aber ich mag CURL. Ist ganz praktisch.</p>
<p>Die zweite benötigte Funktion erstellt über die Twitter API einen neuen Tweet. Auch hier stehen wieder einige Parameter zur Verfügung:</p>
<pre class="brush:php">
// Twitter update api
function twt_update( $username, $password, $status, $in_reply_to_status_id = '', $lat = '', $long = '' )
{
	// Curl init
	$curl = curl_init();

	// Curl basic settings
	curl_setopt( $curl, CURLOPT_URL, 'http://twitter.com/statuses/update.json' );
	curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
	curl_setopt( $curl, CURLOPT_USERPWD, "$username:$password" );
	curl_setopt( $curl, CURLOPT_POST, true );

	// Build POST parameters
	$post_arr = array();
	$post_arr[] = "status=" . urlencode( $status );
	if( !empty( $in_reply_to_status_id ) )
		$post_arr[] = "in_reply_to_status_id=" . $in_reply_to_status_id;
	if( !empty( $lat ) )
		$post_arr[] = "lat=" . $lat;
	if( !empty( $long ) )
		$post_arr[] = "long=" . $long;
	curl_setopt( $curl, CURLOPT_POSTFIELDS, implode( '&#038;', $post_arr ) );

	// Exec, set return
	$return = json_decode( curl_exec( $curl ) );

	// Close curl
	curl_close( $curl );

	return $return;
}
</pre>
<p>Neben Nutzername und Passwort können an diese Funktion der Statustext (Tweet) und der sehr wichtige Parameter &#8220;in_reply_to_status_id&#8221; übergeben werden. Wird die ID eines Tweets mit diesem Parameter übergeben, erkennt Twitter, dass es sich um eine @rely zu dem Tweet mit der übergebenen ID handelt. Da wir ja Antworten senden wollen, genau das richtige! Die Parameter &#8220;lat&#8221; und &#8220;long&#8221; sind übrigens nur schmückendes Beiwerk und werden von mir nicht genutzt. Ich habe das nur der Vollständigkeit halber mit rein genommen.</p>
<p>Nun zur Anwendung der Funktionen:</p>
<pre class="brush:php">
// Twitter account settings
$username = 'user';
$password = 'pass';

// Configure some reply variations in english and german
$replys_en = array(
	'Always remember #BUELL if you talk about Harley Davidson!',
	'Hey, remember #BUELL if you talk about Harley Davidson!',
	'Remember #BUELL FOREVER! Harley Davidson? NEVER!',
	'It makes me sick, that you dont talk about #BUELL ;-)',
	'#BUELL #BUELL #BUELL remember the Harley Davidson #FAIL',
	'#BUELL killed by Harley Davidson in 2k9. Remember that!',
	'#BUELL will never die. Harley Davidson will.'
);
$replys_de = array(
	'Erinner dich an #BUELL wenn du über Harley Davidson sprichst!',
	'Harley Davidson? Die Firma, die #BUELL zerstört hat?',
	'#BUELL FOREVER! Harley Davidson? NEVER!',
	'Es macht mich krank, dass nicht auch über #BUELL sprichst!',
	'#BUELL #BUELL #BUELL denk an den Harley Davidson #FAIL',
	'#BUELL wurde von Harley Davidson 2k9 geschlossen. HD is next!',
	'#BUELL wird niemals sterben, aber Harley Davidson. #Rentnerchopper'
);

// Load last parsed tweet id
if( file_exists( 'harley_since_id.dat' ) )
	$harley_since_id = file_get_contents( 'harley_since_id.dat' );
else
	$harley_since_id = 0;

// Search for tag harley
$harley = twt_search( $username, $password, '#harley', $harley_since_id );
if( is_object( $harley ) )
{
	if( count( $harley -> results ) )
	{
		foreach( $harley -> results AS $rkey => $tweet )
		{
			// Descending order, so the first array element has the highest id!
			if( $rkey == 0 )
				$harley_since_id = $tweet -> id;
			// Only reply if buell not found
			if( stripos( $tweet -> text, 'buell' ) === false &#038;&#038; $tweet -> from_user != $username )
			{
				if( $tweet -> iso_language_code != 'de' )
					$reply = "@{$tweet->from_user} " . $replys_en[ array_rand( $replys_en ) ];
				else
					$reply = "@{$tweet->from_user} " . $replys_de[ array_rand( $replys_de ) ];

				echo "$reply\n";

				// Send reply
				twt_update( $username, $password, $reply, $tweet -> id );
			}
		}
	}
	else	echo "No new tweets to tag #harley\n";
}

// Store last parsed tweet id
file_put_contents( 'harley_since_id.dat', $harley_since_id );
</pre>
<p>Zuerst werden in zwei Arrays englische bzw. deutsche Ausdrücke des Protests definiert, danach wird aus einer kleinen Datendatei die ID des letzten gefundenen Tweets geladen und die Suche ausgeführt.<br />
Die Suchfunktion gibt ein Objekt zurück, dass in der Eigenschaft &#8220;results&#8221; die gefundenen Tweets als Array enthält, welches anschließend durchlaufen wird. Beim ersten gefundenen Tweet wird die &#8220;since_id&#8221; neu gesetzt. Warum beim ersten? Na, weil die Tweets absteigend sortiert sind &#8211; der Erste ist also immer der Aktuellste.<br />
Enthält der Tweet nicht das Wort &#8220;buell&#8221;, wird in der entsprechenden Sprache (deutsch oder englisch) eine @reply an den Twitter-Account des Tweets gesendet.</p>
<p>Tja, das war&#8217;s eigentlich schon. Wer es mal probieren und einen Spruch reingedrückt bekommen will, der zwitschert einfach mal was mit dem Hashtag #harley &#8211; es dauert allerdings ein wenig, bis die Antwort kommt, das Skript läuft nur alle 15 Minuten.</p>
<p>Ich bin gespannt, wie lange der Account aktiv ist, ohne als Spam gemeldet zu werden. ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/spas-mit-der-twitter-api-und-ausdruck-des-protests-gegenuber-harley-davidson/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter-Sicherheitslücke bei geschützten Tweets [Update]</title>
		<link>http://thegeek.de/twitter-sicherheitslucke-bei-geschutzten-tweets</link>
		<comments>http://thegeek.de/twitter-sicherheitslucke-bei-geschutzten-tweets#comments</comments>
		<pubDate>Mon, 23 Nov 2009 16:55:53 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[sicherheit]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=349</guid>
		<description><![CDATA[Ich bin ein recht aktiver Twitter-Nutzer und gehe sehr offen mit dieser Anwendung um, wer das mit seinem Account nicht möchte, der hat bei Twitter die Möglichkeit seine Tweets auf &#8220;geschützt&#8221; zu setzen. So sind die eigenen 140-Zeichen Botschaften nur von Followern zu lesen, die vom Besitzer des Account freigegeben wurden. Gerade eben bin ich [...]]]></description>
			<content:encoded><![CDATA[<p>Ich bin ein recht aktiver Twitter-Nutzer und gehe sehr offen mit dieser Anwendung um, wer das mit seinem Account nicht möchte, der hat bei Twitter die Möglichkeit seine Tweets auf &#8220;geschützt&#8221; zu setzen. So sind die eigenen 140-Zeichen Botschaften nur von Followern zu lesen, die vom Besitzer des Account freigegeben wurden. Gerade eben bin ich auf einen solchen Account gestoßen: Eine Person, die mir auf Twitter folgt, deren Tweets ich aber nicht lesen darf. Gut, das ist soweit ja kein Problem, jeder kann das mit der Privatsphäre halten, wie es beliebt, nur leider funktioniert das bei Twitter wohl nicht so recht.</p>
<p>Eine simple Google Suche hebelt den Schutzmechanismus von Twitter aus: &#8220;site:http://twitter.com/geschuetzter_account&#8221; (Beispiel). Offenbar erlaubt Twitter dem GoogleBot den Zugriff auch auf geschützte Tweets und da die Nachrichten nur 140-Zeichen lang sind, können diese über die Suchergebnisliste der Suchmaschine prima &#8211; oder gleich komplett über den Google Cache &#8211; gelesen werden.</p>
<p>Und nein, die Daten sind meiner Erkenntnis nach nicht im Index gelandet, weil der Twitter-Account zwischenzeitlich nicht geschützt war, es sind auch Tweets aus diesem Monat zu finden.</p>
<p>Das ist irgendwie&#8230; hmmm&#8230; #FAIL!</p>
<p>[Update]</p>
<p>Laut Aussage eines Freundes ist es doch keine Sicherheitslücke, Accounts die immer geschützt waren, können auch nicht über den Google-Cache oder die Suche aufgerufen werden. Scheinbar war der von mir gefundene Account dann doch zwischenzeitlich nicht geschützt. Verifiziert habe ich das noch nicht.</p>
<p>An der Problematik, dass die Tweets, wenn der Account erst nachträglich geschützt wurde, über Google weiterhin abrufbar sind, ändert das allerdings nichts. Aber das ist ja schon ein recht altes Problem. Was einmal versehentlich öffentlich publiziert wurde, ist aus dem Netz schwer wieder zu entfernen.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/twitter-sicherheitslucke-bei-geschutzten-tweets/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Twitter Listen als RSS/Atom Feed abonnieren</title>
		<link>http://thegeek.de/twitter-listen-als-rssatom-feed-abonnieren</link>
		<comments>http://thegeek.de/twitter-listen-als-rssatom-feed-abonnieren#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:17:53 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[atom]]></category>
		<category><![CDATA[listen]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=317</guid>
		<description><![CDATA[Die neue Listenfunktion bei Twitter ist klasse, denn damit lassen sich endlich die Leute denen man folgt thematisch gruppieren. Da die Listen nun auch per Twitter API angesprochen werden können, ist es möglich die Tweets einer Liste per RSS bzw. Atom zu abonnieren. Eine praktische Sache.
Einfach im Browser oder RSS Reader eine dem folgenden Format [...]]]></description>
			<content:encoded><![CDATA[<p>Die neue Listenfunktion bei Twitter ist klasse, denn damit lassen sich endlich die Leute denen man folgt thematisch gruppieren. Da die Listen nun auch per Twitter API angesprochen werden können, ist es möglich die Tweets einer Liste per RSS bzw. Atom zu abonnieren. Eine praktische Sache.</p>
<p>Einfach im Browser oder RSS Reader eine dem folgenden Format entsprechende URL eingeben:</p>
<p><strong>http://api.twitter.com/1/ACCOUTNAME/lists/LISTENNAME/statuses.atom</strong></p>
<p>Wobei &#8220;<strong>ACCOUNTNAME</strong>&#8221; durch den Twitternamen z.B. &#8220;motorradblogger&#8221; zu ersetzen ist. Das gleiche gilt natürlich für &#8220;<strong>LISTENNAME</strong>&#8220;.</p>
<p>Zum Beispiel so: <a href="http://api.twitter.com/1/motorradblogger/lists/motorradblogger/statuses.atom">Meine Liste von Motorradbloggern</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/twitter-listen-als-rssatom-feed-abonnieren/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spielerei mit der Twitter API</title>
		<link>http://thegeek.de/spielerei-mit-der-twitter-api</link>
		<comments>http://thegeek.de/spielerei-mit-der-twitter-api#comments</comments>
		<pubDate>Mon, 26 Oct 2009 11:58:12 +0000</pubDate>
		<dc:creator>Marc</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://thegeek.de/?p=214</guid>
		<description><![CDATA[Kürzlich habe ich ein wenig mit der Twitter API gespielt. Ich wollte mal sehen, welche Follower meiner Follower auch mir folgen. Dazu habe ich mir eine kleine Funktion geschrieben die ermittelt, welche anderen Twitterer von einem Account verfolgt werden. Die Ergebnisse habe ich in einer Datenbank-Tabelle gespeichert und später ausgewertet.
Die Funktion ist zwar nicht perfekt, [...]]]></description>
			<content:encoded><![CDATA[<p>Kürzlich habe ich ein wenig mit der Twitter API gespielt. Ich wollte mal sehen, welche Follower meiner Follower auch mir folgen. Dazu habe ich mir eine kleine Funktion geschrieben die ermittelt, welche anderen Twitterer von einem Account verfolgt werden. Die Ergebnisse habe ich in einer Datenbank-Tabelle gespeichert und später ausgewertet.</p>
<p>Die Funktion ist zwar nicht perfekt, mir reichte sie jedoch.</p>
<pre class="brush:php">
&lt;?php
function get_friends( $screen_name, $page_limit = 200 )
{
	$screen_names = array();
	for( $page = 1; $page < $page_limit; $page++ )
	{
		ob_start();
		$friends_json = file_get_contents( 'http://twitter.com/statuses/friends.json?screen_name=' . $screen_name . '&#038;page=' . $page );
		$errors = ob_get_contents();
		ob_end_clean();
		if( $friends_json !== false )
		{
			$friends = json_decode( $friends_json );
			if( is_array( $friends ) &#038;&#038; count( $friends ) )
			{
				foreach( $friends AS $friend )
					$screen_names[ $friend -> id ] = $friend -> screen_name;
			}
			else
			if( !count( $friends ) )
			{
				break;
			}
			else
			{
				$screen_names = array();
				break;
			}
		}
		else	break;
	}
	if( count( $screen_names ) || $errors == '' )
	{
		return $screen_names;
	}
	else
	{
		if( strpos( $errors, '401 Unauthorized' ) !== false )
			return false;
		else
			return null;
	}
}

// Example usage
print_r( get_friends( 'motorradblogger' ) );
?&gt;
</pre>
<p>Schade übrigens, dass die Anzahl der Requests pro Stunde bei Twitter limitiert ist, sonst ließen sich ziemlich schnell, ziemlich viele Twitter-Accounts crawlen. ;-)</p>
<p>Die Benutzung ist sehr simpel: Einfach den Accountnamen übergeben, die Funktion läd Seitenweise alle Accounts, denen gefolgt wird und gibt diese in einem assoziativen Array (Schlüssel: Account-ID, Wert: Accountname) zurück. Im Falle eines Fehlers wird &#8216;false&#8217; zurückgegeben, bei einem unbekannten Fehler &#8216;null&#8217;.</p>
]]></content:encoded>
			<wfw:commentRss>http://thegeek.de/spielerei-mit-der-twitter-api/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
