Bugfree外挂开发

通过java模拟浏览器行为,对bugfree系统进行操作。譬如:通过bug id,查询bug的信息;查询产品族;查询满足特定条件的bug列表;批量更新bug的状态;上报bug到bugfree系统等。


package com.yunos.qa;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.HashMap;

import java.util.Map;

public class BugfreeOperator {

private static final String API_KEY = "";

private static final String bugfreeUrl = "http://bugfree-external.aliyun-inc.com/bugfree/api3.php";

private String sessionId;

private SessionInfo sessionInfo;

public BugfreeOperator() {

}

private SessionInfo getSessionInfo() {

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, "mode=getsid");

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return null;

}

SessionInfo sessionInfo = JsonParser.parseSessionInfo(jsonResult);

System.out.println("sessionId: " + sessionInfo.getSessionId());

System.out.println("rand: " + sessionInfo.getRand());

return sessionInfo;

}

/**

*

* 认证码。

#加密算法:

$auth = md5(md5($username.md5($password)).API_KEY.$rand)

其中$username为用户名,$password为该用户的明文密码,$rand为getsid方法获得的rand值。

* @param userName

* @param password

* @return

*/

public boolean login(String userName, String password) {

sessionInfo = getSessionInfo();

if (sessionInfo == null) {

return false;

}

String md5 = MD5.getMD5(password.getBytes());

System.out.println("md5: " + md5);

md5 = userName + md5;

md5 = MD5.getMD5(md5.getBytes());

md5 = md5 + API_KEY + sessionInfo.getRand();

String auth = MD5.getMD5(md5.getBytes());

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "login");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

params.put("username", userName);

params.put("auth", auth);

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return false;

}

System.out.println("jsonResult: " + jsonResult);

return JsonParser.parseLoginResult(jsonResult);

}

public void findProducts() {

if (sessionInfo == null) {

return;

}

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "findproducts");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return;

}

System.out.println("[findProducts] jsonResult: " + jsonResult);

return;

}

public void getBug(int id) {

if (sessionInfo == null) {

return;

}

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "getbug");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

params.put("id", Integer.toString(id));

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return;

}

System.out.println("[getBug] jsonResult: " + jsonResult);

return;

}


public void addBug(int product_id, BugInfo bugInfo, int productmodule_id) {

if (sessionInfo == null) {

return;

}

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "addbug");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

params.put("product_id", Integer.toString(bugInfo.getProduct_id()));

params.put("product_name", bugInfo.getProduct_name());

params.put("productmodule_id", Integer.toString(productmodule_id));

params.put("module_name", bugInfo.getModule_name());

params.put("title", bugInfo.getTitle());

params.put("priority", Integer.toString(bugInfo.getPriority()));

params.put("severity", Integer.toString(bugInfo.getSeverity()));

params.put("assign_to_name", bugInfo.getAssign_to_name());

params.put("BugType", bugInfo.getBugType());

//params.put("created_by", "1169");

//params.put("created_by_name", "haha");

params.put("bug_status", "Active");

DateFormat df=new  SimpleDateFormat("yyyy-MM-dd");

Calendar c =  Calendar.getInstance();

c.add(Calendar.DAY_OF_WEEK, 7); // 目前的時間加7天

//System.out.println(df.format(c.getTime()));

//params.put("mail_to", "\u738b\u5947,\u4e5d\u91ce");

params.put("repeat_step", bugInfo.getRepeat_step());

params.put("Creater", "金永华");

params.put("Downgrade", "\u5426");

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return;

}

System.out.println("[addBug] jsonResult: " + jsonResult);

return;

}

public void updateBugStatus(int id, String bug_status) {

if (sessionInfo == null) {

return;

}

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "updatebug");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

params.put("id", Integer.toString(id));

params.put("bug_status", bug_status);

params.put("severity", "4");

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return;

}

System.out.println("[updateBugStatus] jsonResult: " + jsonResult);

}

public Map<String, String> findModules(int product_id) {

Map<String,String> moduleName2OwnerMap = new HashMap<String, String>();

if (sessionInfo == null) {

return moduleName2OwnerMap;

}

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "findmodules");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

