ویکیپیڈیا:درخواست منتقلی زمرہ جات/ترتیبات
نام | damz.py |
---|---|
زبان | پائیتھون |
تجربہ | ہاں |
صلاحیت کار | زمرہ جات کی منتقلی |
صارف | ZumrahBot |
نتائج | زمرہ جات کی منتقلی |
نمونۂ ترمیم | چند نمونے |
ڈاؤن لوڈ | [ یہاں سے] |
وپ:دمز کے لیے پائتھون کی جس اسکرپٹ سے مدد لی جاتی ہے، ذیل میں اس کی تکنیکی ترتیبات و تفصیلات دی جا رہی ہیں۔
نیچے #اسکرپٹ کی سرخی کے تحت جو کوڈ موجود ہے، اسے damz.py
کے نام سے محفوظ کریں اور اسے پائی ویکی بوٹ کی ڈائرکٹری میں موجود scripts نامی فولڈر میں رکھ دیں۔ بعد ازاں کمانڈ لائن پر جا کر اسے چلائیں۔ اگر وپ:دمز پر درخواستیں موجود ہوں تو یہ اسکرپٹ اپنا کام کرنے لگے گی۔
اسکرپٹ
ترمیماس بوٹ کی اسکرپٹ یہاں موجود ہے۔
اسکرپٹ کا تجزیہ
ترمیماس کوڈ میں دو کلاسیں زیر استعمال ہیں:
- CatMoveInput
- CatMoveBot
منتقلی زمرہ کی کلاس(CatMoveBot)
ترمیماس کلاس میں مندرجہ ذیل فنکشن موجود ہیں:
- __init__
- move
- run
ابتدائی فنکشن
ترمیمپہلے کلاس کے ابتدائی فنکشن میں چند ویکی سائٹ، رجوع مکرر ، لاگ پیج اور خلاصے جیسی چیزوں کو محفوظ کیا گیا ہے۔
def __init__(self, logPage=None, project='wikipedia'):
if logPage is None:
raise ValueError('Log page must be specified')
self.logPage = logPage
self.site = pywikibot.Site('ur', project)
self.redirTemplate = 'زمرہ رجوع مکرر'
# self.summary % (user, user, origin, destination)
self.summary = '[[وپ:دمز|خودکار: منتقلی زمرہ]] بدرخواست [[User:' + '%s|%s]] از [[:%s]] > [[:%s]]'
تبدیل(move) فنکشن
ترمیماس فنکشن میں خلاصے کے ویری ایبل سے تبصرے کی قیمت مقرر کی گئی ہے۔ اس کے بعد پرانی اور نئی زمرے سیٹ کیے گئے ہیں اور زمرہ منتقلی روبہ بلایا گیا ہے۔
def move(self, origin, destination, user):
comment = self.summary % (user, user, origin, destination)
cat = category.CategoryMoveRobot(
origin, destination, batch=True,
comment=comment, inplace=False, move_oldcat=True,
delete_oldcat=True, title_regex=None, history=False)
cat.run()
چلاؤ (run) فنکشن
ترمیماس فنکشن میں ٹاسک کے ویری ایبل سے بنیادی اور مطلوبہ ویکیپیڈیا صفحہ محفوظ کیا گیا ہے۔ اس کے بعد پائی ویکی بوٹ لائبریری کی مدد سے دونوں صفحات کا ڈیٹا بالترتیب originPage اور destinationPage میں حاصل کیا گیا ہے۔
دونوں صفحات کی پڑتال کی بنیاد پر if بیان کے دو بلاک بنائے گئے ہیں:
- پہلے originPage کی موجودگی کی جانچ کی گئی ہے
- اگر پہلا صفحہ خالی ہوا تو پھر destinationPage کی جانچ کی گئی ہے
فنکشن کوڈ
ترمیمdef run(self, task, user):
origin = task[0]
destination = task[1]
# Title of the destination page, without prefix
destTitle = re.sub('^(زمرہ|[Cc]ategory)\:', '', destination)
originPage = pywikibot.Page(self.site, origin)
destinationPage = pywikibot.Page(self.site, destination)
#originPageText = ''
#destinationPageText = ''
if originPage:
try:
originPageText = originPage.get()
# Replace contents with the {{Category redirect}} template
originPage.put(
'{{' + self.redirTemplate + '|' + destTitle + '}}',
self.summary % (user, user, origin, destination)) # corrected and replaced "destinatino" with destination
except Exception as err: # Added Exception as err code for modern error handling
# Failed to fetch page contents. Gracefully ignore!
print(err) # changed pass to print(err) to print the error
if destinationPage:
try:
originPageText = originPage.get()
# TODO: Remove old {{Category redirect}}
except Exception as err:
print(err) # changed pass to print(err) to print the error
self.move(origin, destination, user)
originPage = pywikibot.Page(self.site, origin)
منتقلی زمرہ ان پٹ کلاس(CatMoveBot)
ترمیماس کلاس میں مندرجہ ذیل فنکشن موجود ہیں:
- __init__
- loadCache
- updateCache
- verifyUser
- processInput
- getTaskList
شروعاتی فنکشن
ترمیمکلاس کے شروعاتی فنکشن میں پراجیکٹ کا نام ویکیپیڈیا، کیشے فائل، ٹاسک کا ڈیفالٹ پیج، موورز بوٹ کی مقدار، مقررہ حد کی قیمتوں کو محفوظ کیا گیا ہے۔ ایک متغیرہ کامیابی خلاصہ کی قمیت بھی مقرر کی گئی ہے۔
فنکشن کوڈ
ترمیم def __init__(self, cacheFile=None, project='wikipedia', threshold=3000):
"""
@param cacheFile: path to the local cache of previously validated users
"""
if cacheFile is None:
raise ValueError('Cache file location must be specified')
else:
self.cacheFile = cacheFile
self.cache = self.loadCache()
self.site = pywikibot.Site('ur', project)
self.tasksPageDefault = '{{/بالا}}'
self.moverBots = ['ZumraBot']
self.threshold = threshold
self.successSummary = 'خودکار : منتقلی زمرہ مکمل!'
کیشے لوڈ فنکشن
ترمیمکیشے فائل سے تمام متن پڑھ کر اسے txt نامی متغیرہ میں محفوظ کیا گیا۔ اگر txt خالی نہیں ہوا تو اسے json لائبریری فنکشن لوڈ کی مدد سے پڑھ کر کیشے متغیرہ میں محفوظ کرکے فنکشن کے آخر میں لوٹایا گیا۔ اگر txt خالی ہو تو کیشے کو ایک خالی ڈکشنری میں محفوظ کرکے فنکشن کے آخر میں واپس بھیج دیا جائے۔
فنکشن کوڈ
ترمیم def loadCache(self):
f = open(self.cacheFile, 'r', encoding='utf-8') # removed codecs as open now supports utf-8 encoding
txt = f.read().strip()
f.close()
if txt == '':
# Brand new cache file, will fail json.loads(), return an empty dictionary instead
cache = {}
else:
cache = json.loads(txt)
return cache
کیشے اپڈیٹ فنکشن
ترمیمکیشے فائل سے تمام متن پڑھ کر اسے json لائبریری کے فنکشن dumps کی مدد سے مخصوص فارمیٹ میں ڈھال کر فائل میں محفوظ کیا گیا۔
def updateCache(self, cache):
fh = open(self.cacheFile, 'w', encoding='utf-8')
fh.write(json.dumps(cache))
fh.close()
صارف تصدیق فنکشن
ترمیمصارف کی تصدیق کرتے ہوئے مثبت مقدار واپس پلٹا دیں اگر صارف کا نام پہلے سے کیشے میں موجود ہو۔ دوسری صورت میں صارف کی تبدیلیوں کا شمار اگر مقررہ حد سے زائد ہو تب ہی وہ صارف زمرہ منتقل کرنے کا اہل قرار پائے گا۔
def verifyUser(self, username):
username = username.replace(' ', '_')
# If we have already established that this user qualifies then don't verify the user again
if self.cache.get(username):
return True
# Only users whose edit count is larger than self.threshold can request category moves
params = {
'action': 'query',
'list': 'users',
'ususers': username,
'usprop': 'editcount'
}
try:
req = pywikibot.data.api.Request(site=self.site, **params)
query = req.submit()
if query['query']['users'][0]['editcount'] > self.threshold:
self.cache[username] = True
self.updateCache(self.cache)
return True
else:
return False
except:
return False
پراسیس ان پٹ فنکشن
ترمیماس فنکشن میں اصل کام سرانجام دیا جاتا ہے۔ سب سے پہلے ویکیپیڈیا صفحہ پائی ویکی بوٹ لائبریری کے فنکشن پیج سے حاصل کیا جاتا ہے۔ اس کے بعد متعلقہ صفحہ کا ویکی متن کشید کیا جاتا ہے۔ صفحہ کے تاریخچہ سے تازہ ترین دہرائی حاصل کی جاتی ہے اور اسے ایک متغیرہ ver_history میں محفوظ کر لیا جاتا ہے۔ اس کے بعد ver_history پر نیکسٹ فنکشن لاگو کرکے آخری تبدیلی حاصل کرکے اسے last_revision میں محفوظ کیا۔ نیکسٹ کا فنکشن اس لیے لاگو کیا گیا کیونکہ ver_history ایک جنریٹر ہے۔ last_revision ایک ڈکشنری ہے اس کی کلید user سے صارف کا نام حاصل کیا۔
def processInput(self, tasksPageName):
tasksPage = pywikibot.Page(self.site, tasksPageName)
try:
pageText = tasksPage.get()
#revisions = tasksPage.revisions() # replaced getVersionHistory() with revisions()
#pageHistory = list(revisions)
#lastUser = pageHistory[-1]['user']
ver_history = tasksPage.revisions(reverse=True,total=1) # Fetch only the latest revision
last_revision = next(ver_history) # ver_history is a generator, use next method to get iterator
lastUser = last_revision['user']
except pywikibot.isRedirectPage: # replaced IsRedirectPage() with isRedirectPage()
tasksPage = tasksPage.getRedirectTarget()
try:
pageText = tasksPage.get()
ver_history = tasksPage.revisions(reverse=True,total=1) # Fetch only the latest revision
last_revision = next(ver_history) # ver_history is a generator, use next method to get iterator
lastUser = last_revision['user']
except:
raise ValueError('Task list page not found!')
except:
raise ValueError('Task list page not found!')
if lastUser in self.moverBots:
print(json.dumps({
'result': 'Last edit was by a mover bot. Request ignored.'
}))
return False
elif self.verifyUser(lastUser):
print(json.dumps({ 'result': 'User verified. Processing task list.' }))
tasks = self.getTaskList(pageText)
tasksPage.put(self.tasksPageDefault, self.successSummary)
return {'tasks': tasks, 'user': lastUser}
else:
print(json.dumps({
'result': 'Last editor was not qualified. Request ignored.' }))
return False
ٹاسک لسٹ وصولی فنکشن
ترمیمdef getTaskList(self, taskText):
"""
Returns a list of lists, where each inner lists describe one category move request (i.e. [origin, destination]).
@param taskText: wikicode of the page containing category move requests
"""
# Commenting out text replacement as bala template is required
lines = taskText.split('\n')
wikiText = [line for line in lines if line.strip()]
#taskText = taskText.replace('{{/بالا}}','').replace('\r','').replace('\n\n','\n').strip()
taskList = []
for line in wikiText:
if line.startswith('*'): # change from line == '*' to line.startswith('*)
# Remove the * and any immediately following spaces
line = re.sub('^\* *', '', line)
# Unlink category links
if '[[' in line:
line = re.sub('\[\[\:(زمرہ|[Cc]ategory)\:([^\]]+)\]\]',
'\\1:\\2', line)
# Split by '>' or '@' (optionally surrounded by spaces)
if '>' in line or '@' in line:
pieces = re.split(' *[>@] *', line)
# Clean up category mentions
for i in range(0, len(pieces)):
# Make edit summaries more beautiful!
pieces[i] = pieces[i].replace('_', ' ')
# Add missing `Category` prefix
if (
re.search('^[Cc]ategory\:', pieces[i]) is None and
re.search('^زمرہ\:', pieces[i]) is None
):
pieces[i] = ':' + pieces[i]
# Add the pair to our task list
taskList.append(pieces)
else:
# Mention @ or > not found in the line
print('No ">" or "@" characters in the line')
return taskList
اسکرپٹ
ترمیماسکرپٹ کا مکمل کوڈ درج ذیل ہے۔