Difference between revisions 121003976 and 121014773 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_WLHLOP
  #_MD_XML_CAT
EndEnumeration

Procedure MD_HandleArray(piMode.i)
;
; Array dimensionieren/freigeben
;
  If piMode = 0
    Global Dim gasUsers.s(500) ; 500 als Obergrenze, erspart Loopen der API-Requests0)
  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_WhatLinksHere(psPage.s)
;
; arbeitet über "Links auf diese Seite" -> reine Liste mit Links auf Benutzer
;
  Protected sResult.s
  Protected *Node
  Protected i.i
  Protected sUser.s
  
  sResult = PBWB_SendGET("http://de.wikipedia.org/w/api.php?action=query&titles=" + URLEncoder(psPage) + "&prop=links&pllimit=500&format=xml")
  
  If sResult
    If CatchXML(#_MD_XML_WLH, @sResult, Len(sResult), 0, #PB_Ascii) And XMLStatus(#_MD_XML_WLH) = #PB_XML_Success
      *Node = MainXMLNode(#_MD_XML_WLH) ; <api>
      *Node = ChildXMLNode(*Node)       ; <query>
      *Node = ChildXMLNode(*Node)       ; <pages>
      *Node = ChildXMLNode(*Node)       ; <page>
      *Node = ChildXMLNode(*Node)       ; <links>
     
      *Node = ChildXMLNode(*Node)        ; 1. Childknoten von <links>
     
      i = 0
      Repeat
        sUser = GetXMLAttribute(*Node, "title") ; Seitentitel aus XML-Attribut lesen
        sUser = MD_TitleNormalizer(sUser)       ; Titel normalisieren
        gasUsers(i) = sUser                     ; normalisiert, ins Array eintragen
       
        i = i + 1
        *Node = NextXMLNode(*Node)              ; Pointer auf nächsten Knoten setzen
      Until *Node = 0                           ; kein weiterer Knoten mehr vorhanden
      FreeXML(#_MD_XML_WLH)
    EndIf
  EndIf
EndProcedure

Procedure MD_CatMember(psCategory.s)
;
; Benutzer aus Kategorie lesen
;
  Protected sResult.s
  Protected *Node, *Node2
  Protected i.i
  Protected sUser.s
  
  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")
  
  If sResult
    If CatchXML(#_MD_XML_CAT, @sResult, Len(sResult), 0, #PB_Ascii) And XMLStatus(#_MD_XML_CAT) = #PB_XML_Success
      
      *Node = MainXMLNode(#_MD_XML_CAT) ; <api>
      *Node = ChildXMLNode(*Node)       ; <query> / <query-continue>
      
      Repeat
        If GetXMLNodeName(*Node) = "query" ; Knotenname = <query>
          *Node2 = ChildXMLNode(*Node)     ; <categorymembers>
          *Node2 = ChildXMLNode(*Node2)    ; 1. Childknoten von <categorymembers>
          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
        EndIf
        *Node = NextXMLNode(*Node) ; Hauptpointer auf nächsten Knoten setzen
      Until *Node = 0              ; kein weiterer Knoten mehr vorhanden
      FreeXML(#_MD_XML_CAT)
    EndIf
  EndIf
EndProcedure

Procedure MD_Send(piMethod.i, psParam.s, psMessage.s)
;
; Nachricht an jeden aus dem zu erstellenden Array versenden
;
  Protected i.i

  MD_HandleArray(0)

  If piMethod = 0             ; "Links auf diese Seite" abfragen
    MD_WhatLinksHere(psParam)
  ElseIf piMethod = 1         ; Kategorie abfragen
    MD_CatMember(psParam)
  EndIf
  
  For i = 0 To ArraySize(gasUsers()) ; Elemente nacheinander auslesen
    If gasUsers(i) <> ""
      PBWB_EditPage("de.wikipedia.org", gasUsers(i), "", "&appendtext=" + PBWB_ToUTF8(psMessage) + "&nocreate=1&bot=1&summary=Bot: Nachricht")
    EndIf
  Next iLinksOnPage(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(0, "Wikipedia:StammtischXYZ/Einladungsliste", "{{ers:Wikipedia:StammtischXYZ/Einladung}}")
      MD_Send(1, "Kategorie:Benutzer:aus XYZ", "{{ers:Wikipedia:StammtischXYZ/Einladung}}"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>