Публикуване в дъска на phpBB чрез C# приложение

Ще подобря един от новите си проекти и една от функциите, които искам да добавя, е възможността да публикувам нова тема във форум на phpBB, но възможно ли е да направя това? Ако е, как мога да направя това? Благодаря.


person Nathan Campos    schedule 17.11.2009    source източник
comment
Имате ли достъп до phpBB форума? Обмислете използването на вътрешна phpBB библиотека, за да създадете нишката и да я изпълните чрез уеб услуга от вашето WinMo устройство. друга алтернатива е да подадете HTTP заявките към формуляра за създаване на нишка програмно. За съжаление, може да срещнете проблеми, тъй като това е често срещана тактика за спам и вероятно има проверки.   -  person Sam Pride    schedule 18.11.2009


Отговори (3)


Няма да напиша целия код вместо вас, но мога да изхвърля няколко неща, които съм създал и които работят добре.

Един от начините е да създадете контрола на уеб браузър и да създадете нещо подобно:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            HtmlDocument doc = null;
            doc = webBrowser1.Document;

            //Find login text box and write user name  
            HtmlElement login = doc.GetElementById("username_or_email");
            login.InnerText = this.login;

            //Find password text box and write password
            HtmlElement password = doc.GetElementById("session[password]");
            password.InnerText = this.password;

            // go to the submit button
            webBrowser1.Document.GetElementsByTagName("input")[5].Focus();
            SendKeys.Send("{ENTER}");

        }

Друг начин е да използвате http заявки (не е толкова вероятно да работят надеждно с phpBB)

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(twitterUrl + userID + ".xml");
                string Credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(this.login + ":" + this.password));

                request.Method = "POST";
                request.ContentType = "application/xml";
                request.AllowWriteStreamBuffering = true;
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6; SLCC1; .NET CLR 2.0.50727;";
                request.Headers.Add("Authorization", "Basic " + Credentials);

                HttpWebResponse HttpWResp = (HttpWebResponse)request.GetResponse();

                string response = HttpWResp.StatusCode.ToString();
                    HttpWResp.InitializeLifetimeService();
                    HttpWResp.Close();    

                return response;

Кодът по-горе се използва за влизане в twitter. Можете да модифицирате всеки от тях според вашите вкусове. Не забравяйте, че phpBB вероятно ще използва captcha и проверка на сесията, за да предотврати точно това, което се опитвате да направите.

person Jeremy Morgan    schedule 17.11.2009

  1. Можете да постигнете това с проста инструкция за вмъкване в базата данни на phpBB, но за да сте сигурни, че всичко върви гладко, трябва да сте сигурни, че сте вмъкнали и всички други редове, които phpBB иначе би вмъкнал за нова нишка (потърсете документация /изходен код за това).

    Освен това ще трябва да се уверите, че сте въвели правилните идентификатори, тъй като във вмъкването се изискват уникални идентификатори (като UserID за потребителя, създаващ нишката)

  2. Друг метод е да създадете отделен php файл, който разкрива функцията за създаване на нишка (w/e може да се извика), която phpBB използва за създаване на нова нишка. Ще разрешите POST/GET (POST е по-сигурен) към php файла и след това ще изпълните HTTP POST/GET заявка от C#.

    Във вашия нов php файл ще е необходим някакъв вид разрешение, за да се гарантира, че никой друг не публикува/заявява страницата. Можете да кодирате твърдо име на конкретно поле, което трябва да съдържа конкретен ключ за достъп, така че всички входящи публикации/получавания, които го нямат, да бъдат игнорирани.

Вторият метод, imo, е по-добър, защото позволява на phpBB да върши цялата тежка работа, просто трябва да го свържете правилно.

При втория метод обаче може да имате проблеми със сигурността и phpBB може дори да не позволи това, което се опитвате да направите. (Мисля, че за да извика определени методи, страницата трябва да има DEFINE("IN", "PHPBB") или нещо от сорта, което поставя повече ограничения върху това, което можете да правите.

Като начало бих разгледал сайтовете за поддръжка на phpBB и ще видя дали 2-рата част изобщо е възможна и ще разбера дали извикването на функциите е нещо, което може лесно да се направи.

person Omar    schedule 17.11.2009

Е, влизането в phpBB3 е лесната част, тук е малко код, който използвах

  try
            {
                string format= "autologin=1&login=true&username={0}&password={1}";

                byte[] bytes = Encoding.ASCII.GetBytes(string.Format(format, (object)HttpUtility.UrlEncode("USERNAME"), (object)HttpUtility.UrlEncode("PASSWORD")));

              HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://thephpbb3domain/ucp.php?mode=login");
                httpWebRequest.CookieContainer = new CookieContainer(128);
                httpWebRequest.Timeout = 10000;
                                    httpWebRequest.AllowAutoRedirect = false;
                httpWebRequest.UserAgent = Resources.WEB_USER_AGENT;
                httpWebRequest.Method = "POST";
                httpWebRequest.ContentType = "application/x-www-form-urlencoded";
                httpWebRequest.ContentLength = (long)bytes.Length;
                Stream requestStream = ((WebRequest)httpWebRequest).GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
                HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                if (httpWebResponse == null)
                {
                    int num2 = (int)MessageBox.Show(Resources.ERR_MSG_NO_DATA);
                    return;
                }
                else
                {
                    StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream());
                    streamReader.ReadToEnd().Trim();
                    streamReader.Close();

                            IEnumerator enumerator2 = httpWebResponse.Cookies.GetEnumerator();
                            try
                            {
                                while (enumerator2.MoveNext())
                                {
                                    Cookie cookie = (Cookie)enumerator2.Current;
                                    string str = HttpUtility.UrlDecode(cookie.Value);
                                    if (cookie.Name.EndsWith("_k"))
                                    {
                                        if (cookie.Value.Length > 5)
                                        {

                                            break;
                                        }
                                    }
                                    else if (cookie.Name.EndsWith("_data") && !str.Contains("s:6:\"userid\";i:-1;") && str.Contains("s:6:\"userid\";"))
                                    {


                                    }
                                }

                            }
                            finally
                            {
                                IDisposable disposable = enumerator2 as IDisposable;
                                if (disposable != null)
                                    disposable.Dispose();
                            }


                }
            }
            catch (WebException ex)
            {
                int num = (int)MessageBox.Show(ex.Message, "HTTP Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
            }

Това използва следните основни пространства от имена

       System.Net
       System.Web

Публикуването на тема във форума обаче се превърна в наистина голямо предизвикателство. Някой има ли съвети?

person Shadrack Kimutai    schedule 19.08.2012