params.put("product_id", Integer.toString(product_id));

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return moduleName2OwnerMap;

}

System.out.println("[findModules] jsonResult: " + jsonResult);

JsonParser.parseModuleList(jsonResult, moduleName2OwnerMap);

return moduleName2OwnerMap;

}

private static final String QUERY_TEMPLATE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +

"<query table=\"Bug\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://bugfree/query.xsd\">" +

"<fields logic=\"OR\">" +

"<field name=\"title\" operator=\"LIKE\" value=\"TITLE\"/>" +

"</fields>" +

"</query>";

public String queryByTitle(int product_id, String title) {

String query = QUERY_TEMPLATE.replaceAll("TITLE", title);

if (sessionInfo == null) {

return "";

}

Map<String, String> params = new HashMap<String, String>();

params.put("mode", "query");

params.put(sessionInfo.getSessionName(), sessionInfo.getSessionId());

params.put("product_id", Integer.toString(product_id));

params.put("query", query);

String jsonResult = null;

InputStream is = null;

try {

is = doPost(bugfreeUrl, params);

jsonResult = getResult(is);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

if (jsonResult == null) {

return "";

}

return jsonResult;

}

public boolean hasNotClosed(String jsonResult) {

if (jsonResult.equals("")) {

return false;

}

if (jsonResult.contains("\"bug_status\":\"Active\"")) {

return true;

}

return false;

}

public boolean hasClosed(String jsonResult) {

if (jsonResult.equals("")) {

return false;

}

if (jsonResult.contains("\"bug_status\":\"Closed\"")) {

return true;

}

if (jsonResult.contains("\"bug_status\":\"Resolved\"")) {

return true;

}

return false;

}

public boolean hasRejected(String jsonResult) {

if (jsonResult.equals("")) {

return false;

}

if (jsonResult.contains("\"solution\":\"Reject\"")) {

return true;

}

if (jsonResult.contains("\"solution\":\"Won't Fix\"")) {

return true;

}

// By Design

if (jsonResult.contains("\"solution\":\"By Design\"")) {

return true;

}

return false;

}

public InputStream doPost(String urlStr, Map<String, String> params) throws IOException {

StringBuilder sb = new StringBuilder();

for(Map.Entry<String, String> param : params.entrySet()) {

sb.append(param.getKey()).append("=").append(param.getValue()).append("&");

}

int len = sb.length();

if (len > 0) {

sb.deleteCharAt(len - 1);

}

String args = sb.toString();

//System.out.println("args: " + args);

return doPost(urlStr, args);

}

public InputStream doPost(String urlStr, String args) throws IOException {

URL url = null;

try {

url = new URL(urlStr);

} catch (MalformedURLException e) {

e.printStackTrace();

return null;

}

HttpURLConnection connection = (HttpURLConnection)url.openConnection();

//connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");

//String myCookie = "GerritAccount=aSecfaQr028r8-6yxggWFA1QQc0YQFz5";

if (sessionId != null) {

System.out.println("sessionId: " + sessionId);

connection.setRequestProperty("Cookie", sessionId);

}

//connection.setRequestProperty("Connection", "Keep-Alive");

/**

* 然后把连接设为输出模式。URLConnection通常作为输入来使用,比如下载一个Web页。

* 通过把URLConnection设为输出,你可以把数据向你个Web页传送。下面是如何做:

*/

connection.setDoOutput(true);

//connection.setRequestMethod("POST");

/**

* 最后,为了得到OutputStream,简单起见,把它约束在Writer并且放入POST信息中,例如: ...

*/

OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");

out.write(args); //向页面传递数据。post的关键所在!

// remember to clean up

out.flush();

out.close();

return connection.getInputStream();

}

private static String getResult(InputStream is) throws IOException {

StringBuilder sb = new StringBuilder();

BufferedReader br = new BufferedReader(new InputStreamReader(

is));

String line = null;

while ((line = br.readLine()) != null) {

sb.append(line);

}

return sb.toString();

}

}

  JsonParser用于解析从bugfree返回来的json信息:


