blog.darkstar.work - a simple url encoder/decoder

 a simple url encoder/decoder
 http://blog.darkstar.work

Labels

Wirtschaft (152) Pressefreiheit (131) Österreich (123) IT (98) code (62) Staatsschulden (37) EZB (27) Pensionssystem (16)

2014-09-20

Frage an Prof. Sinn bzgl. Quantitative Easing

Sehr geehrte Frau Rohwer, sehr geehrter Prof. Hans Werner Sinn,

ich sah das Video von Prof. Sinn zu Quantitative Easing:
http://news.yahoo.com/video/qe-no-longer-monetary-policy-153500818.html





und bitte Sie bei Gelegenheit um die Beantwortung folgender Fragen:

1. Die FED setze im Rahmen des 'Emergency Economic Stabilization Act of 2008'  Maßnahmen wie:
http://www.haas.berkeley.edu/groups/finance/QE_oct28_2011.pdf 

wobei das QE der FED viel umfassender war als Draghis bisheriges
Outright Monetary Transactions + Securities_Markets_Programme + LTRO, 
siehe: https://www.ecb.europa.eu/mopo/implement/omo/html/index.en.html

Wenn wir uns die Staatsausgaben der USA und die selbst in der Krise kontinuierlich niedrige Steuerbelastung für die
Wirtschaft ansehen, dann erkenne ich durchaus Vorteile im QE. 

Anmerkung1: Ich beziehe die Vorteile des QE hier rein auf angeschlagene aber nicht komplett bankrotte Banken als Maßnahme um diese Institute schneller wieder fit zu bekommen. Es geht hier nicht um Staatsanleihen oder die unterschiedliche Wirtschaftskraft der einzelnen Volkswirtschaften der EU-Mitgliedsstaaten (Ausschließlich Asset backed securities, die keinerlei Staatsanleihen indirekt oder direkt enthalten.)
Ohne QE müssten meiner Meinung nach angeschlagene aber noch good banks einige Zeit erhebliche Gebühren bei der Kreditvergabe an Kunden und bei den Einlagen der Sparer zusätzlich zu den üblichen Gebühren der Finanzdienstleister weiter verrechnen, einfach um die bad assets (Altlasten) in den Bilanzen langsam kontinuierlich wieder abbauen zu können. Dieser Strafaufschlag, strenge Kriterien von Basel-III wird die Kreditvergabe weiter an die Wirtschaft bremsen. (Basel-III heißt auch höhere EK-Quote, woher soll das Kapital eigentlich herkommen oder wo wird es dann fehlen, wenn es nachher im Tier 1+2 der Banken steckt? Ohne Quantitative Easing kann das für Basel-III noch fehlende Tier 1+2 Kapital der Banken nur entweder von Investoren oder vom Staat =direkt vom Steuerzahler oder in Form höherer Staatsschulden her kommen!)
Damit werden die Hauptkreditnehmer der Banken eher weiterhin Staaten bleiben und die ganze Geldmengenausweitung (die entsteht im wesentlichen durch Kredite) ist wieder so hauptsächlich wieder state driven und genau das wollen wir ja alle nicht, oder?
Vor allem wirds dann überhaupt nie gscheite (Guthaben-)Zinsen geben, wenn die Geldmengenausweitung hauptsächlich rein durch Staaten vorangetrieben wird und nicht durch eine innovative wettbewerbsfähige Wirtschaft, oder? 

Anmerkung2: Ich denke hier einmal nicht rein monetär, sondern in wirtschaftlicher und innovativer Leistung für die Gesellschaft, 
die in den USA jetzt bereits wieder und in Europa kaum stattfindet, an die sinkende Arbeitslosigkeit der USA und an eine verlorene Generation in den EU-Südländern, die den Einstieg ins Wirtschaftsleben komplett versäumte!

Frage: Wie sind Ihre Meinungen dazu?


2. Sie erwähnten in ihrem Interview nur die €-Südstaaten (Greece, Spain, Portugal, Italy) als problematisch bzgl. Wettbewerbsfähigkeit!
Mir ist vollkommen unklar, warum sie Frankreich nicht nannten.
In Frankreich sehe ich nämlich die größten Probleme von allen €-Staaten:


Frage: Sind Sie der Meinung, dass die Probleme von Frankreich tatsächlich so viel geringer sind? 
Ich bin auch der Ansicht, dass die EU-Südstaaten zu zögerlich Reformen umsetzen, aber wenigstens
fanden im Süden unter viel Druck doch kleine Reformen statt, auch was Nachhaltigkeit z.B. bei Pensionen angeht.
Frankreich zeigt keinerlei Willen zur Reform meiner Meinung nach!

