class RGroup

Constants

Email
Passwd

Public Class Methods

new(*gafyd) click to toggle source
# File lib/rgroups.rb, line 18
def initialize(*gafyd)
    @scraper = Mechanize.new
    @scraper.reuse_ssl_sessions = false
    if (gafyd.length == 0) 
            @LIST_GROUPS = @@BASE + @@SUBS
        @BASE_URL = @@BASE + '/group/'
        @LOGIN_URL = 'https://accounts.google.com/ServiceLogin?service=groups2&passive=1209600&continue=https://groups.google.com/&followup=https://groups.google.com/'
    else
            @GAFYD = true
        @GAFYD_DOMAIN = gafyd[0]
            @LIST_GROUPS = @@GAFYD_BASE + @GAFYD_DOMAIN + @@SUBS
        @BASE_URL = @@GAFYD_BASE + @GAFYD_DOMAIN + "/group/"
        @LOGIN_URL = @@GAFYD_BASE + @GAFYD_DOMAIN
    end
end

Public Instance Methods

add_user(email, group, opts={}) click to toggle source

add a user email = email address to add group = group name :mode => direct (only for gafyd accounts) :notify => true/false to notify users they’ve been added (only for gafyd) :delivery => only for gafyd

  • none, email, summary, one

:message => message to send to person when being added

# File lib/rgroups.rb, line 134
def add_user(email, group, opts={})
        if (opts[:mode] && opts[:mode].downcase == "direct")
                raise "direct add mode is only available for gafyd accounts" unless @GAFYD
                page = @scraper.get(@BASE_URL + group + @@DIRECT_ADD)
                member_form = page.form('cr')
                if (email.is_a? Array)
                        member_form.members_new = email.join(", ")
                else
                        member_form.members_new = email
                end
                
                if (opts[:notify]) 
                        member_form.body = opts[:message]
                        member_form.checkbox_with(:name => 'notification').check
                elsif (!opts[:notify] || opts[:notify].nil?)
                        member_form.checkbox_with(:name => 'notification').uncheck
                end        

                if (opts[:delivery])
                        case opts[:delivery]
                                when "none"
                                        member_form.radiobuttons_with(:name => 'delivery')[0].check
                                when "email"
                                        member_form.radiobuttons_with(:name => 'delivery')[1].check
                                when "summary"
                                        member_form.radiobuttons_with(:name => 'delivery')[2].check
                                when "one"
                                        member_form.radiobuttons_with(:name => 'delivery')[3].check
                                else
                                        member_form.radiobuttons_with(:name => 'delivery')[0].check
                        end
                end
        else # we're going to invite, not add
                page = @scraper.get(@BASE_URL + group + @@INVITE_ADD)
                member_form = page.form('cr')
                if (email.is_a? Array)
                        member_form.members_new = email.join(", ")
                else
                        member_form.members_new = email
                end
                member_form.body = opts[:message]
        end
        @scraper.submit(member_form, member_form.button_with(:name => 'Action.InitialAddMembers'))
end
get_topics(group) click to toggle source

lists the most recent topics in a group

# File lib/rgroups.rb, line 113
def get_topics(group)
        topics = {}
        page = @scraper.get(@BASE_URL + group + '/topics?gvc=2')
        page.search('//div[@class="maincontoutboxatt"]//table//a').each do |link|
                unless(link[:class] == "st")
                        topics[link.inner_text.strip] = @@BASE + link[:href]
                end
        end
        
        topics
end
list_members(group) click to toggle source
# File lib/rgroups.rb, line 55
def list_members(group)
        page = @scraper.get(@BASE_URL + group + @@MANAGE)
        member_set = page.search('//table[@class="memlist"]//td')
        members = []
        member_set.each do |m| 
                members.push(member_set[member_set.index(m) + 1].children.text.gsub(/\302\240/, '').gsub(/-me$/, '')) if m.to_s.include?('class="cb"')
        end 
        return members
end
login(username, password) click to toggle source

login to google apps

# File lib/rgroups.rb, line 35
def login(username, password)
    page = @scraper.get(@LOGIN_URL)
    f = page.forms[0]
    f.Email = username
    f.Passwd = password
    @scraper.submit(f, f.buttons.first)
end
post_message(group, subject, message, send_copy=false, cc='') click to toggle source

post a message to groups

