1.代码如下:
click_add_revisions() { lr_think_time(6); web_url("revision", "URL=http://192.168.1.102:8000/reversion/revision/", "Resource=0", "RecContentType=text/html", "Referer=http://192.168.1.102:8000/", "Snapshot=t4.inf", "Mode=HTML", EXTRARES, "Url=/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.eot?", ENDITEM, LAST); web_add_cookie("SRCHUID=V=2&GUID=01963DB195B14EEAB6B0128DE686964D&dmnchg=1; DOMAIN=c.urs.microsoft.com"); web_add_cookie("SRCHD=AF=NOFORM; DOMAIN=c.urs.microsoft.com"); web_add_cookie("SRCHUSR=DOB=20200831; DOMAIN=c.urs.microsoft.com"); web_reg_save_param("addrevisionscsrfmiddlewaretoken","LB='csrfmiddlewaretoken' value='","RB=' />",LAST); //定义声明添加版本csrtoken变量 web_reg_save_param("selectusers","LB=<option value=\"","RB=\">","ORD=All",LAST); //定义声明用户选项变量,变量内容从下面的web_link中的响应内容中获取 web_link("增加 Revision", "Text=增加 Revision", "Snapshot=t5.inf", EXTRARES, "Url=/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.eot?", ENDITEM, "Url=https://c.urs.microsoft.com/l1.dat?cw=637194112741176080&v=3&cv=9.11.17134.0&os=10.0.17134.0.0&pg=4A72F430-B40C-4D36-A068-CE33ADA5ADF9", "Referer=", ENDITEM, LAST); web_set_sockets_option("SSL_VERSION", "TLS1.1"); return 0; }
其中 web_reg_save_param("selectusers","LB=<option value=\"","RB=\">","ORD=All",LAST); 为表示从web_link的响应中获取左边界为<option value=",右边界为">的所有内容,使用ORD=All 表示要获取所有内容,/“ 表示转义双引号;
2.调试
1.在 return 0;代码前打断点
2.Run-Time Settings->Log设置:
勾选Enable logging
选中Always send messages
选中Extended log
勾选Parameter substitution :勾选此项,则可以看到参数赋值变化
3.运行,可以看到参数的选项值如下:
click_add_revisions.c(27): Notify: Saving Parameter "selectusers_1 = 1". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_2 = 324". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_3 = 325". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_4 = 326". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_5 = 327". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_6 = 328". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_7 = 329". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_8 = 330". click_add_revisions.c(27): Notify: Saving Parameter "selectusers_9 = 331".
表示参数selectusers获取到9个值,每个值为等号后的内容
4.使用获取到的参数
4.1.使用lr自带的函数随机获取参数列表中的值:
使用函数lr_paramarr_random()函数,代码如下:
submit_revisions() { char *preseluser,preseluseres[30]; //定义字符变量preseluser,用来表示预选用户,其中变量preseluseres作为preseluser的跳板,直接引用preseluser,就会成为一个常量 //定义字符串变量preseluseres,字符串长度为30 preseluser=lr_paramarr_random("selectusers"); //使用lr_paramarr_random函数随机获取selectusers列表中任意一项作为字符变量preseluser的值 lr_output_message("preseluser=%s",preseluser); //打印preseluser的值 sprintf(preseluseres,"Value=%s",preseluser); //使用sprintf函数,将"Value=%s"作为变量preseluseres的值 lr_output_message("preseluseres=%s",preseluseres); //打印preseluseres的值,验证preseluseres值是否正确,真正运行时可以把此行注释掉 web_submit_data("add", "Action=http://192.168.1.102:8000/reversion/revision/add/", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/html", "Referer=http://192.168.1.102:8000/reversion/revision/add/", "Snapshot=t6.inf", "Mode=HTML", ITEMDATA, "Name=csrfmiddlewaretoken", "Value={addrevisionscsrfmiddlewaretoken}", ENDITEM, "Name=csrfmiddlewaretoken", "Value={addrevisionscsrfmiddlewaretoken}", ENDITEM, "Name=date_created_0", "Value={DateParame}", ENDITEM, "Name=date_created_1", "Value={HourMinParam}", ENDITEM, "Name=user", preseluseres, ENDITEM, //引用preseluseres的值 "Name=comment", "Value=123", ENDITEM, "Name=version_set-TOTAL_FORMS", "Value=0", ENDITEM, "Name=version_set-INITIAL_FORMS", "Value=0", ENDITEM, "Name=version_set-MIN_NUM_FORMS", "Value=0", ENDITEM, "Name=version_set-MAX_NUM_FORMS", "Value=1000", ENDITEM, "Name=version_set-__prefix__-revision", "Value=", ENDITEM, "Name=version_set-__prefix__-object_id", "Value=", ENDITEM, "Name=version_set-__prefix__-content_type", "Value=", ENDITEM, "Name=version_set-__prefix__-db", "Value=", ENDITEM, "Name=version_set-__prefix__-format", "Value=", ENDITEM, "Name=version_set-__prefix__-serialized_data", "Value=", ENDITEM, "Name=version_set-__prefix__-object_repr", "Value=", ENDITEM, "Name=version_set-__prefix__-id", "Value=", ENDITEM, "Name=_save", "Value=", ENDITEM, EXTRARES, "Url=/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.eot?", "Referer=http://192.168.1.102:8000/reversion/revision/", ENDITEM, LAST); return 0; }
其中定义字符变量preseluser,来获取selectusers列表中的随机值,用字符变量preseluseres获取 “Value=%s”通过变量preseluser的拼接值,再使用preseluseres的值
运行代码后,看添加结果是否正确即可(应该正确运行添加);
4.2. 不使用自带函数编写,代码如下:
char preseluseres[30]; submit_revisions() { char *preseluser; //定义字符变量preseluser,用来表示预选用户,其中变量preseluseres作为preseluser的跳板,直接引用preseluser,就会成为一个常量 //定义字符串变量preseluseres,字符串长度为30 char *preselusertwo,preselusertwoes[30]; // char preseluserstr[30]; //定义字符变量preseluserstr,作为拼接后的赋值变量 int selectuserscount; //定义整型变量selectuserscount,用来获取参数{selectusers_count}的值 int userrandnum=0; //定义整型变量userrandnum,用来作为获取随机selectusers列表的下标值 selectuserscount=atoi(lr_eval_string("{selectusers_count}")); //使用lr_eval_string函数获取参数变量selectusers_count的值,然后用atoi函数将字符串转为整型数值,最后赋值给变量selectuserscount lr_output_message("selectuserscount=%d",selectuserscount); //打印selectuserscount的值 userrandnum=rand()%(selectuserscount)+1; //从0到selectuserscount随机出一个数并将这个数加1赋值给变量userrandnum sprintf(preseluseres,"{selectusers_%d}",userrandnum); //拼接获取得到selectusers_%d选项值,例如selectusers_2 lr_output_message("第%d个用户:%s",userrandnum,lr_eval_string(preseluseres)); //打印随机获得的选项用户内容 /*preseluser=lr_paramarr_random("selectusers"); //使用lr_paramarr_random函数随机获取selectusers列表中任意一项作为字符变量preseluser的值 preselusertwo = lr_paramarr_random("selectusers"); //随机获取selectusers列表中任意一项作为字符串变量preselusertwo的值 lr_output_message("preseluser=%s",preseluser); //打印preseluser的值 lr_output_message("preselusertwo=%s",preselusertwo); //打印preselusertwo的值 while(1) { if(preselusertwo==preseluser) { preselusertwo = lr_paramarr_random("selectusers"); //重新随机获取值 lr_output_message("preselusertwo=%s",preselusertwo); //打印preselusertwo的值 } else break; //否则退出循环 } sprintf(preseluseres,"Value=%s",preseluser); //使用sprintf函数,将"Value=%s"作为变量preseluseres的值 lr_output_message("preseluseres=%s",preseluseres); //打印preseluseres的值,验证preseluseres值是否正确,真正运行时可以把此行注释掉 */ web_submit_data("add", "Action=http://192.168.1.102:8000/reversion/revision/add/", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/html", "Referer=http://192.168.1.102:8000/reversion/revision/add/", "Snapshot=t6.inf", "Mode=HTML", ITEMDATA, "Name=csrfmiddlewaretoken", "Value={addrevisionscsrfmiddlewaretoken}", ENDITEM, "Name=csrfmiddlewaretoken", "Value={addrevisionscsrfmiddlewaretoken}", ENDITEM, "Name=date_created_0", "Value={DateParame}", ENDITEM, "Name=date_created_1", "Value={HourMinParam}", ENDITEM, "Name=user", preseluseres, ENDITEM, //引用preseluseres的值 "Name=comment", "Value=123", ENDITEM, "Name=version_set-TOTAL_FORMS", "Value=0", ENDITEM, "Name=version_set-INITIAL_FORMS", "Value=0", ENDITEM, "Name=version_set-MIN_NUM_FORMS", "Value=0", ENDITEM, "Name=version_set-MAX_NUM_FORMS", "Value=1000", ENDITEM, "Name=version_set-__prefix__-revision", "Value=", ENDITEM, "Name=version_set-__prefix__-object_id", "Value=", ENDITEM, "Name=version_set-__prefix__-content_type", "Value=", ENDITEM, "Name=version_set-__prefix__-db", "Value=", ENDITEM, "Name=version_set-__prefix__-format", "Value=", ENDITEM, "Name=version_set-__prefix__-serialized_data", "Value=", ENDITEM, "Name=version_set-__prefix__-object_repr", "Value=", ENDITEM, "Name=version_set-__prefix__-id", "Value=", ENDITEM, "Name=_save", "Value=", ENDITEM, EXTRARES, "Url=/static/xadmin/vendor/font-awesome/fonts/fontawesome-webfont.eot?", "Referer=http://192.168.1.102:8000/reversion/revision/", ENDITEM, LAST); return 0; }
用如下代码:
int selectuserscount; //定义整型变量selectuserscount,用来获取参数{selectusers_count}的值 int userrandnum=0; //定义整型变量userrandnum,用来作为获取随机selectusers列表的下标值 selectuserscount=atoi(lr_eval_string("{selectusers_count}")); //使用lr_eval_string函数获取参数变量selectusers_count的值,然后用atoi函数将字符串转为整型数值,最后赋值给变量selectuserscount lr_output_message("selectuserscount=%d",selectuserscount); //打印selectuserscount的值 userrandnum=rand()%(selectuserscount)+1; //从0到selectuserscount随机出一个数并将这个数加1赋值给变量userrandnum sprintf(preseluseres,"{selectusers_%d}",userrandnum); //拼接获取得到selectusers_%d选项值,例如selectusers_2 lr_output_message("第%d个用户:%s",userrandnum,lr_eval_string(preseluseres)); //打印随机获得的选项用户内容
替换如下代码:
preseluser=lr_paramarr_random("selectusers"); //使用lr_paramarr_random函数随机获取selectusers列表中任意一项作为字符变量preseluser的值 lr_output_message("preseluser=%s",preseluser); //打印preseluser的值 sprintf(preseluseres,"Value=%s",preseluser); //使用sprintf函数,将"Value=%s"作为变量preseluseres的值 lr_output_message("preseluseres=%s",preseluseres); //打印preseluseres的值,验证preseluseres值是否正确,真正运行时可以把此行注释掉
实际上就是将随机生成数据的过程通过自定义的方式而不是系统自带的lr_paramarr_random函数来生成.
建议:一般建议使用系统自带函数生成,不然会多谢很多代码,好处是:可以按照自己的方式打印输出随机到的内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构