Eine Kritik an der derzeitigen Form der Sozialdemokratie

Antwort auf folgenden Artikel der Sektion8

Lieber Niko Kowall,
ich möchte Kritik an der Sektion 8 üben.
Grund ist folgender Textabschnitt:
Da wir als Sektion 8 seit unseren Anfängen für eine politische, demokratische und kulturelle Wende in der SPÖ eingetreten sind, ...
Mir fehlt hier eindeutig sehr stark Arbeit und Wirtschaft!
In der Sektion 8 gibt es in der SPÖ das meiste Wirtschafts-Know-How.

Auch wenn Agenda Austria oder die IV in einigen Themen anderer Meinung sind, schätzen Sie sie wegen ihres fachlichen Wissens als Gesprächspartner. Ihre sachliche Argumentation bzgl. bedarfsorientierter Mindestsicherung hat effizienter & und schneller gewirkt, als wenn AK Steuer- oder Streikkeule geschwungen hätte.

Ich möchte die sozialpolitischen, kulturellen und gesellschaftlichen Errungenschaften der Ära Kreisky in keinster Weise schmälern, leider hat die SPÖ die wirtschaftlichen und investierenden Leistungen dieser Ära komplett vergessen. Hannes Androsch & Bruno Kreisky hatten 2 Ölkrisen zu bekämpfen (Rohstoffpreise +66%) und schafften es trotzdem wichtige Investitionen weiter zu finanzieren zu können (Uno-City, Donauinsel, gratis Schulbuch, Unis) und zusätzlich noch Österreichs Leistungsbilanz von negativ auf positiv zu drehen.

Diese herausragende Leistung wird nirgendwo erwähnt und geriet im Bewusstsein der meisten Sozialdemokraten in Vergessenheit. Ebenso die Politik der Vernunft von damals ist heutzutage leider vergessen. (War die ÖVP anfangs gegen die Donauinsel und witzelte über das Entlastungsgerinne, erkannte sie schnell, dass dieses Projekt wirtschaftlich doch sehr sinnvoll war. Aber Kreisky akzeptierte ebenso die Entscheidung des Volks gegen die Zwentendorf. Diese Politik der Vernunft und das akzeptieren von Niederlagen, besonders dann, wenn die Idee des anderen dann doch sinnvoll war, fehlt mir heutzutage immens)

Was mir noch fehlt und was ich der Sozialdemokratie sehr schwer übel nehme, sind Klassenkampfparolen in der Krise, wenn Sie gegen die wichtigsten Arbeitsplatzsicherer gerichtet sind. In den Krisen der 70er Jahre standen gemeinsame Initiativen für Arbeit und Wirtschaft vor dem Trennenden immer im Vordergrund. Erst, wenn die Wirtschaft wieder in Schwung kam und fette Gewinne schrieb, dann kehrte man zur Klassenkampfrhetorik in altgewohnter Manier zurück. Der Wirtschaft gehts im Moment nicht gut und viele KMUs verschwinden. Meiner Meinung nach können nur die Industrie und KMUs nachhaltig Arbeitsplätze (vor allem des Arbeiters) sichern.

Wenn Sie sich diese Rede von Finanzminister Hannes Androsch aus dem Jahr 1975 anhören, dann verstehen Sie hoffentlich besser, an was es mir in der SPÖ so sehr fehlt:

http://www.mediathek.at/trefferliste/searchword/czoxNToiSGFubmVzIEFuZHJvc2NoIjs=

2014-09-14

Wort zum Sonntag: Bösartiger Seitenhieb auf alle Linken & Neoliberalen!


Im Mittelalter war die Schere zwischen arm und reich (zwischen Lehensherrn – Leibeigenen) viel geringer als heute.
Allerdings war mit dem Zehent (Zehnte, 10%) die Besteuerung auch sehr schön extrem niedrig flat tax.

Trotzdem war die Lebensqualität, Bildung, Gesundheitswesen, Lebenserwartung im Mittelalter wesentlich schlechter als heutzutage und das obwohl
  • die Schere zwischen Arm und Reich viel kleiner war
  • die Steuern extrem geringer und flat tax mäßiger waren.
Schönen Herbst, Heinrich Elsigan.

France is in economic trouble, when I look at those indicators:

