Публикация на доске 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;

Приведенный выше код используется для входа в твиттер. Вы можете изменить любой из них по своему вкусу. Помните, что phpBB, скорее всего, использует капчу и проверку сеанса, чтобы предотвратить именно то, что вы пытаетесь сделать.

person Jeremy Morgan    schedule 17.11.2009

  1. Вы можете выполнить это с помощью простого оператора вставки в базу данных phpBB, однако, чтобы убедиться, что все идет гладко, вам необходимо убедиться, что вы также вставляете любые другие строки, которые phpBB в противном случае вставил бы для нового потока (см. документацию /исходный код для этого).

    Кроме того, вам необходимо убедиться, что вы ввели правильные идентификаторы, поскольку во вставке требуются уникальные идентификаторы (например, UserID для пользователя, создающего поток)

  2. Другой метод заключается в создании отдельного php-файла, предоставляющего функцию создания потока (с возможностью вызова), которую phpBB использует для создания нового потока. Вы разрешите POST/GET (POST более безопасен) для php-файла, а затем запустите HTTP-запрос POST/GET из С#.

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

Второй метод, имхо, лучше, потому что он позволяет phpBB делать всю тяжелую работу, вам просто нужно правильно подключить его.

Однако со вторым методом у вас могут возникнуть проблемы с безопасностью, и phpBB может даже не разрешить то, что вы пытаетесь сделать. (Я думаю, что для вызова определенных методов страница должна иметь DEFINE("IN", "PHPBB") или что-то в этом роде, что накладывает больше ограничений на то, что вы можете делать.

Для начала я бы просмотрела сайты поддержки phpBB и посмотрела, возможна ли вообще вторая часть, и выяснила, легко ли можно вызвать функции.

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