首页 > 代码库 > C#执行javascript代码

C#执行javascript代码

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