je pense, que la France est en difficulté économique, quand je regarde ces indicateurs:
http://www.tradingeconomics.com/france/indicators
Il faut faire des réformes!
France is in economic trouble I think, when I look at those indicators:
http://www.tradingeconomics.com/france/indicators
Thou must reform!

 Keynes paradigm:

  1. State increases spending in economic downturn
  2. State reduces spending in economy high

France forgot to implement the second part of keynes paradigm:

 Misunderstanding Keynes might be very dangerous!


Comparing Unemployed Persons between France & Germany



Some contries in Europe


Antwort an Agenda-Austria zu Piketty


Antwort auf folgenden “Piketty”-Artikel im Blog der Agenda Austria

Bisher hat noch fast jeder in der Piketty-Debatte einen sehr entscheidenden Punkt ignoriert:

“Die Besteuerung durch den Sozialstaat”

In bestimmten Ländern wird Einkommen aus Arbeit, unternehmerischer Tätigkeit, Vermietung, Verpachtung, Pension anderes besteuert als Einkommen aus Kapitalerträgen. Dies hat keinen plausiblen Grund, denn so wie der Financier das Risiko des Investors trägt, trägt der Unternehmer das unternehmerische Risiko und der Arbeiter wird im Falle von Insolvenz oder Fehlinvestition durch Kündigung oder Kurzarbeit auch am unternehmerischen und Investoren-Risiko beteiligt. Der Arbeiter hat meist eine bessere Absicherung des Risikos durch Arbeitslosenversicherung, aber diese Leistung wird ihm schon automatisch mit der Sozialversicherung verrechnet. Dafür kann der Arbeiter nur bedingt Dinge die er grundlegend zum Ausüben seiner Arbeit braucht (Wohnung, geordnete Lebensverhältnisse) steuerlich absetzen.

Hier wirkt sich also der Staat durch unterschiedliche Besteuerung von Einkommen einmal sehr stark auf die Vermögensbildung aus!

Jetzt mögen manche argumentieren, dass Kapitalerträge eigentlich gar nicht besteuert werden sollten, weil der Ertrag des Investors bereits mit Steuern auf Arbeit & SV beim Arbeiter, USt beim Umsatz, KÖST, etc. zig mal vorbesteuert wurden und dass auch beim Erben keine Einkommenssteuer anfällt. Gut erben tun die meisten 1-2x im Leben, ich würde Erbschaftssteuer als Einkommensteuer nur dann zahlen, wenn ich den Erbwert auf 25 Jahren gestückelt aufteilen kann und nicht als einmaliges Jahreseinkommen. Trotzdem ist Erben keine regelmäßige, nicht einmal eine unregelmäßige Einkommensart (mit Ausnahme junger Damen vielleicht, die sich viele alte Ehemänner der Reihe nach nehmen)

Ein Beispiel, wie sich Besteuerung auf das Einkommen auswirkt.
  • TOP-Manager hat ein Brutto-Jahresgehalt von 901.240,-€
    Sein Dienstgeber zahlt reine Lohnnebenkosten von 98,759,11 €
    Damit betragen die Personalkosten ziemlich genau 1 Mio. € (89c lass ich wegfallen)
    Das netto Jahresgehalt des TOP-Managers beträgt 476.678,49 €
  • Ein reicher Investor investiert in einen Fond.
    Sein Kapitalertrag im Jahr fällt in der Höhe von 1 Mio. € aus.
    Das netto Jahreseinkommen des Investors beträgt 750.000,-€
Man möge noch bedenken:

Kapitalertragssteuern machten im Jahr 2013 2,59 Mrd. € aus (heißt Kapitalerträge der Investoren vor Steuer waren 4x so hoch also 10,36 Mrd. €, wovon ihnen nach Steuer 7,77 Mrd. € blieb. Im Jahr 2000 betrugen die Einnahmen aus der KEST 1.,945 Mrd. €) Dem stehen Lohnsteuereinnahmen von 24,6 Mrd. € im Jahr 2013 gegenüber.

Quelle: http://goo.gl/vC6T3l

Weiters muss man beachten, dass der Arbeiter seine Lebensausgaben auch zu bestreiten hat. Für einen in Miete lebenden geschiedenen Arbeiter, der Alimente für seine Kinder und Pflegeregress für seine Eltern zu leisten hat, ist Vermögensaufbau von 0 weg eigentlich NIE möglich. Aber auch für den glücklicheren Arbeiter mit kleinem geerbten Haus im Eigentum wird es immer schwieriger Kapital zu bilden. Die Ursache hierfür ist ganz simpel, nur wie jeder ordentliche Kommunist ignoriert Piketty wahrscheinlich das Hauptproblem der Schwierigkeiten beim Kapitalaufbau des Arbeiters von 0 weg.

