什么是访问亚马逊机械土耳其的最简单示例?

4
我正在寻找一个简单的例子,来讲解如何在C#中使用Amazon Mechanical Turk网络服务。我知道有一个适用于C#的SDK,但我希望在使用它之前先了解基本的机制。
1个回答

6

这是我想到的最简单的代码示例,用于访问 Mechanical Turk。它创建签名并调用 GetAccountBalance 操作。

using System;
using System.Globalization;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;

namespace TurkTest {
    class Program {

        static void Main(string[] args) {
            const string SERVICE_NAME = "AWSMechanicalTurkRequester";  // requester service for MTurk
            const string TIMESTAMP_FORMAT = "yyyy-MM-ddTHH:mm:ss.fffZ";

            // Modify these with your values.
            const string operation = "GetAccountBalance";
            const string accessKey = "<Your access key>";
            const string secretAccessKey = "<Your secret access key>";

            // Millisecond values in the timestamp string can result in intermittent BadClaimsSupplied errors.
            // Get the current UTC time and use that to create a new time with milliseconds set to zero to avoid this case.
            DateTime now = DateTime.UtcNow;
            now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, DateTimeKind.Utc);
            string timeStamp = now.ToString(TIMESTAMP_FORMAT, CultureInfo.InvariantCulture);

            // Create the hash-based messaged authentication algorithm (SHA1) using our secret access key as the key.
            var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(secretAccessKey));

            // Combine the service name, operation and timestamp and then hash them to produce the signature.
            var dataBytes = Encoding.UTF8.GetBytes(SERVICE_NAME + operation + timeStamp);
            string signature = Convert.ToBase64String(hmac.ComputeHash(dataBytes));

            // Build the URL to send to Amazon
            string url =
                @"https://mechanicalturk.amazonaws.com/?Service=AWSMechanicalTurkRequester&AWSAccessKeyId={0}&Version=2012-03-25&Operation={1}&Signature={2}&Timestamp={3}";
            url = string.Format(url, accessKey, operation, signature, timeStamp);

            // Send a request and write the response to the console.
            using (WebClient client = new WebClient()) {
                using (StreamReader reader = new StreamReader(client.OpenRead(url))) {
                    Console.WriteLine(reader.ReadToEnd());
                }
            }

            Console.Read();
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接