# File lib/rgroups.rb, line 91
def post_message(group, subject, message, send_copy=false, cc='')
        page = @scraper.get(@BASE_URL + group + '/topics')
        if (@GAFYD)
                form = page.form_with(:action => '/a/' + @GAFYD_DOMAIN + '/group/' + group + "/post")
        else
                form = page.form_with(:action =>  "/group/" + group + "/post")
        end
        page = @scraper.submit(form, form.button_with(:value => "+ New post"))
        
        form = page.form('postform')
        form.cc = cc
        form.subject = subject
        form.body = message
        
        if (send_copy)
                form.checkbox_with(:name => 'bccme').check
        end
        
        @scraper.submit(form, form.button_with(:name => 'Action.Post'))
end
search_groups(group) click to toggle source

search groups listing groups is not easy when scraping instead, you can search for one returns first 15 results, anything else is real slow

# File lib/rgroups.rb, line 69
def search_groups(group)
        if (@GAFYD)
                page = @scraper.get(@@GAFYD_BASE + @GAFYD_DOMAIN)
        else
                page = @scraper.get(@@BASE)
        end
        
        form = page.form('gs2')
        form.q = group
        page = @scraper.submit(form, form.button_with(:name => "qt_s"))
        groups = []
        page.search('//a[@class="on"]').each do |link|
                parts = link[:href].split("/")
                parts = parts[parts.length - 1].split("?")
                groups << parts[0] unless parts[0].eql?("advanced_search")
        end
        
        return nil if groups.length == 0
        groups
end
settings(group) click to toggle source

return a hash of group settings

# File lib/rgroups.rb, line 234
def settings(group)
        settings = {}
        
        page = @scraper.get(@BASE_URL + group + @@GROUP_SETTINGS)
        settings['group_name'] = page.search('//div[@id="name_view"]').text.strip
        settings['group_description'] = page.search('//div[@id="desc_view"]').text.strip
        settings['group_website'] = page.search('//div[@id="info_url_view"]').text.strip
        
        
        page = @scraper.get(@BASE_URL + group + @@ACCESS_SETTINGS)
        form = page.form_with(:id => "GM_form")
        if (@GAFYD)
                settings['allow_external']  = form.checkbox_with(:name => 'param.allow_external_members').checked?
        end
        form.radiobuttons_with(:name => 'param.archive_view').each do |r|
                settings['archive_view'] = r.value if r.checked?
        end
        form.radiobuttons_with(:name => 'param.members_view').each do |r|
                settings['member_view'] = r.value if r.checked?
        end
        form.radiobuttons_with(:name => 'param.who_can_join').each do |r|
                settings['can_join'] = r.value if r.checked?
        end
        settings['join_question'] = form.field_with(:name => 'param.join_question').value.strip
        form.radiobuttons_with(:name => 'param.who_can_post').each do |r|
                settings['who_can_post'] = "managers" if r.checked?  && r.value == 'm'
                settings['who_can_post'] = "members" if r.checked?  && r.value == 's'
                settings['who_can_post'] = "domain" if r.checked?  && r.value == 'd'
                settings['who_can_post'] = "anyone" if r.checked?  && r.value == 'p'
        end
        settings['mod_non_members']  = form.checkbox_with(:name => 'param.mod_non_members').checked?
        settings['web_posting']  = form.checkbox_with(:name => 'param.allow_web_posting').checked?
        form.radiobuttons_with(:name => 'param.who_can_invite').each do |r|
                settings['who_can_invite'] = r.value if r.checked?
        end
        form.radiobuttons_with(:name => 'param.msg_moderation').each do |r|
                settings['msg_moderation'] = r.value if r.checked?
        end
        settings['mod_new_members']  = form.checkbox_with(:name => 'param.mod_new_members').checked?
        
        
        page = @scraper.get(@BASE_URL + group + @@POST_SETTINGS)
        form = page.form_with(:id => "GM_form")
        if (@GAFYD)
                settings['custom_reply_to'] = form.field_with(:name => 'param.custom_reply_to').value.strip
                form.field_with(:name => 'param.max_size').options.each do |s|
                        settings['max_size'] = s.value if s.selected?
                end
                settings['reply_with_bounce_list']  = form.checkbox_with(:name => 'param.reply_with_bounce_list').checked?
        end
        settings['subject_tag'] = form.field_with(:name => 'param.subject_tag').value.strip
        form.radiobuttons_with(:name => 'param.footer').each do |r|
                settings['message_footer'] = "none" if r.checked?  && r.value == 'n'
                settings['message_footer'] = "default" if r.checked?  && r.value == 'd'
                settings['message_footer'] = "custom" if r.checked?  && r.value == 'c'
        end
        settings['reply_to'] = form.field_with(:name => 'param.footer_text').value.strip
        form.radiobuttons_with(:name => 'param.reply_to').each do |r|
                settings['reply_to'] = "whole_group" if r.checked?  && r.value == 'l'
                settings['reply_to'] = "author" if r.checked?  && r.value == 'a'
                settings['reply_to'] = "owner" if r.checked?  && r.value == 'o'
                settings['reply_to'] = "user_decide" if r.checked?  && r.value == 'n'
                settings['reply_to'] = "custom" if r.checked?  && r.value == 'c'
        end
        settings['posting_as_group']  = form.checkbox_with(:name => 'param.posting_as_group').checked?
        settings['moderation_notify']  = form.checkbox_with(:name => 'param.moderation_notify').checked?
        settings['moderation_message_text'] = form.field_with(:name => 'param.footer_text').value.strip

        page = @scraper.get(@BASE_URL + group + @@ADV_SETTINGS)
        form = page.form_with(:id => "GM_form")
        form.field_with(:name => 'param.lang').options.each do |s|
                settings['primary_language'] = s.value if s.selected?
        end
        settings['fixed_font']  = form.checkbox_with(:name => 'param.font_type').checked?
        settings['no_archive_msgs']  = form.checkbox_with(:name => 'param.no_archive').checked?
        settings['group_is_archived']  = form.checkbox_with(:name => 'param.status_archive').checked?
        settings['google_contact']  = form.checkbox_with(:name => 'param.can_contact').checked?
        
        page = @scraper.get(@BASE_URL + group + @@SPAM_SETTINGS)
        form = page.form_with(:id => "GM_form")
        form.radiobuttons_with(:name => 'param.spam_mode').each do |r|
                settings['spam_mode'] = "post" if r.checked?  && r.value == '0'
                settings['spam_mode'] = "mod" if r.checked?  && r.value == '1'
                settings['spam_mode'] = "mod_quiet" if r.checked?  && r.value == '3'
                settings['spam_mode'] = "reject" if r.checked?  && r.value == '2'
        end
        return settings
