苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 110834|回复: 49
打印 上一主题 下一主题

[教程] 根据传入的JS方法名和参数执行JavaScript

[复制链接]
跳转到指定楼层
发表于 2014-9-17 09:46:07 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
导读部分

【HttpHelper万能框架】教程目录贴  http://www.sufeinet.com/thread-9989-1-1.html
【HttpHelper万能框架】源码购买帖  http://www.sufeinet.com/thread-9926-1-1.html

教程部分


执行JS一直是网络抓取的难题,或者是说可以难倒一部分用户的难题,今天我在万能框架中提供一个简单的执行JS方法
可以直接调用一段JS代码中的方法,或者是直接执行一段JS代码。

我实现的是Js的Eval方法,这个方法我相信懂JS的人都知道一点,他是用来动态执行JS代码的,大家想一下如果我在C#中实现这个方法,是不是就会很方便的来使用C#执行JS了。
我只想说必须的。

下面看方法签名
[C#] 纯文本查看 复制代码
  /// <summary>
        /// 直接调用JS方法并获取返回的值
        /// </summary>
        /// <param name="strJs">要执行的JS代码</param>
        /// <param name="main">要调用的方法名</param>
        /// <returns>执行结果</returns>
        public static string JavaScriptEval(string strJs, string main)


调用方法,下面我 先给出一个简单的JS文件
[C#] 纯文本查看 复制代码

function main1() {

    return 1 + 1;
}

function main2(n) {

    return 1 + n;
}



下面是调用方法和用例大家请看代码
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using CsharpHttpHelper;

namespace CsharpHttpHelper_Demo
{
    public partial class HttpJs_Demo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            string strjs = string.Empty;
            using (StreamReader sr = new StreamReader(Server.MapPath("test.js")))
            {
                strjs = sr.ReadToEnd();
            }

            //调用不带参数的方法
            string main1 = HttpHelper.JavaScriptEval(strjs, "main1()");

            //调用带参数的方法
            string main2 = HttpHelper.JavaScriptEval(strjs, "main2(25)");

            //直接执行JS代码
            string jiafa = HttpHelper.JavaScriptEval(string.Empty, "25+1+4");

            //直接执行JS代码
            string time = HttpHelper.JavaScriptEval(string.Empty, " new Date().toString()");
        }
    }
}

效果如下

好了,我相信有了这个方法能帮助大家解决很多问题。
更强大的功能我会一直研究,等有了成果我会第一时间加入万能框架,分享给大家使用。
这个功能将在25号左右的更新中出现。
小伙伴们有什么想法可以提提建议




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
49
发表于 2021-6-22 17:58:19 | 只看该作者
感恩无私的分享与奉献
48
发表于 2020-12-17 10:08:44 | 只看该作者
回复

使用道具 举报

47
发表于 2020-10-10 17:55:30 | 只看该作者
你好,我想问下,怎么可以利用这个获取js混淆后的代码呢?

比如下面这种:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('v w={\'x\':6,\'u\':\'兼职阎王\',\'t\':\'/6/q\',\'r\':\'-1\',\'s\':\'/6/y\',\'z\':\'F话\',\'G\':[\'/3/J/5/4/E-D.2\',\'/3/J/5/4/p.2\',\'/3/J/5/4/B.2\',\'/3/J/5/4/C-H.2\',\'/3/J/5/4/n.2\',\'/3/J/5/4/f.2\',\'/3/J/5/4/c.2\',\'/3/J/5/4/d.2\',\'/3/J/5/4/b.2\',\'/3/J/5/4/a.2\',\'/3/J/5/4/7-8.2\',\'/3/J/5/4/9.2\',\'/3/J/5/4/e.2\',\'/3/J/5/4/g.2\',\'/3/J/5/4/m.2\',\'/3/J/5/4/k-h.2\',\'/3/J/5/4/j.2\',\'/3/J/5/4/o-i.2\',\'/3/J/5/4/l.2\',\'/3/J/5/4/A-11.2\',\'/3/J/5/4/18.2\',\'/3/J/5/4/I.2\',\'/3/J/5/4/19.2\',\'/3/J/5/4/17.2\',\'/3/J/5/4/16.2\',\'/3/J/5/4/13-.2\',\'/3/J/5/4/14.2\',\'/3/J/5/4/1b.2\',\'/3/J/5/4/1a-1h.2\',\'/3/J/5/4/1i.2\',\'/3/J/5/4/1g.2\',\'/3/J/5/4/1f.2\',\'/3/J/5/4/1c-.2\',\'/3/J/5/4/1d.2\',\'/3/J/5/4/1e.2\',\'/3/J/5/4/15.2\',\'/3/J/5/4/12.2\',\'/3/J/5/4/P.2\',\'/3/J/5/4/Q.2\',\'/3/J/5/4/R.2\',\'/3/J/5/4/O-N.2\',\'/3/J/5/4/K.2\',\'/3/J/5/4/L.2\',\'/3/J/5/4/M.2\',\'/3/J/5/4/S.2\',\'/3/J/5/4/T.2\',\'/3/J/5/4/Z.2\',\'/3/J/5/4/10.2\',\'/3/Y.2\'],\'X\':U,\'V\':\'/6/\',\'W\':0};',62,81,'||jpg|ManHuaKu|42buqieryu|JianZhiYanWang|40257|1601989128ejz9|YaRWnHZLrg6|1601989127BeT68jA3XuibOTQ1|1601989129NW3xhmxF9w2BOora|1601989130L9IprKAXZddkyYSy|1601989132CfbPbm2gjTMTKMyS|1601989131OX5rXsZEqAb9NWPJ|1601989125E7MxhGfhBDJ0E8Nj|1601989133FxY_eOfoWdshfP3Z|1601989124ROXw2bOsGQR0nxV0|13amKzoWR|8dcx|1601989121V9MO6scyY3kNzuTJ|1601989122nF0CsT|1601989119hhpjyFqaCIi0w_oD|1601989123h945JZ5FSQfIWkKs|1601989134e2xFd363J8sPs_Oi|1601989120mxAHvYXDtqw|1601989137S8TvtRUaEmmd6zvf|09|ncid|pcid|cid|btitle|var|cInfo|bid|08|ctitle|1601989117QH|1601989136g4suR_Md8kAGZydt|16019891351|WS0PwE7|16019891392syyFZGD|42|fs|tP1lrMQCLzbvmA|1601989116hL74Klxfgw_cWa1F||1601989091x3RNgYHlsZgkSemU|1601989090pGJv3LsHENuLvm5E|1601989089U6McDjOTOPGcv0O1|uP7ufThR|1601989092f1kAlFD|16019890953gIQ6Oy9hI_13Y7x|1601989094OqRVay6sO63SjfHw|1601989093OBWKBWymhKudHXaY|1601989088VkQHsQWFkLlpVsvV|160198908799_8fQ1HxWNajold|49|burl|bs|fc|222|1601989086vaz3rGVUPlMi5bhE|1601989084KQdmF9xVFstG79j0|UjgrrAGIvlkZG|1601989098yIpYKjFiu8jTwq5R|1601989111gshXsikQtH2l2Cf|1601989110pH6nymHP5ITQQmld|1601989099IyI7zbqG2n0WYMc6|1601989112_jlsoOovFmKbhFHE|1601989113flHhyIUSMVM9Yc1f|16019891164VX_pgnrjWN19Jda|1601989114cBUDuPKlguEdWysq|1601989106TXpn_k5T_FPc|16019891089VktxH9I5SvZKuWi|1601989102n7MeyFBrov4vrEO|160198910122mG1AlBJN0CsVUq|1601989100OUfGixttHZ30_49A|1601989103cR03tz1upXDHVyKq|160198910483M50AkYkdoUnvrD|ksR|1601989105o_jX3jreRxe1rTDl'.split('|'),0,{}))

