-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathpatrolpage.py
More file actions
executable file
·219 lines (179 loc) · 16.2 KB
/
Copy pathpatrolpage.py
File metadata and controls
executable file
·219 lines (179 loc) · 16.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/usr/bin/env python3
# author: https://github.com/vladiscripts
import requests
import re
from dataclasses import dataclass
import pywikibot as pwb
namespaces_excluded = r'(?:Special|Служебная|Участник|User|У|U|Обсуждение[ _]участника|User talk|ОУ|Википедия|ВП|Обсуждение[ _]Википедии|Обсуждение):'
closing_tpls = re.compile(r'\{\{([Оо]тпатрулировано|[Пп]атр|[Оо]тпат|[Сс]делано|[Dd]one|[Оо]тклонено)\s*(?:\|.*?)?\}\}')
sections_re = re.compile(r'\n={2,}[^=]+={2,}\n.*?(?=\n={2,}[^=]+={2,}\n|$)', flags=re.S)
# link_not_striked_re = re.compile(r'\s*(?<!<s>)\s*(\[\[(?!%s)(?!%s).*?\]\])' % (interwiki_prefix, namespaces_excluded), flags=re.I) # не зачёркнутая ссылка
link_title_re = re.compile(r'\[\[([^]|]+).*?\]\]') # заголовок целевой страницы из ссылки
link_re = re.compile(r'\s*(\[\[(?!%s).*?\]\])' % namespaces_excluded, flags=re.I)
@dataclass
class ForumPageChangedStatus:
is_patrolled_page_found = False
is_section_closed = False
@dataclass
class Link:
wikilink: str
pwb_link: pwb.Link
api_data: dict | None = None
s = requests.Session()
s.headers = {'User-Agent': '[[w:ru:User:TextworkerBot]] / page revision checker'}
site = pwb.Site('ru', 'wikipedia', user='TextworkerBot')
def get_pagesdata_from_api(links: dict[str, Link]) -> dict:
""" https://ru.wikipedia.org/w/api.php?action=query&format=json&prop=flagged|info&utf8=1&titles=ЗАГЛАВИЕ # или ЗАГЛАВИЕ1|ЗАГЛАВИЕ2 """
params = {'action': 'query', 'prop': 'flagged|info', 'titles': '|'.join(links.keys()), 'format': 'json', 'utf8': 1, } # 'redirects': 1
r = s.get(url='https://ru.wikipedia.org/w/api.php', params=params)
api_pages = r.json()['query'].get('pages')
if not api_pages:
print(f"нет ['query']['pages'] в {r.request.url}")
return {}
for p in api_pages.values():
if link := links.get(p['title']):
link.api_data = p
else:
print(f'не найден title "{p["title"]}" в {r.request.url}')
return links
def is_page_patrolled(p: dict) -> bool:
""" API's doc: https://ru.wikipedia.org/w/api.php?action=help&modules=query%2Bflagged """
if 'flagged' in p and 'stable_revid' in p['flagged'] and 'pending_since' not in p['flagged']:
return True # патрулировано
else:
return False # не патрулировано
def get_links_not_striked(text) -> list[str]:
text_cropped = re.sub(r'\n *([*:]{2,}).+?\n', r'\n', text, flags=re.S) # удаление обсуждений из раздела, оставляем заголовок и первый запрос
text_striked_cleaned = re.sub(r'<s>.*?</s>', '', text_cropped, flags=re.S | re.I) # удаляем всё, что внутри <s> ... </s>
links = link_re.findall(text_striked_cleaned)
return links
def links_to_dict_with_filter(wikilink_not_striked) -> dict[str, Link]:
""" Сборка ссылок в словарь, с отфильтровкой интервик и пространств имён. """
links = {}
for wikilink in wikilink_not_striked:
pwb_link = pwb.Link(link_title_re.match(wikilink).group(1), site)
pwb_link.parse()
if pwb_link._is_interwiki:
continue
if pwb_link.namespace.id == 0:
links[pwb_link.title] = Link(wikilink=wikilink, pwb_link=pwb_link)
elif pwb_link.namespace.id in [6, 10, 14]:
links[f'{pwb_link.namespace.custom_name}:{pwb_link.title}'] = Link(wikilink=wikilink, pwb_link=pwb_link)
return links
def section_links_processing(d: ForumPageChangedStatus, section: str, redirects: set) -> tuple[ForumPageChangedStatus, str, set]:
""" Проверка ссылок в разделе, зачёркивание """
if wikilink_not_striked := get_links_not_striked(section): # не зачёркнутые викиссылки
if links_filtered := links_to_dict_with_filter(wikilink_not_striked):
links = get_pagesdata_from_api(links_filtered)
for title, link in links.items():
if is_page_patrolled(link.api_data):
# ссылка отпатрулирована, зачёркиваем
d.is_patrolled_page_found = True
section = section.replace(link.wikilink, f'<s>{link.wikilink}</s>')
if 'redirect' in link.api_data:
# ссылка является перенаправлением
redirects.add(title)
return d, section, redirects
def section_closing(d: ForumPageChangedStatus, section: str, redirects: set) -> tuple[ForumPageChangedStatus, str]:
""" Установка шаблона {{отпатрулировано}} в раздел, где все ссылки отпатрулированы """
wikilink_not_striked = get_links_not_striked(section)
if wikilink_not_striked:
# есть не зачёркнутые (не отпатрулированные) викиссылки в разделе, ничего не делаем
pass
else:
# все ссылки зачёркнуты (отпатрулированы), закрываем раздел
section = section.rstrip()
if not redirects:
section = '%s\n: {{отпатрулировано}} участниками. --~~~~\n' % section
else:
section = '%s\n: {{отпатрулировано}} участниками. В запросе были перенаправления: %s. --~~~~\n' \
% (section, ', '.join(['[[%s]]' % t for t in redirects]))
d.is_section_closed = True
return d, section
def main():
workpages = ['Википедия:Запросы к патрулирующим',
'Википедия:Запросы к патрулирующим от автоподтверждённых участников']
for workpage in workpages:
# Загрузка страницы запросов
page = pwb.Page(site, workpage)
page_text = page.get()
d = ForumPageChangedStatus()
# Проверка разделов
sections = [section for section in sections_re.findall(page_text)]
for section in sections:
if link_re.search(section):
redirects = set()
section_original = section
d, section, redirects = section_links_processing(d, section, redirects)
if not closing_tpls.search(section):
d, section = section_closing(d, section, redirects)
page_text = page_text.replace(section_original, section)
# Постинг
if d.is_patrolled_page_found or d.is_section_closed:
page.text = page_text
summary = 'зачеркнуто отпатрулированное, автоитог' if d.is_section_closed else 'зачеркнуто отпатрулированное'
page.save(summary)
def _test():
d = ForumPageChangedStatus()
page_text = """
== [[SEV-3]] ==
Стабилизированная версия, не патрулировалась при создании.
== <s>[[Австралийский речной угорь]]</s> ==
[[У:Macedoja|Macedoja]] ([[ОУ:Macedoja|обс.]]) 10:13, 28 февраля 2026 (UTC)
: {{отпатрулировано}} участниками. --[[У:TextworkerBot|TextworkerBot]] ([[ОУ:TextworkerBot|обс.]]) 00:10, 1 марта 2026 (UTC)
* Все статьи участника без категорий, плохо оформлены и т.д. И их патрулируют. Что стало с патрулирующими. [[У:BNovikov|BNovikov]] ([[ОУ:BNovikov|обс.]]) 16:34, 2 марта 2026 (UTC)
** А ещё участник не ставит [[Шаблон:Переведённая статья| шаблон <nowiki>{{переведённая статья}}</nowiki>]] в своих статьях и даже в истории правок не пишет, что переводит. Тем самым нарушает [[ВП:АП]] редакторов английской Википедии. [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 16:55, 2 марта 2026 (UTC)
*** Написал участнику на СО, что так делать не нужно [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 17:06, 2 марта 2026 (UTC)
** Круто [[У:Macedoja|Macedoja]] ([[ОУ:Macedoja|обс.]]) 16:17, 3 марта 2026 (UTC)
*** Что Вы имеете в виду под "Круто" в данном контексте?... [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 18:01, 3 марта 2026 (UTC)
**** Это не вам ответ,а BNovikov [[У:Macedoja|Macedoja]] ([[ОУ:Macedoja|обс.]]) 18:07, 3 марта 2026 (UTC)
***** Пожалуйста, если Вам делают конструктивные замечания по тому как должны выглядеть статьи - учитывайте их, например, я попросил Вас ставить [Шаблон:Переведённая статья]] в статьях, которые Вы переводите, но Вы даже после того как согласились их ставить добавили новую статью [[Тасманийская ловеттия]] не выставив соответствующий шаблон перевода. Я не понимаю почему Вы так поступили, если Вы сами подтвердили, что [[Служебная:Изменения/152013800|готовы]] их добавлять. Можете хотя бы сейчас добавить шаблон, пожалуйста (на соответствующую страницу обсуждения)? Нарушение авторских прав всё же серьёзное нарушение. {{pb}}+В этой статье желательно поправить ссылки, учитывая [[ВП:Википедия не АИ]] и [[ВП:АИ]]. В enwiki в соответствующих местах стоит настоящая ссылка, её можно перенести в русскую статью. Категории можно добавить по аналогии с тем, как делает BNovikov, предварительно поставив [[Википедия:Гаджеты/HotCat]] (с ним удобнее). [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 18:19, 3 марта 2026 (UTC)
****** Насчёт этого я всё понял уже,но я имел совсем другое ввиду.А за советы благодарю.И всегда готов их выслушать. [[У:Macedoja|Macedoja]] ([[ОУ:Macedoja|обс.]]) 18:32, 3 марта 2026 (UTC)
******* Хорошо, спасибо Вам за сотрудничество, ценю это. Моя просьба остаётся в силе — пожалуйста, прежде чем продолжать создавать новые статьи, устраните хотя бы эту проблему со старыми — расставьте шаблоны переводов. +Есть проблемы с оформлением, но это не так критично, в отличии от нарушения [[ВП:АП]] из-за переводов без указания авторов. [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 18:39, 3 марта 2026 (UTC)
***** Добавляется шаблон следующим образом: нужно вписать <nowiki>{{переведённая статья|en|название статьи на английском}}</nowiki> (аналогично с другими языками) сверху в коде страницы обсуждения. При желании можно указать и дополнительные параметры, параметры перечислены на странице шаблона. [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 18:31, 3 марта 2026 (UTC)
== Самые посещаемые страницы за 21.03.2026 ==
''Популярные статьи с большим количеством неотпатрулированных правок''
* <s>[[Евлоев, Мовсар Магомедович]]</s> — <small>19 в ТОП-1000</small> — '''31''' неотпатрулированных правок
* <s>[[Мёрфи, Лерон]]</s> — <small>52 в ТОП-1000</small> — '''50''' неотпатрулированных правок
** в ва [[ВАВА]]
* <s>[[Лычёва, Екатерина Александровна]]</s> — <small>90 в ТОП-1000</small> — '''17''' неотпатрулированных правок
** в ва [[ВАВА]]<br>
пололао
* <s>[[Туриченко, Кирилл Евгеньевич]]</s> — <small>281 в ТОП-1000</small> — '''61''' неотпатрулированных правок
* <s>[[Плей-офф Кубка Гагарина 2026]]</s> — <small>299 в ТОП-1000</small> — {{color|red|'''отсутствует первичное патрулирование'''}}
* <s>[[Jukebox trio]]</s> — <small>301 в ТОП-1000</small> — '''69''' неотпатрулированных правок
* <s>[[Долидзе, Роман Нодарович]]</s> — <small>365 в ТОП-1000</small> — '''102''' неотпатрулированных правок
* [[Бараневский, Иво]] — <small>807 в ТОП-1000</small> — {{color|red|'''отсутствует первичное патрулирование'''}}
* <s>[[Паттерсон, Сэм]]</s> — <small>957 в ТОП-1000</small> — {{color|red|'''отсутствует первичное патрулирование'''}}
-- [[У:QBA-II-bot|QBA-II-bot]] ([[ОУ:QBA-II-bot|обс.]]) 06:24, 22 марта 2026 (UTC)
== [[Шаблон:Германские племена]] ==
Неотпатрулированный шаблон
Отпатрулированная категория: [[Категория:Литература народов России]]
Отпатрулированный файл: [[Файл:Spiderman2.jpg]]
([[ОУ:Petsernik|обс.]]) 15:05, 72 мартобря 2326 (UTC)
== [[en:Vogue]] ==
[[ Vogue: Глазами редактора | werwrwrwr ]]
интервики — [[У:Petsernik|Petsernik]] ([[ОУ:Petsernik|обс.]]) 14:59, 72 мартобря 2326 (UTC)
== [[День пожарной охраны России]] ==
22 правки. — [[Special:Contributions/2A00:1370:8186:BB3:A30C:5EA3:D6AA:40E6|2A00:1370:8186:BB3:A30C:5EA3:D6AA:40E6]] 21:07, 30 апреля 2025 (UTC)
== [[Без обид]] ==
2 правки. — [[Special:Contributions/2A02:2378:1192:85A8:0:0:0:1|2A02:2378:1192:85A8:0:0:0:1]] 16:42, 30 апреля 2025 (UTC)
* {{Отпатрулировано}}. [[У:Ochota ta Wola|Ochota ta Wola]] ([[ОУ:Ochota ta Wola|обс.]]) 16:49, 30 апреля 2025 (UTC)
== <s>[[Государственный переворот в Пруссии 1932 года]]</s> ==
Создал статьи "Боксгеймские документы" и "Государственный переворот в Пруссии 1932 года" по аналогии с англоязычными версиями статей, немало добавил от себя— == — [[У:IStorik1991|IStorik1991]] ([[ОУ:IStorik1991|обс.]]) 20:11, 29 апреля 2025 (UTC)
* {{Отпатрулировано}}. [[У:Ochota ta Wola|Ochota ta Wola]] ([[ОУ:Ochota ta Wola|обс.]]) 14:44, 30 апреля 2025 (UTC)
"""
sections = [s for s in sections_re.findall(page_text)]
for section in sections:
if link_re.search(section):
redirects = set()
section_original = section
d, section, redirects = section_links_processing(d, section, redirects)
if not closing_tpls.search(section):
d, section = section_closing(d, section, redirects)
page_text = page_text.replace(section_original, section)
pass
pass
if __name__ == '__main__':
main()
# _test()