Jump to content

[Share] Captcha Antibot System [Updated 17.6.2011, Version 2] [Please LOCK IT .]


Recommended Posts

Posted

A fixed number of killed mobs to trigger this can be abused, use random numbers instead.

gz

 

nice share btw :)

Posted

Great share it is working very good, only problem I see is the UPPERCASE letters, is that anyway to make it uppercase or lowercase or even mixed.

It was a lot of players in jail today in my server, most of then for mistakes on the typing, they used lowercase instead. Lot of players got pissed off.

 

Also:

When I used a Dreadnought as a gm and it killed lots of mobs at the same time the window keep changing the code and then sometimes it stop with no code at all. I don't know if a regular char will be able to reproduce that but maybe it they kill 49 mobs and then kill 3 more in one hit (50, 51 and 52) it might happen.

Let me know if the fix above will fix that problem.

 

 

Im sorry coz i havent answered, im also using aoe farming on my pack, 10 mobs per rush impact, and yes it getting more than 50 mobs (for example), but it shows to player only one html (atleast the last one), you can make it with tries if you want to, for example to have 3 times to write it wrong and then punish him, about the UPPERCASE and lowercase letters, check this, it is on L2Attackable after my patch :)!

+		   // Suggestions ----------------------------------------------------------------------
+		   // i removed 1 and l and i because there are confusing to users...
+		   // Z, z, and N also get confusing when rotated
+		   // 0, O, and o are also confusing...
+		   // lowercase G looks a lot like a 9 so i killed it
+		   // this should ideally be done for every language...
+		   // i like controlling the characters though because it helps prevent confusion
+		   // So recommended chars are:
+		   // String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789";
+		   // Suggestions ----------------------------------------------------------------------
+		   String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYZ";
+		   char[] chars = elegibleChars.toCharArray();
+

 

 

Just change ""ABCDEFGHJKLMPQRSTUVWXYZ" to the letters you wanna.

("ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789" are recommented, read the comments, there is reasoning.)

 

Edit: If you want to be sure about html messages and the Mobkill-counter make a check with an output on console :), and check.

Posted

Well first I would suggest the following for the generation of the captcha:

 

	public static BufferedImage generateCaptcha()
{
	final int width = 256;
	final int height = 64;
	final BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	final Graphics2D g2d = bufferedImage.createGraphics();
	final Font textFont = new Font("verdana", Font.BOLD, 36);
	final Font textFontUpper = new Font("verdana", Font.BOLD | Font.ITALIC, 36);

	RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
	g2d.setRenderingHints(renderingHints);

	Color textColor = new Color(98, 213, 43);
	Color circleColor = new Color(98, 213, 43);

	int charsToPrint = 5;
	int circlesToDraw = 8;
	float horizMargin = 20.0f;
	double rotationRange = 0.7; // this is radians

	Graphics2D g = (Graphics2D) bufferedImage.getGraphics();

	//Draw an oval
	g.setColor(new Color(30,31,31));
	g.fillRect(0, 0, width, height);

	// lets make some noisey circles
	g.setColor(circleColor);

	for (int i=0; i<circlesToDraw; i++)
	{
		int circleRadius = (int) (Math.random() * height / 2.0);
		int circleX = (int) (Math.random() * width - circleRadius);
		int circleY = (int) (Math.random() * height - circleRadius);
		g.drawOval(circleX, circleY, circleRadius * 2, circleRadius * 2);
	}

	g.setColor(textColor);
	g.setFont(textFont);

	FontMetrics fontMetrics = g.getFontMetrics();
	int maxAdvance = fontMetrics.getMaxAdvance();
	int fontHeight = fontMetrics.getHeight();

	// Suggestions ----------------------------------------------------------------------
	// i removed 1 and l and i because there are confusing to users...
	// Z, z, and N also get confusing when rotated
	// 0, O, and o are also confusing...
	// lowercase G looks a lot like a 9 so i killed it
	// this should ideally be done for every language...
	// i like controlling the characters though because it helps prevent confusion
	// So recommended chars are:
	// String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789";
	// Suggestions ----------------------------------------------------------------------
	String elegibleChars = "abcdefghjijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789";
	char[] chars = elegibleChars.toCharArray();

	float spaceForLetters = -horizMargin * 2 + width;
	float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);

	for (int i=0; i<charsToPrint; i++)
	{
		double randomValue = Math.random();
		int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
		char characterToShow = chars[randomIndex];
		finalString.append(characterToShow);

		// this is a separate canvas used for the character so that
		// we can rotate it independently
		int charWidth = fontMetrics.charWidth(characterToShow);
		int charDim = Math.max(maxAdvance, fontHeight);
		int halfCharDim = (charDim / 2);

		BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
		Graphics2D charGraphics = charImage.createGraphics();
		charGraphics.translate(halfCharDim, halfCharDim);
		double angle = (Math.random() - 0.5) * rotationRange;
		charGraphics.transform(AffineTransform.getRotateInstance(angle));
		charGraphics.translate(-halfCharDim,-halfCharDim);
		charGraphics.setColor(textColor);
		charGraphics.setFont(textFont);

		int charX = (int) (0.5 * charDim - 0.5 * charWidth);
		charGraphics.drawString("" + characterToShow, charX,
				((charDim - fontMetrics.getAscent())
						/ 2 + fontMetrics.getAscent()));

		float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
		int y = ((height - charDim) / 2);

		if(Character.isDigit(chars[i]) || Character.isLowerCase(chars[i]))
			g2d.setFont(textFont);
		else
			g2d.setFont(textFontUpper);

		g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);

		charGraphics.dispose();
	}

	g.dispose();

	return bufferedImage;
}

 

