如何通过 ClearScript 将 AdWords 公开给 JavaScript?

Posted

技术标签:

【中文标题】如何通过 ClearScript 将 AdWords 公开给 JavaScript?【英文标题】:How to expose AdWords to JavaScript via ClearScript? 【发布时间】:2016-05-12 11:26:24 【问题描述】:

背景:VS2015社区; C#; ClearScript.V8.5.4.5; Google.AdWords.18.25.0

我正在尝试创建一个脚本环境来执行我的预算。在 C# 方面,我正在设置一个 JScript 环境,并向它公开我需要的所有 AdWords 类型和对象,即

    static JScriptEngine JSengine = null;
    static Dictionary<string, object> Settings = new Dictionary<string, object>();

    static void Main(string[] args)
    
        if (args.Length < 1)
        
            Console.WriteLine("engine script.js");
            Environment.Exit(1);
        
        string scriptSpec = args[0];

        try
        
            JSengine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.EnableJITDebugging);
        
        catch (Exception exc)
        
            return;
        

        // .. others as well e.g. File, Environment etc

        JSengine.AddHostType("AdWordsUser", typeof(AdWordsUser));
        JSengine.AddHostType("AdWordsAppConfig", typeof(AdWordsAppConfig));
        JSengine.AddHostType("BudgetOrderService", typeof(BudgetOrderService));
        JSengine.AddHostType("Selector", typeof(Selector));
        JSengine.AddHostType("Predicate", typeof(Predicate));
        JSengine.AddHostType("BudgetOrderPage", typeof(BudgetOrderPage));
        JSengine.AddHostType("BudgetOrder", typeof(BudgetOrder));
        JSengine.AddHostType("PredicateOperator", typeof(PredicateOperator));
        JSengine.AddHostType("AdWordsService", typeof(AdWordsService));

        JSengine.AddHostObject("Settings", Settings);

        object answer = null;
        string script = File.ReadAllText(scriptSpec);
        try
        
            answer = JSengine.Evaluate(script);
        
        catch (ScriptEngineException see)
        
            Console.WriteLine(see.ErrorDetails);
        
    

我已经做过几次这种事情了,所以这并不奇怪。

我目前遇到的困难之一是 JScript 方面。此时的代码如下所示:

var user = new AdWordsUser();
user.OAuthProvider.ClientId = "anonymised.apps.googleusercontent.com";
user.OAuthProvider.ClientSecret = "anonymised";
user.OAuthProvider.AccessToken = "";
user.Config.OAuth2RefreshToken = "anonymised";
user.OAuthProvider.RefreshAccessToken();

var config = new AdWordsAppConfig();
config.ClientCustomerId = "anonymised";
config.DeveloperToken = "anonymised";
config.UserAgent = "anonymised";
config.OAuth2ClientId = user.OAuthProvider.ClientId;
config.OAuth2ClientSecret = user.OAuthProvider.ClientSecret;
config.OAuth2AccessToken = user.OAuthProvider.AccessToken;
config.OAuth2RefreshToken = user.Config.OAuth2RefreshToken;

var bos = user.GetService(AdWordsService.v201603.BudgetOrderService);
var bas = bos.getBillingAccounts();

此时,bosgetBillingAccounts 一无所知。 bos 知道它的唯一方法是执行

var bos = new BudgetOrderService();

但是,bos 和它在 user 中所需的值之间没有任何联系,并且尝试执行 getBillingAccounts 会引发错误。

从中派生出的原始 C# 代码是

BudgetOrderService bos = (BudgetOrderService)user.GetService(AdWordsService.v201603.BudgetOrderService);
BillingAccount[] bas = bos.getBillingAccounts();

GetService 调用投射到BudgetOrderService 似乎足以使getBillingAccountsbos 中可见。但是,JScript 不允许我这样做。

那么从这里到哪里?

【问题讨论】:

【参考方案1】:

您应该能够在脚本代码中进行转换。试试这个:

// C#
JSengine.Script.host = new HostFunctions();

然后,在您的脚本中:

// javascript
var bos = user.GetService(AdWordsService.v201603.BudgetOrderService);
bos = host.cast(BudgetOrderService, bos);

或者您可以公开一个在 C# 代码中进行强制转换的委托。

【讨论】:

太棒了!我最终使用了 ExtendedHostFunctions。

以上是关于如何通过 ClearScript 将 AdWords 公开给 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

Google 应用脚本中的 Adword 脚本

从 ClearScript 调用时在 JScript 中捕获 Adwords 错误?

微软自家的.Net下的JavaScript引擎——ClearScript

如何使用 google app 脚本更新 adword-customizer 数据。 (以前上传的源导致错误)

Google Adword 和 asp.net 母版页

开始使用 Google Adword .net API