2016-05-12 11 views
0

Kontext: VS2015 Gemeinschaft; C#; ClearScript.V8.5.4.5; Google.AdWords.18.25.0Wie kann AdWords über JavaScript mit JavaScript in Verbindung gebracht werden?

Ich versuche, eine Skriptumgebung zu erstellen, um meine Budgets zu tun. Einer der C# Seite, ich habe die Einrichtung eines JScript-Umgebung auf, und das Aussetzen der alle AdWords-Typen und Objekte, die ich es brauchen, nämlich

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); 
     } 
    } 

Ich habe diese Art der Sache getan ein paar Mal schon, so keine Überraschungen dort.

Die Schwierigkeit, die ich im Moment habe, ist eine der JScript-Seite. Der Code an dieser Stelle sieht wie folgt aus:

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(); 

An diesem Punkt bos weiß nichts über getBillingAccounts. Der einzige Weg für bos darüber wissen ist

var bos = new BudgetOrderService(); 

jedoch auszuführen, dann gibt es keine Verbindung dann zwischen bos und die Werte, die sie in user braucht, und versucht getBillingAccounts löst einen Fehler auszuführen.

Die ursprüngliche C# -Code, aus dem das ist

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

Casting der GetService Aufruf BudgetOrderService zu machen getBillingAccounts sichtbar in bos scheint zu sein, ausreichend ableitet. JScript lässt mich das jedoch nicht tun.

Also wohin von hier?

Antwort

1

Sie sollten in der Lage sein, die Besetzung in Skriptcode zu tun. Versuchen Sie folgendes:

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

Dann in Ihrem Skript:

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

Oder Sie können einen Delegaten verfügbar machen, die die Besetzung in C# -Code der Fall ist.

+0

Brilliant! Ich habe ExtendedHostFunctions verwendet. – bugmagnet