Posting In a phpBB Board By a C# Application
I'm going to improve one of my new projects and one of the features that I want to add is the possibility to post a new thread in开发者_如何学Go a phpBB forum board, but it's possible to do this? If it is, how can I do this? Thanks.
You can accomplish this with a simple insert statement into the phpBB database, however, in order to ensure that all things go smoothly, you need to make sure that you also insert any other rows phpBB would otherwise insert for a new thread (look up documentation/source code for that).
In addition, you would need to make sure you entered the proper IDs for w/e unique IDs are required in the insert (like UserID for the user creating the thread)
Another method is to create a separate php file that exposes the create thread function (w/e it may be called) that phpBB uses to create the new thread. You would allow POST/GET (POST is more secure) to the php file and would then run an HTTP POST/GET request from C#.
In your new php file, would need some type of authorization to ensure that no one else is posting/requesting the page. You can hard code a specific field name that must contain a specific access key, so that any incoming posts/gets that don't have it will be ignored.
The second method, imo, is better because it lets phpBB do all the hard work, you just need to wire it up correctly.
However, with the 2nd method, you might have security issues and phpBB might not even allow what you're trying to do. (I think to call certain methods, the page needs to have DEFINE("IN", "PHPBB") or something of the sort, which places more constraints on what you can do.
To start off, I would look around phpBB support sites and see if the 2nd part is even possible and figure out if calling the functions is something that can easily be done.
I wont write all the code for you, but I can dump a couple of things I've built that work well.
One way is to create a webbrowser control, and create something like this:
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}");
}
Another way is to use http requests (not as likely to work reliably with 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;
The code above is used to log into twitter. You can modify either of those to suit your tastes. Remember phpBB is likely to use captcha and session validation to prevent exactly what you're trying to do.
Well Loggin in to phpBB3 is the easy part here is a bit of code i used
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);
}
This used the following core namespaces
System.Net
System.Web
Posting a thread to the Forum however has turned to be a realy big challenge anyone having hints?
精彩评论