save response from web request as mp3 file - c#

When i try to read the stream i get timeout exception. The response i get from the server is the mp3 file and i don't have a clue how to save it as a mp3.
WebClient webClient = new WebClient();
int selectedIndex = listBox2.SelectedIndex;
JObject o = JObject.Parse(result);
string SongID = o["SongID"].ToString();
string SongName = o["SongName"].ToString();
string Year = o["Year"].ToString();
string AlbumName = o["AlbumName"].ToString();
textBox4.Text = SongID + Environment.NewLine + SongName + Environment.NewLine + Year + Environment.NewLine + AlbumName;
string stream = Webpost("{\"header\":{\"token\":\"" +prepToken("getStreamKeyFromSongIDEx", ":chickenFingers:")+"\",\"privacy\":0,\"country\":{\"DMA\":0,\"CC1\":0,\"IPR\":0,\"CC2\":0,\"CC3\":2305843009213694000,\"ID\":190,\"CC4\":0},\"uuid\":\"8E5D1ABD-EE1B-4498-B960-8E46077E8ED4\",\"client\":\"jsqueue\",\"session\":\""+session+"\",\"clientRevision\":\"20130520\"},\"method\":\"getStreamKeyFromSongIDEx\",\"parameters\":{\"mobile\":false,\"prefetch\":false,\"songID\":"+SongID+",\"type\":0,\"country\":{\"DMA\":0,\"CC1\":0,\"IPR\":0,\"CC2\":0,\"CC3\":2305843009213694000,\"ID\":190,\"CC4\":0}}}", "http://*****.com/more.php?getStreamKeyFromSongIDEx", "POST", "text/plain");
JObject ss = JObject.Parse(stream);
string streamkey = ss["result"]["streamKey"].ToString();
string ip = ss["result"]["ip"].ToString();
textBox4.Text += Environment.NewLine+ "downloiad url: " + ip + Environment.NewLine + "stream key: " + streamkey;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + ip + "/stream.php");
request.Method = "POST";
string postData = "streamKey="+ streamkey;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentLength = postData.Length;
request.Host = ip;
request.Accept = "*/*";
request.Headers.Add("Origin", string.Format("http://*********.com"));
request.Headers.Add("Accept-Language", string.Format("sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4"));
request.Headers.Add("Accept-Encoding", string.Format("gzip,deflate,sdch"));
request.Headers.Add("Cookie", string.Format("ismobile=no; PHPSESSID="+ session + "__utma=111479378.517776767.1385046829.1385170025.1385750338.12; __utmb=111479378.14.9.1385751143490; __utmc=111479378; __utmz=111479378.1385157436.6.2.utmcsr=nettech.wikia.com|utmccn=(referral)|utmcmd=referral|utmcct=/wiki/*****_Internal_API"));
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";
textBox4.Text += Environment.NewLine + "headers: " + Environment.NewLine + request.Headers;
textBox4.Text += Environment.NewLine + "StreamKey:" + byteArray;
Stream respStream = request.GetRequestStream();

you can try something like this
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("mp3 url");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Get the stream associated with the response.
Stream receiveStream = response.GetResponseStream();
byte[] buffer = new byte[32768];
using (FileStream fileStream = File.Create("yourfullnamepath.mp3"))
{
while (true)
{
int read = receiveStream.Read(buffer, 0, buffer.Length);
if (read <= 0)
break;
fileStream.Write(buffer, 0, read);
}
}

Related

C# WebBrowser and multithreading

