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> All content in the above text box is licensed under the Creative Commons Attribution-ShareAlike license Version 4 and was originally sourced from https://de.wikipedia.org/w/index.php?diff=prev&oldid=121014773.
![]() ![]() This site is not affiliated with or endorsed in any way by the Wikimedia Foundation or any of its affiliates. In fact, we fucking despise them.
|