C# POST VK

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by stas1kus, 5 Jul 2014.

  1. stas1kus

    stas1kus New Member

    Joined:
    25 Jun 2012
    Messages:
    33
    Likes Received:
    4
    Reputations:
    0
    Доброго времени..

    Столкнулся тут с проблемой написания постов в ВК группу с помощью кода без API.. суть в том что постить получается, но вот постится только 2 раза... может где-то в коде продолбался... подскажите плз

    Ну и соль в том, что нужно делать именно запросами, а не через АПИ, почему думаю сами поняли :)

    Code:
    public string Login(string url, string postData) //Возвращает содержимое поданной страницы
            {
                string HTML = "";
     
                Regex rex1 = new Regex("remixsid=(.*?);", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
                if (url == "0") return "0"; //Проверка на ошибку
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
                //myHttpWebRequest.Proxy = new WebProxy("127.0.0.1", 8888); 
                if (!String.IsNullOrEmpty(postData)) myHttpWebRequest.Method = "POST";
                myHttpWebRequest.Referer = "https://vk.com";
                myHttpWebRequest.UserAgent = "Mozila/14.0 (compatible; MSIE 6.0;Windows NT 5.1; SV1; MyIE2;";
                myHttpWebRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword";
                myHttpWebRequest.Headers.Add("Accept-Language", "ru");
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
                myHttpWebRequest.KeepAlive = false;
     
                // передаем Сookie, полученные в предыдущем запросе
                if (!String.IsNullOrEmpty(this.remixsid))
                {
                    lastCookies = "remixchk=5;remixsid=" + this.remixsid;
                }
                if (!String.IsNullOrEmpty(lastCookies))
                {
                    myHttpWebRequest.Headers.Add(System.Net.HttpRequestHeader.Cookie, lastCookies);
                }
                // ставим False, чтобы при получении кода 302, не делать 
                // автоматического перенаправления
                myHttpWebRequest.AllowAutoRedirect = false;
     
                // передаем параметры
                string sQueryString = postData;
                byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString); //Вконтакте использует кирилическую кодировку
                try
                {
                    if (!String.IsNullOrEmpty(postData))
                    {
                        myHttpWebRequest.ContentLength = ByteArr.Length;
                        myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
                    };
     
                    // делаем запрос
                    HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    StreamReader myStreamReader;
     
                    //Сохраняем Cookie 
                    lastCookies = String.IsNullOrEmpty(myHttpWebResponse.Headers["Set-Cookie"]) ? "" : myHttpWebResponse.Headers["Set-Cookie"];
                    Match matc1 = rex1.Match(lastCookies);
     
                    //Если есть имя сессии, то подменяем Cookie 
                    if (matc1.Groups.Count == 2) { this.remixsid = matc1.Groups[1].ToString(); lastCookies = "remixchk=5;remixsid=" + this.remixsid; }
                    if (myHttpWebResponse.Headers["Content-Type"].IndexOf("windows-1251") > 0)
                    {
                        myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding("windows-1251"));
                    }
                    else
                    {
                        myStreamReader = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.UTF8);
                    }
                    HTML = myStreamReader.ReadToEnd();
                    if (HTML == "") //Проверяем на редирект
                    {
                        HTML = this.GetHtml(myHttpWebResponse.Headers["Location"].ToString(), "");
     
                    }
                }
                catch (Exception err)
                {
                    //Ошибка в чтении страницы
                    return "0";
                }
                return HTML;
            }
     
     
     
            public string PostMessage(string url, string idGroup, string postMessage) //Возвращает содержимое поданной страницы
            {
                string HTML = "";
     
                Regex rex1 = new Regex("remixsid=(.*?);", RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
                if (url == "0") return "0"; //Проверка на ошибку
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
                //myHttpWebRequest.Proxy = new WebProxy("127.0.0.1", 8888);
                if (!String.IsNullOrEmpty(idGroup)) myHttpWebRequest.Method = "POST";
                myHttpWebRequest.Referer = "https://vk.com/" + idGroup;
                myHttpWebRequest.UserAgent = "Mozila/14.0 (compatible; MSIE 6.0;Windows NT 5.1; SV1; MyIE2;";
                myHttpWebRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg,image/pjpeg, application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword";
                myHttpWebRequest.Headers.Add("Accept-Language", "ru");
                myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
                myHttpWebRequest.KeepAlive = false;
     
                lastCookies = "remixchk=5;remixsid=" + this.remixsid;
                myHttpWebRequest.Headers.Add(System.Net.HttpRequestHeader.Cookie, lastCookies);
     
     
                 // передаем параметры
                string sQueryString = postMessage;
                byte[] ByteArr = System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString); //Вконтакте использует кирилическую кодировку
                try
                {
                    if (!String.IsNullOrEmpty(postMessage))
                    {
                        myHttpWebRequest.ContentLength = ByteArr.Length;
                        myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
                    };
     
                    // делаем запрос
                    HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                }
                catch (Exception err)
                {
                    //Ошибка в чтении страницы
                    return "0";
                }
                return HTML;
            }
    
    Ну и вот вызов для написания поста, пытаюсь написать одно и тоже сообщение 4 раза, но почему-то всегда постится только 2... думал связанно было с тем что одинаковое, но начал генерить и подставлять символы разные.. всеравно

    Code:
    for (int i = 0; i < 4; i++)
                {
                    string post = "Message=" + messageTB.Text + "" + i + "&act=post&al=1&facebook_export=&fixed=&friends_only=&from=&hash=" + hash + "&official=&signed=&status_export=&to_id=-" + GruopNum + "&type=all";
                    http.PostMessage("https://vk.com/al_wall.php", groupID.Text, post);
                    Thread.Sleep(1000);
                }
    
    Подскажите плз...
     
  2. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    может капча вылазит?
     
  3. stas1kus

    stas1kus New Member

    Joined:
    25 Jun 2012
    Messages:
    33
    Likes Received:
    4
    Reputations:
    0
    не, я проверял... я отсылал за 5 сек в ВК 10 одинаковых сообщения, и ничего не вылазило + запрос один и тот же шлется...

    зависает на этом месте
    Code:
    myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
    которое находится в методе PostMessage, я от туда уже и проверку if (!String.IsNullOrEmpty(postData)) убрал... но все так же..
     
  4. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Может потому что надо закрывать поток? Судя по коду вам бы не помешало бы RTFM IDisposable & using.
    Поскольку POST запрос и HttpWebRequest вангую еще одну потенциальную проблему - .ServicePoint.Expect100Continue = false;
     
    #4 seosimf, 7 Jul 2014
    Last edited: 7 Jul 2014