I have a class whose main function is:
public void SendSMS(SendInfo info, WebBrowser browser)
{
browser.Width = 300;
browser.Height = 300;
browser.ScriptErrorsSuppressed = true;
browser.DocumentCompleted += Browser_Navigated;
this.number = info.number;
this.message = info.template;
if (info.proxy != null) { WebRequest.DefaultWebProxy = info.proxy; }
debugCode = Application.OpenForms["Form1"].Controls["tabControl1"].Controls["tabPage1"].Controls["DebugCode"] as TextBox;
debugImage = Application.OpenForms["Form1"].Controls["tabControl1"].Controls["tabPage1"].Controls["pictureBox1"] as PictureBox;
MessageBox.Show("I'am start send, template: " + info.template);
browser.Navigate("My secret url :)");
}
After browser navigated,invoke second main function:
private void SendPostRequest(string number, string message, string captcha_key, string captcha_result)
{
MessageBox.Show("Number: " + number + " Message: " + message + " key: " + captcha_key +" result: " + captcha_result);
string postData = "Body=" + message + "&Captcha=" + captcha_result + "&CheckboxTransliterate=false&Phone=" + number.Substring(3, number.Length - 3) + "&PhoneCode=" + number.Substring(0, 3) + "&WidgetId=" + captcha_key + "&_captcha_key=" + captcha_key + "&clearJson=true";
byte[] bytes = Encoding.UTF8.GetBytes(postData);
HttpWebRequest sendRequest = WebRequest.Create("My secret url :") as HttpWebRequest;
sendRequest.Credentials = CredentialCache.DefaultCredentials;
sendRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36";
sendRequest.Method = "POST";
sendRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
sendRequest.Referer = "My secret url :";
sendRequest.Headers.Add("Pragma", "no-cache");
sendRequest.Headers.Add("Cache-Control", "no-cache");
sendRequest.Accept = "application/json, text/plain, *";
sendRequest.Headers.Add(HttpRequestHeader.Cookie, cookies);
sendRequest.ContentLength = bytes.Length;
sendRequest.CookieContainer = new CookieContainer();
sendRequest.CookieContainer = GetUriCookieContainer(sendRequest.RequestUri);
using (Stream dataStream = sendRequest.GetRequestStream())
{dataStream.Write(bytes, 0, bytes.Length);}
onSendCompleted(sendRequest.GetResponse().GetResponseStream());
}
private void onSendCompleted(Stream SendResponsetStream)
{
string status = new StreamReader(SendResponsetStream).ReadToEnd();
SendResponsetStream.Close();
ArgumentsClass args = new ArgumentsClass();
args.ResponseMessage = status;
args.ResponseNumber = number;
OnSmsSendend(this, args);
}
How can I run it's void(Send SMS with its subfunctions) in other threads?
I need these functions(Send SMS with its subfunctions) to be run in parallel.
Thanks!
P.S. Sorry for my English :)
Since your SendSMS does not necessarily need to return anything and the parameters would come from a collection (an array or something similar), you can do something like this-
var tasks = new List<Task>();
foreach (var input in inputs)
{
tasks.Add(Task.Factory.StartNew(() => objjectInstance.SendSMS(input[info], input[browser]))); //objectInstance is class object instance
}
Here inputs is a collection of the input parameters of type- SendInfo and WebBrowser. You have to create the input parameter collection accordingly as per need.

Error:MissingRegistration in GCM with asp.net