And next the following to load it:

 

			final int sId = Config.SERVER_ID;
		int imgId = IdFactory.getInstance().getNextId();

		try
		{
			//File captcha = new File("data/captcha/captcha.png");
			ByteArrayOutputStream bts = new ByteArrayOutputStream();
			ImageIO.write(generateCaptcha(), "png", bts);

			//ImageIO.write(generateCaptcha(), "png", captcha);
			byte[] buffer = bts.toByteArray();
			ByteArrayInputStream bis = new ByteArrayInputStream (buffer, 0, buffer.length);
			PledgeCrest packet = new PledgeCrest(imgId, DDSConverter.convertToDDS(bis).array());
			playerInstance.sendPacket(packet);
		}
		catch (Exception e)
		{
			...

Posted

Well first I would suggest the following for the generation of the captcha:

 

	public static BufferedImage generateCaptcha()
{
	final int width = 256;
	final int height = 64;
	final BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	final Graphics2D g2d = bufferedImage.createGraphics();
	final Font textFont = new Font("verdana", Font.BOLD, 36);
	final Font textFontUpper = new Font("verdana", Font.BOLD | Font.ITALIC, 36);

	RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
	g2d.setRenderingHints(renderingHints);

	Color textColor = new Color(98, 213, 43);
	Color circleColor = new Color(98, 213, 43);

	int charsToPrint = 5;
	int circlesToDraw = 8;
	float horizMargin = 20.0f;
	double rotationRange = 0.7; // this is radians

	Graphics2D g = (Graphics2D) bufferedImage.getGraphics();

	//Draw an oval
	g.setColor(new Color(30,31,31));
	g.fillRect(0, 0, width, height);

	// lets make some noisey circles
	g.setColor(circleColor);

	for (int i=0; i<circlesToDraw; i++)
	{
		int circleRadius = (int) (Math.random() * height / 2.0);
		int circleX = (int) (Math.random() * width - circleRadius);
		int circleY = (int) (Math.random() * height - circleRadius);
		g.drawOval(circleX, circleY, circleRadius * 2, circleRadius * 2);
	}

	g.setColor(textColor);
	g.setFont(textFont);

	FontMetrics fontMetrics = g.getFontMetrics();
	int maxAdvance = fontMetrics.getMaxAdvance();
	int fontHeight = fontMetrics.getHeight();

	// Suggestions ----------------------------------------------------------------------
	// i removed 1 and l and i because there are confusing to users...
	// Z, z, and N also get confusing when rotated
	// 0, O, and o are also confusing...
	// lowercase G looks a lot like a 9 so i killed it
	// this should ideally be done for every language...
	// i like controlling the characters though because it helps prevent confusion
	// So recommended chars are:
	// String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy23456789";
	// Suggestions ----------------------------------------------------------------------
	String elegibleChars = "abcdefghjijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789";
	char[] chars = elegibleChars.toCharArray();

	float spaceForLetters = -horizMargin * 2 + width;
	float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);

	for (int i=0; i<charsToPrint; i++)
	{
		double randomValue = Math.random();
		int randomIndex = (int) Math.round(randomValue * (chars.length - 1));
		char characterToShow = chars[randomIndex];
		finalString.append(characterToShow);

		// this is a separate canvas used for the character so that
		// we can rotate it independently
		int charWidth = fontMetrics.charWidth(characterToShow);
		int charDim = Math.max(maxAdvance, fontHeight);
		int halfCharDim = (charDim / 2);

		BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
		Graphics2D charGraphics = charImage.createGraphics();
		charGraphics.translate(halfCharDim, halfCharDim);
		double angle = (Math.random() - 0.5) * rotationRange;
		charGraphics.transform(AffineTransform.getRotateInstance(angle));
		charGraphics.translate(-halfCharDim,-halfCharDim);
		charGraphics.setColor(textColor);
		charGraphics.setFont(textFont);

		int charX = (int) (0.5 * charDim - 0.5 * charWidth);
		charGraphics.drawString("" + characterToShow, charX,
				((charDim - fontMetrics.getAscent())
						/ 2 + fontMetrics.getAscent()));

		float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
		int y = ((height - charDim) / 2);

		if(Character.isDigit(chars[i]) || Character.isLowerCase(chars[i]))
			g2d.setFont(textFont);
		else
			g2d.setFont(textFontUpper);

		g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);

		charGraphics.dispose();
	}

	g.dispose();

	return bufferedImage;
}

 

