我要改进我的一个新项目,我想添加的功能之一是可以在 phpBB 论坛板上发布一个新线程,但可以这样做吗?如果是,我该怎么做?谢谢。
3 回答
您可以在 phpBB 数据库中使用简单的插入语句来完成此操作,但是,为了确保一切顺利进行,您需要确保您还插入了 phpBB 否则会为新线程插入的任何其他行(查找文档/源代码)。
此外,您需要确保您输入了正确的 ID,因为插入中需要唯一 ID(例如创建线程的用户的 UserID)
另一种方法是创建一个单独的 php 文件,该文件公开 phpBB 用来创建新线程的创建线程函数(可能会调用它)。您将允许对 php 文件进行 POST/GET(POST 更安全),然后从 C# 运行 HTTP POST/GET 请求。
在您的新 php 文件中,需要某种类型的授权以确保没有其他人在发布/请求该页面。您可以对必须包含特定访问密钥的特定字段名称进行硬编码,这样任何没有它的传入帖子/获取都将被忽略。
第二种方法 imo 更好,因为它让 phpBB 完成所有艰苦的工作,您只需要正确连接它。
但是,使用第二种方法,您可能会遇到安全问题,并且 phpBB 甚至可能不允许您尝试执行的操作。(我认为要调用某些方法,页面需要具有 DEFINE("IN", "PHPBB") 或类似的东西,这对您可以执行的操作施加了更多限制。
首先,我会查看 phpBB 支持站点,看看第二部分是否可能,并确定调用函数是否可以轻松完成。
我不会为你编写所有代码,但我可以转储一些我构建的运行良好的东西。
一种方法是创建一个 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 可能会使用验证码和会话验证来防止您正在尝试做的事情。
那么登录到 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
然而,在论坛上发布一个帖子已经变成了一个非常大的挑战,有人有提示吗?