package com.yunos.qa;

import org.json.*;

import java.util.Map;

public class JsonParser {

public static SessionInfo parseSessionInfo(String jsonResult) {

System.out.println("sessionInfo: " + jsonResult);

SessionInfo sessionInfo = new SessionInfo();

try {

JSONObject jsonObj = new JSONObject(jsonResult);

sessionInfo.setSessionName(jsonObj.getString("sessionname"));

sessionInfo.setSessionId(jsonObj.getString("sessionid"));

sessionInfo.setRand(jsonObj.getString("rand"));

} catch(JSONException ex) {

ex.printStackTrace();

}

return sessionInfo;

}

public static boolean parseLoginResult(String jsonResult) {

try {

JSONObject jsonObj = new JSONObject(jsonResult);

String status =jsonObj.getString("status");

return "success".equals(status);

} catch(JSONException ex) {

ex.printStackTrace();

}

return false;

}

public static void parseModuleList(String jsonResult, Map<String,String> moduleName2OwnerMap) {

try {

JSONObject jsonObj = new JSONObject(jsonResult);

JSONArray moduleList =jsonObj.getJSONArray("ModuleList");

int moduleCount = moduleList.length();

for(int i=0; i<moduleCount; i++) {

JSONObject moduleObj = moduleList.getJSONObject(i);

//System.out.println("module id:" + moduleObj.getString("id"));

String moduleName = moduleObj.getString("name");

//System.out.println("module name:" + moduleName);

//System.out.println("module product_id:" + moduleObj.getString("product_id"));

//System.out.println("module grade:" + moduleObj.getString("grade"));

//moduleObj.get

//System.out.println("module parent_id:" + moduleObj.getString("parent_id"));

//System.out.println("module full_path_name:" + moduleObj.getString("full_path_name"));

//System.out.println("module display_order:" + moduleObj.getString("display_order"));

//System.out.println("module owner_id:" + moduleObj.getString("owner_id"));

String ownerName = moduleObj.getString("owner_name");

//System.out.println("module owner_name:" + ownerName);

moduleName2OwnerMap.put(moduleName, ownerName);

}

} catch(JSONException ex) {

ex.printStackTrace();

}

}

}

  SessionInfo用于会话信息:


package com.yunos.qa;

public class SessionInfo {

private String sessionName = "";

private String sessionId = "";

private String rand = "";

public String getSessionName() {

return sessionName;

}

public void setSessionName(String sessionName) {

this.sessionName = sessionName;

}

public String getSessionId() {

return sessionId;

}

public void setSessionId(String sessionId) {

this.sessionId = sessionId;

}

public String getRand() {

return rand;

}

public void setRand(String rand) {

this.rand = rand;

}

}

 BugInfo:javabean对象,用于映射bugfree中的bug:


package com.yunos.qa;

