最近在做网站自动登陆小工具,遇到技术屏障。密码在submit时会使用js进行加密。这时我需要模拟这个加密过程,想到使用C#执行javascript代码。
对于执行javascript代码,纯代码方式使用如下两种方式。
1、Google Chrome V8引擎
Google Chrome V8引擎在.NET上的封装,功能完善,性能相对较高。地址: http://javascriptdotnet.codeplex.com/
using Noesis.Javascript; using System; using System.Collections.Generic; namespace JsCSharp { class Program { static void Main(string[] args) { using (JavascriptContext ctx = new JavascriptContext()) { var j = ctx.Run("function add(x,y){return x+y;};add(5,10);"); Console.WriteLine(j);//15 } } } }
2、使用 Microsoft.JScript
Microsoft.JScript是微软提供的程序集,可以在vs中直接添加引用。在开发时必须引入Microsoft.JScript、Microsoft.Vsa命名空间。
using Microsoft.JScript; using Microsoft.JScript.Vsa; using System; namespace JsCSharp { class Program { static VsaEngine Engine = VsaEngine.CreateEngine(); static void Main(string[] args) { var j = EvalJScript("function add(x,y){return x+y;};add(5,10);"); Console.WriteLine(j);//15 } static object EvalJScript(string JScript) { object Result = null; try { Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine); } catch (Exception ex) { return ex.Message; } return Result; } } }
3、最后我使用的方法
在开发中,使用加密js似乎存在缺陷,应用上面两种方法均返回“参数不匹配”错误,但是在浏览器控制台执行加密脚本没有出现任何错误。故使用替代方法。
B/S架构web应用执行javascript
页面执行javascript后,再提交结果到后台。
window.$ = function (a) { return document.getElementById(a); } window.onload = function () { $(‘form1‘).onsubmit = function () { var pwd = $(‘hfdPwd‘); pwd.value = jingoalSHA1.hex_sha1(jingoalSHA1.hex_sha1($(‘txtPwd‘).value) + $(‘hfdToken‘).value) } }
比较复杂逻辑,如提交数据到后台,处理后返回前端执行脚本再次提交到后台。
C/S架构的Winform
使用webbrowser在页面执行脚本,利用api获得值。虽没有上面两种干净和谐,但不失为一种解决方案。