Revision 121014773 of "Benutzer:Inkowik/Test3" on dewiki

[[PureBasic]]
<pre>
; -------------------------------------------------------------
; MessageDelivery.pb (MD)
; posting messages on German Wikipedia user talk pages
; -- http://de.wikipedia.org --
;
; Author: Inkowik
; -- http://de.wikipedia.org/wiki/Benutzer:Inkowik --
;
; This code is using the PureBasicWikibot framework (PBWB)
; -------------------------------------------------------------

XIncludeFile "PBWB.pb"

Enumeration
  #_MD_XML_LOP
  #_MD_XML_CAT
EndEnumeration

Procedure MD_HandleArray(piMode.i)
;
; Array dimensionieren/freigeben
;
  If piMode = 0
    Global Dim gasUsers.s(0)
  ElseIf piMode = 1
    FreeArray(gasUsers())
  EndIf
EndProcedure

Procedure.s MD_TitleNormalizer(psString.s)
;
; Seitentitel anpassen, damit nur Benutzer-Diskussionen bearbeitet werden
;
  If Not FindString(psString, "Benutzer Diskussion:")
    psString = ReplaceString(psString, "Benutzerin Diskussion:", "Benutzer Diskussion:")
    psString = ReplaceString(psString, "User talk:", "Benutzer Diskussion:")
    psString = ReplaceString(psString, "Benutzer:", "Benutzer Diskussion:")
    psString = ReplaceString(psString, "Benutzerin:", "Benutzer Diskussion:")
    psString = ReplaceString(psString, "User:", "Benutzer Diskussion:")
  EndIf
  
  ProcedureReturn psString
EndProcedure

