Аватар c#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kokoulin, 16 Jan 2012.

  1. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    63
    Likes Received:
    5
    Reputations:
    5
    Как загрузить аватарку для группы в контакт?
    гружу прохожу всем редиректам предпоследний запрос имеет вид:
    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|"}

    в чем может быть проблема?
     
  2. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    выложи код
     
  3. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    63
    Likes Received:
    5
    Reputations:
    5
    Используеться библиотека 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(urlservpostadditionalHeadersMultipartContentFormatter.Header);
                        
    post string.Format("act=success&al=1&error=1&hash={0}&mid={1}&oid=-{2}&server={3}"erroridclubserver);
                        
    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(urlservpost);
                        
    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}"urlservpost);
                        
    post MultipartContentFormatter.MakeString("photo={0}",ava);
                        
    answer1 VkRequest.StaticRequest(serverurlpostadditionalHeadersMultipartContentFormatter.Header);
                        
     
  4. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    подозреваю. что возвращаемое значение типа 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, прочитай пару книг. Но писать на таком без понятия, что ты делаешь это бессмысленно и в итоге не принесет никакой пользы.
    Да я не отрицаю, что используя длл это удобнее/быстрее, но только в том случае когда ты знаешь. что в ней делает каждая строчка кода.
     
  5. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    63
    Likes Received:
    5
    Reputations:
    5
    я умею писать на стандартных ф-иях) видать на них и прийдется делать хотя я крайне не люблю эти адские конструкции
    функция MultipartContentFormatter.MakeString перегоняет картинку в массив байт, этой функции можно передать как картинку так и сразу массив байт
    MultipartContentFormatter.Header добавляет в хэдер контент тайп

    в том то все и дело что в отладчике все нормально уходит
     
    #5 kokoulin, 17 Jan 2012
    Last edited: 17 Jan 2012
  6. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Вот тебе готовая функция. Загружает фото и возвращает хеш на него. 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;
    }
     
  7. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    63
    Likes Received:
    5
    Reputations:
    5
    о большое спасибо)
    я так понимаю Accaunt это класс для работы с аккаунтами и он описан в библиотеке, но в последней версии которая на сайте и в архивах с ботоводом (5.4.0.0) его нет, или тут предполагается самоличное его написание?)
     
    #7 kokoulin, 17 Jan 2012
    Last edited: 17 Jan 2012
  8. Kairos

    Kairos Elder - Старейшина

    Joined:
    5 Oct 2009
    Messages:
    37
    Likes Received:
    21
    Reputations:
    21
    Это класс из ботовода и в движок он не входит (и пока что не планируется)
     
  9. kokoulin

    kokoulin Member

    Joined:
    8 Jan 2011
    Messages:
    63
    Likes Received:
    5
    Reputations:
    5
    пичалька, ну ладно