Dieses nennt sich sozialistischer Umverteilungsstaat!

Der Staat schlägt zig Steuern und Gebühren auf alles drauf, egal ob Parkraumbewirtschaftung, Kanalgebühr, UBahn-Steuer, Luftverdrängungssteuer, etc. Die Abgabenquote in Österreich stieg von 35% in den 1970ern auf 51% im Jahr 2014. Leute, die in den 1970ern sich Kapital aufbauten hatten es unendlich leichter und der einzige Grund hierfür ist der umverteilende (Un-)Sozialstaat!

In Frankreich ist das noch viel viel extremer, wie sehr der Staat sich überall ausgedehnt hat und überall mitschneidet, besteuert, reglementiert und Einkommens- und Vermögensverhältnisse von den meisten unbemerkt verschiebt!

2014-09-05

Draghi und der Forex

Donnerstag,  4. September 2014
Was mir im Forex komisch vorkam, nachdem Draghi den €-Leitzins um 0,10% Punkte auf 0,05% senkte.

Der € bricht kaum gegenüber dem politischen Zloty, dem ungarischen Forint, der tschechischen Krone und dem Schweizer Franken ein.

Der € bricht mittel gegenüber dem ¥ und der türkischen Lira ein.

Der € bricht sehr stark gegenüber dem US$, kanadischen Dollar, Signarpur $ und australischem Dollar ein.

und jetzt kommts: 
Der Schweizer Franken bricht ebenfalls stark gegenüber dem US$
ein: http://www.finanzen.at/devisen/chart/schweizer_franken-us_dollar-kurs

Noch interessanter wirds, wenn man sich den €/Rubel Kurs ansieht:
http://www.finanzen.at/devisen/chart/euro-russischer_rubel-kurs


2014-08-18

Hohe Steuern und Abgaben auf Arbeit wirken beschäftigungshemmend

Hohe Steuern und Abgaben auf Arbeit wirken beschäftigungshemmend,
mehr Belastung von Unternehmen wirkt in der Regel wachstumshemmend.
Steuern müssen sein, aber zu hohe Steuern wirken sich genauso destruktiv auf eine Volkswirtschaft aus, wie zu niedrige Steuern.
Österreich ist leider bereits in dem Bereich angelangt, wo nicht etwa zu hoher Kapital- oder Zinsdruck, sondern zu hoher Steuerdruck negativ auf die Wirtschaft wirkt.

Eine stärkere Besteuerung von betrieblich Vermögen wirkt ebenso beschäftigungs- und wachstumsverhindernd, genauso wie eine stärkere Besteuerung von Unternehmensbeteiligungen und betrieblich investiertem Fremdkapital.

Dass das Land die Krise relativ gut meistern konnte, ist der Vielseitigkeit von Österreichs Wirtschaft zu verdanken (besonders Industrie, Tourismus und Einnahmen aus dem Transit),
nur seit 2008 wird jede Reform verweigert, die Unternehmen azsgeraubt (Bankenabgabe, Mobilfunkfrequenzen) und in einer Tour Steuern und Abgaben erhöht oder neue erfunden aus Mangel an Pensions-, Verwaltungs-, Föderalismus-, Struktur-, Bildungs- und sonstigen Reformen.

http://www.christoph-neumayer.at/arbeitslosigkeit-auf-rekordhoch-wo-bleiben-die-reformen/#comment-138417

2014-07-25

Keine Verschwörungstheorie, weil ziemlich real extrapolierbar

Ich wiederhole es jetzt zum 1001 Mal: Österreich hat ein Problem mit dem Rentensystem. Darum geht es zwar hier nur peripher, aber ich nutze jede Gelegenheit um darauf hinzuweisen.

Erklärung für Dummies: Leute leben im Schnitt um 10 Jahre länger als 1970, gehen früher in Rente als in den 1970er Jahren, die Renten sind höher und die Alterspyramide sieht wie folgt aus:
Details unter: http://blog.area23.at/2014/06/pensionssystemproblematik-update.html

Fast überall in €uropa ist die demographische Situation ähnlich schwierig

Freuen wir uns, das ist eine zusätzliche Herausforderung zur Staatsschuldenkrise, Bankenkrise zusammen auch €-Krise genannt, 60% Jugenarbeitslosigkeit im Süden, u.s.w. u.s.f.
Darüber gibt's auch genügend wissenschaftliche und populärwissenschaftliche Artikel, siehe: 
http://deutsche-wirtschafts-nachrichten.de/2013/08/15/europa-wird-zum-seniorenheim/