public class BugInfo {

private int product_id;     //  Integer     必须  产品id    1

private int productmodule_id;       //    Integer         模块id    1

private String product_name = "";

private String module_name = "";

private String title;           //String     必须  Bug标题   1

private int severity = 4;            //Integer     必须  严重程度    1,2,3,4

private int priority = 2;    //Integer         优先级     1,2,3,4

private String repeat_step = "";      // String      重现步骤

private String assign_to_name = "";  //String  必须  指派给     系统管理员

private String BugType = "";        // String 必须 缺陷类型

//private String created_by = "";

//private String bug_status = "";

private String action_note = "";     //String      注释

private String mail_to = "";             //String      抄送给, 以','分割     系统管理员,admin@bugfree.org

private int related_case = 0;    //Integer         相关Case

//attachment_file[]

public BugInfo(int product_id, String title, int severity, String assign_to_name, String BugType) {

this.product_id = product_id;

if (title.length() > 102) {

this.title = title.substring(0, 100);

} else {

this.title = title;

}

this.severity = severity;

this.assign_to_name = assign_to_name;

this.BugType = BugType;

}

public int getProduct_id() {

return product_id;

}

public void setProduct_id(int product_id) {

this.product_id = product_id;

}

public int getProductmodule_id() {

return productmodule_id;

}

public void setProductmodule_id(int productmodule_id) {

this.productmodule_id = productmodule_id;

}

public String getProduct_name() {

return product_name;

}

public void setProduct_name(String product_name) {

this.product_name = product_name;

}

public String getModule_name() {

return module_name;

}

public void setModule_name(String module_name) {

this.module_name = module_name;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public int getSeverity() {

return severity;

}

public void setSeverity(int severity) {

this.severity = severity;

}

public int getPriority() {

return priority;

}

public void setPriority(int priority) {

this.priority = priority;

}

public String getRepeat_step() {

return repeat_step;

}

public void setRepeat_step(String repeat_step) {

this.repeat_step = repeat_step;

}

public String getAssign_to_name() {

return assign_to_name;

}

public void setAssign_to_name(String assign_to_name) {

this.assign_to_name = assign_to_name;

}

public String getBugType() {

return BugType;

}

public void setBugType(String bugType) {

BugType = bugType;

}

public String getAction_note() {

return action_note;

}

public void setAction_note(String action_note) {

this.action_note = action_note;

}

public String getMail_to() {

return mail_to;

}

public void setMail_to(String mail_to) {

this.mail_to = mail_to;

}

public int getRelated_case() {

return related_case;

}

public void setRelated_case(int related_case) {

this.related_case = related_case;

}

}

  其他:

  bugfree在addbug时,对bug的title的内容是有校验的。我在用程序addbug时,遇到过一次addbug失败,报错信息如下:

  {"status":"failed","code":7,"info":{"custom_field":"custom field [quot;_prio] is not valid field name"}}

