Как загрузить аватарку для группы в контакт? гружу прохожу всем редиректам предпоследний запрос имеет вид: Code: url http://cs11345.vk.com/upload.php post act=page_photo&mid=156525997&oid=-34222301&hash=9cde9e1ac89a0665914f26593b2e289e&rhash=be1fb81e3bdff55d0c7b3a441e1d757c&photo_hash=e9aee4ae4e&vk=1&upldr=1&ajx=1 ответ на него {"code":"1|"} следом за ним идет тоже самое только плюс изображение Code: url http://cs11345.vk.com/upload.php?/upload.php?act=page_photo&mid=156525997&oid=-34222301&hash=9cde9e1ac89a0665914f26593b2e289e&rhash=be1fb81e3bdff55d0c7b3a441e1d757c&photo_hash=e9aee4ae4e&vk=1&upldr=1&ajx=1 multipart/form-data; boundary=---------------------------491299511942 -----------------------------491299511942 Content-Disposition: form-data; name="photo"; filename="bg.jpg" Content-Type: image/jpeg ответ по идее должен быть: Code: {"mid":156525997,"oid":-34222301,"server":11345,"photo_hash":"e9aee4ae4e","photo":"04aa6816eax","width":200,"height":201,"hash":"351f5b508fc6d5017f3c97812633356d"} но я получаю на него снова {"code":"1|"} в чем может быть проблема?
Используеться библиотека ViKing.Engine.dll для запросов и преобразования строки в multiparat работает коректоно проверял на радикале и своем сервере PHP: post = "act=a_new_photo&al=1&oid=-"+club; answer1 = VkRequest.StaticRequest("http://vk.com/al_page.php", post); hash = Convert.ToString(Regex.Match(answer1.Content, "(?<=check_hash: \')[0-9a-f]*")); string rhash = Convert.ToString(Regex.Match(answer1.Content, "(?<=rhash: \')[0-9a-f]*")); string error = Convert.ToString(Regex.Match(answer1.Content, "(?<=error_hash: \')[0-9a-f]*")); string server = Convert.ToString(Regex.Match(answer1.Content, "(?<=server: )[0-9]*")); string hash1 = Convert.ToString(Regex.Match(answer1.Content, "(?<=hash\":\").*(?=\", \"r)")); ; string rhash1 = Convert.ToString(Regex.Match(answer1.Content, "(?<=rhash\":\")[0-9a-f]*")); ; string photohash = Convert.ToString(Regex.Match(answer1.Content, "(?<=_hash\":\")[0-9a-f]*")); ; post = MultipartContentFormatter.MakeString("mid={0}&aid=undefined&gid=undefined&hash={1}&rhash={2}&al=1&act=check_upload&type=photo&ondone=Upload.callbacks.oncheck0",id,hash,rhash); string urlserv = string.Format("http://cs{0}.vk.com/upload.php",server); answer1 = VkRequest.StaticRequest(urlserv, post, additionalHeaders: MultipartContentFormatter.Header); post = string.Format("act=success&al=1&error=1&hash={0}&mid={1}&oid=-{2}&server={3}", error, id, club, server); answer1 = VkRequest.StaticRequest("http://vk.com/upload_fails.php ", post); post = String.Format("act=page_photo&mid={0}&oid=-{1}&hash={2}&rhash={3}&photo_hash={4}&vk=1&upldr=1&ajx=1",id,club,hash1,rhash1,photohash); answer1 = VkRequest.StaticRequest(urlserv, post); string filenamedata = string.Format("ava.jpg"); string filenam = Application.ExecutablePath; filenam = Path.GetDirectoryName(filenam); Directory.CreateDirectory("data"); filenam = Path.Combine(filenam, "data", filenamedata); Image ava = Image.FromFile(filenam); string serverurl = string.Format("{0}?{1}", urlserv, post); post = MultipartContentFormatter.MakeString("photo={0}",ava); answer1 = VkRequest.StaticRequest(serverurl, post, additionalHeaders: MultipartContentFormatter.Header);
подозреваю. что возвращаемое значение типа string. (Посмотри в отладчике хоть. что ты отправляешь) Получается у тебя идет отправка пути изображения. Что бы отправить картинку еще нужно представить ввиде массива байт. Далее в хедере реквеста обязательно указать соответствующий контент_тайп http://en.wikipedia.org/wiki/Mime_type Далее этот массив нужно передать на запись в стрим реквеста. Примеры: http://stackoverflow.com/questions/566462/upload-files-with-httpwebrequest-multipart-form-data http://stackoverflow.com/questions/3890754/c-using-httpwebrequest-to-post-data-upload-image-using-multipart-form-data П,C учись писать хотя бы используя стандартные классы .NET, прочитай пару книг. Но писать на таком без понятия, что ты делаешь это бессмысленно и в итоге не принесет никакой пользы. Да я не отрицаю, что используя длл это удобнее/быстрее, но только в том случае когда ты знаешь. что в ней делает каждая строчка кода.
я умею писать на стандартных ф-иях) видать на них и прийдется делать хотя я крайне не люблю эти адские конструкции функция MultipartContentFormatter.MakeString перегоняет картинку в массив байт, этой функции можно передать как картинку так и сразу массив байт MultipartContentFormatter.Header добавляет в хэдер контент тайп в том то все и дело что в отладчике все нормально уходит
Вот тебе готовая функция. Загружает фото и возвращает хеш на него. akk.Request работает примерно так же как VkRequest.StaticRequest и тут есть перегрузка string.Split, но я думаю ты разберешься ) Code: public static string UploadPhoto(Account akk, Image image) { string id = akk.SignedId; // Account id, starts from '-' if it is club or public page //Get upload parameters var page = akk.Request("photos.php?act=a_choose_photo_box&al=1&scrollbar_width=16&to_id=" + id).Content; var m = Regex.Match(page, @"Upload.init\('choose_photo_upload', '([^']+)', ({[^}]+})"); var url = m.Groups[1].Value; var form = Regex.Matches(m.Groups[2].Value, @"'(\w+)'\s*:\s*'?([^,}']+)'?".Replace('\'', '"')).OfType<Match>(); var par = string.Join("&", form.Select(t => t.Groups[1].Value + "="+ t.Groups[2].Value).ToArray()); //upload var ans = akk.Request(url, MultipartContentFormatter.MakeString(par + "&al=1&photo={0}", image), additionalHeaders: MultipartContentFormatter.Header).Content; //confirm and get address url = Regex.Match(ans, @"top.\('([^']+)'\);").Groups[1].Value; ans = akk.Request("al_photos.php?act=choose_uploaded&al=1&" + url.Replace(":", "%3A")).Content; var photo = ans.Split("<!>")[5]; return photo; }
о большое спасибо) я так понимаю Accaunt это класс для работы с аккаунтами и он описан в библиотеке, но в последней версии которая на сайте и в архивах с ботоводом (5.4.0.0) его нет, или тут предполагается самоличное его написание?)