Überalterung in USA, Japan, China 1-Kind Politik, EU nicht alleine bei geringer Fertilität (Fertilität von 4-5 in Afrika auch jetzt nicht so wahnsinnig hoch mehr bei härteren klimatischen Bedingungen, höherer Kindersterblichkeit, etc.)

http://infographics.economist.com/2014/fertility_20140528/

Das heißt: Fast die ganze Welt hat in baldiger Zukunft ein (eher mehrere) Rentenprobleme, aber dafür sicher weniger Probleme mit Bevölkerungsexplosion und wahrscheinlich auch etwas weniger Ressourcen-Konflikte!
Das heißt: Schwächeres Weltwirtschaftswachstum (ausgenommen Innovationen), weil weniger Erwerbstätige müssen mehr Rentner sichern: Bevölkerung wächst noch etwas (in die Höhe), weil Leute älter werden, aber nicht mehr so in die Breite (Fertilität)!


P.S.: In Bezug auf soziale würdige Alterssicherung für alle Senioren hätten wir prinzipiell vom Bereich des möglichen und machbaren kein Rentenproblem.
Wir haben ein Systemproblem und es fehlt der Wille zu sozial verträglichen machbaren Korrekturen.

2014-07-22

Wollen Sie ein Haus? Mit oder ohne Wohnbauförderung?

Eigentlich wäre normalerweise die Wohnbauförderung a Bledsinn, weil sie Steuern auf Arbeit stärker erhöht. 
Soweit die Theorie, aber 
ohne Wohnbauförderung => keine Landesdarlehen =>  Landeshypothekenbanken machen kein Gschäft. 
Und wer kommt dann für die Landeshaftungen auf?
Der Steuerzahler!


Diese Idee ist erst dann umsetzbar, sobald die Landeshaftungen 2018 für die Landeshypothekenbanken laut EU Recht nicht mehr gülting sind und die Landesbanken wieder besser aufgestellt!

2014-07-19

a simple twitter login tester in C#

using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.IO;
using System.Web;
using System.Windows.Forms;
// [...]

namespace TweetBotTestForm
{
    public partial class Form1 : Form
    {
        const string AUTHURL = "https://twitter.com/sessions";

        public Form1()
        {
            InitializeComponent();
            this.textUsername.Text = "AAA@BBB";
            this.textPassword.Text = "XXXXXXX";
        }
    

        private void buttonLogin_Click(object sender, EventArgs e)
        {
            this.textOutput.Clear();
            this.textOutput.Text = string.Format(
                "Posting Username \'{0}\' Password \'{1}\' in {2}\r\n\n",
                this.textUsername.Text, this.textPassword.Text, AUTHURL);

            Dictionary<string, string> postParams =
                new Dictionary<string, string>();

            postParams.Add("session[username_or_email]", textUsername.Text);
            postParams.Add("session[password]", textPassword.Text);
            postParams.Add("remember_me", "0");
            postParams.Add("redirect_after_login", "/");

            string responseText = this.HttpPostLogin(AUTHURL, postParams);
            this.textOutput.Text += "AuthToken: " + responseText + "\r\n\n";

            string webResultText = this.LoginTweet(AUTHURL,
                this.textUsername.Text, this.textPassword.Text);
            this.textOutput.Text += "WebClient: " + webResultText + "\r\n\n";

        }       

        /// <summary>
        /// twitter login test
        /// by using System.Net.WebClient class
        /// </summary>
        /// <param name="authUrl">twitter session url</param>
        /// <param name="username">username</param>
        /// <param name="password">password</param>
        /// <returns>AuthToken</returns>
        protected string LoginTweet(
            string authUrl,
            string username,
            string password
        )
        {
            WebClient webClient = new WebClient();

            NameValueCollection formData = new NameValueCollection();
            // formData["authenticity_token"] = "3f962756ee8ab2afb0e0cb35ae1c97117844a6c7";
            formData["remember_me"] = "0";
            formData["redirect_after_login"] = "/";
            formData["return_to_ssl"] = "false";
            formData["scribe_log"] = string.Empty;
            formData["session[username_or_email]"] = username;
            formData["session[password]"] = password;

           
            byte[] responseBytes =
                webClient.UploadValues(authUrl, "POST", formData);
            string result = Encoding.UTF8.GetString(responseBytes);

            webClient.Dispose();

            string authResponse = ParseTwitterSession(ref result);

            return authResponse; // result;
        }