  title里边有一些特殊字符,会导致这个问题

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-30 03:08:23

Bugfree外挂开发的相关文章

韩国国内最大的游戏外挂制作公司被警方查处

日前,韩国国内最大的游戏外挂制作公司被警方查处. 5月26日,韩国釜山警察厅网络监察大队以涉嫌开发外挂(侵犯著作权)为由,对A公司CEO赵某(26岁)等3人进行了立案.同时,警方还对涉嫌从A公司购买外挂,并通过运营打币工作室获得非法收入8亿韩元(折合人民币约为446万元)的洪某(36岁)等24人进行了不拘留立案. 据警方称,赵某涉嫌在2008年6月创办公司后雇用员工30名开发游戏外挂,并按每个外挂7万韩元(折合人民币约为391元)的价格出售,获利50亿韩元(折合人民币约为2790万元),在扰乱游

打击非法外挂 腾讯QQ完成IP加密技术

1998年11月12日,马化腾和他大学时的同班同学张志东正式注册成立"深圳市腾讯计算机系统有限公司".当时公司的主要业务是拓展无线网络寻呼系统.在http://www.aliyun.com/zixun/aggregation/30730.html">公司成立当初要业务是为寻呼台建立网上寻呼系统,这种针对企业或单位的软件开发工程可以说是几乎所有中小型网络服务公司的最佳选择. 1997年,马化腾接触到了ICQ并成为它的用户,他亲身感受到了ICQ的魅力,也看到了它的局限性:一

网络游戏产业十年之外挂的发展

网络游戏十年间,伴随网络游戏一同成长的,是游戏"外挂"的发展.十年网游经营路,外挂影响到并毁灭掉的网络游戏数不胜数,即便是目前的各类热门网络游戏产品当中,也不乏存在多多少少的外挂问题.那么外挂的发展是从什么时候开始,这期间又都经历了哪些变革呢?我们不妨通过此次回忆,去了解一下外挂的变迁. 最早的带有外挂性质的软件--按键精灵 外挂的发展最早可以追溯到2003年,实际当外挂第一次为游戏而设置功能前,它就以一种特殊的形式存在于网络当中了.2001,当国内互连网已经取得了多数年轻人的喜爱时,

开源Bug跟踪管理工具--BugFree

-------------------------------------------- |BugFree--服务企业研发管理,专注软件测试流程| -------------------------------------------- 地址:http://www.bugfree.org.cn/    目录: -----   1. BugFree是什么?   2. BugFree可以帮助您做什么?   3. BugFree的适用对象.   4. 为什么要选择BugFree?   5. BugFr

游戏安全资讯精选 2017年第十九期:WebLogic Server WLS组件漏洞入侵挖矿事件分析,苹果手游代充灰色产业深度揭秘,《绝地求生》99%外挂都来自国内

[游戏行业安全动态]苹果手游代充灰色产业深度揭秘 概要:苹果手游代充最早可以追溯到2012年前后,到现在已经经历了多次发展,从最开始的外币汇率差,退款,36漏洞,再到现在黑卡,盗刷信用卡,甚至出现了专门的库存系统.库存系统保存的就是苹果的消费凭据,充值商家等到有客户时候,可以随时使用,可谓完美绕过苹果风控,使黑卡和盗刷可以大规模实现,让供货和销售分开,降低了行业进入的门槛,更加细分了产业链,放大了黑卡和盗刷的影响.库存系统还能绕过大多数游戏的外币检测,甚至充值游戏里已经下架的面值,比如之前某款游

《C++ 黑客编程揭秘与防范》——1.2 应用程序的调试

1.2 应用程序的调试 C++ 黑客编程揭秘与防范 在开发程序的过程中,除了编码以外还需要对程序进行调试,当编写的程序出现问题后,就要对程序进行调试.调试不是仅使用一个printf()或MessageBox()进行简单的输出来观察某个函数的返回值(虽然在调试的时候的确是对返回值观察较多),也不是对某个变量.某一时间的具体值的输出.调试是有专业的调试分析工具的,VC6不但提供代码编辑.代码编译.编译连接等功能,还提供了一个非常好用的调试工具.在编写完代码后,如果程序输出的结果是未知的,或者是没有预

北京一高新企业开发腾讯游戏外挂牟利千万

在全国同行游戏中排名前三.深圳腾讯公司引进代理的火爆网络游戏<地下城与勇士>被"盯"上了,北京一家正规公司开发"萝卜游侠"等软件外挂<地下城与勇士>,不到半年非法牟利近千万.昨日,记者从南山警方获悉,7名涉案人员日前被抓获. 腾讯火爆游戏遭侵权 <地下城与勇士>(简称D N F项目)游戏是深圳腾讯公司与韩国N EO PLE公司签订授权合同正式引入代理出版发行的大型在线网络游戏,同时在线人数达200万人,在全国同行游戏中排名前三.但

两团伙开发腾讯网游外挂软件遭法院判刑

[TechWeb消息]11月5日消息,来自腾讯公司消息称,两个寄生于腾讯旗下网游<QQ自由幻想>.<寻仙>的非法外挂团伙,近日分别被深圳市南山区人民法院和江苏省南通市崇川区人民法院宣判并获刑. 今年初,腾讯公司根据游戏玩家的举报,陆续发现有人针对<QQ自由幻想>和<寻仙>两款游戏,开发了非法的外挂软件并大量销售牟利.腾讯公司随即分别向深圳市南山区公安分局和江苏省南通市公安局报案.经过警方的缜密侦查和取证,深圳警方于2009年4月将<QQ自由幻想>

51承认开发QQ外挂 腾讯称难以置信

针对网上沸沸扬扬的51.com公司制作运营彩虹QQ的传闻,51新闻发言人.副总裁黄绍麟昨日对媒体矢口否认.但在强大的舆论压力下,该公司昨日下午声明承认彩虹外挂确系该公司所为.业界人士认为,51出尔反尔的做法令人意外.腾讯方面则对此表示,"居然有合法注册的企业从事外挂制作,令人难以置信". 51与腾讯之间有很多业务重合,几乎QQ每推出一款新的功能,51都会很快复制到自己的平台上,51秀.51商城.51群组,甚至51问问.目前,51几乎拷贝了QQ产品线上的全部应用功能.51依靠抄袭赢得了风