I have following code which give "Error:MissingRegistration" response from GCM server.
public void SendPushNotification()
{
string stringregIds = null;
List<string> regIDs = _db.Directories.Where(i => i.GCM != null && i.GCM != "").Select(i => i.GCM).ToList();
//Here I add the registrationID that I used in Method #1 to regIDs
stringregIds = string.Join("\",\"", regIDs);
//To Join the values (if ever there are more than 1) with quotes and commas for the Json format below
try
{
string GoogleAppID = "AIzaSyA2Wkdnp__rBokCmyloMFfENchJQb59tX8";
var SENDER_ID = "925760665756";
var value = "Hello";
WebRequest tRequest;
tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
tRequest.Method = "post";
Request.ContentType = "application/json";
tRequest.Headers.Add(string.Format("Authorization: key={0}", GoogleAppID));
tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID));
string postData = "{\"collapse_key\":\"score_update\",\"time_to_live\":108,\"delay_while_idle\":true,\"data\": { \"message\" : " + "\"" + value + "\",\"time\": " + "\"" + System.DateTime.Now.ToString() + "\"},\"registration_ids\":[\"" + stringregIds + "\"]}";
Byte[] byteArray = Encoding.UTF8.GetBytes(postData);
tRequest.ContentLength = byteArray.Length;
Stream dataStream = tRequest.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse tResponse = tRequest.GetResponse();
dataStream = tResponse.GetResponseStream();
StreamReader tReader = new StreamReader(dataStream);
string sResponseFromServer = tReader.ReadToEnd();
TempData["msg1"] = "<script>alert('" + sResponseFromServer + "');</script>";
HttpWebResponse httpResponse = (HttpWebResponse)tResponse;
string statusCode = httpResponse.StatusCode.ToString();
tReader.Close();
dataStream.Close();
tResponse.Close();
}
catch (Exception ex)
{
}
}
But exact string returned by 'postData' posted by Postman or Fiddler gives positive response and notification arrived at device.
What I'm missing in my code please help me.
The postData returns this value which successfully posted by Postman And Fiddler
{"collapse_key":"score_update","time_to_live":108,"delay_while_idle":true,"data": { "message" : "Hello","time": "5/13/2016 5:50:59 PM"},"registration_ids":["cXMf6hkYIrw:APA91bGr-8y2Gy-qzNJ3zjrlf8t-4m9uDib9P0j8GW87bH5jq891-x_7P0qqItzlc_HXh11Arg76lCOcjXPrU9LAgtYLwllH2ySxA0ADSfiz3qPolajjvI3d3zE6Rh77dwRqXn3NnbAm"]}
The problem in your code is in ContentType
Instead of using this:-
Request.ContentType = "application/json";
Use
tRequest.ContentType = "application/json";
It will work
Try This:-
private string SendGCMNotification()
{
try
{
string message = "some test message";
//string tickerText = "example test GCM";
string contentTitle = "content title GCM";
string registration_id = "cXMf6hkYIrw:APA91bGr-8y2Gy-qzNJ3zjrlf8t-4m9uDib9P0j8GW87bH5jq891-x_7P0qqItzlc_HX‌​h11Arg76lCOcjXPrU9LAgtYLwllH2ySxA0ADSfiz3qPolajjvI3d3zE6Rh77dwRqXn3NnbAm";
string postData =
"{ \"registration_ids\": [ \"" + registration_id + "\" ], " +
"\"data\": {\"contentTitle\":\"" + contentTitle + "\", " +
"\"message\": \"" + message + "\"}}";
string GoogleAppID = "AIzaSyA2Wkdnp__rBokCmyloMFfENchJQb59tX8";
WebRequest wRequest;
wRequest = WebRequest.Create("https://android.googleapis.com/gcm/send");
wRequest.Method = "POST";
wRequest.ContentType = " application/json;charset=UTF-8";
wRequest.Headers.Add(string.Format("Authorization: key={0}", GoogleAppID));
var bytes = Encoding.UTF8.GetBytes(postData);
wRequest.ContentLength = bytes.Length;
var stream = wRequest.GetRequestStream();
stream.Write(bytes, 0, bytes.Length);
stream.Close();
var wResponse = wRequest.GetResponse();
stream = wResponse.GetResponseStream();
var reader = new StreamReader(stream);
var response = reader.ReadToEnd();
var httpResponse = (HttpWebResponse)wResponse;
var status = httpResponse.StatusCode.ToString();
reader.Close();
stream.Close();
wResponse.Close();
//TODO check status
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return "sent";
}

Posting tasks to Asana using API in C#

I'm trying to figure out how to post a new task to a user in asana, but I keep getting the 400 error code. Can anyone tell me what I am doing wrong.
This is what I have so far:
string apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
string ID = "xxxxxxxxxxxxx";
string url = #"https://app.asana.com/api/1.0/tasks";
Data dat = new Data();
dat.workspace = ID;
dat.name = "Buy eggs";
dat.notes = "Testing";
string json = JsonConvert.SerializeObject(dat);
string data ="\"data\": " + json;
byte[] bytes = Encoding.UTF8.GetBytes(data);
var req = (HttpWebRequest)WebRequest.Create(url);
Console.WriteLine(bytes.ToString());
req.Method = WebRequestMethods.Http.Post;
req.ContentLength = bytes.Length;
req.ContentType = "application/json";
var authInfo = apiKey + ":";
var encodedAuthInfo = Convert.ToBase64String(
Encoding.Default.GetBytes(authInfo));
req.Headers.Add("Authorization", "Basic " + encodedAuthInfo);
req.ContentLength = bytes.Length;
Stream reqStream = req.GetRequestStream();
reqStream.Write(bytes, 0, bytes.Length);
reqStream.Close();
try
{
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
string res = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(res);
Console.ReadLine();
}
catch (WebException ex)
{
HttpWebResponse response = ((HttpWebResponse)ex.Response);
string e = url + " caused a " + (int)response.StatusCode + " error.\n" + response.StatusDescription;
Console.WriteLine(e);
Console.ReadLine();
}
I put the serial converter, did i do it wrong?
As the first comment points out, you need to serialize the data properly. The final body posted should look something like:
{ "data": { "name": "My Example Task", ... }}
(Except of course with the ... replaced with more fields.)
I have researched a long and found below code useful and working. I can successfully post Task to Asana through my application. I have used Json serializer for dot net. Thanks to Newtonsoft.Json.
string json = null;
byte[] bytes = null;
string url = "https://app.asana.com/api/1.0/tasks";
HttpWebRequest req = default(HttpWebRequest);
Stream reqStream = default(Stream);
string authInfo = null;
Task TaskData = new Task();
try
{
authInfo = apiKey + Convert.ToString(":");
TaskData.workspace = WorkspaceId;
TaskData.name = TaskName;
TaskData.notes = TaskNotes;
json = JsonConvert.SerializeObject(TaskData);
json = json.Insert((json.Length - 1), ",\"projects\":[" + ProjectId + "]");
json = Convert.ToString("{ \"data\":") + json + "}";
bytes = Encoding.UTF8.GetBytes(json);
req = (HttpWebRequest)WebRequest.Create(url);
req.Method = WebRequestMethods.Http.Post;
req.ContentType = "application/json";
req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)));
req.ContentLength = bytes.Length;
reqStream = req.GetRequestStream();
reqStream.Write(bytes, 0, bytes.Length);
reqStream.Close();
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
string res = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.WriteLine(res);
Console.ReadLine();
string finalString = res.Remove(0, 8);
finalString = finalString.Remove((finalString.Length - 1));
AsanaObjectId newtask = JsonConvert.DeserializeObject<AsanaObjectId>(finalString);
return newtask;
}
catch (WebException ex)
{
HttpWebResponse response = (HttpWebResponse)ex.Response;
string resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
MessageBox.Show(resp);
System.Environment.Exit(0);
}

