class NineGag

Constants

DEFAULT

Public Class Methods

comments(id) click to toggle source
# File lib/nine-gag.rb, line 7
def self.comments(id)
  url = 'http://comment-cdn.9gag.com/v1/cacheable/comment-list.json'
  params = {
    appId: "a_dd8f2b7d304a10edaf6f29517ea0ca4100a43d1b",
    url: "http://9gag.com/gag/#{id}",
    count: 10,
    level: 2,
    order: 'score',
    mentionMapping: true,
    origin: '9gag.com'
  }
  # params.merge(ref: next_page) unless next_page.nil?

  begin
    result = RestClient.get(url, { params: params })
    data = JSON.parse(result.body, symbolize_names: true)[:payload][:comments].map do |c|
      user = c[:user]
      comment = {
        id: c[:commentId],
        text: c[:text],
        timestamp: c[:timestamp],
        level: c[:level],
        likes_count: c[:likeCount],
        dislikes_count: c[:dislikeCount],
        permalink: c[:permalink],
        user: {
          user_id: user[:userId],
          avatar_url: user[:avatarUrl],
          display_name: user[:displayName]
        }
      }
    end
    {
      status: "success",
      data: data
    }
  rescue RestClient::ExceptionWithResponse => e
    {
      status: "failed",
      message: e.response
    }
  end
end
method_missing(method_name, *args, &block) click to toggle source
# File lib/nine-gag.rb, line 51
def self.method_missing(method_name, *args, &block)
  opts = args[0] || {}
  type = opts.fetch(:type, "hot")
  after = opts.fetch(:after, nil)
  raise ArgumentError, "type is invalid, only :fresh or :hot" unless %w[hot fresh].include?(type.to_s)

  group, type =
    if DEFAULT.include?(method_name)
      ["default", method_name]
    else
      [method_name, type]
    end

  post_scrape(group, type, after)
end

Private Class Methods

post_scrape(group, type, after = nil) click to toggle source
# File lib/nine-gag.rb, line 69
def self.post_scrape(group, type, after = nil)
  url = "https://9gag.com/v1/group-posts/group/#{group}/type/#{type}"
  headers = {
    Accept: 'application/json',
    'X-Requested-With': 'XMLHttpRequest',
    params: { after: after }
  }

  begin
    result = RestClient.get(url, headers)
    data =
      JSON.parse(result.body, symbolize_names: true)[:data][:posts].map do |post|
        p = {
          id: post[:id],
          title: post[:title],
          url: post[:url],
          comments_count: post[:commentsCount],
          points: post[:upVoteCount],
          nsfw: !post[:nsfw].zero?,
          video: false,
          media: {
            image: post[:images][:image700][:url],
            poster: post[:images][:image460][:url]
          },
          tags: post[:tags].map {|t| t[:key]}
        }

        if post[:type] == "Animated"
          p[:video] = true
          p[:media].merge!(
            mp4: post[:images][:image460sv][:url],
            webvm: post[:images][:image460svwm][:url]
          )
        end

        p
      end

    {
      status:  "success",
      data: data
    }
  rescue RestClient::ExceptionWithResponse => e
    {
      status: "failed",
      message: e.response
    }
  end
end