Քանի որ չտեսությունում սպամում էին, իսկ ես ռադիկալ միջոցների էի դիմել, ու արգելել էի ոչ հայատառ ամենը, նույնիսկ նկարների անունները, մտածեցի որ ակտուալ չէ png֊ն գրել պնգ երբեմն։
Որոշեցի ավելացնել քափչա, բայց ոչ թե պարզապես քափչա, այլ հայրենական քափչա։ Որ հայերեն տառեր հարցնի։
mediawiki 18.3֊ի հետ գալիս է ConfirmEdit հավելումը։
Սկզբիվ պետք է գեներացնել քափչայի նկարները։ Ձեռնարնկներում ասում են, պետք է բառարան, ու ցույց են տալիս համակարգում ինչ որ բառարան։
Ես որոշեցի որպես բառարան օգտագործել aspell-hy պրոյեկտի ցանկը։
# emerge -f aspell-hy
Արխիվը բացելիս նկատում ենք hy-common.cwl նիշքը։ Այն պետք է բացել՝
# preunzip hy-common.cwl
Ստանում ենք hy-common.wl նիշքը որը արդեն կարելի է օգտագործել որպես բառարան։
Հիմա պետք է գեներացնել նկարները։
ConfirmEdit֊ը պարունակում է փայթոն սկրիպտ դրանք գեներացնելու համար
Այն ունի կախվածություն, Փայթոնի imaging գրադարանը՝
# emerge imaging
Նկարում ենք այսպես՝
#!/bin/bash SL=/home/noch/captcha WORDLIST=$SL/hy-common.wl FONT=$SL/ArTarumianGrqiNorBold.ttf #FONT=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf python $SL/captcha.py --font=$FONT --wordlist=$WORDLIST --key=PASSWORD --output=captcha --count=1000 --verbose
ArTarumianGrqiNorBold.ttf նիշքը դա իրականում իմ փոխած տարբերակն է, երբ ես ստացա նույն տառատեսակի յունիկոդ տարբերակը։
Այստեղ ինձ սպասում էր անակնկալ, որովհետեւ captcha.py սկրիպտը բնավ չի աշխատում ոչ լատինատար տառերի հետ։
Ասում էր՝ չեմ անի, քանզի «because it contains non-alphabetic characters» մեջբերման վերջ։
Ես փայթն չգիտեմ բնավ, սակայն ակնհայտ է, որ պետք է սկրիպտը փոխել։
Այսպիսի տող կա, որը ուշադրություն է գրավում։
r = re.compile('[^a-z]');
Ես չգիտեի, re֊ն որն է, կարդացի ձեռնարկ, ու փոխեցի այդ տողը հետեւյալով՝
re.U r = re.compile('[\u0000-\uFFFF]');
Ահա, հիմա սկրիպտը աշխատեց,
word is արՈԻ image_a8fdc272_5729344832344ace.png word is չաէյ image_4c6948ee_40c45604f8ac8c9c.png word is ԱնԻՄ image_5429d63a_5a72ee839989336f.png word is Մօաո image_2fc16caa_db478d58e1e0694b.png
սակայն գեներացրած պատկերների մեջ տառերի տեղը քառակուսիներ էին։
Ակնհայտ է, որ կոդավորման հետ խնդիր կար։
Բացի դրանից, կոդի այս հատցածը՝
print "word is %s" % word
կատարվելիս տպում էր չորս տառից բաղկացած բառեր, իսկ գեներացրած պատկերներում տառերը ութն էին։ Այսինքն հաստատ յունիկոդի հետ խնդիր է։
Սկզբից ես ենթադրեցի, որ իմ տողը յունիկոդ տող է, քանի որ սկրիպտի որ մասում էլ այն print չանեի, հայերեն գրում էր։
Ի վերջո, կանչվում էր
gen_captcha(word, font, 40, os.path.join(output, filename))
ֆունկցիան, որտեղ եւ գեներացվում է նկարը։
Ահա այս մասում է հաստատ խնդիրը՝
# create a font object font = ImageFont.truetype(fontname,fontsize) # determine dimensions of the text dim = font.getsize(text) # create a new image significantly larger that the text edge = max(dim[0], dim[1]) + 2*min(dim[0], dim[1]) im = Image.new('RGB', (edge, edge), bgcolor) d = ImageDraw.Draw(im) x, y = im.size # add the text to the image d.text((x/2-dim[0]/2, y/2-dim[1]/2), text, font=font, fill=fgcolor)
Կրկին նայեցի ձեռնարկը։
Պարզվում է կարելի է տառատեսակը բեռնել որպես յունիկոդ ֆոնթ՝
font = ImageFont.truetype(fontname,fontsize,encoding=’unic’) ImageFont.truetype(file, size, encoding=value) => Font instance
(New in 1.1.5) Load a TrueType or OpenType font file, and create a font object using the given encoding. Common encodings are “unic” (Unicode), “symb” (Microsoft Symbol), “ADOB” (Adobe Standard), “ADBE” (Adobe Expert), and “armn” (Apple Roman).
Փոխեցի, աշխատացրի, սակայն կրկին քառակուսիներ՝
Գուցե իմ տողը յունիկո՞դ չէ։
Բայց այն ոչ մի տեղ հայտարարված չէ, փայթոնում չեն հայտարարում օգտագործելուց առաջ։
Պարզվում է, ամեն մի տողը կարելի է դեքոդ անել՝
font = ImageFont.truetype(fontname,fontsize,encoding='unic') # determine dimensions of the text dim = font.getsize(text) # create a new image significantly larger that the text edge = max(dim[0], dim[1]) + 2*min(dim[0], dim[1]) im = Image.new('RGB', (edge, edge), bgcolor) d = ImageDraw.Draw(im) x, y = im.size # add the text to the image text0 = text.decode("utf-8") d.text((x/2-dim[0]/2, y/2-dim[1]/2), text0, font=font, fill=fgcolor)
Ահա, ստացանք հայրենական քափչա

Ես որոշեցի մեծացել փոփոխականը ու չունենալ լավ փչացրած տառեր, մեկ է հայերեն ՕՑՌ միայն հայերն են կարողանում անել փաթեթային ձեւով։
Գեներացրի մի քանի հազար, տեղադրեցի սպասարկչի վրա։
Պարզվեց, որ 18.3֊ի հետ եկած ConfirmEdit֊ը իր իսկ հետ չի աշխատում։
Այնպես որ ես այն քաշեցի սվնից։
svn co http://svn.wikimedia.org/svnroot/mediawiki/branches/REL1_18/extensions/ConfirmEdit
Ահա հիմա վերջապես ամենը աշխատեց՝

Այնպես որ ռոբոտները այլեւս չեն գրանցվի, իսկ դուք զգոն եղեք որ ձեզ ռոբոտի տեղ չդնեն։ Քափչա գրելիս։ ։Ճ
ու տենց
Comments: no replies