        /// <summary>
        /// twitter login test
        /// by using System.Net.HttpWebRequest/HttpWebResponse class
        /// </summary>
        /// <param name="authUrl"></param>
        /// <param name="postParameters"></param>
        /// <returns></returns>
        protected string HttpPostLogin(
            string authUrl,
            Dictionary<string, string> postParameters
        )
        {
            string postData = "";

            foreach (string key in postParameters.Keys)
            {
                postData += HttpUtility.UrlEncode(key) + "="
                      + HttpUtility.UrlEncode(postParameters[key]) + "&";
            }

            HttpWebRequest myHttpWebRequest =
                (HttpWebRequest)HttpWebRequest.Create(authUrl);
            myHttpWebRequest.Method = "POST";

            byte[] data = Encoding.ASCII.GetBytes(postData);

            myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
            myHttpWebRequest.ContentLength = data.Length;

            Stream requestStream = myHttpWebRequest.GetRequestStream();
            requestStream.Write(data, 0, data.Length);
            requestStream.Close();

            HttpWebResponse myHttpWebResponse =
                (HttpWebResponse)myHttpWebRequest.GetResponse();

            this.textOutput.Text += "\r\n Cookie Count = " +
                myHttpWebResponse.Cookies.Count.ToString();
            this.textOutput.Text += "\r\n Header = " +
                myHttpWebResponse.Headers.ToString();
            this.textOutput.Text += "\r\n";

            Stream responseStream = myHttpWebResponse.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(
                responseStream,
                Encoding.Default
            );
            string pageContent = myStreamReader.ReadToEnd();

            myStreamReader.Close();
            responseStream.Close();
            myHttpWebResponse.Close();

            string authResponse = ParseTwitterSession(ref pageContent);

            return authResponse; // pageContent;
        }


        /// <summary>
        /// Dummy html code in response parsing
        /// very quick & dirty implemented
        /// </summary>
        /// <param name="pageContent">html response from webclient</param>
        /// <returns>authentication_token</returns>
        protected static string ParseTwitterSession(ref string pageContent)
        {
            string authResponse = string.Empty;
            if (pageContent.IndexOf("authenticity_token") < 0)
            {
                return authResponse;
            }
            pageContent = pageContent.Substring(

                pageContent.IndexOf("authenticity_token") + 18);

            while (pageContent.IndexOf("value=\"") > -1)
            {
                pageContent = pageContent.Substring(
                    pageContent.IndexOf("value=") + 8
                );
                if (pageContent.IndexOf('\"') > -1)
                {
                    string valueString =
                        pageContent.Substring(
                            0,
                            pageContent.IndexOf("\"")
                        );

                    if (valueString.Length > 37)
                    {
                        authResponse = valueString;
                        break;
                    }
                }
                else
                {
                    authResponse = string.Empty;
                    break;
                }
            }
            return authResponse;
        }

    }
}



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Net;
using System.IO;
using System.Web;

namespace TwitterTestLogon
{
    public partial class TweetLogin : Form
    {
        const string AUTHURL = "https://twitter.com/sessions";

        public TweetLogin()
        {
            InitializeComponent();
            this.textUsername.Text = "myemail@mydomain.org";
            this.textPassword.Text = "mypassword";
        }
  

