كيفية تنزيل جميع منشورات منتدى PHPBB3 إذا لم أكن مسؤول؟ [مغلق

StackOverflow https://stackoverflow.com/questions/3620875

  •  26-09-2019
  •  | 
  •  

سؤال

اعتدت على نشر أفكاري في منتدى واحد وبدأت في القلق من أنني سأخسرها إذا تم إغلاقها. هل تعرف طريقة جيدة لتنزيل كامل (أفكار من اللاعبين الآخرين هي أيضا لطيفة!) منتدى phpbb3 إلى قاعدة بيانات؟ هل هناك برامج متوفرة بالفعل ، أو يجب أن أكتبها بنفسي؟

update1:

حسنًا ، يمكنني أن أكتبها بنفسي - هذه ليست مشكلة صعبة ، أليس كذلك؟ أنا فقط لا أريد أن أضيع الوقت في اختراع الدراجة.

Update2:

هناك إجابة في Superuser: كيف يمكنني تنزيل منتدى PHPBB بالكامل (نشط)؟

لكنني فضلت صنع نص روبي لاستنساخ المنتدى. إنه ليس حلاً كاملًا ، لكنه يكفي بالنسبة لي. ونعم ، لا ينتهك أي TOS إذا كنت قلقًا جدًا.

require :rubygems
require :hpricot
require 'open-uri'
require :uri
require :cgi
#require 'sqlite3-ruby'

class PHPBB
  def initialize base_url
    @base_url = base_url
    @forums, @topics = Array.new(4) { {} }
    self.parse_main_page 'main', 'index.php'
    @forums.keys.each do |f|
      self.parse_forum "forum.#{f}", "viewforum.php?f=#{f}"
    end
    @topics.keys.each do |t|
      self.parse_topic "topic.#{t}", "viewtopic.php?t=#{t}"
    end
  end


  def read_file cached, remote
    local = "%s.%s.html" % [__FILE__, cached]
    if File.exists? local
      return IO.read local
    else # download and save
      puts "load #{remote}"
      File.new(local, "w+") << (content = open(@base_url + remote).read)
      return content
    end
  end


  def parse_main_page local, remote
    doc = Hpricot(self.read_file(local,remote))
    doc.search('ul.forums/li.row').each do |li|
      fa = li.search('a.forumtitle').first # forum anchor
      f = self.parse_anchor(fa)['f']
      @forums[f] = {
        forum_id: f,
        title: fa.inner_html,
        description: li.search('dl/dt').first.inner_html.split('<br />').last.strip
      }
      ua, pa = li.search('dd.lastpost/span/a') # user anchor, post anchor
      q = self.parse_anchor(pa)
      self.last_post f, q['p'] unless q.nil?
    end
  end

  def last_post f,p
    @last_post = {forum_id: f, post_id: p} if @last_post.nil? or p.to_i > @last_post[:post_id].to_i
  end

  def last_topic f,t
  end


  def parse_forum local, remote, start=nil
    doc = Hpricot(self.read_file(local,remote))
    doc.search('ul.topics/li.row').each do |li|
      ta = li.search('a.topictitle').first # topic anchor
      q = self.parse_anchor(ta)
      f = q['f']
      t = q['t']
      u = self.parse_anchor(li.search('dl/dt/a').last)['u']
      @topics[t] = {
        forum_id: f,
        topic_id: t,
        user_id: u,
        title: ta.inner_html
      }
    end
  end


  def parse_topic local, remote, start=nil
    doc = Hpricot(self.read_file(local,remote))
    if start.nil?
      doc.search('div.pagination/span/a').collect{ |p| self.parse_anchor(p)['start'] }.uniq.each do |p|
        self.parse_topic "#{local}.start.#{p}", "#{remote}&start=#{p}", true
      end
    end
    doc.search('div.postbody').each do |li|
      # do something
    end
  end


  def parse_url href
    r = CGI.parse URI.parse(href).query
    r.each_pair { |k,v| r[k] = v.last }
  end


  def parse_anchor hp
    self.parse_url hp.attributes['href'] unless hp.nil?
  end
end
هل كانت مفيدة؟

المحلول

سيكون هذا انتهاكًا لشروط الخدمة وقد يكون غير قانوني أيضًا.

ثانياً ، إذا بدأ مجتمع Stackoverflow في حل هذا النوع من مشكلات توخيل الويب ، فأنت تعلم ...

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