end
subscribed_groups() click to toggle source

groups that the logged-in user is subscribed to

# File lib/rgroups.rb, line 44
def subscribed_groups
        page = @scraper.get(@LIST_GROUPS)
        groups = []
        page.search('//a[@class="on"]').each do |link|
                parts = link[:href].split("/")
                groups << parts[parts.length - 1]
        end
        
        groups
end
update_user(email, group, action, opts={}) click to toggle source

update a user email = email address to update group = group name action = set_member, set_email :value => depends on what you’re doing.

  • set_member: regular, manager, owner, unsubscribe, ban

  • set_email: none, email, summary, one

# File lib/rgroups.rb, line 186
def update_user(email, group, action, opts={})
    page = @scraper.get(@BASE_URL + group + @@MANAGE)
            member_set = page.search('//table[@class="memlist"]//td')
            members = []
            member_set.each do |m| 
                    members.push(member_set[member_set.index(m) + 1]) if m.to_s.include?('class="cb"')
            end 
            
            member_form = page.form('memberlist')
            email.downcase!
            index = nil 
            members.each_index do |m| 
                    index = m if members[m].to_s.downcase.include?(email)
            end 
    
            member_form.checkboxes_with(:name => 'subcheckbox')[index].check unless index.nil?
            
            if (action.downcase == "set_member")
                    case opts[:value]
                            when "regular"
                                    member_form.field_with(:name => 'membership_type').options[1].select
                            when "manager"
                                    member_form.field_with(:name => 'membership_type').options[2].select
                            when "owner"
                                    member_form.field_with(:name => 'membership_type').options[3].select
                            when "unsubscribe"
                                    member_form.field_with(:name => 'membership_type').options[5].select
                            when "ban"
                                    member_form.field_with(:name => 'membership_type').options[6].select
                    end
                    @scraper.submit(member_form, member_form.button_with(:name => 'Action.SetMembershipType'))
            elsif (action.downcase == "set_email")
                    case opts[:value]
                            when "none"
                                    member_form.field_with(:name => 'delivery').options[1].select
                            when "email"
                                    member_form.field_with(:name => 'delivery').options[2].select
                            when "summary"
                                    member_form.field_with(:name => 'delivery').options[3].select
                            when "one"
                                    member_form.field_with(:name => 'delivery').options[4].select
                    end
                    @scraper.submit(member_form, member_form.button_with(:name => 'Action.SetDeliveryType'))
            end   
            
    end