Captchas programmiere mit Java

sengul

Mitglied
Hallo,

ich habe ein JFrame der JButtons erhält mit Java programmiert. Nun möchte, wenn ich ein JButton anklicke, ein Captchashttp://www.java-forum.org/#27353162erscheint. Wie kann ich ein Captchas programmieren? Geht das überhaupt mit Java?

Bis jetzt habe ich ein Mix der aus Zufalls Zahlen und Buchstaben besteht programmiert. Unten ist der Code:
Aber wie gestallte ich jetzt das diese Mix bunt, groß, verschwommen und verschoben erscheint?

Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.*; 
public class Captcha { 

public static String generateCaptcha() { 
Random random = new Random(); 
int length = 5; 
StringBuffer captchaStringBuffer = new StringBuffer(); 
for (int i = 0; i < length; i++) { 
int captchaNumber = Math.abs(random.nextInt()) % 60; 
int charNumber = 0; 
if (captchaNumber < 26) { 
charNumber = 65 + captchaNumber; 
} 
else if (captchaNumber < 52){ 
charNumber = 97 + (captchaNumber - 26); 
} 
else { 
charNumber = 48 + (captchaNumber - 52); 
} 
captchaStringBuffer.append((char)charNumber); 
} 
String neu = captchaStringBuffer.toString();
return neu; 
} 
public static void main(String[] args){ 
Captcha captcha = new Captcha(); 
String str = captcha.generateCaptcha(); 
System.out.println(str); 

} 
}
 
Zuletzt bearbeitet von einem Moderator:

sheel

I love Asm
Hi

das Generieren und Unlesbarmachen von einem Textbild ist nicht ganz trivial,
würde da eine bestehende Lib verwenden. zB. SimpleCaptcha
http://simplecaptcha.sourceforge.net/
Downloaden, die Jar-Datei zum eigenen Programm dazutun, und dann wie in
http://simplecaptcha.sourceforge.net/javadocs/index.html
beschrieben ein Bild generieren und/oder den eingegebenen Text prüfen lassen.

PS: Bitte solche Fragen im Forum lassen und nicht wahllos Kopien an Mods und Admins senden.
 

sengul

Mitglied
Okey, danke. Ich werde jetzt Fragen nur hier erstellen. Ich habe den Link SimpleCaptcha auch gesehen, aber wusste nicht wie ich das in den java Code integriere. Also ich lade das erst runter und dann füge ich die jar datei meinem programm.
 

sengul

Mitglied
Sorry, aber ich komme nicht weiter, download und Jar datei sind eigebunden, aber im Internet finde ich was mit Servlet, aber ich brauche den doch gar nicht. Der ist doch für Webseiten, und ich mach keine Webseite.

Ich mache nur GUI programmierung, und was ich will ist dass, wenn auf ein Button klicke, das ein Captchas erscheint.

Ich habe jetzt folgenden Code gefunden im Internet, wie muss ich diesen umstellen, so das ich kein Servlet brauche.

Die rot markierten Stellen machen Probleme in eclipse

package com.edw.captcha;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import nl.captcha.Captcha;
import nl.captcha.backgrounds.GradiatedBackgroundProducer;
import nl.captcha.servlet.CaptchaServletUtil;
import nl.captcha.text.renderer.DefaultWordRenderer;

public class EdwCaptcha extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<Color> colors = new ArrayList<Color> ();
colors.add(Color.black);
colors.add(Color.red);

List<Font> fonts = new ArrayList<Font>();
fonts.add(new Font("Arial", Font.ITALIC, 40));

Captcha captcha = new Captcha.Builder(120, 50)
.addText(new DefaultWordRenderer(colors, fonts))
.addBackground(new GradiatedBackgroundProducer(Color.white, Color.white))
.gimp()
.addBorder()
.build();

// display the image produced
CaptchaServletUtil.writeImage(response, captcha.getImage());

// save the captcha value on session
request.getSession().setAttribute("simpleCaptcha", captcha);
}
}
 

sheel

