【问题标题】:Upload in MediaFire with C#使用 C# 在 MediaFire 中上传
【发布时间】:2015-08-31 02:39:03
【问题描述】:

有没有人在 MediaFire 中编写代码? 在此link 之后,您可以进行自己的会话(当然使用您的用户名和密码)。我使用此代码通过 Post 方法上传和发送值。

private static string url = "HTTPS://www.mediafire.com/api/1.3/upload/simple.php?session_token=ed007dc432d5081952c15c50a  3f5c4dade894927dbcb8c44a59c6aefag6bd1d293f90434bfa  7bcd13d284069aabfa528623601a39b7026ca534acf21a6de1  0343543e271ac5a44ca&action_on_duplicate=&response_  format=json";
        try
        {
            string posturl = url;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(posturl);
            byte[] bytes;
            bytes = File.ReadAllBytes(@"G:\Untitled.jpg");


            request.Headers.Clear();
            request.Method = "POST";
            request.Headers.Add(HttpRequestHeader.AcceptLangua  ge, "en-US,en;q=0.8,fa;q=0.6");
            request.Headers.Add(HttpRequestHeader.AcceptEncodi  ng, "gzip, deflate");
            request.ContentType = "multipart/form-data";
            request.Referer = @"https://www.mediafire.com/developers/tools/api_tools";
            request.ContentLength = bytes.Length;




            Stream requestStream = request.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            HttpWebResponse response;
            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream responseStream = response.GetResponseStream();
                string responseStr = new StreamReader(responseStream).ReadToEnd();
                textBox1.Text = responseStr;
               // return responseStr;
            }
        }
        catch (Exception s)
        {
            MessageBox.Show("Session Token Error. " + s.Message);
        }

然后不幸的是我看到了这个错误,

“会话令牌错误。服务器提交了一个协议 违规.section=ResponseStatusLine”

任何帮助将不胜感激。问候

【问题讨论】:

    标签: c# mediafire


    【解决方案1】:

    好吧,根据 Error 看来 session_token 的值是错误的。我现在也在使用 Mediafire API,并且我能够通过大多数 API 调用获得好运(上传除外......) 因此,如果您阅读文档,您就会知道第一步是创建第一个调用,在该调用中生成一个 session_token,其生命周期为 10 分钟(之后您必须更新它)。 要检索这些值,这是我的代码

        public int secret_key;
        public string session_token; //is a token used to authorize user specific transactions
        public string time;
        bool first_call = true;
        bool new_key = false;
    
    
    
            //Creating a first session token MediaFire 
            string email = "";
            string password = "";
            string app_id = "";
            string app_key = "";
    
            byte[] b = Encoding.UTF8.GetBytes(email + password + app_id + app_key);
            SHA1 sh = new SHA1Managed();
            byte[] b2 = sh.ComputeHash(b);
            string signature = BitConverter.ToString(b2).Replace("-", "").ToLower();
            string req_url = String.Format("https://www.mediafire.com/api/1.4/user/get_session_token.php?email={0}&password={1}&application_id={2}&signature={3}&token_version=2", email, password, app_id, signature);
    
            HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(req_url);
            try
            {
                WebResponse response = myReq.GetResponse();
                Stream responseStream = response.GetResponseStream();
    
                XElement root = XDocument.Load(responseStream).Root;
    
                if (root.Element("result").Value == ("Success"))
                {
                    secret_key = Convert.ToInt32(root.Element("secret_key").Value);
                    session_token = root.Element("session_token").Value;
                    time = root.Element("time").Value;
                }
                else if (root.Element("result").Value == ("Error"))
                {
                    //TODO
                    //Check errors list on MediaFire API
                    int error = Convert.ToInt32(root.Element("error").Value);
                    string message_error = root.Element("message").Value;
                }
            }
            catch (System.Net.WebException webEx)
            {
    
                HttpWebResponse response = webEx.Response as HttpWebResponse;
                if (response.StatusCode == HttpStatusCode.Forbidden)
                {
                    var r_error = (HttpWebResponse)webEx.Response;
                    Stream receiveStream = r_error.GetResponseStream();
                    StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
                    string s = reader.ReadToEnd().ToString();
                    XElement response_body = XDocument.Parse(s).Root;
                    int error = Convert.ToInt32(response_body.Element("error").Value);
                    string message_error = response_body.Element("message").Value;
                }
                else if (response.StatusCode != HttpStatusCode.Forbidden)
                {
                    throw;
                }
    
    
            }
    

    成功创建 session_token 后,您现在可以进行其他 API 调用。我在您的代码中注意到的一点是缺少签名,但是使用 token_version=2 的任何 API 调用(我认为是这样,或者至少是大多数)都需要签名 计算签名有几个方面。您这样做的方式将取决于它是否是您对当前会话进行的第一次通话。我输入了这个函数。
    sk -> secret_key
    URI -> 可以像 /api/1.4/upload/simple.php?session_token=" + session_token
    first_call -> 只是为了确定它是否是当前会话的第一个呼叫

       static public string get_signature(int sk, string time, string URI, bool first_call)
        {
            string input = "";
            if (first_call)
            {
                sk %= 256;
                input = sk + time + URI;
            }
            else
            {
                sk = neo_secretkey(sk);
                sk %= 256;
                input = sk + time + URI;
            }
    
            //signature = the Message-Digest (MD5) of the 'secret_key' modulo 256 + 'time' + the URI of the API call. 
            byte[] ByteData = Encoding.ASCII.GetBytes(input);
            //MD5 creating MD5 object.
            MD5 oMd5 = MD5.Create();
            //Hash 
            byte[] HashData = oMd5.ComputeHash(ByteData);
    
            //convert byte array to hex format
            StringBuilder oSb = new StringBuilder();
    
            for (int x = 0; x < HashData.Length; x++)
            {
                //hexadecimal string value
                oSb.Append(HashData[x].ToString("x2"));
            }
    
            return oSb.ToString();
        }
    

    您将看到函数 neosecretkey()。这对于当前会话的第二次和未来调用是必要的。

    static public int neo_secretkey(int sk)
            {
                long n_secret = (Convert.ToInt64(sk) * 16807) % 2147483647;
                return Convert.ToInt32(n_secret);
            }
    

    好吧,现在确保您的代码一切正常。请求 URL 必须如下所示 "http://www.mediafire.com/api/1.4/upload/simple.php?session_token=" + session_token + "&signature=" + 签名

    我的代码有点丑,我对C#没有太多经验。希望这对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多