not getting the SOAP response

My SOAP request works - hits the server and displays my request in the server logs and sends the response but I am unable to read the response with my codes (C# & ASP.NET) below.Am I missing something?
try
{
string url = "http://a.b.c.d/ABC/services/DOMFlightAvailability?wsdl";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version10;
req.Method = "POST";
string request = "<Request>"
+ "<Origin>BOM</Origin>"
+ "<Destination>BLR</Destination>"
+ "<DepartDate>2014-11-15</DepartDate>"
+ "<ReturnDate>2014-11-15</ReturnDate>"
+ "<AdultPax>1</AdultPax>"
+ "<ChildPax>1</ChildPax>"
+ "<InfantPax>1</InfantPax>"
+ "<Currency>INR</Currency>"
+ "<Clientid>123</Clientid>"
+ "<Clientpassword>123</Clientpassword>"
+ "<Clienttype>123</Clienttype>"
+ "<Preferredclass>E</Preferredclass>"
+ "<mode>ONE</mode>"
+ "<PreferredAirline>AI,G8,IC,6E,9W,S2,IT,9H,I7,SG</PreferredAirline>"
+ "</Request>";
byte[] postBytes = Encoding.ASCII.GetBytes("xmlRequest=" + request + "");
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = postBytes.Length;
Stream requestStream = req.GetRequestStream();
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
Stream resStream = response.GetResponseStream();
var sr = new StreamReader(response.GetResponseStream());
string responseText = sr.ReadToEnd();
Response.Write(responseText);
lblResult.Text = responseText;
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
This is my other way of doing it - hits the server and trasmits the response but I am still unable to get the response data
try
{
DOMFlightAvailabilityPortTypeClient obj = new DOMFlightAvailabilityPortTypeClient();
string req = "<Request>"
+ "<Origin>BOM</Origin>"
+ "<Destination>DEL</Destination>"
+ "<DepartDate>2014-11-20</DepartDate>"
+ "<ReturnDate>2014-12-21</ReturnDate>"
+ "<AdultPax>1</AdultPax>"
+ "<ChildPax>0</ChildPax>"
+ "<InfantPax>0</InfantPax>"
+ "<Currency>INR</Currency>"
+ "<Clientid>123</Clientid>"
+ "<Clientpassword>123</Clientpassword>"
+ "<Clienttype>123</Clienttype>"
+ "<Preferredclass>E</Preferredclass>"
+ "<mode>ONE</mode>"
+ "<PreferredAirline>AI,G8,IC,6E,9W,S2,IT,9H,I7,SG</PreferredAirline>"
+ "</Request>";
string str = obj.getAvailability(req);
XmlDocument doc = new XmlDocument();
doc.LoadXml(str);
DataSet ds = new DataSet();
ds.ReadXml(new XmlTextReader(new StringReader(str)));
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}

How to use PennySMS in c#.net?

Has anyone used PennySMS's web services? (https://www.pennysms.com/docs) I'm having some difficulty doing a successful HttpPost request.
Update:
I'm a n00b to Web Services. I don't even know if I can complete this type of request server-side. I've replaced the actual info in the params with example info.
protected void bText_Click(object sender, EventArgs e)
{
string XML = "<?xml version=\"1.0\"?>"
+"<methodCall>"
+"<methodName>send</methodName>"
+" <params>"
+" <param>"
+ " <value><string>MY KEY</string></value>"
+" </param>"
+" <param>"
+ " <value><string>service#example.com</string></value>"
+" </param>"
+" <param>"
+ " <value><string>555555555</string></value>"
+" </param>"
+" <param>"
+" <value><string>Test Message</string></value>"
+" </param>"
+" </params>"
+"</methodCall>";
SendText("http://api.pennysms.com/xmlrpc", "XML");
}
public void SendText(string _URL, string _parameters)
{
WebRequest request = WebRequest.Create(_URL);
request.Method = "POST";
string postData = _parameters;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "text/xml";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
}
The following code works. I've made no attemps to optimize anything. Unless the server restricts outgoing connections, you can use this server-side.
protected static string DoRequest()
{
string XML = "<?xml version=\"1.0\"?>"
+"<methodCall>"
+"<methodName>send</methodName>"
+" <params>"
+" <param>"
+ " <value><string>MY KEY</string></value>"
+" </param>"
+" <param>"
+ " <value><string>service#example.com</string></value>"
+" </param>"
+" <param>"
+ " <value><string>555555555</string></value>"
+" </param>"
+" <param>"
+" <value><string>Test Message</string></value>"
+" </param>"
+" </params>"
+"</methodCall>";
return SendText("http://api.pennysms.com/xmlrpc", XML);
}
public static string SendText(string _URL, string _parameters)
{
WebRequest request = WebRequest.Create(_URL);
request.Method = "POST";
string postData = _parameters;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "text/xml";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
long responseLength = request.GetResponse().ContentLength;
Stream responseStream = request.GetResponse().GetResponseStream();
MemoryStream memStream = new MemoryStream((int)responseLength);
byteArray = new byte[4096];
int bytesRead = 0;
bytesRead = responseStream.Read(byteArray, 0, 4096);
while(bytesRead > 0)
{
memStream.Write(byteArray, 0, bytesRead);
bytesRead = responseStream.Read(byteArray, 0, 4096);
}
return Encoding.UTF8.GetString(memStream.ToArray());
}
If you're using the XML-RPC API, have you checked your content-type? It should be "text/xml".

Categories