Procedure.i MD_LinksOnPage(psPage.s)
;
; fragt Links ab, die auf der Seite vorhanden sind
;
  Protected sResult.s
  Protected sUser.s
  Protected sContinue.s
  Protected *Node, *Node2
  Protected i.i
  Protected iNodeSize.i
  
  sContinue = ""
  
  Repeat
    
    If sContinue = ""
      sResult = PBWB_SendGET("http://de.wikipedia.org/w/api.php?action=query&titles=" + URLEncoder(psPage) + "&prop=links&plnamespace=2|3&pllimit=500&format=xml")
    Else
      sResult = PBWB_SendGET("http://de.wikipedia.org/w/api.php?action=query&titles=" + URLEncoder(psPage) + "&prop=links&plnamespace=2|3&pllimit=500&format=xml&plcontinue=" + sContinue)
    EndIf
    
    If sResult
      If CatchXML(#_MD_XML_LOP, @sResult, Len(sResult), 0, #PB_Ascii) And XMLStatus(#_MD_XML_LOP) = #PB_XML_Success
        
        sContinue = ""
         
        *Node = MainXMLNode(#_MD_XML_LOP) ; <api>
        *Node = ChildXMLNode(*Node)       ; <query> / <query-continue>
        
        Repeat
          If GetXMLNodeName(*Node) = "query-continue"
            *Node2 = ChildXMLNode(*Node)
            sContinue = GetXMLAttribute(*Node2, "plcontinue")
          ElseIf GetXMLNodeName(*Node) = "query"
            *Node2 = ChildXMLNode(*Node)        ; <pages>
            *Node2 = ChildXMLNode(*Node2)       ; <page>
            *Node2 = ChildXMLNode(*Node2)       ; <links>
            
            If *Node2
              iNodeSize = XMLChildCount(*Node2)
              ReDim gasUsers(ArraySize(gasUsers()) + iNodeSize)
              *Node2 = ChildXMLNode(*Node2)     ; 1. Childknoten von <links>
           
              i = 0
              Repeat
                sUser = GetXMLAttribute(*Node2, "title") ; Seitentitel aus XML-Attribut lesen
                sUser = MD_TitleNormalizer(sUser)        ; Titel normalisieren
                gasUsers(i) = sUser                      ; normalisiert, ins Array eintragen
             
                i = i + 1
                *Node2 = NextXMLNode(*Node2)              ; Pointer auf nächsten Knoten setzen
              Until *Node2 = 0                            ; kein weiterer Knoten mehr vorhanden
              FreeXML(#_MD_XML_LOP)
            Else
              PBWB_LogEntry("Keine Links auf der Seite " + psPage, 3)
              ProcedureReturn 0
            EndIf
          EndIf
        Until *Node = 0
      Else
        PBWB_LogEntry("Fehler in der XML-Struktur", 3)
        ProcedureReturn 0
      EndIf
    Else
      PBWB_LogEntry("Keine API-Rückgabe erhalten", 3)
      ProcedureReturn 0
    EndIf
  Until sContinue = ""
EndProcedure

Procedure.i MD_CatMember(psCategory.s)
;
; Benutzer aus Kategorie lesen
;
  Protected sResult.s
  Protected sUser.s
  Protected sContinue.s
  Protected *Node, *Node2
  Protected i.i
  Protected iNodeSize.i
  
  sContinue = ""
  
  Repeat
  
    If sContinue = ""
      sResult = PBWB_SendGET("http://de.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=" + URLEncoder(psCategory) + "&cmtype=page&cmnamespace=2&cmlimit=500&format=xml")
    Else
      sResult = PBWB_SendGET("http://de.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=" + URLEncoder(psCategory) + "&cmtype=page&cmnamespace=2&cmlimit=500&format=xml&cmcontinue=" + sContinue)
    EndIf
    
    If sResult
      If CatchXML(#_MD_XML_CAT, @sResult, Len(sResult), 0, #PB_Ascii) And XMLStatus(#_MD_XML_CAT) = #PB_XML_Success
        
        sContinue = ""
        
        *Node = MainXMLNode(#_MD_XML_CAT) ; <api>
        *Node = ChildXMLNode(*Node)       ; <query> / <query-continue>
        
        Repeat
          If GetXMLNodeName(*Node) = "query-continue"
            *Node2 = ChildXMLNode(*Node)
            sContinue = GetXMLAttribute(*Node2, "cmcontinue")
          ElseIf GetXMLNodeName(*Node) = "query" ; Knotenname = <query>
            *Node2 = ChildXMLNode(*Node)         ; <categorymembers>
            iNodeSize = XMLChildCount(*Node2)
            *Node2 = ChildXMLNode(*Node2)        ; 1. Childknoten von <categorymembers>
            
            If *Node2
              ReDim gasUsers(ArraySize(gasUsers()) + iNodeSize)
              i = 0
              Repeat   
                sUser = GetXMLAttribute(*Node2, "title") ; Seitentitel aus XML-Attribut lesen
                sUser = MD_TitleNormalizer(sUser)        ; Titel normalisieren
                gasUsers(i) = sUser                      ; normalisiert, ins Array eintragen
                
                i = i + 1
                *Node2 = NextXMLNode(*Node2) ; Pointer 2 auf nächsten Knoten setzen
              Until *Node2 = 0               ; kein weiterer Knoten mehr vorhanden
            Else
              PBWB_LogEntry("Keine Seiten in der Kategorie " + psCategory, 3)
              ProcedureReturn 0
            EndIf
          EndIf
          *Node = NextXMLNode(*Node) ; Hauptpointer auf nächsten Knoten setzen
        Until *Node = 0              ; kein weiterer Knoten mehr vorhanden
        FreeXML(#_MD_XML_CAT)
      Else
        PBWB_LogEntry("Fehler in der XML-Struktur", 3)
        ProcedureReturn 0
      EndIf
    Else
      PBWB_LogEntry("Keine API-Rückgabe erhalten", 3)
      ProcedureReturn 0
    EndIf
  Until sContinue = ""
EndProcedure

Procedure.i MD_Send(psLinkpage.s, psCategory.s, psMessage.s, psSummary.s)
;
; Nachricht an jeden aus dem zu erstellenden Array versenden
;
  Protected i.i, j.i
  Protected iSuccess.i

  MD_HandleArray(0)
  iSuccess = 1
  
  If psLinkpage
    If Not MD_LinksOnPage(psLinkpage)
      iSuccess = 0
    EndIf
  EndIf
  If psCategory
    If Not MD_CatMember(psCategory)
      iSuccess = 0
    EndIf
  EndIf
  
  If iSuccess
    For i = 0 To ArraySize(gasUsers()) ; Elemente nacheinander auslesen
      For j = 0 To ArraySize(gasUsers())
        If (gasUsers(i) = gasUsers(j)) And (i <> j)
          gasUsers(j) = ""
        EndIf
      Next j
      
      If gasUsers(i) <> ""
        If PBWB_EditPage("de.wikipedia.org", gasUsers(i), "", "&appendtext=" + PBWB_ToUTF8(psMessage) + "&nocreate=1&bot=1&minor=1&summary=Bot: " + psSummary)
          PBWB_LogEntry("Seite abgespeichert: " + gasUsers(i))
        EndIf
      EndIf
    Next i
  Else
    PBWB_LogEntry("Vorgang abgebrochen, da Fehler auftraten", 3)
    ProcedureReturn 0
  EndIf
  
  MD_HandleArray(1)
EndProcedure

Procedure MD()
;
; Allgemeines; was soll getan werden
;
  If PBWB_InitFramework("<user agent>", #PBWB_POSTHEADER_DEWIKI)
    If PBWB_Logon("de.wikipedia.org", "Username", "Password")
      
      ; ----
      MD_Send("Wikipedia:StammtischXYZ/Einladungsliste", "Kategorie:Benutzer:aus XYZ", "{{ers:Wikipedia:StammtischXYZ/Einladung}}", "Einladung zum 11. XYZ-Stammtisch")
      ; ----
      
      PBWB_Logoff("de.wikipedia.org")
    EndIf
    PBWB_FreeFramework()
  EndIf
EndProcedure

MD()
</pre>