1

我要改进我的一个新项目,我想添加的功能之一是可以在 phpBB 论坛板上发布一个新线程,但可以这样做吗?如果是,我该怎么做?谢谢。

4

3 回答 3

2
  1. 您可以在 phpBB 数据库中使用简单的插入语句来完成此操作,但是,为了确保一切顺利进行,您需要确保您还插入了 phpBB 否则会为新线程插入的任何其他行(查找文档/源代码)。

    此外,您需要确保您输入了正确的 ID,因为插入中需要唯一 ID(例如创建线程的用户的 UserID)

  2. 另一种方法是创建一个单独的 php 文件,该文件公开 phpBB 用来创建新线程的创建线程函数(可能会调用它)。您将允许对 php 文件进行 POST/GET(POST 更安全),然后从 C# 运行 HTTP POST/GET 请求。

    在您的新 php 文件中,需要某种类型的授权以确保没有其他人在发布/请求该页面。您可以对必须包含特定访问密钥的特定字段名称进行硬编码,这样任何没有它的传入帖子/获取都将被忽略。

第二种方法 imo 更好,因为它让 phpBB 完成所有艰苦的工作,您只需要正确连接它。

但是,使用第二种方法,您可能会遇到安全问题,并且 phpBB 甚至可能不允许您尝试执行的操作。(我认为要调用某些方法,页面需要具有 DEFINE("IN", "PHPBB") 或类似的东西,这对您可以执行的操作施加了更多限制。

首先,我会查看 phpBB 支持站点,看看第二部分是否可能,并确定调用函数是否可以轻松完成。

于 2009-11-17T23:56:38.877 回答
1

我不会为你编写所有代码,但我可以转储一些我构建的运行良好的东西。

一种方法是创建一个 webbrowser 控件,并创建如下内容:

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 可能会使用验证码和会话验证来防止您正在尝试做的事情。

于 2009-11-17T23:50:54.780 回答
1

那么登录到 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

然而,在论坛上发布一个帖子已经变成了一个非常大的挑战,有人有提示吗?

于 2012-08-19T11:05:00.307 回答