Ще подобря един от новите си проекти и една от функциите, които искам да добавя, е възможността да публикувам нова тема във форум на 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;
Кодът по-горе се използва за влизане в twitter. Можете да модифицирате всеки от тях според вашите вкусове. Не забравяйте, че phpBB вероятно ще използва captcha и проверка на сесията, за да предотврати точно това, което се опитвате да направите.
Можете да постигнете това с проста инструкция за вмъкване в базата данни на phpBB, но за да сте сигурни, че всичко върви гладко, трябва да сте сигурни, че сте вмъкнали и всички други редове, които phpBB иначе би вмъкнал за нова нишка (потърсете документация /изходен код за това).
Освен това ще трябва да се уверите, че сте въвели правилните идентификатори, тъй като във вмъкването се изискват уникални идентификатори (като UserID за потребителя, създаващ нишката)
Друг метод е да създадете отделен php файл, който разкрива функцията за създаване на нишка (w/e може да се извика), която phpBB използва за създаване на нова нишка. Ще разрешите POST/GET (POST е по-сигурен) към php файла и след това ще изпълните HTTP POST/GET заявка от C#.
Във вашия нов php файл ще е необходим някакъв вид разрешение, за да се гарантира, че никой друг не публикува/заявява страницата. Можете да кодирате твърдо име на конкретно поле, което трябва да съдържа конкретен ключ за достъп, така че всички входящи публикации/получавания, които го нямат, да бъдат игнорирани.
Вторият метод, imo, е по-добър, защото позволява на phpBB да върши цялата тежка работа, просто трябва да го свържете правилно.
При втория метод обаче може да имате проблеми със сигурността и phpBB може дори да не позволи това, което се опитвате да направите. (Мисля, че за да извика определени методи, страницата трябва да има DEFINE("IN", "PHPBB") или нещо от сорта, което поставя повече ограничения върху това, което можете да правите.
Като начало бих разгледал сайтовете за поддръжка на phpBB и ще видя дали 2-рата част изобщо е възможна и ще разбера дали извикването на функциите е нещо, което може лесно да се направи.
Е, влизането в 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
Публикуването на тема във форума обаче се превърна в наистина голямо предизвикателство. Някой има ли съвети?