(转)Java编写的一个论坛自动发贴机
2008-04-20 – 11:20 pm原文:可可熊的窝
针对phpwind 5.3版本,目前功能介绍:
- 在验证码没有开启的情况下可以实现自动注册并且发贴。
- 当注册验证码开启,登录验证码未开启的情况下可以手动注册,然后输入用户名与密码。
- 当注册验证与登录验证全部开启的情况下,本程序无任何作用。
这个星期做课程设计,就写了这个小程序,界面内容仿照晨风论坛灌水机,内容还包括发贴后自动回贴,回复已经存在的贴子,这两个还没有写,不过挺容易 实现的,遵循release early的原则。Java代码写的不是很好,基本没有做什么异常处理。先完成课程设计的要求,以后再继续更新,以后会加入验证码分析、或者获得验证码, 手动输入。当然更可能的是在程序里显示验证码,然后手动输入,因为毕竟验证码的分析不是一件很容易的事情。
第一个比较大的Java程序,写的时候遇到的很多问题,不过还好,一步一步走下来了,也按照预期的目标完成了该完成的内容。程序的实际意义并没有多 少,不过学到了不少东西,GUI的设计(全部是手动写的代码),HTTP协议,httpclient这个包的使用,差点把这个忘了,我的前一篇文章提到了 这个包的使用, 它提供了很方便的HTTP操作,可以使我们把程序的重点放在设计上,而不是麻烦的HTTP操作。不过我的程序用到的东西很少,即使用 Java已有的java.net里面的类也是很容易实现,更多httpclient的信息可以在HttpClient Home找到。
不过请注意 HTTPClient 与上面说的httpclient是两个不同的项目,我所用的是Apache 的一个开源项目,我刚开始的时侯就把这两个搞混了,结果在这上面浪费了不少时间:-(
遵循GPL发布
代码:
/* * Write by cocobear * cocobear.cn@gmail.com * http://cocobear.cn * */ //package Jwind; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.*; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.cookie.*; import org.apache.commons.httpclient.methods.*; import java.util.*; import org.apache.commons.httpclient.params.*; import org.apache.commons.httpclient.methods.multipart.*; public class Jwind { public static void main(String[] args) { BackFrame frame = new BackFrame(); } } class BackFrame extends JFrame { public TopJPanel panela; public DownJPanel panelb; public AutoRegister UserPass; public BackFrame() { setLocation(180,180); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setTitle(“Jwind — by cocobear.cn”); setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); setLayout(new GridLayout(2,1,1,1)); panela = new TopJPanel(); panelb = new DownJPanel(); add(panela); add(panelb); setVisible(true); /*在添加完所有组件后再设置可见*/ } public static final int DEFAULT_WIDTH = 600; public static final int DEFAULT_HEIGHT = 400; class ButtonAction implements ActionListener { public ButtonAction(int i) { ; } public void actionPerformed(ActionEvent event) { System.out.println(“start click!”); String url = panela.panela.URL.getText(); String user = panela.panela.User.getText(); String pass = panela.panela.Pass.getText(); String fid = panela.panela.FID.getText(); String tid = panela.panela.TID.getText(); String encode = panela.panela.Encode.getText(); String title = panelb.Title.getText(); String content = panelb.Content.getText(); int PostType = 3; int AutoReg = 0; int AllFid = 0; if (panela.panelb.AutoReg.isSelected()) { AutoReg = 1; try { UserPass = new AutoRegister(url); user = UserPass.getUser(); pass = UserPass.getPass(); System.out.println(“注册成功用户:”+user); System.out.println(“密码为:”+pass); } catch (IOException e) { System.out.println(“Error”+e.toString()); } } if (panela.panelb.AllF.isSelected()) { AllFid = 1; } if (panela.panelb.AutoReply.isSelected()) { PostType = 1; } else if (panela.panelb.ReplyOld.isSelected()) { PostType = 2; } else { PostType = 3; if (url.equals(“”) || user.equals(“”) || pass.equals(“”) || fid.equals(“”) || title.equals(“”) || content.equals(“”) || encode.equals(“”) ) { System.out.println(“少参数”); } try { NewPost post = new NewPost(url,user,pass,fid,title,content,encode); } catch (IOException e) { System.out.println(“Error”+e.toString()); } } System.out.println(“原始URL:”+url); System.out.println(“发贴类型: “+PostType); System.out.println(“自动注册”+AutoReg); System.out.println(“所有版块”+AllFid); } } class TopJPanel extends JPanel { public TLeftJPanel panela; public TRightJPanel panelb; public TopJPanel() { setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.BOTH; panela = new TLeftJPanel(); panelb = new TRightJPanel(); JPanel panelc = new JPanel(); gc.weightx = 1; /*上部左边面板占2/3空间*/ gc.weighty = 1; /*左右面板占满纵向空间*,改为其它数值也可以,但必须设置*/ // gc.gridwidth = 3; gc.gridx = 0; add(panela,gc); gc.gridx = 1; add(panelc,gc); gc.gridx = 2; //gc.gridwidth = 2; add(panelb,gc); setVisible(true); } } class TLeftJPanel extends JPanel { public JTextField User; public JTextField Pass; public JTextField URL; public JTextField FID; public JTextField TID; public JTextField Encode; public TLeftJPanel() { JLabel LabUser; JLabel LabURL; JLabel LabPass; JLabel LabFID; /*版块ID*/ JLabel LabTID; /*贴子ID*/ JLabel LabEncode; //setBackground(Color.BLACK); setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.HORIZONTAL; LabURL = new JLabel(“论坛地址:”); LabUser = new JLabel(“用户名:”); LabPass = new JLabel(“密码:”); LabFID = new JLabel(“版块ID:”); LabTID = new JLabel(“贴子ID:”); LabEncode = new JLabel(“网页编码:”); LabURL.setHorizontalAlignment(JLabel.CENTER); /*设置居中*/ LabUser.setHorizontalAlignment(JLabel.CENTER); LabPass.setHorizontalAlignment(JLabel.CENTER); LabFID.setHorizontalAlignment(JLabel.CENTER); LabTID.setHorizontalAlignment(JLabel.CENTER); LabEncode.setHorizontalAlignment(JLabel.CENTER); URL = new JTextField(“http://1g50.cn/upload“); User = new JTextField(“test”); Pass = new JTextField(“ffffff”); FID = new JTextField(“2″); TID = new JTextField(“0″); Encode = new JTextField(“GBK”); URL.setColumns(8); gc.gridx = 0; gc.weightx = 1; /*标签宽度为1*/ gc.weighty = 1; /*高度全部为1*/ add(LabURL,gc); gc.gridx = 2; gc.weightx = 2; /*输入框宽度为2*/ add(URL,gc); gc.gridx = 0; gc.weightx = 1; add(LabUser,gc); gc.gridx = 2; gc.weightx = 2; add(User,gc); gc.gridx = 0; gc.weightx = 1; add(LabPass,gc); gc.gridx = 2; gc.weightx = 2; add(Pass,gc); gc.gridx = 0; gc.weightx = 1; add(LabFID,gc); gc.gridx = 2; gc.weightx = 2; add(FID,gc); gc.gridx = 0; gc.weightx = 1; add(LabTID,gc); gc.gridx = 2; gc.weightx = 2; add(TID,gc); gc.gridx = 0; gc.weightx = 1; add(LabEncode,gc); gc.gridx = 2; gc.weightx = 2; add(Encode,gc); setVisible(true); } } class TRightJPanel extends JPanel { public JCheckBox AutoReg; public JCheckBox AllF; public JRadioButton AutoReply; public JRadioButton ReplyOld; public JRadioButton NewThread; public ButtonGroup group; public TRightJPanel() { AutoReg = new JCheckBox(“自动注册”); AllF = new JCheckBox(“所有版块发贴”); group = new ButtonGroup(); AutoReply = new JRadioButton(“发新贴后自动顶”); ReplyOld = new JRadioButton(“顶原来发的贴”); NewThread = new JRadioButton(“一直发新贴”,true); group.add(AutoReply); group.add(ReplyOld); group.add(NewThread); //setBackground(Color.GREEN); setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.BOTH; gc.weightx = 1; gc.weighty = 1; gc.gridx = 0; gc.gridwidth = 1; add(AutoReg,gc); gc.gridx = 0; gc.gridwidth = 1; add(AllF,gc); gc.gridx = 0; add(AutoReply,gc); //gc.gridx = 0; add(ReplyOld,gc); //gc.gridx = 0; add(NewThread,gc); setVisible(true); } } /* * 下部面板 * */ class DownJPanel extends JPanel { public JTextField Title; public JTextArea Content; public DownJPanel() { JLabel LabTitle; JLabel LabContent; JLabel LabStatus; JButton StartButton; LabTitle = new JLabel(“主题:”); LabContent = new JLabel(“内容:”); LabStatus = new JLabel(“欢迎访问http://cocobear.cn“); LabTitle.setHorizontalAlignment(JLabel.CENTER); LabContent.setHorizontalAlignment(JLabel.CENTER); // LabStatus.setHorizontalAlignment(JLabel.CENTER); StartButton = new JButton(“开始”); Title = new JTextField(“版主快删了,这是灌水贴”); Content = new JTextArea(“灌水来了!”); Content.setRows(4); Content.setColumns(10); JScrollPane sp = new JScrollPane(Content); /*为TextArea加入滚动条*/ //setBackground(Color.BLUE); setLayout(new GridBagLayout()); GridBagConstraints gc = new GridBagConstraints(); gc.fill = GridBagConstraints.HORIZONTAL; gc.weightx = 1; gc.weighty = 1; add(LabTitle,gc); gc.weightx = 6; gc.gridx = 2; add(Title,gc); gc.gridx = 0; gc.weightx = 1; gc.weighty = 6; add(LabContent,gc); Content.setLineWrap(true); gc.fill = GridBagConstraints.BOTH; /*扩展TextArea*/ gc.gridx = 2; gc.weightx = 6; add(sp,gc); gc.fill = GridBagConstraints.NONE; /*使StartButton不扩展*/ gc.gridx = 0; gc.weightx = 1; gc.weighty = 1; add(StartButton,gc); gc.gridx = 2; gc.weightx = 6; add(LabStatus,gc); setVisible(true); /*End of GUI*/ int start = 1; ButtonAction StartAction = new ButtonAction(start); StartButton.addActionListener(StartAction); } } } class AutoRegister { public String name = “”; public String pass = “”; public AutoRegister(String url) throws IOException { String host = “”; String port = “80″; try { URL regurl = new URL(url); host = regurl.getHost(); port = “” + ((regurl.getPort() == -1)?80:regurl.getPort()); System.out.println(“Host is :”+host); System.out.println(“Port is :”+port); }catch (MalformedURLException ex) { } Random rd = new Random(); int rdget; do { if ((rdget = rd.nextInt(122)) > 97) { char c = (char)rdget; String tmp = Character.toString(c); name+=tmp; } } while (name.length() < 6 ); System.out.println(name); do { if ((rdget = rd.nextInt(122)) > 97) { char c = (char)rdget; String tmp = Character.toString(c); pass+=tmp; } } while (pass.length() < 6 ); System.out.println(pass); HttpClient regclient = new HttpClient(); regclient.getHostConfiguration().setHost(host,80,“http”); String regurl = url.concat(“/register.php”); System.out.println(regurl); HttpMethod regmethod = regPostMethod(regurl,name,pass); regclient.executeMethod(regmethod); System.out.println(regmethod.getStatusLine()); String regresponse = new String(regmethod.getResponseBodyAsString().getBytes(“8859_1″)); System.out.println(regresponse); regmethod.releaseConnection(); } private static HttpMethod regPostMethod(String regurl,String name,String pass) { PostMethod reg = new PostMethod(regurl); NameValuePair regname = new NameValuePair(“regname”,name); NameValuePair regpwd = new NameValuePair(“regpwd”,pass); NameValuePair regemail = new NameValuePair(“regemail”,“cocobear@yeah.net”); // NameValuePair regpwdrepeat = new NameValuePair(”regpwdrepeat”,”ffffff”); NameValuePair forward = new NameValuePair(“forward”,“”); NameValuePair step = new NameValuePair(“step”,“2″); reg.setRequestBody(new NameValuePair[] {regname,regpwd,regemail,forward,step}); return reg; } String getUser() { return name; } String getPass() { return pass; } } class NewPost { public NewPost(String url,String user,String pass,String fid,String title,String content,String encode) throws IOException { String host = “”; String port = “80″; try { URL regurl = new URL(url); host = regurl.getHost(); port = “” + ((regurl.getPort() == -1)?80:regurl.getPort()); System.out.println(“Host is :”+host); System.out.println(“Port is :”+port); }catch (MalformedURLException ex) { } HttpClient client = new HttpClient(); client.getHostConfiguration().setHost(host, 80, “http”);/*需要更改端口*/ //client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); String posturl = url.concat(“/post.php”); String loginurl = url.concat(“/login.php”); String geturl1 = posturl.concat(“?fid=”); String geturl = geturl1.concat(fid); System.out.println(“Post url is “+posturl); System.out.println(“User is “+user); System.out.println(“Password is “+pass); System.out.println(“geturl is “+geturl); /*登录论坛*/ PostMethod authpost = new PostMethod(loginurl); NameValuePair userid = new NameValuePair(“pwuser”, user); NameValuePair password = new NameValuePair(“pwpwd”, pass); NameValuePair hideid = new NameValuePair(“hideid”,“0″); NameValuePair cktime = new NameValuePair(“cktime”,“31536000″); NameValuePair forward = new NameValuePair(“forward”,“/”); NameValuePair jumpurl = new NameValuePair(“jumpurl”,“/”); NameValuePair step = new NameValuePair(“step”,“2″); authpost.setRequestBody( new NameValuePair[] {userid, password,hideid,cktime,forward,jumpurl,step}); Map<String,String> headers = new HashMap<String,String>(); client.executeMethod(authpost); authpost.releaseConnection(); /*登录完成*/ /*获取cookie;自动cookie处理有问题,cookie信息不全*/ for(Header header : authpost.getResponseHeaders(“Set-Cookie”)) { String[] sArray = header.getValue().split(“;”)[0].split(“=”); headers.put(sArray[0],sArray[1]); } StringBuffer buffer = new StringBuffer(); for (Iterator iterator = headers.keySet().iterator();iterator.hasNext();) { String key = (String) iterator.next(); buffer.append(buffer.length() > 0 ? “;”:“”).append(key).append(“=”).append(headers.get(key)); } /*获取verify值*/ GetMethod getverify = new GetMethod(geturl); getverify.addRequestHeader(“Cookie”,buffer.toString()); client.executeMethod(getverify); String result = null; StringBuffer resultBuffer = new StringBuffer(); BufferedReader in = new BufferedReader( new InputStreamReader( getverify.getResponseBodyAsStream(), getverify.getResponseCharSet())); String inputLine = null; String strverify = null; while ((inputLine = in.readLine()) != null) { String strofverify = “verify”; if (inputLine.indexOf(strofverify) != -1) { strverify = inputLine.substring(42,50);/*verify值在一行的指定位置*/ } } System.out.println(“verify is :” + strverify); in.close(); /*String encode = “gbk”; result = ConverterStringCode(resultBuffer.toString(), getverify.getResponseCharSet(), encode); System.out.println(result); */ getverify.releaseConnection(); /*获取verify值完成*/ /*开始提交贴子*/ PostMethod autopost = new PostMethod(posturl); autopost.addRequestHeader(“Cookie”,buffer.toString()); autopost.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler()); //autopost.removeRequestHeader(”Content-Type”); //autopost.addRequestHeader(new Header(”Content-Type”,”text/html; charset=GBK”)); System.out.println(strverify); StringPart verify = new StringPart(“verify”,strverify); StringPart atc_title = new StringPart(“atc_title”,title,encode); StringPart atc_autourl = new StringPart(“atc_autourl”,“1″); StringPart atc_usesign = new StringPart(“atc_usesign”,“1″); StringPart atc_convert = new StringPart(“atc_convert”,“1″); StringPart atc_content = new StringPart(“atc_content”,content,encode); StringPart atc_rvrc = new StringPart(“act_rvrc”,“0″); //StringPart atc_hide = new StringPart(”atc_hide”,”1″); StringPart atc_money = new StringPart(“atc_money”,“0″); StringPart atc_downrvrc1 = new StringPart(“atc_downrvrc1″,“0″); StringPart atc_desc1 = new StringPart(“atc_desc1″,“”); StringPart atc_step = new StringPart(“step”,“2″); StringPart pid = new StringPart(“pid”,“”); StringPart action =new StringPart(“action”,“new”); StringPart atc_fid = new StringPart(“fid”,“2″); StringPart tid = new StringPart(“tid”,“0″); StringPart special = new StringPart(“special”,“0″); Part[] parts = {verify,atc_title,atc_autourl,atc_usesign,atc_convert,atc_content,atc_rvrc,atc_money,atc_downrvrc1,atc_desc1,atc_step,pid,action,atc_fid,tid,special,}; autopost.setRequestEntity(new MultipartRequestEntity(parts,autopost.getParams())); int status = client.executeMethod(autopost); System.out.println(“autopost return “+status); String response = new String(autopost.getResponseBodyAsString().getBytes(“8859_1″)); System.out.println(response); } private static String ConverterStringCode(String source, String srcEncode, String destEncode) { if (source != null) { try { return new String(source.getBytes(srcEncode), destEncode); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return “”; } } else { return “”; } } }
Popularity: 17% [?]