1
Name:
Anonymous
2010-09-07 15:38
Hi, has anybody made a dump script that supports the captchas? If not, I'll get to working on one in a few weeks.
It should post one picture every 60 seconds, asking for the captcha answers as needed.
26
Name:
Anonymous
2010-11-12 14:50
Note: if you use this, you will get banned. I'm having trouble getting all the HTTP emulation stuff right.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Captchan {
public static String url = "";
public static String challenge = "";
public static String response = "";
JFileChooser filechooser = new JFileChooser();
JFrame frame = new JFrame("Captchan");
JPanel panel = new JPanel();
JButton select = new JButton("Select Files...");
JTextField tfBoard = new JTextField("Board");
JTextField tfThread = new JTextField("Thread");
JTextField tfName = new JTextField("Name");
JTextField tfEmail = new JTextField("Email");
JTextField tfSubject = new JTextField("Subject");
JTextField tfComment = new JTextField("Comment");
JTextField tfSeconds = new JTextField("Seconds to wait");
JButton start = new JButton("Start");
File files[];
public static void main(String[] args) {
new Captchan();
}
public Captchan() {
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setContentPane(panel);
panel.setLayout(new java.awt.GridLayout(9,1,0,3));
panel.add(select);
panel.add(tfBoard);
panel.add(tfThread);
panel.add(tfName);
panel.add(tfEmail);
panel.add(tfSubject);
panel.add(tfComment);
panel.add(tfSeconds);
panel.add(start);
frame.pack();
select.addActionListener(new OpenAction());
start.addActionListener(new StartAction());
filechooser.setMultiSelectionEnabled(true);
frame.setVisible(true);
}
private void work() {
select.setEnabled(false);
tfBoard.setEnabled(false);
tfThread.setEnabled(false);
tfName.setEnabled(false);
tfEmail.setEnabled(false);
tfSubject.setEnabled(false);
tfComment.setEnabled(false);
tfSeconds.setEnabled(false);
start.setEnabled(false);
for(File file:files) {
String topic = "";
try {
String topicURL = "http://boards.4chan.org/ " + tfBoard.getText() + "/res/" + tfThread.getText();
topic = wget(new URL(topicURL), false);
int left = topic.indexOf("http://api.recaptcha.net/challenge?k= ") + "http://api.recaptcha.net/challenge?k= ".length();
int right = topic.indexOf('"', left);
reCaptcha(topic.substring(left, right));
ClientHttpRequest chr;
chr = new ClientHttpRequest("http://sys.4chan.org/ "+tfBoard.getText()+"/post");
chr.setUserAgent("Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12");
chr.setReferer(topicURL);
chr.setParameter("name", tfName.getText());
chr.setParameter("email", tfEmail.getText());
chr.setParameter("sub", tfSubject.getText());
chr.setParameter("com", tfComment.getText());
chr.setParameter("recaptcha_challenge_field", challenge);
chr.setParameter("recaptcha_response_field", response);
chr.setParameter("upfile", file);
chr.setParameter("pwd", genPass());
chr.setParameter("mode", "regist");
chr.post();
try {
Thread.sleep(1000000L * Long.parseLong(tfSeconds.getText()));
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
System.exit(1);
} catch (IOException e) {
System.exit(1);
}
}
}
private String genPass() {
String result = "";
for(int i=0;i<8;i++) {
result += (char)(((int)Math.random()*26)+97);
}
return result;
}
public static String wget (URL url, boolean post, String... post_data)
{
return wget(url, post, false, post_data);
}
public static String wget(URL url, boolean post, boolean ignore, String... post_data)
{
try
{
URLConnection urlcon = url.openConnection();
if (post)
{
String msg = "";
boolean key = false;
for (String s : post_data)
{
msg += URLEncoder.encode(s, "UTF-8");
if (key = !key) msg += "=";
else msg += "&";
}
urlcon.setDoOutput(true);
urlcon.getOutputStream().write(msg.getBytes());
}
InputStream urlin = urlcon.getInputStream();
String data = ignore ? null : "";
int len;
byte[] buffer = new byte[1023];
while ((len = urlin.read(buffer)) >= 0)
{
if (!ignore)
data += new String(buffer, 0, len);
}
return data;
}
catch (Exception ex)
{
System.err.println("[" + url + "]:");
ex.printStackTrace();
return null;
}
}
private void reCaptcha(String id)
{
try
{
String captcha = wget(new URL("http://www.google.com/recaptcha/api/challenge?k= " + id + "&ajax=1&cachestop=0.34919850158610977"), false);
int idx0 = captcha.indexOf("challenge : '") + "challenge : '".length();
int idx1 = captcha.indexOf('\'', idx0);
String challenge = captcha.substring(idx0, idx1);
new ReCaptchaWindow(challenge);
}
catch (Exception e)
{
e.printStackTrace();
}
}
class OpenAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
int returnval = filechooser.showOpenDialog(null);
if (returnval == JFileChooser.APPROVE_OPTION) {
files = filechooser.getSelectedFiles();
}
}
}
class StartAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
work();
}
}
}