بوٹ کی تفصیلات
پائیتھون اسکرپٹ
نام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 بیان کے دو بلاک بنائے گئے ہیں:

  1. پہلے originPage کی موجودگی کی جانچ کی گئی ہے
  2. اگر پہلا صفحہ خالی ہوا تو پھر 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

اسکرپٹ

ترمیم

اسکرپٹ کا مکمل کوڈ درج ذیل ہے۔