Я собираюсь улучшить один из своих новых проектов, и одна из функций, которую я хочу добавить, — это возможность опубликовать новую тему на форуме phpBB, но возможно ли это сделать? Если это так, как я могу это сделать? Спасибо.
Публикация на доске phpBB с помощью приложения C#
Ответы (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, скорее всего, использует капчу и проверку сеанса, чтобы предотвратить именно то, что вы пытаетесь сделать.
Вы можете выполнить это с помощью простого оператора вставки в базу данных phpBB, однако, чтобы убедиться, что все идет гладко, вам необходимо убедиться, что вы также вставляете любые другие строки, которые phpBB в противном случае вставил бы для нового потока (см. документацию /исходный код для этого).
Кроме того, вам необходимо убедиться, что вы ввели правильные идентификаторы, поскольку во вставке требуются уникальные идентификаторы (например, UserID для пользователя, создающего поток)
Другой метод заключается в создании отдельного php-файла, предоставляющего функцию создания потока (с возможностью вызова), которую phpBB использует для создания нового потока. Вы разрешите POST/GET (POST более безопасен) для php-файла, а затем запустите HTTP-запрос POST/GET из С#.
В вашем новом файле php потребуется некоторая авторизация, чтобы гарантировать, что никто другой не публикует/не запрашивает страницу. Вы можете жестко закодировать определенное имя поля, которое должно содержать определенный ключ доступа, чтобы любые входящие сообщения/получения, которые не имеют его, были проигнорированы.
Второй метод, имхо, лучше, потому что он позволяет phpBB делать всю тяжелую работу, вам просто нужно правильно подключить его.
Однако со вторым методом у вас могут возникнуть проблемы с безопасностью, и phpBB может даже не разрешить то, что вы пытаетесь сделать. (Я думаю, что для вызова определенных методов страница должна иметь DEFINE("IN", "PHPBB") или что-то в этом роде, что накладывает больше ограничений на то, что вы можете делать.
Для начала я бы просмотрела сайты поддержки 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
Однако публикация темы на форуме оказалась действительно большой проблемой, у кого-нибудь есть намеки?