最近在做网站自动登陆小工具,遇到技术屏障。密码在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获得值。虽没有上面两种干净和谐,但不失为一种解决方案。
C#执行javascript代码,布布扣,bubuko.com