有一些工具是可以直接反js混淆的,比如:https://www.html.cn/tool/js_beautify/
咱们这个js可以做到这种功能吗
46
发表于 2019-12-12 00:31:55 | 只看该作者
也是好东西
45
发表于 2019-8-25 11:35:12 | 只看该作者
强烈支持楼主ing……
44
发表于 2019-8-22 16:54:36 | 只看该作者
强烈支持楼主ing……
43
发表于 2019-6-1 21:33:38 | 只看该作者
请教苏神,下面是Winform程序,执行的时候也报
System.Reflection.TargetInvocationException”类型的未经处理的异常在 mscorlib.dll 中发生
调试的时候出现这个报错,我已经改成X86
报错的地方(红色部分):
                private static Type SetScriptControlType(string strJs, object obj)
                {
                        ExecJsHelper.type.InvokeMember("Language", BindingFlags.SetProperty, null, obj, new object[]
                        {
                                "JScript"
                        });
                        ExecJsHelper.type.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, obj, new object[]
                        {
                                strJs
                        });

                        return ExecJsHelper.type;
                }
是什么原因呢?谢谢!
private void button3_Click_1(object sender, EventArgs e)
        {
            string strJs = string.Empty;
            string strPath = "D:\\Dev\\other\\snake\\snake\\BDZH.js";

            using (StreamReader sr = new StreamReader(strPath,Encoding.Default))
            {
                strJs = sr.ReadToEnd();
            }

            if (strJs != string.Empty)
            {
                string strContent = HttpHelper.JavaScriptEval(strJs, "getTeamList()");
                txtBox1.Text = strContent;
                webBrowser1.DocumentText = strContent;
            }
        }
42
发表于 2018-3-6 18:00:16 | 只看该作者
看到这帖子真是高兴!
41
发表于 2018-3-6 17:59:48 | 只看该作者
强烈支持楼主ing……
40
发表于 2018-3-6 17:49:51 | 只看该作者

function calcActualValue(usageType, vehiclePurpose, purchaseValue, usedMonths){
    if(Number(purchaseValue) == 0){
        return "";
    }

    var rate = getDeprecationRate(usageType, vehiclePurpose);
    var actualValue = isNaN(rate) ? Number(purchaseValue)
        : Number(purchaseValue) * (1 - Math.min(rate * usedMonths, 0.8));

    return actualValue;
}

function getActualValue(usageType, vehiclePurpose,
                        purchaseValue, registerDate, inceptionDate) {
    if(!purchaseValue){
        return "";
    }

    if(!usageType || !vehiclePurpose){
        return purchaseValue;
    }

    var regDate = registerDate ? new Date(registerDate.replace(/\-/g, "/")) : new Date();
    var icpDate = inceptionDate ? new Date(inceptionDate.replace(/\-/g, "/")) : new Date();

    var usedMonths  = icpDate.getMonth() - regDate.getMonth()
        + (icpDate.getFullYear() - regDate.getFullYear()) * 12;

    if(regDate.getDate() > icpDate.getDate()){
        usedMonths = usedMonths - 1;
    }

    return calcActualValue(usageType, vehiclePurpose,
        purchaseValue.toString().replace(/,/g, ""), usedMonths);
}


我在C#写的调用代码:HttpHelper.JavaScriptEval(strjs, "getActualValue('101','01','66700','2016-04-22','2018-03-07 00:00')");

请问为什么会报调用的目标发生了异常呢?如果是js报错,那请问能不能看到那行出错了呢?还有如果这js使用了JQuery或者其他的js那要怎么解决呢?
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-12-2 07:05

© 2014-2021

快速回复 返回顶部 返回列表