Search Unity

Issue with error CS0246: The type or namespace name 'HMACSHA1' could not be found

Discussion in 'VR' started by VizII, Mar 2, 2017.

  1. VizII

    VizII

    Joined:
    Mar 22, 2013
    Posts:
    5
    Hello, I have a similar problem. I'm using TwitterAPI.cs I found online:
    Code (CSharp):
    1. using UnityEngine;
    2.  
    3. using System;
    4. using System.Security.Cryptography;
    5. using System.Collections.Generic;
    6. using System.Text;
    7. using System.Globalization;
    8. using System.Collections;
    9.  
    10.  
    11. using MiniJSON;
    12.  
    13. public class TwitterAPI : MonoBehaviour {
    14.     public string oauthConsumerKey = "";
    15.     public string oauthConsumerSecret = "";
    16.     public string oauthToken = "";
    17.     public string oauthTokenSecret = "";
    18.  
    19.     private string oauthNonce = "";
    20.     private string oauthTimeStamp = "";
    21.  
    22.     public static TwitterAPI instance = null;
    23.  
    24.     // Use this for initialization
    25.     void Awake () {
    26.         if (instance == null) {
    27.             instance = this;
    28.         }
    29.         else {
    30.             Debug.LogError("More then one instance of TwitterAPI: " + this.transform.name);
    31.         }
    32.     }
    33.  
    34.     public void SearchTwitter(string keywords, Action<List<TweetSearchTwitterData> > callback)
    35.     {
    36.         PrepareOAuthData();
    37.         StartCoroutine(SearchTwitter_Coroutine(keywords, callback));
    38.     }
    39.  
    40.     public void FindTrendsByLocationTwitter(string location, Action<List<TrendByLocationTwitterData> > callback)
    41.     {    
    42.         PrepareOAuthData();
    43.         StartCoroutine(FindTrendsByLocation_Coroutine(location, callback));
    44.     }
    45.  
    46.     private IEnumerator SearchTwitter_Coroutine(string keywords, Action<List<TweetSearchTwitterData> > callback)
    47.     {
    48.         // Fix up hashes to be webfriendly
    49.         keywords = Uri.EscapeDataString(keywords);
    50.  
    51.         string twitterUrl = "https://api.twitter.com/1.1/search/tweets.json";
    52.      
    53.         SortedDictionary<string, string> twitterParamsDictionary = new SortedDictionary<string, string>
    54.         {
    55.             {"q", keywords},
    56.             {"count", "100"},
    57.             {"result_type", "recent"},
    58.         };
    59.  
    60.         WWW query = CreateTwitterAPIQuery(twitterUrl, twitterParamsDictionary);
    61.         yield return query;
    62.  
    63.         callback(ParseResultsFromSearchTwitter(query.text));
    64.     }
    65.  
    66.     // Use of MINI JSON http://forum.unity3d.com/threads/35484-MiniJSON-script-for-parsing-JSON-data
    67.     private List<TweetSearchTwitterData> ParseResultsFromSearchTwitter(string jsonResults) {
    68.         Debug.Log(jsonResults);
    69.      
    70.         List<TweetSearchTwitterData> twitterDataList = new List<TweetSearchTwitterData>();
    71.         object jsonObject = Json.Deserialize(jsonResults);
    72.         IDictionary search = (IDictionary) jsonObject;
    73.         IList tweets = (IList) search["statuses"];
    74.         foreach (IDictionary tweet in tweets) {
    75.             IDictionary userInfo = tweet["user"] as IDictionary;        
    76.          
    77.             TweetSearchTwitterData twitterData = new TweetSearchTwitterData();        
    78.             twitterData.tweetText = tweet["text"] as string;
    79.             twitterData.screenName = userInfo["screen_name"] as string;
    80.             twitterData.retweetCount = (Int64)tweet["retweet_count"];
    81.             twitterData.profileImageUrl = userInfo["profile_image_url"] as string;
    82.          
    83.             twitterDataList.Add(twitterData);
    84.         }
    85.      
    86.         return twitterDataList;
    87.     }
    88.  
    89.     private IEnumerator FindTrendsByLocation_Coroutine(string location, Action<List<TrendByLocationTwitterData> > callback)
    90.     {
    91.         location = Uri.EscapeDataString(location);
    92.         string twitterUrl = "https://api.twitter.com/1.1/trends/place.json";
    93.         SortedDictionary<string, string> twitterParamsDictionary = new SortedDictionary<string, string>
    94.         {
    95.             {"id", location}
    96.         };
    97.  
    98.         WWW query = CreateTwitterAPIQuery(twitterUrl, twitterParamsDictionary);
    99.         yield return query;
    100.      
    101.         callback(ParseResultsFromFindTrendsByLocationTwitter(query.text));
    102.     }
    103.  
    104.     private List<TrendByLocationTwitterData> ParseResultsFromFindTrendsByLocationTwitter(string jsonResults) {
    105.         Debug.Log(jsonResults);
    106.      
    107.         List<TrendByLocationTwitterData> twitterDataList = new List<TrendByLocationTwitterData>();
    108.         object jsonObject = Json.Deserialize(jsonResults);
    109.         IList jsonList = jsonObject as IList;
    110.         IDictionary search = jsonList[0] as IDictionary;
    111.         IList trends = (IList) search["trends"];
    112.         foreach (IDictionary trend in trends) {
    113.             TrendByLocationTwitterData twitterData = new TrendByLocationTwitterData();        
    114.             twitterData.name = trend["name"] as string;
    115.             twitterData.query = trend["query"] as string;
    116.             twitterData.url = trend["url"] as string;
    117.          
    118.             twitterDataList.Add(twitterData);
    119.         }
    120.      
    121.         return twitterDataList;
    122.     }
    123.  
    124.     private WWW CreateTwitterAPIQuery(string twitterUrl, SortedDictionary<string, string> twitterParamsDictionary)
    125.     {
    126.         string signature = CreateSignature(twitterUrl, twitterParamsDictionary);
    127.         Debug.Log("OAuth Signature: " + signature);
    128.      
    129.         string authHeaderParam = CreateAuthorizationHeaderParameter(signature, this.oauthTimeStamp);
    130.         Debug.Log("Auth Header: " + authHeaderParam);
    131.      
    132.         Dictionary<string, string> headers = new Dictionary<string, string>();
    133.         headers["Authorization"] = authHeaderParam;
    134.      
    135.         string twitterParams = ParamDictionaryToString(twitterParamsDictionary);
    136.      
    137.         WWW query = new WWW(twitterUrl + "?" + twitterParams, null, headers);    
    138.         return query;
    139.     }
    140.  
    141.  
    142.     private void PrepareOAuthData() {
    143.         oauthNonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture)));
    144.         TimeSpan _timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0);    
    145.         oauthTimeStamp = Convert.ToInt64(_timeSpan.TotalSeconds).ToString(CultureInfo.InvariantCulture);
    146.  
    147.         // Override the nounce and timestamp here if troubleshooting with Twitter's OAuth Tool
    148.         //oauthNonce = "69db07d069ac50cd673f52ee08678596";
    149.         //oauthTimeStamp = "1442419142";
    150.     }
    151.      
    152.     // Taken from http://www.i-avington.com/Posts/Post/making-a-twitter-oauth-api-call-using-c
    153.     private string CreateSignature(string url, SortedDictionary<string, string> searchParamsDictionary)
    154.     {
    155.         //string builder will be used to append all the key value pairs
    156.         StringBuilder signatureBaseStringBuilder = new StringBuilder();
    157.         signatureBaseStringBuilder.Append("GET&");
    158.         signatureBaseStringBuilder.Append(Uri.EscapeDataString(url));
    159.         signatureBaseStringBuilder.Append("&");
    160.  
    161.         //the key value pairs have to be sorted by encoded key
    162.         SortedDictionary<string, string> urlParamsDictionary = new SortedDictionary<string, string>
    163.                              {
    164.                                  {"oauth_version", "1.0"},
    165.                                  {"oauth_consumer_key", this.oauthConsumerKey},
    166.                                  {"oauth_nonce", this.oauthNonce},
    167.                                  {"oauth_signature_method", "HMAC-SHA1"},
    168.                                  {"oauth_timestamp", this.oauthTimeStamp},
    169.                                  {"oauth_token", this.oauthToken}
    170.                              };
    171.      
    172.         foreach (KeyValuePair<string, string> keyValuePair in searchParamsDictionary)
    173.         {
    174.             urlParamsDictionary.Add(keyValuePair.Key, keyValuePair.Value);
    175.         }
    176.      
    177.         signatureBaseStringBuilder.Append(Uri.EscapeDataString(ParamDictionaryToString(urlParamsDictionary)));
    178.            string signatureBaseString = signatureBaseStringBuilder.ToString();
    179.  
    180.         Debug.Log("Signature Base String: " + signatureBaseString);
    181.      
    182.         //generation the signature key the hash will use
    183.         string signatureKey =
    184.             Uri.EscapeDataString(this.oauthConsumerSecret) + "&" +
    185.             Uri.EscapeDataString(this.oauthTokenSecret);
    186.  
    187.         HMACSHA1 hmacsha1 = new HMACSHA1(
    188.             new ASCIIEncoding().GetBytes(signatureKey));
    189.  
    190.         //hash the values
    191.         string signatureString = Convert.ToBase64String(
    192.             hmacsha1.ComputeHash(
    193.                 new ASCIIEncoding().GetBytes(signatureBaseString)));
    194.      
    195.         return signatureString;
    196.     }
    197.  
    198.     private string CreateAuthorizationHeaderParameter(string signature, string timeStamp)
    199.     {
    200.         string authorizationHeaderParams = String.Empty;
    201.         authorizationHeaderParams += "OAuth ";
    202.    
    203.         authorizationHeaderParams += "oauth_consumer_key="
    204.                                      + "\"" + Uri.EscapeDataString(this.oauthConsumerKey) + "\", ";
    205.      
    206.         authorizationHeaderParams += "oauth_nonce=" + "\"" +
    207.                                      Uri.EscapeDataString(this.oauthNonce) + "\", ";
    208.      
    209.         authorizationHeaderParams += "oauth_signature=" + "\""
    210.                                      + Uri.EscapeDataString(signature) + "\", ";
    211.    
    212.         authorizationHeaderParams += "oauth_signature_method=" + "\"" +
    213.             Uri.EscapeDataString("HMAC-SHA1") +
    214.             "\", ";
    215.  
    216.         authorizationHeaderParams += "oauth_timestamp=" + "\"" +
    217.                                      Uri.EscapeDataString(timeStamp) + "\", ";    
    218.  
    219.         authorizationHeaderParams += "oauth_token=" + "\"" +
    220.                                      Uri.EscapeDataString(this.oauthToken) + "\", ";
    221.  
    222.         authorizationHeaderParams += "oauth_version=" + "\"" +
    223.                                      Uri.EscapeDataString("1.0") + "\"";
    224.         return authorizationHeaderParams;
    225.     }
    226.  
    227.     private string ParamDictionaryToString(IDictionary<string, string> paramsDictionary) {
    228.         StringBuilder dictionaryStringBuilder = new StringBuilder();    
    229.         foreach (KeyValuePair<string, string> keyValuePair in paramsDictionary)
    230.         {
    231.             //append a = between the key and the value and a & after the value
    232.             dictionaryStringBuilder.Append(string.Format("{0}={1}&", keyValuePair.Key, keyValuePair.Value));
    233.         }
    234.  
    235.         // Get rid of the extra & at the end of the string
    236.         string paramString = dictionaryStringBuilder.ToString().Substring(0, dictionaryStringBuilder.Length - 1);
    237.         return paramString;
    238.     }
    239. }
    but when I am trying to compile it for Hololens I get:
    Could anyone advise on changes that need to be made to make it work?

    Thanks!
     
  2. VizII

    VizII

    Joined:
    Mar 22, 2013
    Posts:
    5
    Ok, so I was able to make it work by adopting https://forum.unity3d.com/threads/r...snt-exist-in-target-fram.313589/#post-2038137

    However, instead of MacAlgorithmNames.HmacSha256, I used MacAlgorithmNames.HmacSha1. The resulting code is (working both in the editor and Hololens):
    Code (CSharp):
    1. using UnityEngine;
    2.  
    3. using System;
    4. using System.Security.Cryptography;
    5. using System.Collections.Generic;
    6. using System.Text;
    7. using System.Globalization;
    8. using System.Collections;
    9.  
    10.  
    11. using MiniJSON;
    12.  
    13. #if NETFX_CORE
    14. using System.Runtime.InteropServices.WindowsRuntime;
    15. using Windows.Security.Cryptography;
    16. using Windows.Security.Cryptography.Core;
    17. #endif
    18.  
    19. public class TwitterAPI : MonoBehaviour {  
    20.     public string oauthConsumerKey = "";
    21.     public string oauthConsumerSecret = "";
    22.     public string oauthToken = "";
    23.     public string oauthTokenSecret = "";
    24.    
    25.     private string oauthNonce = "";
    26.     private string oauthTimeStamp = "";
    27.    
    28.     public static TwitterAPI instance = null;
    29.    
    30.     // Use this for initialization
    31.     void Awake () {
    32.         if (instance == null) {
    33.             instance = this;
    34.         }
    35.         else {
    36.             Debug.LogError("More then one instance of TwitterAPI: " + this.transform.name);
    37.         }
    38.     }
    39.  
    40.     public void SearchTwitter(string keywords, Action<List<TweetSearchTwitterData> > callback)
    41.     {  
    42.         PrepareOAuthData();
    43.         StartCoroutine(SearchTwitter_Coroutine(keywords, callback));
    44.     }
    45.  
    46.     public void FindTrendsByLocationTwitter(string location, Action<List<TrendByLocationTwitterData> > callback)
    47.     {      
    48.         PrepareOAuthData();
    49.         StartCoroutine(FindTrendsByLocation_Coroutine(location, callback));
    50.     }
    51.    
    52.     private IEnumerator SearchTwitter_Coroutine(string keywords, Action<List<TweetSearchTwitterData> > callback)
    53.     {
    54.         // Fix up hashes to be webfriendly
    55.         keywords = Uri.EscapeDataString(keywords);
    56.  
    57.         string twitterUrl = "https://api.twitter.com/1.1/search/tweets.json";
    58.        
    59.         SortedDictionary<string, string> twitterParamsDictionary = new SortedDictionary<string, string>
    60.         {
    61.             {"q", keywords},
    62.             {"count", "100"},
    63.             {"result_type", "recent"},
    64.         };
    65.  
    66.         WWW query = CreateTwitterAPIQuery(twitterUrl, twitterParamsDictionary);
    67.         yield return query;
    68.  
    69.         callback(ParseResultsFromSearchTwitter(query.text));
    70.     }
    71.  
    72.     // Use of MINI JSON http://forum.unity3d.com/threads/35484-MiniJSON-script-for-parsing-JSON-data
    73.     private List<TweetSearchTwitterData> ParseResultsFromSearchTwitter(string jsonResults) {
    74.         Debug.Log(jsonResults);
    75.        
    76.         List<TweetSearchTwitterData> twitterDataList = new List<TweetSearchTwitterData>();
    77.         object jsonObject = Json.Deserialize(jsonResults);
    78.         IDictionary search = (IDictionary) jsonObject;
    79.         IList tweets = (IList) search["statuses"];
    80.         foreach (IDictionary tweet in tweets) {
    81.             IDictionary userInfo = tweet["user"] as IDictionary;          
    82.            
    83.             TweetSearchTwitterData twitterData = new TweetSearchTwitterData();          
    84.             twitterData.tweetText = tweet["text"] as string;
    85.             twitterData.screenName = userInfo["screen_name"] as string;
    86.             twitterData.retweetCount = (Int64)tweet["retweet_count"];
    87.             twitterData.profileImageUrl = userInfo["profile_image_url"] as string;
    88.            
    89.             twitterDataList.Add(twitterData);
    90.         }
    91.        
    92.         return twitterDataList;
    93.     }
    94.  
    95.     private IEnumerator FindTrendsByLocation_Coroutine(string location, Action<List<TrendByLocationTwitterData> > callback)
    96.     {
    97.         location = Uri.EscapeDataString(location);
    98.         string twitterUrl = "https://api.twitter.com/1.1/trends/place.json";
    99.         SortedDictionary<string, string> twitterParamsDictionary = new SortedDictionary<string, string>
    100.         {
    101.             {"id", location}
    102.         };
    103.  
    104.         WWW query = CreateTwitterAPIQuery(twitterUrl, twitterParamsDictionary);
    105.         yield return query;
    106.        
    107.         callback(ParseResultsFromFindTrendsByLocationTwitter(query.text));
    108.     }
    109.  
    110.     private List<TrendByLocationTwitterData> ParseResultsFromFindTrendsByLocationTwitter(string jsonResults) {
    111.         Debug.Log(jsonResults);
    112.        
    113.         List<TrendByLocationTwitterData> twitterDataList = new List<TrendByLocationTwitterData>();
    114.         object jsonObject = Json.Deserialize(jsonResults);
    115.         IList jsonList = jsonObject as IList;
    116.         IDictionary search = jsonList[0] as IDictionary;
    117.         IList trends = (IList) search["trends"];
    118.         foreach (IDictionary trend in trends) {
    119.             TrendByLocationTwitterData twitterData = new TrendByLocationTwitterData();          
    120.             twitterData.name = trend["name"] as string;
    121.             twitterData.query = trend["query"] as string;
    122.             twitterData.url = trend["url"] as string;
    123.            
    124.             twitterDataList.Add(twitterData);
    125.         }
    126.        
    127.         return twitterDataList;
    128.     }
    129.  
    130.     private WWW CreateTwitterAPIQuery(string twitterUrl, SortedDictionary<string, string> twitterParamsDictionary)
    131.     {
    132.         string signature = CreateSignature(twitterUrl, twitterParamsDictionary);
    133.         Debug.Log("OAuth Signature: " + signature);
    134.        
    135.         string authHeaderParam = CreateAuthorizationHeaderParameter(signature, this.oauthTimeStamp);
    136.         Debug.Log("Auth Header: " + authHeaderParam);
    137.        
    138.         Dictionary<string, string> headers = new Dictionary<string, string>();
    139.         headers["Authorization"] = authHeaderParam;
    140.        
    141.         string twitterParams = ParamDictionaryToString(twitterParamsDictionary);
    142.        
    143.         WWW query = new WWW(twitterUrl + "?" + twitterParams, null, headers);      
    144.         return query;
    145.     }
    146.  
    147.  
    148.     private void PrepareOAuthData() {
    149.         oauthNonce = Convert.ToBase64String(new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture)));
    150.         TimeSpan _timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0);      
    151.         oauthTimeStamp = Convert.ToInt64(_timeSpan.TotalSeconds).ToString(CultureInfo.InvariantCulture);
    152.  
    153.         // Override the nounce and timestamp here if troubleshooting with Twitter's OAuth Tool
    154.         //oauthNonce = "69db07d069ac50cd673f52ee08678596";
    155.         //oauthTimeStamp = "1442419142";
    156.     }
    157.        
    158.     // Taken from http://www.i-avington.com/Posts/Post/making-a-twitter-oauth-api-call-using-c
    159.     private string CreateSignature(string url, SortedDictionary<string, string> searchParamsDictionary)
    160.     {
    161.         //string builder will be used to append all the key value pairs
    162.         StringBuilder signatureBaseStringBuilder = new StringBuilder();
    163.         signatureBaseStringBuilder.Append("GET&");
    164.         signatureBaseStringBuilder.Append(Uri.EscapeDataString(url));
    165.         signatureBaseStringBuilder.Append("&");
    166.  
    167.         //the key value pairs have to be sorted by encoded key
    168.         SortedDictionary<string, string> urlParamsDictionary = new SortedDictionary<string, string>
    169.                              {
    170.                                  {"oauth_version", "1.0"},
    171.                                  {"oauth_consumer_key", this.oauthConsumerKey},
    172.                                  {"oauth_nonce", this.oauthNonce},
    173.                                  {"oauth_signature_method", "HMAC-SHA1"},
    174.                                  {"oauth_timestamp", this.oauthTimeStamp},
    175.                                  {"oauth_token", this.oauthToken}
    176.                              };
    177.        
    178.         foreach (KeyValuePair<string, string> keyValuePair in searchParamsDictionary)
    179.         {
    180.             urlParamsDictionary.Add(keyValuePair.Key, keyValuePair.Value);
    181.         }  
    182.        
    183.         signatureBaseStringBuilder.Append(Uri.EscapeDataString(ParamDictionaryToString(urlParamsDictionary)));
    184.            string signatureBaseString = signatureBaseStringBuilder.ToString();
    185.  
    186.         Debug.Log("Signature Base String: " + signatureBaseString);
    187.        
    188.         //generation the signature key the hash will use
    189.         string signatureKey =
    190.             Uri.EscapeDataString(this.oauthConsumerSecret) + "&" +
    191.             Uri.EscapeDataString(this.oauthTokenSecret);
    192.  
    193. #if NETFX_CORE
    194.         var objMacProv = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha1);
    195.         byte[] secretKey = Encoding.UTF8.GetBytes(signatureKey);
    196.         var hash = objMacProv.CreateHash(secretKey.AsBuffer());
    197.         hash.Append(CryptographicBuffer.ConvertStringToBinary(signatureBaseString, BinaryStringEncoding.Utf8));
    198.         string signatureString = CryptographicBuffer.EncodeToBase64String(hash.GetValueAndReset());
    199.        
    200. #else
    201.         HMACSHA1 hmacsha1 = new HMACSHA1(
    202.             new ASCIIEncoding().GetBytes(signatureKey));
    203.  
    204.         //hash the values
    205.         string signatureString = Convert.ToBase64String(
    206.             hmacsha1.ComputeHash(
    207.                 new ASCIIEncoding().GetBytes(signatureBaseString)));
    208. #endif      
    209.         return signatureString;
    210.     }
    211.    
    212.     private string CreateAuthorizationHeaderParameter(string signature, string timeStamp)
    213.     {
    214.         string authorizationHeaderParams = String.Empty;
    215.         authorizationHeaderParams += "OAuth ";
    216.      
    217.         authorizationHeaderParams += "oauth_consumer_key="
    218.                                      + "\"" + Uri.EscapeDataString(this.oauthConsumerKey) + "\", ";
    219.        
    220.         authorizationHeaderParams += "oauth_nonce=" + "\"" +
    221.                                      Uri.EscapeDataString(this.oauthNonce) + "\", ";
    222.        
    223.         authorizationHeaderParams += "oauth_signature=" + "\""
    224.                                      + Uri.EscapeDataString(signature) + "\", ";
    225.      
    226.         authorizationHeaderParams += "oauth_signature_method=" + "\"" +
    227.             Uri.EscapeDataString("HMAC-SHA1") +
    228.             "\", ";
    229.  
    230.         authorizationHeaderParams += "oauth_timestamp=" + "\"" +
    231.                                      Uri.EscapeDataString(timeStamp) + "\", ";      
    232.  
    233.         authorizationHeaderParams += "oauth_token=" + "\"" +
    234.                                      Uri.EscapeDataString(this.oauthToken) + "\", ";
    235.  
    236.         authorizationHeaderParams += "oauth_version=" + "\"" +
    237.                                      Uri.EscapeDataString("1.0") + "\"";
    238.         return authorizationHeaderParams;
    239.     }
    240.    
    241.     private string ParamDictionaryToString(IDictionary<string, string> paramsDictionary) {
    242.         StringBuilder dictionaryStringBuilder = new StringBuilder();      
    243.         foreach (KeyValuePair<string, string> keyValuePair in paramsDictionary)
    244.         {
    245.             //append a = between the key and the value and a & after the value
    246.             dictionaryStringBuilder.Append(string.Format("{0}={1}&", keyValuePair.Key, keyValuePair.Value));
    247.         }
    248.  
    249.         // Get rid of the extra & at the end of the string
    250.         string paramString = dictionaryStringBuilder.ToString().Substring(0, dictionaryStringBuilder.Length - 1);
    251.         return paramString;
    252.     }
    253. }