I love Asm
Du brauchst kein Servlet, stimmt.
Und ich merk grad, dass mein zweiter Link oben falsch ist, hier der Richtige:
http://simplecaptcha.sourceforge.net/javadocs/nl/captcha/Captcha.html

Da werden zuerst verschiedene Beispiele gegeben, wie ein Captcha generiert wird,
und von dem erzeugten Captcha-Objekt kann man dann mit getImage ein BufferedImage
holen, dass man auf einer "normalen" Java-GUI schon anzeigen lassen kann,
und mit getAnswer den enthaltenen Text als String (zum Prüfen, ob die Benutzereingabe gleich ist)
 

sengul

Mitglied
ich komme nicht klar, mit dem Teil "mit getImage ein BufferedImage
holen"
Wie mache ich das? Ich habe ein Captchas generiert und dann captachas object mit captcha.getImage(); ich dachte das wärs mit BufferedImage holen. Aber irgendwie klappt es nicht, was mache ich falsch? Ich füge den Code hinzu. Ich bitte um Hilfe?

package com.edw.captcha;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextField;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

import nl.captcha.Captcha;
import nl.captcha.backgrounds.TransparentBackgroundProducer;
import nl.captcha.gimpy.RippleGimpyRenderer;
import nl.captcha.text.producer.DefaultTextProducer;
import nl.captcha.text.renderer.DefaultWordRenderer;

public class EdwCaptcha {

private static JFrame fr;
private static TextField adTField = null;
private static JPanel panel;

private static Captcha setupCustomInstance(){

int width=160;
int height=50;
char[] chars={'a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','2','3','4','5','6','7','8','9'};

DefaultTextProducer text=new DefaultTextProducer(5,chars);
TransparentBackgroundProducer background=new TransparentBackgroundProducer();
RippleGimpyRenderer gimpy=new RippleGimpyRenderer();

List<Color> colors = new ArrayList<Color> ();
colors.add(Color.black);
colors.add(Color.red);

List<Font> fonts = new ArrayList<Font>();
fonts.add(new Font("Arial", Font.ITALIC, 40));

Captcha captcha=new Captcha.Builder(width,height)
.addText(text,new DefaultWordRenderer(colors, fonts))
.addBackground(background).gimp(gimpy).build();

captcha.getImage();
String g = captcha.getAnswer();
System.out.println(g);

fr = new JFrame("Captchas");
fr.setSize(300,300);
fr.setLocation(300,300);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setLayout(new BorderLayout(5,5));
panel = new JPanel(new GridLayout(3,3,20,20));
adTField = new TextField("",10);
adTField.setEditable(true);
panel.add(adTField);
fr.getContentPane().add(BorderLayout.CENTER, panel);
fr.pack();
fr.setVisible(true);
return captcha;

}

public static void main(String[] args) {

EdwCaptcha.setupCustomInstance();
}

}
 

sengul

Mitglied
kommt eine adresse, wie dieses

BufferedImage@37a71e93: type = 3 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width = 160 height = 50 #Bands = 4 xOff = 0 yOff = 0 dataOffset[0] 0
 

vfl_freak

Premium-User
Moin,

BufferedImage@37a71e93
So kannst das println auch nicht benutzen!!
Du gibst hier die Speicheradresse des Objekts aus!

Klappt dies denn aus deinem Code? Gibt getAnswer hier einen String zurück??
Java:
captcha.getImage();
String g = captcha.getAnswer();
System.out.println( g );
Das Captcha wird doch immer ein Image sein, oder ?

BTW: nutze bitte die Java-Tags, so bekommt man ja Augenkrebs!!

Gruß Klaus
 

sengul

Mitglied
ja genau, der String kommt immer raus , es ist immer eine Mix aus verschiedenen zahlen und Buchstaben

captcha.getImage(); das hier ist doch eine Image oder, wenn ich das als return angebe, und die methode im Main aufrufe kommt aber nichts zurück? was muss ich da machen?

braucht ich oder dass

writeImage( ... ,captcha.getImage());

kann ich hier als erste parameter ein JFrame übergeben?