<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>SoWebDev-BLOG</title>
	<atom:link href="http://frank-it-beratung.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://frank-it-beratung.com</link>
	<description>Social-Media- &#38; Web-Entwicklung</description>
	<lastBuildDate>Sun, 29 Jan 2012 06:39:12 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='frank-it-beratung.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/d9f7f66a412ac4d15cb40e1bc458386c?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>SoWebDev-BLOG</title>
		<link>http://frank-it-beratung.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://frank-it-beratung.com/osd.xml" title="SoWebDev-BLOG" />
	<atom:link rel='hub' href='http://frank-it-beratung.com/?pushpress=hub'/>
		<item>
		<title>Facebook API Tutorial: Mit C# oder Visual Basic ein Foto uploaden (Tutorial Teil 4)</title>
		<link>http://frank-it-beratung.com/2011/11/14/tutorial-mit-c-oder-visual-basic-ein-foto-uploaden-facebook-api-tutorial-teil-4/</link>
		<comments>http://frank-it-beratung.com/2011/11/14/tutorial-mit-c-oder-visual-basic-ein-foto-uploaden-facebook-api-tutorial-teil-4/#comments</comments>
		<pubDate>Mon, 14 Nov 2011 16:12:01 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Graph API]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[C#. Facebook API]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=716</guid>
		<description><![CDATA[Aufgrund einiger Anfragen habe ich schnell diesen vierten Teil des Facebook-Tutorials geschrieben in dem erklärt wird, wie man via C# oder Visual Basic ein Foto zu Facebook hochladen kann. 1. Die Vorarbeiten werden in Teil 1, Teil 2 und Teil 3 dieses Tutorials erklärt. Jetzt habe ich das Formular mit einem Feld für den Dateinamen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=716&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Aufgrund einiger Anfragen habe ich schnell diesen vierten Teil des Facebook-Tutorials geschrieben in dem erklärt wird, wie man via C# oder Visual Basic ein Foto zu Facebook hochladen kann.</p>
<p>1. Die Vorarbeiten werden in <a title="Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 1)" href="http://frank-it-beratung.com/2010/12/10/tutorial-ein-facebook-pinnwandeintrag-mit-visual-basic-oder-c-teil-1/">Teil 1</a>, <a title="Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 2)" href="http://frank-it-beratung.com/2011/01/29/tutorial-ein-facebook-pinnwandeintrag-mit-visual-basic-oder-c-teil-2/">Teil 2</a> und <a title="Tutorial: Auf Facebook mit Visual Basic oder C# bei einem Freund einen Pinnwandeintrag posten (Teil 3)" href="http://frank-it-beratung.com/2011/02/18/tutorial-facebook-vb-csharp-pinnwandeintrag-bei-freund/">Teil 3</a> dieses Tutorials erklärt. Jetzt habe ich das Formular mit einem Feld für den Dateinamen und Pfad sowie einer Taste &#8222;Fotoupload&#8220; ergänzt (Wer es etwas komfortabler haben möchte und den Dateinamen nicht tippen möchte kann noch den &#8222;OpenFileDialog&#8220; bedienen, auf das ich hier verzichtet habe).</p>
<p><a href="http://frankitberatung.files.wordpress.com/2011/11/screen11.jpg"><img title="Facebook API Tutorial C#" src="http://frankitberatung.files.wordpress.com/2011/11/screen11.jpg?w=593&#038;h=239" alt="" width="593" height="239" /></a></p>
<p><span id="more-716"></span></p>
<p>2. Statt WebClient.UploadData verwende ich nun UploadFile und poste dies an &#8222;https://graph.facebook.com/me/photos&#8220;. Statt &#8222;me&#8220; kann ich auch die Nummer eines meiner Alben angeben oder sogar den Namen eines meiner Freunde (falls die eine Upload zulassen).</p>
<p>3. Der Parameter &#8222;message&#8220; dient zu Bildbeschreibung. Zudem kann man noch Tags, Beschreibungen usw. angeben, Details siehe in der Doku von <a href="http://developers.facebook.com/docs/reference/api/photo/" target="_blank">Facebook Developer</a>.</p>
<p>4. Der komplette Code für das Click-Event auf die Taste  &#8222;Fotouplaod&#8220; sieht dann folgendermaßen aus:</p>
<pre>private void buttonUpload_Click(object sender, EventArgs e)
{
 byte[] Nachricht = null;
 byte[] Antwort = null;
 string AccessToken = null;
 string u = "";

 AccessToken = txtAccessToken.Text;

 if (string.IsNullOrEmpty(AccessToken))
 {
   MessageBox.Show("Bitte erst auf 'Login' klicken");
   return;
 }

  //postet das Foto unter "Fotos" des ausgewählten Users:            
  string GraphURL = "https://graph.facebook.com/me/photos";

  //WebClient anlegen
  System.Net.WebClient myWebClient = new System.Net.WebClient();

  //Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
  System.Net.ServicePointManager.Expect100Continue = false;

  u = "?message=" + txtStatusupdate.Text + "&amp;access_token=" + AccessToken;
  Nachricht = Encoding.UTF8.GetBytes(u);

  try
  {
   Antwort = myWebClient.UploadFile(GraphURL+u, "POST", textBoxDateiname.Text);
   //MessageBox.Show(System.Text.Encoding.ASCII.GetString(Antwort));
   MessageBox.Show("Foto erfogreich hochgeladen!");
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }
}</pre>
<p><strong>Alternative: FileUploadAsync</strong></p>
<p>In einem Kommentar zum meinem letzten Tutorials wurde ich gefragt, ob dies mit &#8222;Async&#8220; nicht schöner wäre &#8211; natürlich! Ich wollte es nur nicht unnötig kompliziert machen. Aber wenn hier ein großes Foto hochgeladen wird wäre es natürlich besser, wenn die Anwendung solange nicht &#8222;einfriert&#8220; und stattdessen z. B. den Fortschritt anzeigt. Dafür erweitere ich das Formular um eine Taste &#8222;Fotoupload (async)&#8220; sowie ein Label, in dem der Fortschritt des Uploads angezeigt werden soll:</p>
<p><a href="http://frankitberatung.files.wordpress.com/2011/11/screen2.jpg"><img class="alignnone size-full wp-image-734" title="Facebook API Tutorial mit C#" src="http://frankitberatung.files.wordpress.com/2011/11/screen2.jpg?w=600" alt=""   /></a></p>
<p>Der Code für einen &#8222;async&#8220;-Upload dazu sieht dann so aus:</p>
<pre>private void buttonAsyncUpload_Click_1(object sender, EventArgs e)
{
  byte[] Nachricht = null;            
  string AccessToken = null;
  string u = "";

  AccessToken = txtAccessToken.Text;

  if (string.IsNullOrEmpty(AccessToken))
  {
    MessageBox.Show("Bitte erst auf 'Login' klicken");
    return;
  }

  string GraphURL = "https://graph.facebook.com/me/photos";

  //WebClient anlegen
  System.Net.WebClient myWebClient = new System.Net.WebClient();

  //Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
  System.Net.ServicePointManager.Expect100Continue = false;

  u = "?message=" + txtStatusupdate.Text + "&amp;access_token=" + AccessToken;
  Nachricht = Encoding.UTF8.GetBytes(u);

  //hier werden die Callbacks festgelegt:
  myWebClient.UploadProgressChanged +=
   new UploadProgressChangedEventHandler(UploadProgessChange);
  myWebClient.UploadFileCompleted +=
   new UploadFileCompletedEventHandler(UploadFertig);

  try
  {
    myWebClient.UploadFileAsync(new Uri(GraphURL + u),
     "POST", textBoxDateiname.Text);
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.Message);
  }

}

private void UploadProgessChange(object sender,
  UploadProgressChangedEventArgs e)
{
  LabelUpload.Text = e.ProgressPercentage.ToString() + "%";
  // Alternativen: e.UserState, e.BytesReceived, e.TotalBytesToReceive,...
}

private void UploadFertig(object sender, UploadFileCompletedEventArgs e)
{            
  MessageBox.Show("Upload fertig!");
  //ggf. Rückgabewert auslesen:
  //byte[] data = (byte[])e.Result;
  //string textData = System.Text.Encoding.UTF8.GetString(data);
  //MessageBox.Show("Result: " + textData);  
}</pre>
<p>Codebeispiele in Visual Basic folgen!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/716/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/716/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/716/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=716&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/11/14/tutorial-mit-c-oder-visual-basic-ein-foto-uploaden-facebook-api-tutorial-teil-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>

		<media:content url="http://frankitberatung.files.wordpress.com/2011/11/screen11.jpg" medium="image">
			<media:title type="html">Facebook API Tutorial C#</media:title>
		</media:content>

		<media:content url="http://frankitberatung.files.wordpress.com/2011/11/screen2.jpg" medium="image">
			<media:title type="html">Facebook API Tutorial mit C#</media:title>
		</media:content>
	</item>
		<item>
		<title>Neue Version Access Token Manager &#8211; jetzt auch mit Google+ Unterstützung</title>
		<link>http://frank-it-beratung.com/2011/10/14/neue-version-access-token-manager-jetzt-auch-mit-google-unterstutzung/</link>
		<comments>http://frank-it-beratung.com/2011/10/14/neue-version-access-token-manager-jetzt-auch-mit-google-unterstutzung/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 08:51:51 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Google API]]></category>
		<category><![CDATA[Access Token]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[OAuth]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=691</guid>
		<description><![CDATA[Gerade habe ich schnell eine neue Version (1.2) des Access Token Managers online gestellt. Da er nun auch Google+ (eigentlich sämtliche Google-Dienste) unterstüzt (man also auch Access Tokens mit OAuth für Google+ erstellen kann) hat das Tool einen neuen Namen bekommen und heißt nun einfach nur &#8222;Access Token Manager&#8220;. In den nächsten Tagen werde ich [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=691&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Gerade habe ich schnell eine neue Version (1.2) des Access Token Managers online gestellt. Da er nun auch Google+ (eigentlich sämtliche Google-Dienste) unterstüzt (man also auch Access Tokens mit OAuth für Google+ erstellen kann) hat das Tool einen neuen Namen bekommen und heißt nun einfach nur &#8222;Access Token Manager&#8220;.</p>
<p><a href="http://frankitberatung.files.wordpress.com/2011/10/bild1.jpg"><img class="size-medium wp-image-700 alignleft" title="Access Token Manager" src="http://frankitberatung.files.wordpress.com/2011/10/bild1.jpg?w=300&#038;h=279" alt="" width="300" height="279" /></a></p>
<p>In den nächsten Tagen werde ich ein Tutorial zu Google+ API schreiben und dann auch die Funktionen genauer erklären.</p>
<p><strong><a href="http://www.frank-it-beratung.de/setupdotnettools/FBAccessTokenManager/setup.exe" target="_blank">Download &#8222;setup.exe&#8220; Access Token Manager</a><br />
</strong></p>
<p>Interessierte können den <strong>Quelltext</strong> ebenfalls einsehen und nach eigenen Wünschen verändern und weiterentwickeln (Lizenz: <a href="http://creativecommons.org/licenses/by/3.0/de/" target="_blank">CC BY 3.0</a>, also mit Namensnennung). Auf Wunsch eines Kollegens habe ich das nicht in C# sondern in Visual Basic geschrieben &#8211; (was mich inzwischen auch schon ärgert, aber nun ist es zu spät). Visual Studio 2010 Express Editon ist ausreichend:</p>
<p><strong><strong>Quellcode AccessTokenManager (Lizenz: <a href="http://creativecommons.org/licenses/by/3.0/de/" target="_blank">CC 3.0 BY</a>): <a href="http://www.frank-it-beratung.de/tutorialsetc/FBAccessTokenManager/frmMain_v1.2.vb.txt" target="_blank">frmMain.vb</a> (und <a href="http://www.frank-it-beratung.de/tutorialsetc/FBAccessTokenManager/frmMain.Designer_v1.2.vb.txt" target="_blank">frmMain.Designer.vb</a>)</strong></strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/691/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/691/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/691/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/691/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/691/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/691/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/691/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/691/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=691&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/10/14/neue-version-access-token-manager-jetzt-auch-mit-google-unterstutzung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>

		<media:content url="http://frankitberatung.files.wordpress.com/2011/10/bild1.jpg?w=300" medium="image">
			<media:title type="html">Access Token Manager</media:title>
		</media:content>
	</item>
		<item>
		<title>Facebook Access Tokens mit FB Access Token Manager erstellen &#8211; neue Version mit kleinen Verbesserungen</title>
		<link>http://frank-it-beratung.com/2011/10/11/facebook-access-tokens-mit-fb-access-token-manager-erstellen-neue-version-mit-kleinen-verbesserungen/</link>
		<comments>http://frank-it-beratung.com/2011/10/11/facebook-access-tokens-mit-fb-access-token-manager-erstellen-neue-version-mit-kleinen-verbesserungen/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 15:43:09 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Graph API]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Access Token]]></category>
		<category><![CDATA[access_token]]></category>
		<category><![CDATA[Facebook Access Token]]></category>
		<category><![CDATA[FB]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=678</guid>
		<description><![CDATA[Um schnell und unkompliziert Access-Tokens für Facebook zu generieren habe ich vor einiger Zeit in Rahmen eines Projektes ein kleines Tool („FB Access Token Manager“) mit einem einfachen GUI geschrieben, mit dem sich dies ganz komfortabel bewerkstelligen lässt (und dies auch hier genauer beschrieben). Facebook-API Programmierer können damit sehr schnell für die unterschiedlichsten Apps und [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=678&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Um schnell und unkompliziert Access-Tokens für Facebook zu generieren habe ich vor einiger Zeit in Rahmen eines Projektes ein kleines Tool („FB Access Token Manager“) mit einem einfachen GUI geschrieben, mit dem sich dies ganz komfortabel bewerkstelligen lässt (und dies auch <a title="Facebook Access Tokens mit FB Access Token Manager erstellen" href="http://frank-it-beratung.com/2010/12/05/facebook-access-token-tool/">hier</a> genauer beschrieben).</p>
<p><span id="more-678"></span></p>
<p><a href="http://frankitberatung.files.wordpress.com/2011/10/screensho1.png"><img class="size-medium wp-image-684 alignleft" title="Screenshot Facebook Access Token Manager" src="http://frankitberatung.files.wordpress.com/2011/10/screensho1.png?w=289&#038;h=300" alt="" width="289" height="300" /></a></p>
<p>Facebook-API Programmierer können damit sehr schnell für die unterschiedlichsten Apps und Dienste Access Token &#8222;in Serie&#8220; generieren und sich auch komfortabel mit einem Klick die Access-Tokens für Seiten beim Scope &#8222;manage_pages&#8220; holen (Details zu den Permissions finden Sie in der <a href="http://developers.facebook.com/docs/authentication/permissions" target="_blank">offiziellen Doku</a>).</p>
<p><strong>Neu in der Version 1.1:</strong></p>
<ul>
<li>die Schaltfläche &#8222;Test Access Token&#8220; &#8211; diese ruft die &#8222;ME&#8220; Seite des aktuellen Users auf und stellt das Ergebnis (JSON) dar &#8211; wenn es also mit Ihrem Script nicht klappt können Sie prüfen, ob es an dem Access Token oder an Ihrer Programmierkunst liegt <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>die Schaltfläche &#8222;to facebook&#8220; &#8211; ich brauche diese, um Benutzer auszuloggen &#8211; Sie auch?</li>
</ul>
<p>Das Tool „FB Access Token Manager“ kann hier kostenlos heruntergeladen werden:</p>
<p><strong><a href="http://www.frank-it-beratung.de/setupdotnettools/FBAccessTokenManager/setup.exe" target="_blank">Download &#8222;setup.exe&#8220; FB Access Token Manager</a><br />
</strong></p>
<p>Interessierte können den <strong>Quelltext</strong> ebenfalls einsehen und nach eigenen Wünschen verändern und weiterentwickeln (Lizenz: <a href="http://creativecommons.org/licenses/by/3.0/de/" target="_blank">CC BY 3.0</a>, also mit Namensnennung). Auf Wunsch eines Kollegens habe ich das nicht in C# sondern in Visual Basic geschrieben &#8211; (was mich inzwischen auch schon ärgert, aber nun ist es zu spät). Visual Studio 2010 Express Editon ist ausreichend:</p>
<p><strong><strong>Quellcode FB AccessTokenManager: <a href="http://www.frank-it-beratung.de/tutorialsetc/FBAccessTokenManager/frmMain_v1.1.vb.txt" target="_blank">frmMain.vb</a> (und <a href="http://www.frank-it-beratung.de/tutorialsetc/FBAccessTokenManager/frmMain.Designer_v1.1..vb.txt" target="_blank">frmMain.Designer.vb</a>)</strong></strong></p>
<p><strong>Update am 14.10.2011:</strong> Eine neue Version ist erschienen &#8211; jetzt mit Google+ API Unterstüzung, Details dazu <a title="Neue Version Access Token Manager – jetzt auch mit Google+ Unterstützung" href="http://frank-it-beratung.com/2011/10/14/neue-version-access-token-manager-jetzt-auch-mit-google-unterstutzung/">hier</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/678/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/678/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/678/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=678&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/10/11/facebook-access-tokens-mit-fb-access-token-manager-erstellen-neue-version-mit-kleinen-verbesserungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>

		<media:content url="http://frankitberatung.files.wordpress.com/2011/10/screensho1.png?w=289" medium="image">
			<media:title type="html">Screenshot Facebook Access Token Manager</media:title>
		</media:content>
	</item>
		<item>
		<title>Eine einfache Twitter-Wall mit PHP im Eigenbau</title>
		<link>http://frank-it-beratung.com/2011/09/15/eine-einfache-twitter-wall-mit-php-im-eigenbau/</link>
		<comments>http://frank-it-beratung.com/2011/09/15/eine-einfache-twitter-wall-mit-php-im-eigenbau/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 13:39:29 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter API]]></category>
		<category><![CDATA[Twitter Search API]]></category>
		<category><![CDATA[Twitterwall]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=655</guid>
		<description><![CDATA[Im letzten Monat hatte ich ein kurzes Tutorial zur Suche nach Hashtags in der Twitter Search API geschrieben. Darauf kam eine Anfrage, wie den eine einfache Twitter-Wall mit PHP zu realisieren sei. Auch das ist ganz einfach &#8211; hier sollte man die Parameter since_id verwenden um immer nur die neuesten Tweets nachzuladen. Im folgenden Beispiel [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=655&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Im letzten Monat hatte ich ein kurzes <a title="Suche in Twitter mit PHP Bordmitteln – Ein kurzes Tutorial" href="http://frank-it-beratung.com/2011/08/09/suche-in-twitter-mit-php-bordmitteln-ein-kurzes-tutorial/">Tutorial zur Suche nach Hashtags in der Twitter Search API</a> geschrieben. Darauf kam eine Anfrage, wie den eine einfache Twitter-Wall mit PHP zu realisieren sei. Auch das ist ganz einfach &#8211; hier sollte man die Parameter since_id verwenden um immer nur die neuesten Tweets nachzuladen. Im folgenden Beispiel wurde das ganz einfach mit einem Meta-Refresh der Seite realisiert. Schöner wäre dies mit Ajax, aber um das Beispiel möglichst einfach zu halten habe ich darauf verzichtet:<span id="more-655"></span></p>
<pre>&lt;?php

// Tutorial: Eine einfache Twitter-Wall im Eingenbau
// http://frank-it-beratung.com/blog/

session_start();

// Suche nach Hashtag...
$hashtag="design";
$APIurl = "http://search.twitter.com/search.json";

// Refreh-Url mit since_id ggf aus Session laden
if (!isset($_SESSION['refresh_url'])) {
    $param="?q=%23".$hashtag;    
} else {
    $param=$_SESSION['refresh_url'];
}
$APIurl.=$param;

// weitere Paramter für die Suche siehe
// https://dev.twitter.com/docs/using-search

// GET vorbereiten
$opts = array('http' =&gt;
            array(
                'method'  =&gt; 'GET'
            )
        );

// mit file_get_contents versenden
$result = file_get_contents($APIurl, false, stream_context_create($opts));
$json=json_decode($result);

// since_id in Session speichern
$_SESSION['refresh_url']=$json-&gt;refresh_url;

// neue Ergebnisse seit der letzten Suche
$neueergebnisse="";
for ($i = 0; $i &lt; count($json-&gt;results); $i++) {
    $neueergebnisse.="&lt;img src='".$json-&gt;results[$i]-&gt;profile_image_url;
    $neueergebnisse.="' align='left' width='48' height='48' hspace='5' /&gt;";    
    $neueergebnisse.=$json-&gt;results[$i]-&gt;from_user;
    $neueergebnisse.=" (ID: " .$json-&gt;results[$i]-&gt;from_user_id .")&lt;br/&gt;";    
    $neueergebnisse.="&lt;strong style='font-size:20pt;'&gt;";
    $neueergebnisse.=utf8_decode($json-&gt;results[$i]-&gt;text)."&lt;/strong&gt;";
    $neueergebnisse.="&lt;br/&gt;";    
    $neueergebnisse.="Datum: ". $json-&gt;results[$i]-&gt;created_at;
    $neueergebnisse.=" (Tweet-ID: " . $json-&gt;results[$i]-&gt;id_str.")";    
    $neueergebnisse.="&lt;hr/&gt;";
}

// Alte Ergebnisse aus Session holen
// besser wäre hier u. U. Speicherung in einer Datenbank
if (isset($_SESSION['altetreffer'])) {
    $altetreffer=$_SESSION['altetreffer'];
} else {
    $altetreffer="";
}

// Alte und neue zusammenfügen und in Session legen
$alletreffer=$neueergebnisse . $altetreffer;
$_SESSION['altetreffer']=$alletreffer;

?&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="ISO-8859-1"&gt;
&lt;title&gt;Twitter-Wall Tutorial&lt;/title&gt;
&lt;?php
// optimal wäre eine Ajax-Lösung, aber hier ganz einfach
// mit einem Refresh alle 60 Sekunden (Achtung: Rate Limit!)
?&gt;
&lt;meta http-equiv="refresh" content="60; URL=Twitterwall-Tutorial.php"&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Twitter-Wall für #&lt;?php echo $hashtag ?&gt;&lt;/h1&gt;
Anzahl neuer Treffer: &lt;?php echo count($json-&gt;results); ?&gt;
am &lt;?php echo date("d.m.Y H:m:i"); ?&gt; Uhr
&lt;hr/&gt;
&lt;?php echo $alletreffer; ?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/655/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/655/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=655&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/09/15/eine-einfache-twitter-wall-mit-php-im-eigenbau/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>
	</item>
		<item>
		<title>Suche in Twitter mit PHP Bordmitteln &#8211; Ein kurzes Tutorial</title>
		<link>http://frank-it-beratung.com/2011/08/09/suche-in-twitter-mit-php-bordmitteln-ein-kurzes-tutorial/</link>
		<comments>http://frank-it-beratung.com/2011/08/09/suche-in-twitter-mit-php-bordmitteln-ein-kurzes-tutorial/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 13:30:59 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter API]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=648</guid>
		<description><![CDATA[Wegen des Tutorials zu Twitter mit OAuth und PHP hatte ich eine Anfrage, wie eine Suche nach Hashtags zu realisieren sei &#8211; das ist ganz einfach, da keine Authentifizierung mit OAuth erforderlich ist. Hier ein kleines selbsterklärendes Beispiel, das Twitter nach dem Hashtag #design durchsucht und die aktuellsten 15 Tweets zurückliefert und darstellt (Details zu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=648&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wegen des Tutorials zu <a title="Tutorial: Twitter API mit PHP-Bordmitteln" href="http://frank-it-beratung.com/2011/04/15/tutorial-twitter-api-mit-php-bordmitteln/">Twitter mit OAuth und PHP</a> hatte ich eine Anfrage, wie eine Suche nach Hashtags zu realisieren sei &#8211; das ist ganz einfach, da keine Authentifizierung mit OAuth erforderlich ist. Hier ein kleines selbsterklärendes Beispiel, das Twitter nach dem Hashtag #design durchsucht und die aktuellsten 15 Tweets zurückliefert und darstellt (Details zu den Suchoptionen siehe <a href="https://dev.twitter.com/docs/using-search" target="_blank">https://dev.twitter.com/docs/using-search</a>).<span id="more-648"></span></p>
<pre>&lt;?php

// Suche in Twitter mit PHP Bordmitteln - Ein kurzes Tutorial
// www.Frank-IT-Beratung.com/blog/

// Suche nach Hashtag "design"
$hashtag="design";
$APIurl = "http://search.twitter.com/search.json";

// weitere Paramter für die Suche siehe
// https://dev.twitter.com/docs/using-search
$param="?q=%23".$hashtag;    
$APIurl.=$param;

// GET vorbereiten
$opts = array('http' =&gt;
            array(
                'method'  =&gt; 'GET'
            )
        );

// mit file_get_contents versenden
$result = file_get_contents($APIurl, false, stream_context_create($opts));
$json=json_decode($result);
$ergebnisse="";
for ($i = 0; $i &lt; count($json-&gt;results); $i++) {
    $ergebnisse.="&lt;img src='".$json-&gt;results[$i]-&gt;profile_image_url;
    $ergebnisse.="' align='left' width='48' height='48' hspace='5' /&gt;";    
    $ergebnisse.=$json-&gt;results[$i]-&gt;from_user;
    $ergebnisse.=" (ID: " .$json-&gt;results[$i]-&gt;from_user_id .")&lt;br/&gt;";    
    $ergebnisse.="&lt;strong style='font-size:20pt;'&gt;";
    $ergebnisse.=utf8_decode($json-&gt;results[$i]-&gt;text)."&lt;/strong&gt;";
    $ergebnisse.="&lt;br/&gt;";    
    $ergebnisse.="Datum: ". $json-&gt;results[$i]-&gt;created_at;
    $ergebnisse.=" (Tweet-ID: " . $json-&gt;results[$i]-&gt;id_str.")";    
    $ergebnisse.="&lt;hr/&gt;";
}
?&gt;

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="ISO-8859-1"&gt;
&lt;title&gt;Tutorial: Suche in Twitter&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Suche nach #&lt;?php echo $hashtag ?&gt;&lt;/h1&gt;
Anzahl Treffer: &lt;?php echo count($json-&gt;results); ?&gt;
am &lt;?php echo date("d.m.Y H:m:i"); ?&gt; Uhr
&lt;hr/&gt;
&lt;?php echo $ergebnisse; ?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/648/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/648/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/648/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=648&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/08/09/suche-in-twitter-mit-php-bordmitteln-ein-kurzes-tutorial/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>
	</item>
		<item>
		<title>OAuth Probleme mit Umlauten: Lösungen für PHP, Perl, C#, VB</title>
		<link>http://frank-it-beratung.com/2011/07/16/oauth-probleme-mit-umlauten-losungen-fur-php-perl-c/</link>
		<comments>http://frank-it-beratung.com/2011/07/16/oauth-probleme-mit-umlauten-losungen-fur-php-perl-c/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 16:07:23 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Sonderzeichen]]></category>
		<category><![CDATA[Umlaute]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[VisualBasic]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=634</guid>
		<description><![CDATA[Nahezu alle aktuellen Social Networks nutzen inzwischen OAuth zur Authentifizierung. In diversen Blogposts habe ich dies schon genauer für Twitter, Facebook &#38; Co beschrieben. Ein bekanntes Problem ist die richtige Darstellung der Leer- und Sonderzeichen sowie der deutschen Umlaute. Hier eine Zusammenstellung der Lösungen (Details können in den einzelnen Beiträgen nachgelesen werden): PHP: rawurlencode+utf8_encode ist [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=634&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nahezu alle aktuellen Social Networks nutzen inzwischen OAuth zur Authentifizierung. In diversen Blogposts habe ich dies schon genauer für Twitter, Facebook &amp; Co beschrieben. Ein bekanntes Problem ist die richtige Darstellung der Leer- und Sonderzeichen sowie der deutschen Umlaute. Hier eine Zusammenstellung der Lösungen (Details können in den einzelnen Beiträgen nachgelesen werden):</p>
<p><span id="more-634"></span><strong>PHP</strong>: rawurlencode+utf8_encode ist die Lösung:</p>
<pre>$params=rawurlencode(utf8_encode("Hallöchen Simon wie geht's?"));</pre>
<p><strong>C#:</strong> Hier sind es einige Zeilen, die Idee ist von Andre Arnott, Details siehe <a title="Twitter mit OAuth und C# – So geht’s auch mit Umlauten und Sonderzeichen" href="http://frank-it-beratung.com/2010/11/04/twitter-mit-oauth-und-c-so-gehts-auch-mit-umlauten-und-sonderzeichen/">hier</a></p>
<pre>string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };
 StringBuilder escaped =
   new StringBuilder(Uri.EscapeDataString(txtTweet.Text.ToString()));

 for (int i = 0; i &lt; UriRfc3986CharsToEscape.Length; i++)
 {
   escaped.Replace(UriRfc3986CharsToEscape[i],
    Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
 }
 Parameters = "&amp;text=" + escaped.ToString();</pre>
<p><strong>VB/Visual Basic:</strong> wie in C# (vgl. oben)</p>
<pre>Dim UriRfc3986CharsToEscape As String() = _
 New () {"!", "*", "'", "(", ")"}
Dim escaped As New _
  StringBuilder(Uri.EscapeDataString(txtTweet.Text.ToString()))
For i As Integer = 0 To UriRfc3986CharsToEscape.Length - 1
  escaped.Replace(UriRfc3986CharsToEscape(i), _
   Uri.HexEscape(UriRfc3986CharsToEscape(i)(0)))
Next i
Parameters = "&amp;text=" &amp; escaped.ToString()</pre>
<p><strong>Perl</strong>: Hier ist ein decode_utf8 ausreichend, z. B. bei Net::OAuth</p>
<pre>extra_params =&gt; {
       text =&gt; decode_utf8($nachricht)
}</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/634/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/634/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/634/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=634&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/07/16/oauth-probleme-mit-umlauten-losungen-fur-php-perl-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>
	</item>
		<item>
		<title>Tutorial: Twitter API mit PHP-Bordmitteln &#8211; So geht&#8217;s mit POST und GET</title>
		<link>http://frank-it-beratung.com/2011/06/12/tutorial-twitter-api-mit-php-bordmitteln-so-gehts-mit-post-und-get/</link>
		<comments>http://frank-it-beratung.com/2011/06/12/tutorial-twitter-api-mit-php-bordmitteln-so-gehts-mit-post-und-get/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 15:27:42 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Twitter API]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=625</guid>
		<description><![CDATA[In den letzten Wochen hatte ich in einem kurzen Tutorial beschrieben, wie man mit PHP-Bordmitteln ohne SDKs und Frameworks eine Twitter direct message bzw. Tweets verschicken kann. Wie John richtig in einer Mail geschrieben hat geht mein Code nur mit method=&#8220;POST&#8220;. Manchmal ist aber von der Twitter API ein GET vorgeschrieben, z. B. wenn man [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=625&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In den letzten Wochen hatte ich in <a title="Tutorial: Twitter API mit PHP-Bordmitteln" href="http://frank-it-beratung.com/2011/04/15/tutorial-twitter-api-mit-php-bordmitteln/">einem kurzen Tutorial</a> beschrieben, wie man mit PHP-Bordmitteln ohne SDKs und Frameworks eine Twitter direct message bzw. Tweets verschicken kann. Wie John richtig in einer Mail geschrieben hat geht mein Code nur mit method=&#8220;POST&#8220;. Manchmal ist aber von der Twitter API ein GET vorgeschrieben, z. B. wenn man auslesen möchte, welchen andere Twitter-User einen erwähnt haben (mentions). Deshalb hier die Info, wie es auch mit GET geht:</p>
<p><span id="more-625"></span></p>
<pre>#!/usr/local/bin/php5

&lt;?php

// Tutorial: Twitter via OAuth mit PHP Bordmitteln

echo "OAuth Tutorial";
echo "\n\n";

// OAuth Tokens User
$accesstoken = "???";
$accesssecret = "???";

// OAuth Keys App
$consumerkey ="???";
$consumerkeysecret="???";

// 1. Beispiel direct message an Simon_A_Frank
// $APIurl = "https://api.twitter.com/direct_messages/new.xml";
// $params="user=Simon_A_Frank&amp;text=";
// doppelt codieren, sonst gehen Umlaute, Sonder und Leerzeichen nicht
// $params.=rawurlencode(utf8_encode("Hallöchen Simon wie geht's?"));
// $reqmethod = "POST";

// 2. Beispiel: Einen Tweet versenden
// $APIurl = "http://api.twitter.com/1/statuses/update.xml";
// $params ="trim_user=true&amp;status=".
//     rawurlencode(utf8_encode("@Simon_A_Frank ok, wunderbar!"));
// $reqmethod = "POST";

// 3. Beispiel: Mit method=get Mentions lesen
$APIurl = "http://api.twitter.com/1/statuses/mentions.xml";
$params ="trim_user=true&amp;count=5";
$reqmethod = "GET";

// Request bauen ...
$srequest="oauth_consumer_key=".$consumerkey;
$srequest.="&amp;oauth_nonce=".rand(10000001,99999999);            
$srequest.="&amp;oauth_signature_method=HMAC-SHA1";
$srequest.="&amp;oauth_timestamp=" . time();        
$srequest.="&amp;oauth_token=" . $accesstoken;
$srequest.="&amp;oauth_version=1.0";
if ($params!="") {
    $srequest.="&amp;".$params;
}    

// Alle Parameter müssen sortiert sein
$sr=explode("&amp;",$srequest);
sort($sr);    
$srequestSorted=implode("&amp;",$sr);    

// Basestring und Key:
$key=$consumerkeysecret."&amp;".$accesssecret;      
$basestring=strtoupper($reqmethod)."&amp;".rawurlencode($APIurl).
  "&amp;".rawurlencode($srequestSorted);

// Signatur erzeugen
$sig=rawurlencode(base64_encode(hash_hmac('sha1', $basestring, $key, true)));    

// Signatur einfügen - für den Request muss diese nicht sortiert sein    
$srequest.="&amp;oauth_signature=$sig";

// Der Request ist fertig und sieht so aus:
echo "\nRequest: $srequest\n\n";

// POST oder GET?
if ($reqmethod=="POST") {
    $opts = array('http' =&gt;
        array(
            'method'  =&gt; 'POST',
            'header'  =&gt; 'Content-type: application/x-www-form-urlencoded',
            'content' =&gt; $srequest
        )
    );
} else
{
    $opts = array('http' =&gt;
        array(
            'method'  =&gt; 'GET'
        )
    );
    $APIurl=$APIurl."?".$srequest;    
}

// mit file_get_contents versenden
$result = file_get_contents($APIurl, false, stream_context_create($opts));
// Das Ergebnis ausgeben
echo "\nResult:\n" . $result;
echo "\n... das war's!\n";

?&gt;</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/625/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/625/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/625/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/625/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/625/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/625/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/625/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/625/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=625&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/06/12/tutorial-twitter-api-mit-php-bordmitteln-so-gehts-mit-post-und-get/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>
	</item>
		<item>
		<title>Tutorial: Twitter API neues Beispiel: Mit PHP einen Tweet senden</title>
		<link>http://frank-it-beratung.com/2011/05/16/tutorial-twitter-api-neues-beispiel-mit-php-einen-tweet-senden/</link>
		<comments>http://frank-it-beratung.com/2011/05/16/tutorial-twitter-api-neues-beispiel-mit-php-einen-tweet-senden/#comments</comments>
		<pubDate>Mon, 16 May 2011 15:23:23 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Twitter API]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=619</guid>
		<description><![CDATA[Letzten Monat hatte ich in einem kurzen Tutorial beschrieben, wie man mit PHP-Bordmitteln ohne SDKs und Frameworks eine Twitter direct message verschickt. Wegen den vielen Anfragen hier noch die kurze Ergänzung, wie man einen  Tweet senden kann. Dafür einfach folgende Zeilen austauschen: $APIurl = "http://api.twitter.com/1/statuses/update.xml"; [...] $params ="trim_user=true&#38;status=". rawurlencode(utf8_encode("@Simon_A_Frank So verschickt man einen Tweet!")); &#8222;trim_user=true&#38;&#8220; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=619&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Letzten Monat hatte ich in einem <a title="Tutorial: Twitter API mit PHP-Bordmitteln" href="http://frank-it-beratung.com/2011/04/15/tutorial-twitter-api-mit-php-bordmitteln/">kurzen Tutorial</a> beschrieben, wie man mit PHP-Bordmitteln ohne SDKs und Frameworks eine Twitter direct message verschickt. Wegen den vielen Anfragen hier noch die kurze Ergänzung, wie man einen  Tweet senden kann. Dafür einfach folgende Zeilen austauschen:</p>
<pre>$APIurl = "http://api.twitter.com/1/statuses/update.xml";
[...]
$params ="trim_user=true&amp;status=".
  rawurlencode(utf8_encode("@Simon_A_Frank So verschickt man einen Tweet!"));</pre>
<p>&#8222;trim_user=true&amp;&#8220; kann auch weggelassen werden &#8211; die bewrikt, dass die Rückmeldung nicht so ausführlich ist, Details siehe <a href="https://dev.twitter.com/docs/api" target="_blank">Twitter API Doku</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/619/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/619/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/619/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=619&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/05/16/tutorial-twitter-api-neues-beispiel-mit-php-einen-tweet-senden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>
	</item>
		<item>
		<title>Tutorial: Twitter API mit PHP-Bordmitteln</title>
		<link>http://frank-it-beratung.com/2011/04/15/tutorial-twitter-api-mit-php-bordmitteln/</link>
		<comments>http://frank-it-beratung.com/2011/04/15/tutorial-twitter-api-mit-php-bordmitteln/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 18:06:56 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Social Networks]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Twitter API]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=610</guid>
		<description><![CDATA[Um mit einem PHP Script auf  die Twitter API via OAuth zuzugreifen und einfache Aktionen durchzuführen, z. B. ein Tweet oder eine direct message zu versenden ist kein aufwendiges Framework oder SDK erforderlich, insbesondere, wenn man nur eine „Single User“ Lösung basteln möchte. Das Ganze geht auch mit PHP Bordmitteln &#8211; wie genau erklärt das [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=610&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Um mit einem PHP Script auf  die Twitter API via OAuth zuzugreifen und einfache Aktionen durchzuführen, z. B. ein Tweet oder eine direct message zu versenden ist kein aufwendiges Framework oder SDK erforderlich, insbesondere, wenn man nur eine „Single User“ Lösung basteln möchte. Das Ganze geht auch mit PHP Bordmitteln &#8211; wie genau erklärt das folgende Tutorial.<span id="more-610"></span></p>
<p>Mit „Single User“ sind hier kleine individualisierte Tools oder Scripte gemeint, die nur von einem User genutzt werden. Dadurch kann bei der Programmierung auf die etwas aufwendigere OAuth-Benutzerauthentifizierung und Generieung der Token verzichten kann. Stattdessen ist es hier einfacher, die Zugangsdaten (Tokens und Keys) manuell zu generieren Als erstes müssen Sie Ihr „Application“ bei Twitter registrieren:</p>
<ol start="1">
<li>Surfen Sie auf http://dev.twitter.com</li>
<li>Loggen Sie sich mit dem Twitter-Account ein, mit dem auch das Script ausgeführt werden soll.</li>
<li>Füllen Sie das Registrierungs-Formular aus. Application-Type: Browser, Callback-URL: leer lassen, Read&amp;Write auswählen.</li>
<li>Jetzt sehen Sie den Consumer Key und das Consumer Secret der Applikation.</li>
<li>Klicken Sie auf „My Access Token“. Dadurch genrieren Sie das Access Token sowie das Access Token Secret für den aktuell eingeloggten User.</li>
</ol>
<p>Das PHP Script sieht folgendermaßen aus (mit Absicht wurde hier auf OOP verzichtet, um PHP Einsteigern das Verständnis zu erleichtern):</p>
<pre>#!/usr/local/bin/php5

&lt;?php

// Tutorial: Twitter via OAuth mit PHP Bordmitteln
//   

echo "OAuth Tutorial";
echo "\n\n";

// OAuth Tokens
$accesstoken = "???";
$accesssecret = "???";

// OAuth Keys
$consumerkey ="???";
$consumerkeysecret="???";

// Beispiel: direct message an Simon_A_Frank
$APIurl = "https://api.twitter.com/direct_messages/new.xml";

// Parameter, bei direct messag user und text
$params="user=Simon_A_Frank&amp;text=";
// doppelt codieren, sonst gehen Umlaute, Sonder- und Leerzeichen nicht
$params.=rawurlencode(utf8_encode("Hallöchen Simon wie geht's?"));
$reqmethod = "POST";

// Request bauen ...
$srequest="oauth_consumer_key=".$consumerkey;
$srequest.="&amp;oauth_nonce=".rand(10000001,99999999);            
$srequest.="&amp;oauth_signature_method=HMAC-SHA1";
$srequest.="&amp;oauth_timestamp=" . time();        
$srequest.="&amp;oauth_token=" . $accesstoken;
$srequest.="&amp;oauth_version=1.0";
if ($params!="") {
    $srequest.="&amp;".$params;
}    

// Alle Parameter müssen sortiert sein
$sr=explode("&amp;",$srequest);
sort($sr);    
$srequestSorted=implode("&amp;",$sr);    

// Basestring und Key:
$key=$consumerkeysecret."&amp;".$accesssecret;      
$basestring=strtoupper($reqmethod)."&amp;".rawurlencode($APIurl).
    "&amp;".rawurlencode($srequestSorted);

// Signatur erzeugen
$sig=rawurlencode(base64_encode(hash_hmac('sha1', $basestring, $key, true)));    

// Signatur einfügen - für den Request muss diese
// scheinbar nicht sortiert sein    
$srequest.="&amp;oauth_signature=$sig";

// Der Request ist fertig und sieht so aus:
echo "\nRequest: $srequest\n\n";

// mit file_get_contents versenden
$opts = array('http' =&gt;
    array(
        'method'  =&gt; $reqmethod,
        'header'  =&gt; 'Content-type: application/x-www-form-urlencoded',
        'content' =&gt; $srequest
    )
);
// Das Ergebnis ausgeben
$result = file_get_contents($APIurl, false, stream_context_create($opts));
echo "\nResult:\n" . $result;
echo "\n... das war's!\n";

?&gt;</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/610/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/610/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/610/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=610&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/04/15/tutorial-twitter-api-mit-php-bordmitteln/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>
	</item>
		<item>
		<title>Tutorial: Die FriendFeed API mit C# (oder Visual Basic)</title>
		<link>http://frank-it-beratung.com/2011/03/26/tutorial-die-friendfeed-api-mit-c-oder-visual-basic/</link>
		<comments>http://frank-it-beratung.com/2011/03/26/tutorial-die-friendfeed-api-mit-c-oder-visual-basic/#comments</comments>
		<pubDate>Sat, 26 Mar 2011 17:57:50 +0000</pubDate>
		<dc:creator>Simon A. Frank</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[FriendFeed]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[FriendFeed API]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false">http://frank-it-beratung.com/?p=567</guid>
		<description><![CDATA[Nach den vielen Tutorials zu Facebook heute mal etwas zu dem m. E. vielfach unterschätzten Dienst FriendFeed. Dessen API ist eine feine Sache, da zum einen der Zugriff trotz OAuth relativ unkompliziert ist (es gibt sogar noch einen Basic Auth Zugang, der aber in Kürze abgestellt werden soll und deshalb hier keine Erwähnung findet). Zum anderen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=567&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nach den vielen Tutorials zu Facebook heute mal etwas zu dem m. E. vielfach unterschätzten Dienst <a href="http://www.FriendFeed.com">FriendFeed</a>. Dessen API ist eine feine Sache, da zum einen der Zugriff trotz OAuth relativ unkompliziert ist (es gibt sogar noch einen Basic Auth Zugang, der aber in Kürze abgestellt werden soll und deshalb hier keine Erwähnung findet). Zum anderen hat man via FriendFeed Zugriff auf knapp 60 Social Networks, kann also auf diesem Wege sozsuagen mit einer Schnittstelle sehr viel erreichen – z. B. Flickr, delicious, Digg, Mixx, Last.fm, YouTube uvm.</p>
<p>Als ich für ein Kundenprojekt die FriendFeed Anbindung programmiert habe bin ich fast verzweifelt. Ich habe es nicht geschafft, mit C# Daten via POST an FriendFeed zu senden - GET war kein Problem, da aber Status Updates und Bilduploads POST erfordern musst ich auch dies hinbekommen. Ich hatte bereits vor einiger Zeit eine FriendFeed Anbindung mit PHP realisiert und wusste, dass es eigentlich „ganz einfach“ gehen muss. Des Rätsels Lösung verrate ich unten – jetzt erstmals die Basics:</p>
<p><span id="more-567"></span></p>
<p>1. Als erstes muss man seine Application bei FriendFeed registrieren. Man wählt einen Namen und „Installed application“ (nicht „Browser“) sowie eine „FeedBack Group“ (bei der Nutzer der Application Fragen und Kommentare posten können). Ansonsten sind keine Einstellungen notwendig:</p>
<p><a href="http://friendfeed.com/api/register" target="_blank">http://friendfeed.com/api/register</a></p>
<p>2. Nach der Registrierung erhält man den Consumer Key sowie das Consumer Secret.</p>
<p>3. Jetzt erstellt man folgendes Form unter C# (oder Visual Basic) – die Express Edition ist ausreichend, hier im Screenshot die 2010er Version:</p>
<p><a href="http://frankitberatung.files.wordpress.com/2011/03/friendfeed_mit_csharp.jpg"><img class="size-full wp-image-578 alignnone" title="FriendFeed mit C#" src="http://frankitberatung.files.wordpress.com/2011/03/friendfeed_mit_csharp.jpg?w=600&#038;h=317" alt="" width="600" height="317" /></a></p>
<p>4. Für die Authentifizierung eines Users ist es einfacher als bei vielen anderen Social Networks (siehe z. B. meine Tutorials zu <a title="Twitter mit OAuth statt Basic Auth mit C# und .Net – Ein kurzes Tutorial" href="http://frank-it-beratung.com/2010/09/12/twitter-mit-oauth-statt-basic-auth-dotnet-csharp/">Twitter</a> oder <a title="Tutorial: Ein Facebook Pinnwandeintrag mit Visual Basic oder C# (Teil 1)" href="http://frank-it-beratung.com/2010/12/10/tutorial-ein-facebook-pinnwandeintrag-mit-visual-basic-oder-c-teil-1/">Facebook</a>). Es ist kein interner Browser notwendig, was die Sache unkomplizierter macht (aber auch die Gefahr mit sich bringt, dass ein App-Entwickler das Passwort des Users abspeichert - aber das ist ein anderes Thema). Für OAuth verwende ich die Klasse, die Eran Sandler dankenswerterweise erstellt hat (siehe Download auf <a href="http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs" target="_blank">Google Code</a>). Mit folgenden Code lassen sich die Tokens für einen User in FriendFeed ermitteln (hier in C#, Visual Basic siehe unten):</p>
<pre>//WebClient anlegen
WebClient myWebClient = new WebClient();

//oAuth anlegen
OAuth.OAuthBase oAuth = new OAuth.OAuthBase();

//Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
System.Net.ServicePointManager.Expect100Continue = false;

//ggf Umlaute in PW fixen
string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };
string Passwort=textBoxPassword.Text;
StringBuilder escaped = new StringBuilder(Uri.EscapeDataString(Passwort));
for (int i = 0; i &lt; UriRfc3986CharsToEscape.Length; i++)
{
  escaped.Replace(UriRfc3986CharsToEscape[i],
  Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
}
Passwort = escaped.ToString();
String FFReqParameters = "ff_username=" + textBoxUsername.Text
  + "&amp;ff_password=" + Passwort;

String OAuthReqParameters = "";
String RequestMethod = "GET";

//die Tokens und Keys
String AccessToken = "";
String AccessSecret = "";
String ConsumerKey = "???";
String ConsumerSecret = "???";

// Zeit und Nonce lassen sich mit Hilfe von OAuthBase einfach generieren
String Nonce = oAuth.GenerateNonce();
String Zeitstempel = oAuth.GenerateTimeStamp();

// Die URL muss mit Parametern (auch bei POST!) als String und
// URI vorligen - etwas verwirrend, aber so will es OAuthBAse
String APIUrl = "<a href="https://friendfeed.com/account/oauth/ia_access_token">https://friendfeed.com/account/oauth/ia_access_token</a>?"
  + FFReqParameters;

Uri APIUri = new Uri(APIUrl);

// Jetzt die Signature generieren
// außerdem wird hier die APIUrl normalisiert
// und OAuthReqParameters generiert
String signature = oAuth.GenerateSignature(APIUri, ConsumerKey, ConsumerSecret,
  AccessToken, AccessSecret, RequestMethod, Zeitstempel,
  Nonce, out APIUrl, out OAuthReqParameters);

// die Signatur fehlt noch im vorbereiteten Request
OAuthReqParameters = OAuthReqParameters + "&amp;" + "oauth_signature=" + signature;
string AntwortString = "";
Byte[] Antwort;

// Senden ...
try
{
  Antwort = myWebClient.DownloadData(
    "<a href="https://friendfeed.com/account/oauth/ia_access_token">https://friendfeed.com/account/oauth/ia_access_token</a>?"
    + OAuthReqParameters);
    AntwortString = System.Text.Encoding.ASCII.GetString(Antwort);
  System.Windows.Forms.MessageBox.Show(AntwortString);
}
catch (Exception ex)
{
  System.Windows.Forms.MessageBox.Show(ex.Message);
  return;
}

//Jetzt das Access-Token gan "mnauell" aus der Antwort filtern
string[] tokensplit = AntwortString.Split(new Char[] { '&amp;' });
foreach (string s in tokensplit)
{
  string[] zeilesplit = s.Split(new Char[] { '=' });
  if (zeilesplit[0] == "oauth_token")
  {
    textBoxAccessToken.Text = zeilesplit[1];
  }
  else if (zeilesplit[0] == "oauth_token_secret")
  {
    textBoxAccessTokenSecret.Text = zeilesplit[1];
  }
}</pre>
<p>5. Hat man die Access Tokens des Users ermittelt kann man nun beispielsweise ein Status Nachricht  senden (was noch alles geht siehe <a href="http://www.FriendFeed.com/api/" target="_blank">offizielle Doku der API</a>).  Wie oben bereits angedeutet kann man da nun verzweifeln, denn FriendFeed akzeptiert POST via C# nicht so einfach. Zuerst habe ich einen Fehler in der OAuth-Signatur vermutet, nach ausführlichem Test und Analyse des Netzwerkverkehrs war mir klar, dass es an dem Request-Header liegt. Hier wartet FreindFeed auf „Content-type: application/x-www-form-urlencoded&#8220;, die der .Net WebClient jedoch nicht sendet. Mit folgender Zeile war dann das Problem gelöst:</p>
<pre>myWebClient.Headers.Add(
"Content-type: application/x-www-form-urlencoded");</pre>
<p>6. Hier nun der komplette Code:</p>
<pre> //WebClient anlegen
 WebClient myWebClient = new WebClient();

 //Wer folgende Zeile vergisst wird verzweifeln:
 myWebClient.Headers.Add("Content-type: application/x-www-form-urlencoded");

 //oAuth anlegen
 OAuth.OAuthBase oAuth = new OAuth.OAuthBase();

 //Except100 ausschalten, sonst gibt es u. U. Fehlermeldungen
 System.Net.ServicePointManager.Expect100Continue = false;

 //ggf Umlaute in Nachricht fixen:           
 string[] UriRfc3986CharsToEscape = new[] { "!", "*", "'", "(", ")" };
 string Nachricht = textBoxNachricht.Text;
 StringBuilder escaped =
 new StringBuilder(Uri.EscapeDataString(Nachricht));
 for (int i = 0; i &lt; UriRfc3986CharsToEscape.Length; i++)
 {
   escaped.Replace(UriRfc3986CharsToEscape[i],
   Uri.HexEscape(UriRfc3986CharsToEscape[i][0]));
 }
 Nachricht = escaped.ToString();

 string FFReqParameters = "format=xml&amp;body=" + Nachricht;
 string OAuthReqParameters = "";
 string RequestMethod = "POST";

 //die Tokens und Keys
 string AccessToken = textBoxAccessToken.Text;           
 string AccessSecret = textBoxAccessTokenSecret.Text;           
 string ConsumerKey = "???";
 string ConsumerSecret = "???";

 // Zeit und Nonce lassen sich mit Hilfe von OAuthBase einfach generieren
 string Nonce = oAuth.GenerateNonce();
 string Zeitstempel = oAuth.GenerateTimeStamp();

 // Die URL muss mit Parametern (auch bei POST!) als String und vorliegen           
 string APIUrl = "<a href="http://friendfeed-api.com/v2/entry">http://friendfeed-api.com/v2/entry</a>" + "?" + FFReqParameters;
 Uri APIUri = new Uri(APIUrl);

 // Jetzt die Signature generieren
 // außerdem wird hier die APIUrl normalisiert
 // und OAuthReqParameters generiert           
 String signature = oAuth.GenerateSignature(APIUri, ConsumerKey, ConsumerSecret,
   AccessToken, AccessSecret, RequestMethod, Zeitstempel,
   Nonce, out APIUrl, out OAuthReqParameters);

 // die Signatur fehlt noch im vorbereiteten Request
 OAuthReqParameters = OAuthReqParameters + "&amp;" + "oauth_signature=" + signature;

 // Senden ...
 string AntwortString = "";
 Byte[] Antwort;
 try
 {
   Antwort = myWebClient.UploadData(APIUri,
   RequestMethod, Encoding.UTF8.GetBytes(OAuthReqParameters));
   AntwortString = System.Text.Encoding.ASCII.GetString(Antwort);
   System.Windows.Forms.MessageBox.Show("Erfolgt - Antwort: " + AntwortString);
 }
 catch (WebException ex)
 {
   System.Windows.Forms.MessageBox.Show(ex.Message);               
 }
}</pre>
<p>Noch ein abschließender Tipp: Die FriendFeed Server sind sehr häufig überlastet. Es lohnt sich also, einen Vorgang zwei oder dreimal zu wiederholen, bevor man einen Fehler im eigenen Code sucht.</p>
<p>Und hier noch die Codebeispiele in VisualBasic:</p>
<p><a href="http://www.frank-it-beratung.de/tutorialsetc/FriendFeed.vb.txt" target="_blank">FriendFeed.vb</a> (dafür benötigen Sie <a href="http://www.frank-it-beratung.de/tutorialsetc/OAuthBase.vb.txt" target="_blank">OAuthBase.vb</a>, Details dazu finden Sie <a title="Twitter API mit OAuth und Visual Basic" href="http://frank-it-beratung.com/2010/11/11/twitter-api-mit-oauth-und-visual-basic/" target="_blank">hier</a>).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/frankitberatung.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/frankitberatung.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/frankitberatung.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/frankitberatung.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/frankitberatung.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/frankitberatung.wordpress.com/567/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/frankitberatung.wordpress.com/567/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/frankitberatung.wordpress.com/567/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frank-it-beratung.com&amp;blog=8626129&amp;post=567&amp;subd=frankitberatung&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frank-it-beratung.com/2011/03/26/tutorial-die-friendfeed-api-mit-c-oder-visual-basic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/f05b723c4d2e03a33a32270107af8511?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Simon</media:title>
		</media:content>

		<media:content url="http://frankitberatung.files.wordpress.com/2011/03/friendfeed_mit_csharp.jpg" medium="image">
			<media:title type="html">FriendFeed mit C#</media:title>
		</media:content>
	</item>
	</channel>
</rss>