        /// <summary>
        /// event that is fired, when buttonLogin clicked
        /// </summary>
        /// <param name="sender">sender, that fires event</param>
        /// <param name="e">EventArgs e</param>
        private void buttonLogin_Click(object sender, EventArgs e)
        {
            this.textOutput.Clear();
            this.textOutput.Text = string.Format(
                "Posting Username \'{0}\' Password \'{1}\' in {2}\r\n\n",
                this.textUsername.Text, this.textPassword.Text, AUTHURL);

            // create Dictionary<string, string> postParams with default parameters to post for twitter login
            Dictionary<string, string> postParams = new Dictionary<string, string>();
            postParams.Add("session[username_or_email]", textUsername.Text);
            postParams.Add("session[password]", textPassword.Text);
            postParams.Add("remember_me", "0");
            postParams.Add("redirect_after_login", "/");
            postParams.Add("return_to_ssl", "false");
            // postParams.Add("scribe_log", string.Empty);


            // get authentication Parameters from twitter Login via HttpPostLogin(AUTHURL, postParams);
            Dictionary<string, string> authTwitterParams = this.HttpPostLogin(AUTHURL, postParams);
            // write authentication Parameters to TextBox textOutput
            this.textOutput.Text += "\r\nTwitter Login POSTING via HttpWebRequest: \r\n";
            foreach (string ikey in authTwitterParams.Keys)
            {
                string ivalue =  authTwitterParams[ikey];
                this.textOutput.Text += ikey + " \t= "
                    + authTwitterParams[ikey] + "\r\n";
                
                try
                {
                    // add 4 authentication twitter parameters to postParams
                    if (ikey.StartsWith("Set-Cookie"))
                    {
                        string guest_id = HttpUtility.UrlDecode(ParseTwitterSession(ivalue, "guest_id"));
                        postParams.Add("guest_id", guest_id);
                        this.textOutput.Text += "guest_id" + " \t= " + guest_id + "\r\n";

                        string _twitter_sess = ParseTwitterSession(ivalue, "_twitter_sess");
                        postParams.Add("_twitter_sess", _twitter_sess);
                        this.textOutput.Text += "_twitter_sess" + " \t= " + _twitter_sess + "\r\n";

                        string ct0 = ParseTwitterSession(ivalue, "ct0");
                        postParams.Add("ct0", ct0);
                        this.textOutput.Text += "ct0" + " \t= " + ct0 + "\r\n";

                        string tdomain  = ParseTwitterSession(ivalue, "Domain");
                        postParams.Add("Domain", tdomain);
                        this.textOutput.Text += "Domain" + " \t= " + tdomain + "\r\n";
                    }   
                }
                catch (Exception ex)
                {
                    this.textOutput.Text += "\r\nException: " + ex.ToString() + "\r\n";
                }
            }

            // pass postParams from Dictionary<string, string> to NameValueCollection formData 
            NameValueCollection formData = new NameValueCollection();
            foreach (string pkey in postParams.Keys) { formData[pkey] = postParams[pkey]; }

            // get authentication Parameters from twitter Login via WebClientLoginTwitter(AUTHURL, formData);
            Dictionary<string, string> gotAuthParams = this.WebClientLoginTwitter(AUTHURL, formData);
            // write authentication Parameters to TextBox textOutput
            this.textOutput.Text += "\r\nTwitter Login POSTING via WebClient: \r\n";
            foreach (string ikey in gotAuthParams.Keys)
            {
                this.textOutput.Text += ikey + " \t= "
                        + gotAuthParams[ikey] + "\r\n";
            }            

        }
  

        /// <summary>
        /// twitter login test
        /// by using System.Net.HttpWebRequest/HttpWebResponse class
        /// </summary>
        /// <param name="authUrl">twitter session url</param>
        /// <param name="postParameters">parameter collection, that will be POSTed urlencoded to requested authUrl</param>
        /// <returns>Dictionary<string, string> authParams from response Headers and authenticity_token from response body</returns>
        protected Dictionary<string, string> HttpPostLogin(
   string authUrl, 
   Dictionary<string, string> postParameters
  )
        {
            string postData = "";
            // add all postParameters as an UrlEncoded string
            foreach (string key in postParameters.Keys)
            {
                postData += HttpUtility.UrlEncode(key) + "="
                      + HttpUtility.UrlEncode(postParameters[key]) + "&";
            }
            // get postData as byte[]
            byte[] data = Encoding.ASCII.GetBytes(postData);

            // create HttpWebRequest via authUrl // set POST Method, ContentType, ContentLength
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(authUrl); 
            myHttpWebRequest.Method = "POST";
            myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
            myHttpWebRequest.ContentLength = data.Length;

            // Write postParameters as byte[] to RequestStream of created HttpWebRequest
            Stream requestStream = myHttpWebRequest.GetRequestStream();
            requestStream.Write(data, 0, data.Length);
            requestStream.Close();

            // get HttpWebResponse now from HttpWebRequest
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

            // create twitterResponseHeaders Dictionary<string, string> 
            Dictionary<string, string> twitterResponseHeaders = new Dictionary<string, string>();

            // add key values from HttpWebResponse.Headers to twitterResponseHeaders Dictionary<string, string> 
            foreach (string hkey in myHttpWebResponse.Headers.AllKeys)
            {
                string hvalue = myHttpWebResponse.Headers[hkey];
                twitterResponseHeaders.Add(hkey, hvalue);
            }

            // get ResponseStream from HttpWebResponsem, read Content of ResponseStream and store it in string pageContent
            Stream responseStream = myHttpWebResponse.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(responseStream, Encoding.Default);
            string pageContent = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            responseStream.Close();

            // close HttpWebResponse received from HttpWebRequest
            myHttpWebResponse.Close();

            // parse authenticity_token hidden form value from received pageContent
            string authenticity_token = ParseTwitterAuthValue(ref pageContent, "authenticity_token");
            // and add it to twitterResponseHeaders Dictionary<string, string> 
            twitterResponseHeaders.Add("authenticity_token", authenticity_token);

            return twitterResponseHeaders; // pageContent;
        }
  

        /// <summary>
        /// twitter login test
        /// using System.Net.WebClient class
        /// </summary>
        /// <param name="authUrl">twitter session url</param>
        /// <param name="authParams">parameter collection, that will be POSTed as NameValueCollection formData to requested authUrl</param>
        /// <returns>Dictionary<string, string> authParams from response Headers and authenticity_token from response body</returns>
        protected Dictionary<string, string> WebClientLoginTwitter(
   string authUrl, 
   NameValueCollection formData
  )
        {
            WebClient webClient = new WebClient();

            // add authParams to NameValueCollection formData
           

            // POST to authUrl pairs in NameValueCollection formData via WebClient.UploadValues
            byte[] responseBytes = webClient.UploadValues(authUrl, "POST", formData);
            string result = Encoding.UTF8.GetString(responseBytes);

            Dictionary<string, string> responseHeaders = new Dictionary<string, string>();
            for (int rh = 0; rh < webClient.ResponseHeaders.Keys.Count; rh++)
            {
                string rhkey = webClient.ResponseHeaders.Keys[rh];
                string rhvalue = webClient.ResponseHeaders[rhkey];
                responseHeaders.Add(rhkey, rhvalue);
            }

            webClient.Dispose();
            
            string authResponse = ParseTwitterAuthValue(ref result, "authenticity_token");
            responseHeaders.Add("authenticity_token", authResponse);

            return responseHeaders; // result;
        }

  
        /// <summary>
        /// Dummy html code in response parsing
        /// very quick & dirty implemented
        /// </summary>
        /// <param name="pageContent">html response from webclient or httpwebresponse</param>
        /// <returns>authentication_token</returns>
        protected static string ParseTwitterAuthValue(ref string pageContent, string parseString)
        {
            int parseStringLength = parseString.Length; 
            if (string.IsNullOrEmpty(parseString) || (parseStringLength < 2)) {
                throw new ArgumentException("ParseTwitterSession(ref string pageContent, string parseString)\r\n, parseString is null, empty or to short for parse...");
            }
            
            string authResponse = string.Empty;
            if (pageContent.IndexOf(parseString) < 0)
            {
                return authResponse;
            }
            pageContent = pageContent.Substring(
                pageContent.IndexOf(parseString) + parseStringLength);

            while (pageContent.IndexOf("value=\"") > -1)
            {
                pageContent = pageContent.Substring(
                    pageContent.IndexOf("value=") + 8
                );
                if (pageContent.IndexOf('\"') > -1)
                {
                    string valueString =
                        pageContent.Substring(
                            0,
                            pageContent.IndexOf("\"")
                        );

                    if (valueString.Length > 37)
                    {
                        authResponse = valueString;
                        break;
                    }
                }
                else
                {
                    authResponse = string.Empty;
                    break;
                }
            }
            return authResponse;
        }

  
        /// <summary>
        /// Dummy html code in response parsing
        /// very quick & dirty implemented
        /// </summary>
        /// <param name="pageContent">html response from webclient or httpwebresponse</param>
        /// <returns>authentication_token</returns>
        protected static string ParseTwitterSession(string contentForSearch, string parseString)
        {
            int parseStringLength = parseString.Length;
            if (string.IsNullOrEmpty(parseString) || (parseStringLength < 2))
            {
                throw new ArgumentException("ParseTwitterSession(ref string pageContent, string parseString)\r\n, parseString is null, empty or to short for parse...");
            }
            string content2Parse = contentForSearch;
            string parsedValue = string.Empty;

            if (content2Parse.IndexOf(parseString) < 0)
            {
                return parsedValue;
            }
            content2Parse = content2Parse.Substring(
                content2Parse.IndexOf(parseString) + parseStringLength);

            while (content2Parse.IndexOf("=") > -1)
            {
                content2Parse = content2Parse.Substring(
                    content2Parse.IndexOf("=") + 1
                );
                if (content2Parse.IndexOf(';') > -1)
                {
                    string valueString =
                        content2Parse.Substring(
                            0,
                            content2Parse.IndexOf(";")
                        );

                    if (valueString.Length > 1)
                    {
                        parsedValue = valueString;
                        break;
                    }
                }
                else
                {
                    parsedValue = content2Parse;
                    break;
                }
            }
            return parsedValue;
        }

    }
}