سؤال

سأقوم بتحسين أحد مشاريعي الجديدة وأحد الميزات التي أريد إضافتها هي إمكانية نشر موضوع جديد في لوحة منتدى 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 من المرجح أن يستخدم Captcha والتحقق من صحة الجلسة لمنع ما تحاول القيام به بالضبط.

نصائح أخرى

  1. يمكنك تحقيق ذلك من خلال عبارة إدراج بسيطة في قاعدة بيانات PHPBB ، ومع ذلك ، من أجل التأكد من أن كل الأشياء تسير بسلاسة ، تحتاج إلى التأكد /رمز المصدر لذلك).

    بالإضافة إلى ذلك ، ستحتاج إلى التأكد من إدخال المعرفات المناسبة لمعرفات w/e الفريدة مطلوبة في الإدراج (مثل userId للمستخدم إنشاء مؤشر الترابط)

  2. هناك طريقة أخرى تتمثل في إنشاء ملف PHP منفصل يعرض وظيفة Create Thread (w/e قد يسمى) الذي يستخدمه PHPBB لإنشاء مؤشر الترابط الجديد. سوف تسمح لـ Post/Get (Post أكثر أمانًا) إلى ملف PHP ، ثم تقوم بتشغيل طلب/الحصول على HTTP من C#.

    في ملف PHP الجديد الخاص بك ، ستحتاج إلى نوع من التفويض للتأكد من أنه لا يوجد أي شخص آخر ينشر/يطلب الصفحة. يمكنك رمز اسم حقل محدد يجب أن يحتوي على مفتاح وصول محدد ، بحيث سيتم تجاهل أي منشورات/الحصول على أي مشاركات واردة.

الطريقة الثانية ، IMO ، أفضل لأنها تتيح PHPBB القيام بكل العمل الشاق ، تحتاج فقط إلى توصيله بشكل صحيح.

ومع ذلك ، مع الطريقة الثانية ، قد يكون لديك مشكلات أمان وقد لا يسمح PHPBB بما تحاول القيام به. (أعتقد أن استدعاء طرق معينة ، تحتاج الصفحة إلى تحديد ("في" ، "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

ومع ذلك ، فقد تحول نشر موضوع إلى المنتدى إلى تحد كبير حقًا أي شخص لديه تلميحات؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top