And next the following to load it:

 

			final int sId = Config.SERVER_ID;
		int imgId = IdFactory.getInstance().getNextId();

		try
		{
			//File captcha = new File("data/captcha/captcha.png");
			ByteArrayOutputStream bts = new ByteArrayOutputStream();
			ImageIO.write(generateCaptcha(), "png", bts);

			//ImageIO.write(generateCaptcha(), "png", captcha);
			byte[] buffer = bts.toByteArray();
			ByteArrayInputStream bis = new ByteArrayInputStream (buffer, 0, buffer.length);
			PledgeCrest packet = new PledgeCrest(imgId, DDSConverter.convertToDDS(bis).array());
			playerInstance.sendPacket(packet);
		}
		catch (Exception e)
		{
			...

 

Can you please give us reasoning? As i can see you have changed the font and added all letters/numbers....

Posted

awesome good job man!

 

Question: it is possible if i whant to disable jail and just the character to stay in freezing mode or to disable the if you write also wrong you get jail for 1 minute?

Posted

awesome good job man!

 

Question: it is possible if i whant to disable jail and just the character to stay in freezing mode or to disable the if you write also wrong you get jail for 1 minute?

 

Well, yes, its simple, everywhere you can see this

+                                       activeChar.setPunishLevel(L2PcInstance.PunishLevel.JAIL, 1);

... Just delete it! This is the "method" that jails the player.

Guest
This topic is now closed to further replies.



  • Posts

    • 寒冷的冬天 — 火热的折扣。使用促销代码 WINTER 即可在我们商店的所有购买中获得 10% 折扣! 有效链接: 数字商品商店(网站): 前往 其他服务和产品: 商店 Telegram 机器人: 前往 – 通过 Telegram 信使方便访问商店。 虚拟号码服务: 前往 用于购买 Telegram Stars 的 Telegram 机器人: 前往 – 在 Telegram 中快速且优惠地购买 Stars。 SMM 面板: 前往 – 推广您的社交媒体账户。 我们想向您展示当前的 促销和特别优惠列表 ,用于购买我们服务的产品和服务: 1. 您可以在首次购买时使用促销代码:SOCNET(15% 折扣) 2. 获取 $1 商店余额或 10–20% 折扣——只需在我们的网站注册后按以下模板填写您的用户名:"SEND ME BONUS, MY USERNAME IS..." ——您需要在我们的论坛主题中发布! 3. SMM 面板首次试用可获得 $1:只需在我们的网站(Support)提交主题为 “Get Trial Bonus” 的工单。 4. 我们的 Telegram 频道和 Stars 购买机器人中每周都会赠送 Telegram Stars! 新闻: ➡ Telegram 频道: https://t.me/accsforyou_shop ➡ WhatsApp 频道: https://chat.whatsapp.com/K8rBy500nA73z27PxgaJUw?mode=ems_copy_t ➡ Discord 服务器: https://discord.gg/y9AStFFsrh 联系方式和支持: ➡ Telegram: https://t.me/socnet_support ➡ WhatsApp: https://wa.me/79051904467 ➡ Discord: socnet_support ➡ ✉ Email: solomonbog@socnet.store
    • Cold winter — hot discounts. Use promo code WINTER and get 10% off on all purchases in our store! Active links: Digital goods store (Website): Go to Other services and products: Store Telegram bot: Go to – convenient access to the store via the Telegram messenger. Virtual numbers service: Go to Telegram bot for purchasing Telegram Stars: Go to – fast and profitable purchase of Stars in Telegram. SMM Panel: Go to – promotion of your social media accounts. We want to present to you the current list of promotions and special offers for purchasing products and services of our service: 1. You can use a promo code for your first purchase: SOCNET (15% discount) 2. Get $1 on your store balance or a 10–20% discount — just write your username after registering on our website using the following template: "SEND ME BONUS, MY USERNAME IS..." – you need to post this in our forum thread! 3. Get $1 for the first trial launch of the SMM Panel: just open a ticket with the subject “Get Trial Bonus” on our website (Support). 4. Weekly Telegram Stars giveaways in our Telegram channel and in our bot for purchasing stars! News: ➡ Telegram channel: https://t.me/accsforyou_shop ➡ WhatsApp channel: https://chat.whatsapp.com/K8rBy500nA73z27PxgaJUw?mode=ems_copy_t ➡ Discord server: https://discord.gg/y9AStFFsrh Contacts and support: ➡ Telegram: https://t.me/socnet_support ➡ WhatsApp: https://wa.me/79051904467 ➡ Discord: socnet_support ➡ ✉ Email: solomonbog@socnet.store
    • Cold winter — hot discounts. Use promo code WINTER and get 10% off on all purchases in our store! Active links: Digital goods store (Website): Go to Other services and products: Store Telegram bot: Go to – convenient access to the store via the Telegram messenger. Virtual numbers service: Go to Telegram bot for purchasing Telegram Stars: Go to – fast and profitable purchase of Stars in Telegram. SMM Panel: Go to – promotion of your social media accounts. We want to present to you the current list of promotions and special offers for purchasing products and services of our service: 1. You can use a promo code for your first purchase: SOCNET (15% discount) 2. Get $1 on your store balance or a 10–20% discount — just write your username after registering on our website using the following template: "SEND ME BONUS, MY USERNAME IS..." – you need to post this in our forum thread! 3. Get $1 for the first trial launch of the SMM Panel: just open a ticket with the subject “Get Trial Bonus” on our website (Support). 4. Weekly Telegram Stars giveaways in our Telegram channel and in our bot for purchasing stars! News: ➡ Telegram channel: https://t.me/accsforyou_shop ➡ WhatsApp channel: https://chat.whatsapp.com/K8rBy500nA73z27PxgaJUw?mode=ems_copy_t ➡ Discord server: https://discord.gg/y9AStFFsrh Contacts and support: ➡ Telegram: https://t.me/socnet_support ➡ WhatsApp: https://wa.me/79051904467 ➡ Discord: socnet_support ➡ ✉ Email: solomonbog@socnet.store
    • Telegram Stars — a new digital currency inside Telegram. And right now, the best opportunities are opening for profitable purchases and participation in exclusive events. And you can purchase Telegram Stars safely and at the best price in our bot. Active links: Telegram bot for purchasing Telegram Stars: Go to – fast and profitable purchase of Stars in Telegram. Other services and products: Digital goods store (Website): Go to Store Telegram bot: Go to – convenient access to the store via the Telegram messenger. Virtual numbers service: Go to SMM Panel: Go to – promotion of your social media accounts. We want to present to you the current list of promotions and special offers for purchasing products and services of our service: 1. You can use a promo code for your first purchase: SOCNET (15% discount) 2. Get $1 on your store balance or a 10–20% discount — just write your username after registering on our website using the following template: "SEND ME BONUS, MY USERNAME IS..." — you need to post this in our forum thread! 3. Get $1 for the first trial launch of the SMM Panel: just open a ticket with the subject “Get Trial Bonus” on our website (Support). 4. Weekly Telegram Stars giveaways in our Telegram channel and in our bot for purchasing stars! News: ➡ Telegram channel: https://t.me/accsforyou_shop ➡ WhatsApp channel: https://chat.whatsapp.com/K8rBy500nA73z27PxgaJUw?mode=ems_copy_t ➡ Discord server: https://discord.gg/y9AStFFsrh Contacts and support: ➡ Telegram: https://t.me/socnet_support ➡ WhatsApp: https://wa.me/79051904467 ➡ Discord: socnet_support ➡ ✉ Email: solomonbog@socnet.store
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock