Twitter on Button Poster

  • Ich habe mal versucht mir ein Programm zu schreiben mit dem ich auf Knopfdruck twittern kann.
    Dazu habe ich mir dieses Script angeschaut:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "Icons.au3"
    #Include <WinAPI.au3>
    #include <WinHTTP.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hw_open = _WinHttpOpen("Twitter Poster")
    Global $hw_connect = _WinHttpConnect($hw_open, "twitter.com")
    Global $Eingelogt = 0

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $Token=_GetAuthenticity_Token()

    [/autoit] [autoit][/autoit] [autoit]

    $MainGUI = GUICreate("Twitter Poster", 550, 170, Default, Default)
    GUISetBkColor(0x5599BB)
    $eText=GUICtrlCreateEdit("",_WinAPI_GetSystemMetrics(4), 10, 500, 60, BitOR($ES_WANTRETURN,$ES_CENTER) )
    GUICtrlSetState($eText,$GUI_DISABLE)
    $eBenutzername=GUICtrlCreateInput("", 10, 90, 60, 20 )
    $ePw=GUICtrlCreateInput("", 10, 130, 60, 20, $ES_PASSWORD+$ES_AUTOHSCROLL )
    $LoginInfo=GUICtrlCreateLabel("<< Benutzername", 80, 90, 140, 25 )
    GUICtrlSetFont (-1, 12, 800, 4, "Comic Sans MS" )
    $PasswortInfo=GUICtrlCreateLabel("<< Passwort", 80, 130, 140, 25 )
    GUICtrlSetFont (-1, 12, 800, 4, "Comic Sans MS" )
    $EinlogInfo=GUICtrlCreateLabel("Einloggen...", 80, 110, 140, 25 )
    GUICtrlSetFont (-1, 12, 800, 2, "Comic Sans MS" )
    GUICtrlSetState($EinlogInfo,$GUI_HIDE)
    $AbsendenPic=GUICtrlCreatePic("", 400, 50 )
    _SetImage($AbsendenPic, @ScriptDir&"\Birdies\128\3.png")
    $LoginPic=GUICtrlCreatePic("", 220, 100, 50, 50)
    _SetImage($LoginPic, @ScriptDir&"\Birdies\login_128.png")
    $AusloggenPic=GUICtrlCreatePic("", 80, 100, 50, 50)
    _SetImage($AusloggenPic, @ScriptDir&"\Birdies\delete_item_128.png")
    GUICtrlSetState($AusloggenPic,$GUI_HIDE)
    WinSetTrans("Twitter Poster","",0)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    For $i=1 To 255 Step +2
    Sleep (10)
    WinSetTrans("Twitter Poster","",$i)
    WinMove("Twitter Poster","",@desktopwidth/2 - (295+$i)/2-2,@desktopheight/2 - 170/2-30)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $AbsendenPic
    If GUICtrlRead($eText)<>'' Then
    _Posten(GUICtrlRead($eText))
    GUICtrlSetData($eText,"")
    EndIf
    Case $LoginPic
    If GUICtrlRead($eBenutzername)<>'' And GUICtrlRead($ePw)<>'' Then
    GUICtrlSetState ($LoginInfo, $GUI_HIDE )
    GUICtrlSetState ($PasswortInfo, $GUI_HIDE)
    GUICtrlSetState ($EinlogInfo,$GUI_SHOW)
    _Einloggen(GUICtrlRead($eBenutzername),GUICtrlRead($ePw))
    Else
    MsgBox ( 48, "Logindaten fehlen", "Benutzername und Passwort bitte vorher eingeben" )
    EndIf
    Case $AusloggenPic
    _Ausloggen()

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetAuthenticity_Token()
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"GET", "/","HTTP/1.1", "http://twitter.com/")
    _WinHttpSendRequest($h_openRequest)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    Local $data=""
    Do
    $data&=_WinHttpReadData($h_openRequest)
    Until @error
    _WinHttpCloseHandle($h_openRequest)
    $result=StringRegExp($data,'<[^>]*?name="authenticity_token"[^>]*?value="(.*?)"',1)
    If @error Then
    $result=StringRegExp($data,'<[^>]*?value="(.*?)"[^>]*?name="authenticity_token"',1)
    If @error Then Return SetError(1,0,"")
    EndIf
    Return $result[0]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Einloggen($username,$pw)
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/sessions","HTTP/1.1", "http://www.twitter.com/")

    [/autoit] [autoit][/autoit] [autoit]

    $sPost = "authenticity_token="&$Token&"&session[username_or_email]="&_URIEncode($username)&"&session[password]="&_URIEncode($pw)&"&q="

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded"& @CRLF , $sPost)
    _WinHttpReceiveResponse($h_openRequest)
    Local $data=""
    Do
    $data&=_WinHttpReadData($h_openRequest)
    Until @error

    [/autoit] [autoit][/autoit] [autoit]

    If StringInStr($data,"Wrong Username/Email and password combination.") Then
    MsgBox ( 16, " Falsches Passwort ", "Das von ihnen eingegebene Passwort ist falsch" )
    GUICtrlSetState ($LoginInfo, $GUI_SHOW)
    GUICtrlSetState ($PasswortInfo, $GUI_SHOW)
    GUICtrlSetState ($EinlogInfo,$GUI_HIDE)
    Else
    $Eingelogt = 1
    GUICtrlSetState ($LoginPic, $GUI_HIDE )
    GUICtrlSetState ($LoginInfo, $GUI_HIDE )
    GUICtrlSetState ($PasswortInfo, $GUI_HIDE)
    GUICtrlSetState ($eBenutzername, $GUI_DISABLE)
    GUICtrlSetState ($ePw, $GUI_DISABLE)
    GUICtrlSetState ($EinlogInfo,$GUI_HIDE)
    GUICtrlSetState ($AusloggenPic,$GUI_SHOW)
    GUICtrlSetState ($eText,$GUI_ENABLE)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Posten($nachricht)
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/status/update","HTTP/1.1", "http://www.twitter.com/")

    [/autoit] [autoit][/autoit] [autoit]

    $sPost = "authenticity_token="&$Token&"&status="&_URIEncode($nachricht)&"&twttr=true&return_rendered_status=true"

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"& @CRLF, $sPost)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ If _WinHttpQueryDataAvailable($h_openRequest) Then
    ;~ Local $data=""
    ;~ Do
    ;~ $data&=_WinHttpReadData($h_openRequest)
    ;~ Until @error
    ;~ FileWrite ("Posten.htm", $data)
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ $header = _WinHttpQueryHeaders($h_openRequest)
    ;~ MsgBox(0, "Header", $header)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _URIEncode($sData)
    ; Author: Prog@ndy
    Local $aData = StringSplit(BinaryToString(StringToBinary($sData,4),1),"")
    Local $nChar
    $sData=""
    For $i = 1 To $aData[0]
    ;~ ConsoleWrite($aData[$i] & @CRLF)
    $nChar = Asc($aData[$i])
    Switch $nChar
    Case 45, 46, 48-57, 65 To 90, 95, 97 To 122, 126
    $sData &= $aData[$i]
    Case 32
    $sData &= "+"
    Case Else
    $sData &= "%" & Hex($nChar,2)
    EndSwitch
    Next
    Return $sData
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ausloggen()
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/sessions/destroy","HTTP/1.1", "http://www.twitter.com/")

    [/autoit] [autoit][/autoit] [autoit]

    $sPost = "authenticity_token="&$Token

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded"& @CRLF , $sPost)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    GUICtrlSetState ($eText,$GUI_DISABLE)
    GUICtrlSetState ($LoginPic, $GUI_SHOW )
    GUICtrlSetState ($LoginInfo, $GUI_SHOW )
    GUICtrlSetState ($PasswortInfo, $GUI_SHOW)
    GUICtrlSetState ($eBenutzername, $GUI_ENABLE)
    GUICtrlSetState ($ePw, $GUI_ENABLE)
    GUICtrlSetState ($EinlogInfo,$GUI_HIDE)
    GUICtrlSetState ($AusloggenPic,$GUI_HIDE)
    EndFunc

    [/autoit]

    Welches Perfekt funktioniert. Ich habe mir einige Code-Zeilen geklaut und daraus das gemacht:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "Icons.au3"
    #Include <WinAPI.au3>
    #include <WinHTTP.au3>
    #include "ModernMenuRaw.au3"

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("^t","go")
    Opt("guioneventmode",1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $hw_open = _WinHttpOpen("Twitter")
    Global $hw_connect = _WinHttpConnect($hw_open, "twitter.com")
    Global $Eingelogt = 0
    Global $tweetbutton, $gui
    Global $run = 0
    Global $input
    Global Const $Token=_GetAuthenticity_Token()

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(20)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _Einloggen(IniRead("login","login","name","name"),IniRead("login","login","pw","password"))

    [/autoit] [autoit][/autoit] [autoit]

    Func go()
    If $run = 0 Then
    $run = 1
    ElseIf $run = 1 THen
    $run = 0
    EndIf
    If $run = 0 Then GUIDelete($gui)
    If $run = 1 Then
    $gui = GUICreate("Twitter",500,60,-1,-1)
    $tweetbutton = GUICtrlCreateButton("Tweet",440,10,50,40)
    $input = GUICtrlCreateInput("",10,20,420,20)
    GUICtrlSetOnEvent($tweetbutton,"tweetbutton")
    GUISetOnEvent($GUI_EVENT_CLOSE,"_endfunc")
    GUISetState(@SW_SHOW)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func tweetbutton()
    _Posten(GUICtrlRead($input))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _endfunc()
    GUIDelete($gui)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Einloggen($username,$pw)
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/sessions","HTTP/1.1", "http://www.twitter.com/")

    [/autoit] [autoit][/autoit] [autoit]

    $sPost = "authenticity_token="&$Token&"&session%5Busername_or_email%5D="&_URIEncode($username)&"&session%5Bpassword%5D="&_URIEncode($pw)&"&q="

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded"& @CRLF , $sPost)
    _WinHttpReceiveResponse($h_openRequest)
    Local $data=""
    Do
    $data&=_WinHttpReadData($h_openRequest)
    Until @error

    [/autoit] [autoit][/autoit] [autoit]

    If StringInStr($data,"Wrong Username/Email and password combination.") Then
    MsgBox ( 16, " Falsches Passwort ", "Das von ihnen eingegebene Passwort ist falsch" )
    GUICtrlSetState ($LoginInfo, $GUI_SHOW)
    GUICtrlSetState ($PasswortInfo, $GUI_SHOW)
    GUICtrlSetState ($EinlogInfo,$GUI_HIDE)
    Else
    $Eingelogt = 1
    GUICtrlSetState ($LoginPic, $GUI_HIDE )
    GUICtrlSetState ($LoginInfo, $GUI_HIDE )
    GUICtrlSetState ($PasswortInfo, $GUI_HIDE)
    GUICtrlSetState ($eBenutzername, $GUI_DISABLE)
    GUICtrlSetState ($ePw, $GUI_DISABLE)
    GUICtrlSetState ($EinlogInfo,$GUI_HIDE)
    GUICtrlSetState ($AusloggenPic,$GUI_SHOW)
    GUICtrlSetState ($eText,$GUI_ENABLE)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetAuthenticity_Token()
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"GET", "/","HTTP/1.1", "http://twitter.com/")
    _WinHttpSendRequest($h_openRequest)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    Local $data=""
    Do
    $data&=_WinHttpReadData($h_openRequest)
    Until @error
    _WinHttpCloseHandle($h_openRequest)
    $result=StringRegExp($data,'<[^>]*?name="authenticity_token"[^>]*?value="(.*?)"',1)
    If @error Then
    $result=StringRegExp($data,'<[^>]*?value="(.*?)"[^>]*?name="authenticity_token"',1)
    If @error Then Return SetError(1,0,"")
    EndIf
    Return
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Posten($nachricht)
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/status/update","HTTP/1.1", "http://www.twitter.com/")

    [/autoit] [autoit][/autoit] [autoit]

    $sPost = "authenticity_token="&$Token&"&status="&_URIEncode($nachricht)&"&twttr=true&return_rendered_status=true"

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8"& @CRLF, $sPost)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ If _WinHttpQueryDataAvailable($h_openRequest) Then
    ;~ Local $data=""
    ;~ Do
    ;~ $data&=_WinHttpReadData($h_openRequest)
    ;~ Until @error
    ;~ FileWrite ("Posten.htm", $data)
    ;~ EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;~ $header = _WinHttpQueryHeaders($h_openRequest)
    ;~ MsgBox(0, "Header", $header)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _URIEncode($sData)
    ; Author: Prog@ndy
    Local $aData = StringSplit(BinaryToString(StringToBinary($sData,4),1),"")
    Local $nChar
    $sData=""
    For $i = 1 To $aData[0]
    ;~ ConsoleWrite($aData[$i] & @CRLF)
    $nChar = Asc($aData[$i])
    Switch $nChar
    Case 45, 46, 48-57, 65 To 90, 95, 97 To 122, 126
    $sData &= $aData[$i]
    Case 32
    $sData &= "+"
    Case Else
    $sData &= "%" & Hex($nChar,2)
    EndSwitch
    Next
    Return $sData
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ausloggen()
    Global $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/sessions/destroy","HTTP/1.1", "http://www.twitter.com/")

    [/autoit] [autoit][/autoit] [autoit]

    $sPost = "authenticity_token="&$Token

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded"& @CRLF , $sPost)
    _WinHttpReceiveResponse($h_openRequest)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_openRequest)
    GUICtrlSetState ($eText,$GUI_DISABLE)
    GUICtrlSetState ($LoginPic, $GUI_SHOW )
    GUICtrlSetState ($LoginInfo, $GUI_SHOW )
    GUICtrlSetState ($PasswortInfo, $GUI_SHOW)
    GUICtrlSetState ($eBenutzername, $GUI_ENABLE)
    GUICtrlSetState ($ePw, $GUI_ENABLE)
    GUICtrlSetState ($EinlogInfo,$GUI_HIDE)
    GUICtrlSetState ($AusloggenPic,$GUI_HIDE)
    EndFunc

    [/autoit]

    Dieses funktioniert allerdings nicht; es tweetet nichts. Warum?