Gå til innhold

Python: Hvordan logge seg inn på diskusjon.no?


Anbefalte innlegg

Heisann

 

Vil lage et script som går gjennom rapportsenteret på forumet her (for veiledere, moderatorer etc.), og filtrerer ut de emnene som kun har 1 eller 2 ord.

 

Tror jeg skal få til mesteparten på egenhånd, men jeg lurer på hvordan jeg kan bruke urllib (eller noe annet) for å logge inn på brukeren min. Om jeg må bruke noen form for cookie eller noe?

 

Takk for svar :D

Lenke til kommentar
Videoannonse
Annonse

Til dette anbefaler jeg Mechanize, et tredjeparts bibliotek som forenkler oppgaven mye.

http://wwwsearch.sourceforge.net/mechanize/

 

Koden under er et eksempel på hvordan det vil fungere. Har et problem med at serveren nekter meg tilgang til enkelte sider selv om jeg er logget inn med den; hvor jeg får beskjed om at den ikke gir tilgang til roboter. Går sikkert ann å unngå dette på en måte også om det skulle vise seg å være et problem.

 

import mechanize, re

username = "some_user"
password = "some_password"

# Login
browser = mechanize.Browser()
response = browser.open("https://www.diskusjon.no/index.php?app=core&module=global&section=login")
browser.select_form(nr=1)
browser['username'] = username
browser['password'] = password
browser['rememberMe'] = ['1']
reponse = browser.submit()

# Test success
reponse = browser.open("https://www.diskusjon.no/index.php")
reg2 = re.compile("<div id='user_navigation' class='(.*?)'>", re.DOTALL)
if reg2.findall(reponse.read())[0] != "logged_in":
print "We did not manage to log in! *Sad panda*"
exit()

# open a website and read content
html = browser.open("https://www.diskusjon.no/index.php?app=forums&module=extras&section=myposts").read()
# HTML is now a string with the HTML content of the page

Lenke til kommentar

Noe i denne stilen,med BeautifulSoup til og parse.

mechanize er også greit,men denne metoden fungerte bedere for meg på hw.

Dette variere fra side til side.

BeautifulSoup og lxml er 2 veldig gode parsere for python.

Du kjenner vel igjen output ;)

import urllib2
from BeautifulSoup import BeautifulSoup
import urllib2

url = 'https://www.diskusjon.no/index.php?showforum=341'
username = 'username'
password = 'password'

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)
pagehandle = urllib2.urlopen(url)
page = pagehandle.read()

soup = BeautifulSoup(page)
tag = soup.find("a", {"id": "tid-link-1357940"})
print tag.text

'''Ouptput-->
Python: Hvordan logge seg inn på diskusjon.no?
'''

Lenke til kommentar

Bortsett fra at HW.no bruker form login og session cookies, ikke basic auth.

 

Heller, noe a la:

 

import logging
import urllib2, urllib
import cookielib
import BeautifulSoup

username = "foo"
password = "bar"

L = logging.getLogger("ForumModule")

class LogInClass(object):
   logged_in = False
   baseurl = "https://www.diskusjon.no/"

   def __init__(self):
       # Headers (User agent) to send to the web server
       self.headers = {
           'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
       }

       # Set up url openers and cookie jar
       self.urlopen = urllib2.urlopen
       self.request = urllib2.Request
       self.cookiejar = cookielib.LWPCookieJar()
       self.opener = urllib2.build_opener(
           urllib2.HTTPCookieProcessor(self.cookiejar)
       )
       urllib2.install_opener(self.opener)

   def fetch_url(self, url, post_data=None, headers=None):
       """
       Fetch URL, return a file-like object
       """

       if not url.startswith("http"):
           url = self.baseurl + url

       L.debug("Opening URL %s", url)

       if isinstance(post_data, unicode):
           L.debug("Encoding unicode POST value to utf8")
           post_data = post_data.encode("utf8")

       if post_data:
           post_data = urllib.urlencode(post_data)
           L.debug("POST data: %s", post_data)

       req = self.request(url, post_data, headers or self.headers)
       return self.urlopen(req)


   def login(self):
       base = self.fetch_url(self.baseurl)
       soup = BeautifulSoup.BeautifulSoup(base)
       formtarget = soup("form")[0]['action']

       logindata = {
           "username": username,
           "password": password,
       }

       self.mainpage = self.fetch_url(formtarget, logindata).read()

       self.logged_in = True
       return self.mainpage

   def do_stuffs(self):
       if not self.logged_in:
           self.login()
       # Insert spambot logic here

 

Det der er faktisk litt kode sakset fra et prosjekt jeg gjorde tidligere i dag, nettopp for å hente noe data fra en webside man måtte logge inn på, så vet at den metoden virker :)

 

Har ikke testet mot diskusjon.no - trenger sannsynligvis noen tweaks for det. Også, kan være jeg har glemt å kopiere over noen viktige deler (la ikke merke til noen når jeg leste igjennom tho), så ... Missing parts are left as an exercise for the reader :)

Endret av Terrasque
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...